swup 3.1.1 → 4.0.0-rc.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -0
- package/dist/Swup.cjs +1 -1
- package/dist/Swup.cjs.map +1 -1
- package/dist/Swup.modern.js +1 -1
- package/dist/Swup.modern.js.map +1 -1
- package/dist/Swup.module.js +1 -1
- package/dist/Swup.module.js.map +1 -1
- package/dist/Swup.umd.js +1 -1
- package/dist/Swup.umd.js.map +1 -1
- package/dist/types/Swup.d.ts +53 -45
- package/dist/types/helpers/Location.d.ts +10 -7
- package/dist/types/helpers/delegateEvent.d.ts +2 -2
- package/dist/types/helpers/matchPath.d.ts +3 -0
- package/dist/types/helpers.d.ts +1 -4
- package/dist/types/index.d.ts +7 -4
- package/dist/types/modules/Cache.d.ts +14 -14
- package/dist/types/modules/Classes.d.ts +13 -0
- package/dist/types/modules/Context.d.ts +73 -0
- package/dist/types/modules/Hooks.d.ts +241 -0
- package/dist/types/modules/__test__/cache.test.d.ts +1 -0
- package/dist/types/modules/__test__/hooks.test.d.ts +1 -0
- package/dist/types/modules/__test__/replaceContent.test.d.ts +1 -0
- package/dist/types/modules/awaitAnimations.d.ts +21 -0
- package/dist/types/modules/enterPage.d.ts +5 -2
- package/dist/types/modules/fetchPage.d.ts +23 -3
- package/dist/types/modules/getAnchorElement.d.ts +2 -1
- package/dist/types/modules/leavePage.d.ts +5 -2
- package/dist/types/modules/plugins.d.ts +7 -0
- package/dist/types/modules/renderPage.d.ts +6 -6
- package/dist/types/modules/replaceContent.d.ts +8 -11
- package/dist/types/modules/visit.d.ts +33 -0
- package/dist/types/utils/index.d.ts +3 -1
- package/package.json +13 -9
- package/src/Swup.ts +172 -182
- package/src/__test__/index.test.ts +8 -3
- package/src/helpers/Location.ts +12 -9
- package/src/helpers/__test__/matchPath.test.ts +54 -0
- package/src/helpers/delegateEvent.ts +3 -2
- package/src/helpers/matchPath.ts +22 -0
- package/src/helpers.ts +2 -5
- package/src/index.ts +36 -4
- package/src/modules/Cache.ts +43 -33
- package/src/modules/Classes.ts +48 -0
- package/src/modules/Context.ts +121 -0
- package/src/modules/Hooks.ts +413 -0
- package/src/modules/__test__/cache.test.ts +142 -0
- package/src/modules/__test__/hooks.test.ts +263 -0
- package/src/modules/__test__/replaceContent.test.ts +92 -0
- package/src/modules/awaitAnimations.ts +169 -0
- package/src/modules/enterPage.ts +23 -17
- package/src/modules/fetchPage.ts +74 -29
- package/src/modules/getAnchorElement.ts +2 -1
- package/src/modules/leavePage.ts +26 -20
- package/src/modules/plugins.ts +7 -2
- package/src/modules/renderPage.ts +52 -33
- package/src/modules/replaceContent.ts +33 -16
- package/src/modules/visit.ts +143 -0
- package/src/utils/index.ts +25 -5
- package/dist/types/helpers/cleanupAnimationClasses.d.ts +0 -2
- package/dist/types/helpers/fetch.d.ts +0 -5
- package/dist/types/helpers/getDataFromHtml.d.ts +0 -7
- package/dist/types/helpers/markSwupElements.d.ts +0 -1
- package/dist/types/modules/events.d.ts +0 -33
- package/dist/types/modules/getAnimationPromises.d.ts +0 -7
- package/dist/types/modules/getPageData.d.ts +0 -6
- package/dist/types/modules/loadPage.d.ts +0 -15
- package/dist/types/modules/transitions.d.ts +0 -6
- package/readme.md +0 -60
- package/src/helpers/cleanupAnimationClasses.ts +0 -8
- package/src/helpers/fetch.ts +0 -33
- package/src/helpers/getDataFromHtml.ts +0 -39
- package/src/helpers/markSwupElements.ts +0 -16
- package/src/modules/__test__/events.test.ts +0 -72
- package/src/modules/events.ts +0 -92
- package/src/modules/getAnimationPromises.ts +0 -183
- package/src/modules/getPageData.ts +0 -24
- package/src/modules/loadPage.ts +0 -81
- package/src/modules/transitions.ts +0 -10
- /package/dist/types/{modules/__test__/events.test.d.ts → helpers/__test__/matchPath.test.d.ts} +0 -0
package/dist/Swup.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Swup.umd.js","sources":["../src/helpers/classify.ts","../src/helpers/getCurrentUrl.ts","../src/helpers/updateHistoryRecord.ts","../node_modules/delegate-it/delegate.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<string, unknown> = {}\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 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","import delegate, { DelegateEventHandler, DelegateOptions, EventType } from 'delegate-it';\nimport { ParseSelector } from 'typed-query-selector/parser.js';\n\nexport type Unsubscribe = {\n\tdestroy: () => void;\n};\n\nexport const delegateEvent = <Selector extends string, TEvent extends EventType>(\n\tselector: Selector,\n\ttype: TEvent,\n\tcallback: DelegateEventHandler<GlobalEventHandlersEventMap[TEvent]>,\n\toptions?: DelegateOptions\n): Unsubscribe => {\n\tconst controller = new AbortController();\n\tdelegate<string, ParseSelector<Selector, HTMLElement>, TEvent>(\n\t\tselector,\n\t\ttype,\n\t\tcallback,\n\t\toptions\n\t);\n\treturn { destroy: () => controller.abort() };\n};\n","export const query = (selector: string, context: Document | Element = document) => {\n\treturn context.querySelector<HTMLElement>(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<string, PageRecord> = {};\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 as escape, query } from '../utils.js';\n\n/**\n * Find the anchor element for a given hash.\n * @see https://html.spec.whatwg.org/#find-a-potential-indicated-element\n *\n * @param hash Hash with or without leading '#'\n * @returns The element, if found, or null.\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 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<void>[] {\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 elements match the animationSelector, but keep things going\n\tif (!animatedElements.length) {\n\t\tconsole.warn(`[swup] No elements found matching animationSelector \\`${selector}\\``);\n\t\treturn [Promise.resolve()];\n\t}\n\n\tconst animationPromises = animatedElements\n\t\t.map((element) => getAnimationPromiseForElement(element))\n\t\t.filter(Boolean) as Promise<void>[];\n\n\tif (!animationPromises.length) {\n\t\tconsole.warn(\n\t\t\t`[swup] No CSS animation duration defined on elements matching \\`${selector}\\``\n\t\t);\n\t\treturn [Promise.resolve()];\n\t}\n\n\treturn animationPromises;\n}\n\nconst isTransitionOrAnimationEvent = (event: any): event is TransitionEvent | AnimationEvent =>\n\t[transitionEndEvent, animationEndEvent].includes(event.type);\n\nfunction getAnimationPromiseForElement(element: Element): Promise<void> | undefined {\n\tconst { type, timeout, propCount } = getTransitionInfo(element);\n\n\t// Resolve immediately if no transition defined\n\tif (!type || !timeout) {\n\t\treturn undefined;\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<PageRecord> {\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<void>[] = this.getAnimationPromises('out');\n\tPromise.all(animationPromises).then(() => {\n\t\tthis.triggerEvent('animationOutDone');\n\t});\n\n\treturn animationPromises;\n};\n","import { classify, createHistoryRecord, updateHistoryRecord, getCurrentUrl } from '../helpers.js';\nimport Swup from '../Swup.js';\nimport { PageRecord } from './Cache.js';\n\nexport type HistoryAction = 'push' | 'replace';\n\nexport type TransitionOptions = {\n\turl: string;\n\tcustomTransition?: string;\n\thistory?: HistoryAction;\n};\n\nexport type PageLoadOptions = {\n\turl: string;\n\tcustomTransition?: string;\n\thistory?: HistoryAction;\n\tevent?: PopStateEvent;\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, history: historyAction = 'push' } = 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\tconst historyUrl = url + (this.scrollToElement || '');\n\t\tif (historyAction === 'replace') {\n\t\t\tupdateHistoryRecord(historyUrl);\n\t\t} else {\n\t\t\tcreateHistoryRecord(historyUrl);\n\t\t}\n\t}\n\n\tthis.currentPageUrl = getCurrentUrl();\n\n\t// when everything is ready, render the page\n\tPromise.all<PageRecord | void>([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<string, unknown> = {}\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 { DelegateEvent } from 'delegate-it';\n\ntype HandlersEventMap = {\n\tanimationInDone: undefined;\n\tanimationInStart: undefined;\n\tanimationOutDone: undefined;\n\tanimationOutStart: undefined;\n\tanimationSkipped: undefined;\n\tclickLink: DelegateEvent<MouseEvent>;\n\tcontentReplaced: PopStateEvent | undefined;\n\tdisabled: undefined;\n\tenabled: undefined;\n\topenPageInNewTab: DelegateEvent<MouseEvent>;\n\tpageLoaded: undefined;\n\tpageRetrievedFromCache: undefined;\n\tpageView: PopStateEvent | undefined;\n\tpopState: PopStateEvent;\n\tsamePage: DelegateEvent<MouseEvent>;\n\tsamePageWithHash: DelegateEvent<MouseEvent>;\n\tserverError: undefined;\n\ttransitionStart: PopStateEvent | undefined;\n\ttransitionEnd: PopStateEvent | undefined;\n\twillReplaceContent: PopStateEvent | undefined;\n};\ntype AvailableEventNames = keyof HandlersEventMap;\n\nexport type Handler<T extends keyof HandlersEventMap> = (event: HandlersEventMap[T]) => void;\nexport type Handlers = {\n\t[Key in keyof HandlersEventMap]: Handler<Key>[];\n};\n\nexport function on<TEventType extends AvailableEventNames>(\n\tthis: Swup,\n\tevent: TEventType,\n\thandler: Handler<TEventType>\n): void {\n\tconst eventHandlers = this._handlers[event] as Handler<TEventType>[];\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<TEventType extends AvailableEventNames>(\n\tthis: Swup,\n\tevent?: TEventType,\n\thandler?: Handler<TEventType>\n) {\n\tif (event && handler) {\n\t\tconst eventHandlers = this._handlers[event] as Handler<TEventType>[];\n\t\t// Remove specific handler\n\t\tif (eventHandlers.includes(handler)) {\n\t\t\t(this._handlers[event] as Handler<TEventType>[]) = 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<TEventType extends AvailableEventNames>(\n\tthis: Swup,\n\teventName: TEventType,\n\toriginalEvent?: HandlersEventMap[TEventType]\n): void {\n\tconst eventHandlers = this._handlers[eventName] as Handler<TEventType>[];\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<string, string>;\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 { DelegateEvent } 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 { HistoryAction, 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<string, string>;\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<Options> = {}) {\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: DelegateEvent<MouseEvent>) {\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// Get the history action, if set\n\t\tlet history: HistoryAction | undefined;\n\t\tconst historyAttr = linkEl.getAttribute('data-swup-history');\n\t\tif (historyAttr && ['push', 'replace'].includes(historyAttr)) {\n\t\t\thistory = historyAttr as HistoryAction;\n\t\t}\n\n\t\t// Finally, proceed with loading the page\n\t\tthis.performPageLoad({ url, customTransition, history });\n\t}\n\n\thandleLinkToSamePage(url: string, hash: string, event: DelegateEvent<MouseEvent>) {\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","has","elementMap","get","set","setups","Set","existed","add","delete","delegateEvent","selector","type","options","signal","base","document","aborted","once","nativeListenerOptions","Document","documentElement","capture","Boolean","listenerFn","event","delegateTarget","target","Text","parentElement","Element","currentTarget","closest","contains","safeClosest","Object","assign","call","removeEventListener","JSON","stringify","addEventListener","delegate","destroy","controller","abort","query","context","querySelector","queryAll","Array","from","querySelectorAll","escapeCssIdentifier","ident","window","CSS","escape","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","keys","length","getPage","getCurrentPage","exists","empty","enterPage","skipTransition","triggerEvent","Promise","resolve","requestAnimationFrame","animationPromises","getAnimationPromises","all","then","getAnchorElement","charAt","substring","decodeURIComponent","element","getElementById","decoded","body","transitionProp","transitionEndEvent","animationProp","animationEndEvent","animationType","animationSelector","animatedElements","console","warn","map","timeout","propCount","expectedType","getComputedStyle","transitionDuration","animationDelay","animationDuration","transitionDelays","styles","transitionTimeout","calculateTimeout","transitionDurations","animationDelays","animationDurations","animationTimeout","max","getTransitionInfo","endEvent","startTime","performance","now","propsTransitioned","end","onEnd","isTransitionOrAnimationEvent","elapsedTime","setTimeout","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","shouldIgnoreVisit","performPageLoad","customTransition","historyAction","shouldSkipTransition","text","updateTransition","toLowerCase","fetchPromise","scrollToElement","historyUrl","pushState","createHistoryRecord","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","PopStateEvent","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","loadPage","on","use","unuse","ignoreVisit","linkSelector","Accept","popStateHandler","bind","enable","click","linkClickHandler","removeAttribute","_temp2","origin","triggerWillOpenNewWindow","linkEl","fromElement","metaKey","ctrlKey","shiftKey","altKey","button","preventDefault","handleLinkToSamePage","historyAttr","triggerEl","matches","result","startsWith","url1","url2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Swup.umd.js","sources":["../src/helpers/classify.ts","../src/helpers/getCurrentUrl.ts","../src/helpers/updateHistoryRecord.ts","../node_modules/delegate-it/delegate.js","../src/helpers/delegateEvent.ts","../src/helpers/Location.ts","../src/modules/Cache.ts","../src/utils/index.ts","../src/modules/Classes.ts","../src/modules/Context.ts","../src/modules/Hooks.ts","../src/modules/getAnchorElement.ts","../src/modules/awaitAnimations.ts","../src/modules/visit.ts","../src/helpers/createHistoryRecord.ts","../src/modules/fetchPage.ts","../src/modules/leavePage.ts","../src/modules/replaceContent.ts","../src/modules/enterPage.ts","../src/modules/renderPage.ts","../src/modules/plugins.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<string, unknown> = {}\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 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","import delegate, { DelegateEventHandler, DelegateOptions, EventType } from 'delegate-it';\nimport { ParseSelector } from 'typed-query-selector/parser.js';\n\nexport type DelegateEventUnsubscribe = {\n\tdestroy: () => void;\n};\n\nexport const delegateEvent = <Selector extends string, TEvent extends EventType>(\n\tselector: Selector,\n\ttype: TEvent,\n\tcallback: DelegateEventHandler<GlobalEventHandlersEventMap[TEvent]>,\n\toptions?: DelegateOptions\n): DelegateEventUnsubscribe => {\n\tconst controller = new AbortController();\n\toptions = { ...options, signal: controller.signal };\n\tdelegate<string, ParseSelector<Selector, HTMLElement>, TEvent>(\n\t\tselector,\n\t\ttype,\n\t\tcallback,\n\t\toptions\n\t);\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 */\n\nexport class Location extends URL {\n\tconstructor(url: URL | string, base: string = document.baseURI) {\n\t\tsuper(url.toString(), base);\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 Swup from '../Swup.js';\nimport { Location } from '../helpers.js';\nimport { PageData } from './fetchPage.js';\n\nexport interface CacheData extends PageData {}\n\nexport class Cache {\n\tprivate swup: Swup;\n\tprivate pages: Map<string, CacheData> = new Map();\n\n\tconstructor(swup: Swup) {\n\t\tthis.swup = swup;\n\t}\n\n\tget size() {\n\t\treturn this.pages.size;\n\t}\n\n\tget all() {\n\t\treturn this.pages;\n\t}\n\n\tpublic has(url: string): boolean {\n\t\treturn this.pages.has(this.resolve(url));\n\t}\n\n\tpublic get(url: string): CacheData | undefined {\n\t\treturn this.pages.get(this.resolve(url));\n\t}\n\n\tpublic set(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.triggerSync('cache:set', { page });\n\t}\n\n\tpublic update(url: string, page: CacheData) {\n\t\turl = this.resolve(url);\n\t\tpage = { ...this.get(url), ...page, url };\n\t\tthis.pages.set(url, page);\n\t}\n\n\tpublic delete(url: string): void {\n\t\tthis.pages.delete(this.resolve(url));\n\t}\n\n\tpublic clear(): void {\n\t\tthis.pages.clear();\n\t\tthis.swup.hooks.triggerSync('cache:clear');\n\t}\n\n\tpublic prune(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\tprivate resolve(urlToResolve: string): string {\n\t\tconst { url } = Location.fromUrl(urlToResolve);\n\t\treturn this.swup.resolveUrl(url);\n\t}\n}\n","export const query = (selector: string, context: Document | Element = document) => {\n\treturn context.querySelector<HTMLElement>(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 = (): Promise<void> => {\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\nexport function isPromise<T>(obj: any): obj is PromiseLike<T> {\n\treturn (\n\t\t!!obj &&\n\t\t(typeof obj === 'object' || typeof obj === 'function') &&\n\t\ttypeof obj.then === 'function'\n\t);\n}\n\nexport function runAsPromise(func: Function, args: any[] = [], ctx: any = {}): Promise<any> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst result = func.apply(ctx, 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\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 Swup from '../Swup.js';\nimport { queryAll } from '../utils.js';\n\nexport class Classes {\n\tpublic swup: Swup;\n\n\tswupClasses = ['to-', 'is-changing', 'is-rendering', 'is-popstate', 'is-animating'];\n\n\tconstructor(swup: Swup) {\n\t\tthis.swup = swup;\n\t}\n\n\tget selectors(): string[] {\n\t\tconst { scope } = this.swup.context.animation;\n\t\tif (scope === 'containers') return this.swup.context.containers;\n\t\tif (scope === 'html') return ['html'];\n\t\tif (Array.isArray(scope)) return scope;\n\t\treturn [];\n\t}\n\n\tget selector(): string {\n\t\treturn this.selectors.join(',');\n\t}\n\n\tget targets(): HTMLElement[] {\n\t\tif (!this.selector.trim()) return [];\n\t\treturn queryAll(this.selector) as HTMLElement[];\n\t}\n\n\tpublic add(...classes: string[]): void {\n\t\tthis.targets.forEach((target) => target.classList.add(...classes));\n\t}\n\n\tpublic remove(...classes: string[]): void {\n\t\tthis.targets.forEach((target) => target.classList.remove(...classes));\n\t}\n\n\tpublic clear(): 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\tprivate isSwupClass(className: string): boolean {\n\t\treturn this.swupClasses.some((c) => className.startsWith(c));\n\t}\n}\n","import Swup, { Options } from '../Swup.js';\nimport { HistoryAction, HistoryDirection } from './visit.js';\n\nexport interface Context<TEvent = Event> {\n\t/** The previous page, about to leave */\n\tfrom: FromContext;\n\t/** The next page, about to enter */\n\tto: ToContext;\n\t/** The content containers, about to be replaced */\n\tcontainers: Options['containers'];\n\t/** Information about animated page transitions */\n\tanimation: AnimationContext;\n\t/** What triggered this visit */\n\ttrigger: TriggerContext<TEvent>;\n\t/** Browser history behavior on this visit */\n\thistory: HistoryContext;\n\t/** Scroll behavior on this visit */\n\tscroll: ScrollContext;\n}\n\nexport interface FromContext {\n\t/** The URL of the previous page */\n\turl: string;\n}\n\nexport interface ToContext {\n\t/** The URL of the next page */\n\turl?: string;\n\t/** The HTML content of the next page */\n\thtml?: string;\n}\n\nexport interface AnimationContext {\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/** 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 ScrollContext {\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;\n}\n\nexport interface TriggerContext<TEvent = Event> {\n\t/** DOM element that triggered this visit. */\n\tel?: Element;\n\t/** DOM event that triggered this visit. */\n\tevent?: TEvent;\n}\n\nexport interface HistoryContext {\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 ContextInitOptions {\n\tto: string | undefined;\n\tfrom?: string;\n\thash?: string;\n\tanimate?: boolean;\n\tanimation?: string;\n\ttargets?: string[];\n\tel?: Element;\n\tevent?: Event;\n\taction?: HistoryAction;\n\tresetScroll?: boolean;\n}\n\nexport function createContext(\n\tthis: Swup,\n\t{\n\t\tto,\n\t\tfrom = this.currentPageUrl,\n\t\thash: target,\n\t\tanimate = true,\n\t\tanimation: name,\n\t\tel,\n\t\tevent,\n\t\taction = 'push',\n\t\tresetScroll: reset = true\n\t}: ContextInitOptions\n): Context {\n\treturn {\n\t\tfrom: { url: from },\n\t\tto: { url: to },\n\t\tcontainers: this.options.containers,\n\t\tanimation: {\n\t\t\tanimate,\n\t\t\twait: false,\n\t\t\tname,\n\t\t\tscope: this.options.animationScope,\n\t\t\tselector: this.options.animationSelector\n\t\t},\n\t\ttrigger: {\n\t\t\tel,\n\t\t\tevent\n\t\t},\n\t\thistory: {\n\t\t\taction,\n\t\t\tpopstate: false,\n\t\t\tdirection: undefined\n\t\t},\n\t\tscroll: {\n\t\t\treset,\n\t\t\ttarget\n\t\t}\n\t};\n}\n","import { DelegateEvent } from 'delegate-it';\n\nimport Swup, { Options } from '../Swup.js';\nimport { isPromise, runAsPromise } from '../utils.js';\nimport { Context } from './Context.js';\nimport { FetchOptions, PageData } from './fetchPage.js';\nimport { AnimationDirection } from './awaitAnimations.js';\n\nexport interface HookDefinitions {\n\t'animation:out:start': undefined;\n\t'animation:out:end': undefined;\n\t'animation:in:start': undefined;\n\t'animation:in:end': undefined;\n\t'animation:skip': undefined;\n\t'animation:await': { direction: AnimationDirection };\n\t'cache:clear': undefined;\n\t'cache:set': { page: PageData };\n\t'content:replace': { page: PageData };\n\t'content:scroll': { options: ScrollIntoViewOptions };\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'history:popstate': { event: PopStateEvent };\n\t'link:click': { el: HTMLAnchorElement; event: DelegateEvent<MouseEvent> };\n\t'link:self': undefined;\n\t'link:anchor': { hash: string; options: ScrollIntoViewOptions };\n\t'link:newtab': { href: string };\n\t'page:request': { url: string; options: FetchOptions };\n\t'page:load': { page: PageData; cache?: boolean };\n\t'page:view': { url: string; title: string };\n\t'visit:start': undefined;\n\t'visit:end': undefined;\n}\n\nexport type HookArguments<T extends HookName> = HookDefinitions[T];\n\nexport type HookName = keyof HookDefinitions;\n\nexport type Handler<T extends HookName> = (\n\t/** The global context object for the current visit */\n\tcontext: Context,\n\t/** The local arguments passed into the handler */\n\targs: HookArguments<T>,\n\t/** The default handler to be executed, available if replacing an internal hook handler */\n\tdefaultHandler?: Handler<T>\n) => Promise<any> | void;\n\nexport type Handlers = {\n\t[K in HookName]: Handler<K>[];\n};\n\nexport type HookUnregister = () => void;\n\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<T extends HookName> = {\n\tid: number;\n\thook: T;\n\thandler: Handler<T>;\n} & HookOptions;\n\ntype HookLedger<T extends HookName> = Map<Handler<T>, HookRegistration<T>>;\n\ninterface HookRegistry extends Map<HookName, HookLedger<HookName>> {\n\tget<K extends HookName>(key: K): HookLedger<K> | undefined;\n\tset<K extends HookName>(key: K, value: HookLedger<K>): this;\n}\n\n/**\n * Hook registry.\n *\n * Create, trigger and handle hooks.\n *\n */\nexport class Hooks {\n\tprotected swup: Swup;\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\treadonly hooks: HookName[] = [\n\t\t'animation:out:start',\n\t\t'animation:out:end',\n\t\t'animation:in:start',\n\t\t'animation:in:end',\n\t\t'animation:skip',\n\t\t'animation:await',\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'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:request',\n\t\t'page:load',\n\t\t'page:view',\n\t\t'visit:start',\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 * Register a new hook.\n\t */\n\tcreate(hook: HookName) {\n\t\tif (!this.registry.has(hook)) {\n\t\t\tthis.registry.set(hook, new Map());\n\t\t}\n\t}\n\n\t/**\n\t * Check if a hook is registered.\n\t */\n\thas(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<T extends HookName>(hook: T): HookLedger<T> | 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\ton<T extends HookName>(hook: T, handler: Handler<T>): HookUnregister;\n\ton<T extends HookName>(hook: T, handler: Handler<T>, options: HookOptions): HookUnregister;\n\ton<T extends HookName>(\n\t\thook: T,\n\t\thandler: Handler<T>,\n\t\toptions: HookOptions = {}\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<T> = { ...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\tbefore<T extends HookName>(hook: T, handler: Handler<T>): HookUnregister;\n\tbefore<T extends HookName>(hook: T, handler: Handler<T>, options: HookOptions): HookUnregister;\n\tbefore<T extends HookName>(\n\t\thook: T,\n\t\thandler: Handler<T>,\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\treplace<T extends HookName>(hook: T, handler: Handler<T>): HookUnregister;\n\treplace<T extends HookName>(hook: T, handler: Handler<T>, options: HookOptions): HookUnregister;\n\treplace<T extends HookName>(\n\t\thook: T,\n\t\thandler: Handler<T>,\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\tonce<T extends HookName>(hook: T, handler: Handler<T>): HookUnregister;\n\tonce<T extends HookName>(hook: T, handler: Handler<T>, options: HookOptions): HookUnregister;\n\tonce<T extends HookName>(\n\t\thook: T,\n\t\thandler: Handler<T>,\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\toff<T extends HookName>(hook: T): void;\n\toff<T extends HookName>(hook: T, handler: Handler<T>): void;\n\toff<T extends HookName>(hook: T, handler?: Handler<T>): 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 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\tasync trigger<T extends HookName>(\n\t\thook: T,\n\t\targs?: HookArguments<T>,\n\t\tdefaultHandler?: Handler<T>\n\t): Promise<any> {\n\t\tconst { before, handler, after, replaced } = this.getHandlers(hook, defaultHandler);\n\t\tawait this.execute(before, args);\n\t\tconst [result] = await this.execute(handler, args, replaced ? defaultHandler : undefined);\n\t\tawait this.execute(after, args);\n\t\tthis.dispatchDomEvent(hook, 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 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\ttriggerSync<T extends HookName>(\n\t\thook: T,\n\t\targs?: HookArguments<T>,\n\t\tdefaultHandler?: Handler<T>\n\t): any {\n\t\tconst { before, after, handler, replaced } = this.getHandlers(hook, defaultHandler);\n\t\tthis.executeSync(before, args);\n\t\tconst [result] = this.executeSync(handler, args, replaced ? defaultHandler : undefined);\n\t\tthis.executeSync(after, args);\n\t\tthis.dispatchDomEvent(hook, args);\n\t\treturn result;\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\tasync execute<T extends HookName>(\n\t\tregistrations: HookRegistration<T>[],\n\t\targs?: HookArguments<T>,\n\t\tdefaultHandler?: Handler<T>\n\t): Promise<any> {\n\t\tconst results = [];\n\t\tfor (const { hook, handler, once } of registrations) {\n\t\t\tconst result = await runAsPromise(handler, [this.swup.context, args, defaultHandler]);\n\t\t\tresults.push(result);\n\t\t\tif (once) {\n\t\t\t\tthis.off(hook, handler);\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\texecuteSync<T extends HookName>(\n\t\tregistrations: HookRegistration<T>[],\n\t\targs?: HookArguments<T>,\n\t\tdefaultHandler?: Handler<T>\n\t): any[] {\n\t\tconst results = [];\n\t\tfor (const { hook, handler, once } of registrations) {\n\t\t\tconst result = handler(this.swup.context, args as HookArguments<T>, defaultHandler);\n\t\t\tresults.push(result);\n\t\t\tif (isPromise(result)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Promise returned from handler for synchronous hook '${hook}'.` +\n\t\t\t\t\t\t`Swup will not wait for it to resolve.`\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (once) {\n\t\t\t\tthis.off(hook, handler);\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\tgetHandlers<T extends HookName>(hook: T, defaultHandler?: Handler<T>) {\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 sort = this.sortRegistrations;\n\t\tconst registrations = Array.from(ledger.values());\n\n\t\tconst before = registrations.filter(({ before, replace }) => before && !replace).sort(sort);\n\t\tconst replace = registrations.filter(({ replace }) => replace).sort(sort);\n\t\tconst after = registrations.filter(({ before, replace }) => !before && !replace).sort(sort);\n\t\tconst replaced = replace.length > 0;\n\n\t\tlet handler: HookRegistration<T>[] = [];\n\t\tif (replaced) {\n\t\t\thandler = [{ id: 0, hook, handler: replace[0].handler }];\n\t\t} else if (defaultHandler) {\n\t\t\thandler = [{ id: 0, hook, handler: defaultHandler }];\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\tsortRegistrations<T extends HookName>(a: HookRegistration<T>, b: HookRegistration<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 * Trigger a custom event on the `document`. Prefixed with `swup:`\n\t * @param hook Name of the hook to trigger.\n\t */\n\tdispatchDomEvent<T extends HookName>(hook: T, args?: HookArguments<T>): void {\n\t\tconst detail = { hook, args, context: this.swup.context };\n\t\tdocument.dispatchEvent(new CustomEvent(`swup:${hook}`, { detail }));\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 Swup, { 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<CSSStyleDeclaration, AnimationStyleKeys>;\n\nexport type AnimationDirection = 'in' | 'out';\n\n/**\n * Return a Promise that resolves when all animations are done on the page.\n *\n * @note We don't make use of the `direction` argument, but it's required by JS plugin\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> | HTMLElement[];\n\t\tdirection?: AnimationDirection;\n\t}\n): Promise<void> {\n\t// Allow usage of swup without animations\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<void> | 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: any): 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 Swup from '../Swup.js';\nimport { createHistoryRecord, updateHistoryRecord, getCurrentUrl, Location } from '../helpers.js';\nimport { FetchOptions } from './fetchPage.js';\nimport { ContextInitOptions } from './Context.js';\n\nexport type HistoryAction = 'push' | 'replace';\nexport type HistoryDirection = 'forwards' | 'backwards';\n\ntype VisitOptions = {\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};\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<void>\n */\nexport function visit(\n\tthis: Swup,\n\turl: string,\n\toptions: VisitOptions & FetchOptions = {},\n\tcontext: Omit<ContextInitOptions, 'to'> = {}\n) {\n\t// Check if the visit should be ignored\n\tif (this.shouldIgnoreVisit(url)) {\n\t\twindow.location.href = url;\n\t\treturn;\n\t}\n\n\tconst { url: to, hash } = Location.fromUrl(url);\n\tthis.context = this.createContext({ ...context, to, hash });\n\tthis.performVisit(to, options);\n}\n\n/**\n * Start a visit to a new URL.\n *\n * Internal method that assumes the global context has already been set up.\n *\n * As a user, you should call `swup.visit(url)` instead.\n *\n * @param url The URL to navigate to.\n * @param options Options for how to perform this visit.\n * @returns Promise<void>\n */\nexport async function performVisit(\n\tthis: Swup,\n\turl: string,\n\toptions: VisitOptions & FetchOptions = {}\n) {\n\tif (typeof url !== 'string') {\n\t\tthrow new Error(`swup.visit() requires a URL parameter`);\n\t}\n\n\tthis.context.to.url = Location.fromUrl(url).url;\n\tconst { animation, animate, history: historyAction } = options;\n\toptions.referrer = options.referrer || this.currentPageUrl;\n\n\tif (animate === false) {\n\t\tthis.context.animation.animate = false;\n\t}\n\tif (historyAction) {\n\t\tthis.context.history.action = historyAction;\n\t}\n\n\t// Clean up old animation classes and set custom animation name\n\tif (!this.context.animation.animate) {\n\t\tthis.classes.clear();\n\t} else if (animation) {\n\t\tthis.context.animation.name = animation;\n\t}\n\n\ttry {\n\t\tawait this.hooks.trigger('visit:start');\n\n\t\t// Begin fetching page\n\t\tconst pagePromise = this.hooks.trigger(\n\t\t\t'page:request',\n\t\t\t{ url: this.context.to.url, options },\n\t\t\tasync (context, { options }) => await this.fetchPage(context.to.url as string, options)\n\t\t);\n\n\t\t// Create history record if this is not a popstate call (with or without anchor)\n\t\tif (!this.context.history.popstate) {\n\t\t\tconst newUrl = url + (this.context.scroll.target || '');\n\t\t\tif (this.context.history.action === 'replace') {\n\t\t\t\tupdateHistoryRecord(newUrl);\n\t\t\t} else {\n\t\t\t\tconst index = this.currentHistoryIndex + 1;\n\t\t\t\tcreateHistoryRecord(newUrl, { index });\n\t\t\t}\n\t\t}\n\n\t\tthis.currentPageUrl = getCurrentUrl();\n\n\t\t// Wait for page before starting to animate out?\n\t\tif (this.context.animation.wait) {\n\t\t\tconst { html } = await pagePromise;\n\t\t\tthis.context.to.html = html;\n\t\t}\n\n\t\t// Wait for page to load and leave animation to finish\n\t\tconst animationPromise = this.leavePage();\n\t\tconst [page] = await Promise.all([pagePromise, animationPromise]);\n\n\t\t// Render page: replace content and scroll to top/fragment\n\t\tawait this.renderPage(this.context.to.url, page);\n\n\t\t// Wait for enter animation\n\t\tawait this.enterPage();\n\n\t\t// Finalize visit\n\t\tawait this.hooks.trigger('visit:end', undefined, () => this.classes.clear());\n\n\t\t// Reset context after visit?\n\t\t// if (this.context.to && this.isSameResolvedUrl(this.context.to.url, requestedUrl)) {\n\t\t// \tthis.createContext({ to: undefined });\n\t\t// }\n\t} catch (error: unknown) {\n\t\t// Return early if error is undefined (probably aborted preload request)\n\t\tif (!error) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Log to console as we swallow almost all hook errors\n\t\tconsole.error(error);\n\n\t\t// Rewrite `skipPopStateHandling` to redirect manually when `history.go` is processed\n\t\tthis.options.skipPopStateHandling = () => {\n\t\t\twindow.location.href = this.context.to.url as string;\n\t\t\treturn true;\n\t\t};\n\n\t\t// Go back to the actual page we're still at\n\t\thistory.go(-1);\n\t}\n}\n","import { getCurrentUrl } from './getCurrentUrl.js';\n\nexport const createHistoryRecord = (\n\turl: string,\n\tcustomData: Record<string, unknown> = {}\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","import Swup from '../Swup.js';\nimport { Location } from '../helpers.js';\n\nexport interface PageData {\n\turl: string;\n\thtml: string;\n}\n\nexport interface FetchOptions extends RequestInit {\n\tmethod?: 'GET' | 'POST';\n\tbody?: string | FormData | URLSearchParams;\n\theaders?: Record<string, string>;\n}\n\nexport class FetchError extends Error {\n\turl: string;\n\tstatus: number;\n\tconstructor(message: string, details: { url: string; status: number }) {\n\t\tsuper(message);\n\t\tthis.name = 'FetchError';\n\t\tthis.url = details.url;\n\t\tthis.status = details.status;\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 & { triggerHooks?: boolean } = {}\n): Promise<PageData> {\n\turl = Location.fromUrl(url).url;\n\n\tif (this.cache.has(url)) {\n\t\tconst page = this.cache.get(url) as PageData;\n\t\tif (options.triggerHooks !== false) {\n\t\t\tawait this.hooks.trigger('page:load', { page, cache: true });\n\t\t}\n\t\treturn page;\n\t}\n\n\tconst headers = { ...this.options.requestHeaders, ...options.headers };\n\toptions = { ...options, headers };\n\n\t// Allow hooking before this and returning a custom response-like object (e.g. custom fetch implementation)\n\tconst response: Response = await this.hooks.trigger(\n\t\t'fetch:request',\n\t\t{ url, options },\n\t\t(context, { url, options }) => fetch(url, options)\n\t);\n\n\tconst { status, url: responseUrl } = response;\n\tconst html = await response.text();\n\n\tif (status === 500) {\n\t\tthis.hooks.trigger('fetch:error', { 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// Only save cache entry for non-redirects\n\tif (url === finalUrl) {\n\t\tthis.cache.set(page.url, page);\n\t}\n\n\tif (options.triggerHooks !== false) {\n\t\tawait this.hooks.trigger('page:load', { page, cache: false });\n\t}\n\n\treturn page;\n}\n","import Swup from '../Swup.js';\nimport { classify } from '../helpers.js';\n\n/**\n * Perform the out/leave animation of the current page.\n * @returns Promise<void>\n */\nexport const leavePage = async function (this: Swup) {\n\tif (!this.context.animation.animate) {\n\t\tawait this.hooks.trigger('animation:skip');\n\t\treturn;\n\t}\n\n\tawait this.hooks.trigger('animation:out:start', undefined, () => {\n\t\tthis.classes.add('is-changing', 'is-leaving', 'is-animating');\n\t\tif (this.context.history.popstate) {\n\t\t\tthis.classes.add('is-popstate');\n\t\t}\n\t\tif (this.context.animation.name) {\n\t\t\tthis.classes.add(`to-${classify(this.context.animation.name)}`);\n\t\t}\n\t});\n\n\tawait this.hooks.trigger(\n\t\t'animation:await',\n\t\t{ direction: 'out' },\n\t\tasync (context, { direction }) => {\n\t\t\tawait this.awaitAnimations({ selector: context.animation.selector, direction });\n\t\t}\n\t);\n\n\tawait this.hooks.trigger('animation:out:end');\n};\n","import Swup, { Options } from '../Swup.js';\nimport { 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// 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\treturn replaced.length === containers.length;\n};\n","import Swup from '../Swup.js';\nimport { nextTick } from '../utils.js';\n\n/**\n * Perform the in/enter animation of the next page.\n * @returns Promise<void>\n */\nexport const enterPage = async function (this: Swup) {\n\tif (!this.context.animation.animate) {\n\t\treturn;\n\t}\n\n\tconst animation = this.hooks.trigger(\n\t\t'animation:await',\n\t\t{ direction: 'in' },\n\t\tasync (context, { direction }) => {\n\t\t\tawait this.awaitAnimations({ selector: context.animation.selector, direction });\n\t\t}\n\t);\n\n\tawait nextTick();\n\n\tawait this.hooks.trigger('animation:in:start', undefined, () => {\n\t\tthis.classes.remove('is-animating');\n\t});\n\n\tawait animation;\n\n\tawait this.hooks.trigger('animation:in:end');\n};\n","import { updateHistoryRecord, getCurrentUrl, classify } from '../helpers.js';\nimport Swup from '../Swup.js';\nimport { PageData } from './fetchPage.js';\n\n/**\n * Render the next page: replace the content and update scroll position.\n * @returns Promise<void>\n */\nexport const renderPage = async function (this: Swup, requestedUrl: string, page: PageData) {\n\tconst { url, html } = page;\n\n\tthis.classes.remove('is-leaving');\n\n\t// do nothing if another page was requested in the meantime\n\tif (!this.isSameResolvedUrl(getCurrentUrl(), requestedUrl)) {\n\t\treturn;\n\t}\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\tthis.context.to.url = this.currentPageUrl;\n\t}\n\n\t// only add for animated page loads\n\tif (this.context.animation.animate) {\n\t\tthis.classes.add('is-rendering');\n\t}\n\n\t// save html into context for easier retrieval\n\tthis.context.to.html = html;\n\n\t// replace content: allow handlers and plugins to overwrite paga data and containers\n\tawait this.hooks.trigger('content:replace', { page }, (context, { page }) => {\n\t\tconst success = this.replaceContent(page, { containers: context.containers });\n\t\tif (!success) {\n\t\t\tthrow new Error('[swup] Container mismatch, aborting');\n\t\t}\n\t\tif (this.context.animation.animate) {\n\t\t\t// Make sure to add these classes to new containers as well\n\t\t\tthis.classes.add('is-animating', 'is-changing', 'is-rendering');\n\t\t\tif (this.context.animation.name) {\n\t\t\t\tthis.classes.add(`to-${classify(this.context.animation.name)}`);\n\t\t\t}\n\t\t}\n\t});\n\n\tawait this.hooks.trigger(\n\t\t'content:scroll',\n\t\t{ options: { behavior: 'auto' } },\n\t\t(context, { options }) => {\n\t\t\tif (this.context.scroll.target) {\n\t\t\t\tconst target = this.getAnchorElement(this.context.scroll.target);\n\t\t\t\tif (target) {\n\t\t\t\t\ttarget.scrollIntoView(options);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.context.scroll.reset) {\n\t\t\t\twindow.scrollTo(0, 0);\n\t\t\t}\n\t\t}\n\t);\n\n\tawait this.hooks.trigger('page:view', { url: this.currentPageUrl, title: document.title });\n\n\t// empty cache if it's disabled (in case preload plugin filled it)\n\tif (!this.options.cache) {\n\t\tthis.cache.clear();\n\t}\n};\n","import Swup from '../Swup.js';\n\nexport type Plugin = {\n\t/** Name of this plugin */\n\tname: string;\n\t/** Identify as a swup plugin */\n\tisSwupPlugin: true;\n\t/** Run on mount */\n\tmount: () => void;\n\t/** Run on unmount */\n\tunmount: () => void;\n\n\t/** The swup instance that mounted this plugin */\n\tswup?: Swup;\n\n\t/** Version of this plugin. Currently not in use, defined here for backward compatiblity. */\n\tversion?: string;\n\t/** Version requirements of this plugin. Example: `{ swup: '>=4' }` */\n\trequires?: Record<string, string>;\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 { DelegateEvent } from 'delegate-it';\n\nimport version from './config/version.js';\n\nimport { delegateEvent, getCurrentUrl, Location, updateHistoryRecord } from './helpers.js';\nimport { DelegateEventUnsubscribe } from './helpers/delegateEvent.js';\n\nimport { Cache } from './modules/Cache.js';\nimport { Classes } from './modules/Classes.js';\nimport { Context, createContext } from './modules/Context.js';\nimport { Hooks } from './modules/Hooks.js';\nimport { getAnchorElement } from './modules/getAnchorElement.js';\nimport { awaitAnimations } from './modules/awaitAnimations.js';\nimport { visit, performVisit, HistoryAction } from './modules/visit.js';\nimport { fetchPage } from './modules/fetchPage.js';\nimport { leavePage } from './modules/leavePage.js';\nimport { replaceContent } from './modules/replaceContent.js';\nimport { enterPage } from './modules/enterPage.js';\nimport { renderPage } from './modules/renderPage.js';\nimport { use, unuse, findPlugin, Plugin } from './modules/plugins.js';\nimport { nextTick } from './utils.js';\n\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/** Plugins to register on startup. */\n\tplugins: Plugin[];\n\t/** Custom headers sent along with fetch requests. */\n\trequestHeaders: Record<string, string>;\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: any) => boolean;\n};\n\nexport default class Swup {\n\t/** Library version */\n\tversion: string = version;\n\t/** Options passed into the instance */\n\toptions: Options;\n\t/** Registered plugin instances */\n\tplugins: Plugin[] = [];\n\t/** Global context of the current visit */\n\tcontext: Context;\n\t/** Cache instance */\n\tcache: Cache;\n\t/** Hook registry */\n\thooks: Hooks;\n\t/** Animation class manager */\n\tclasses: Classes;\n\t/** URL of the currently visible page */\n\tcurrentPageUrl = getCurrentUrl();\n\t/** Index of the current history entry */\n\tcurrentHistoryIndex = 1;\n\t/** Delegated event subscription handle */\n\tprivate clickDelegate?: DelegateEventUnsubscribe;\n\n\tvisit = visit;\n\tperformVisit = performVisit;\n\tleavePage = leavePage;\n\trenderPage = renderPage;\n\treplaceContent = replaceContent;\n\tenterPage = enterPage;\n\tdelegateEvent = delegateEvent;\n\tfetchPage = fetchPage;\n\tawaitAnimations = awaitAnimations;\n\tgetAnchorElement = getAnchorElement;\n\tuse = use;\n\tunuse = unuse;\n\tfindPlugin = findPlugin;\n\tgetCurrentUrl = getCurrentUrl;\n\tcreateContext = createContext;\n\tlog: (message: string, context?: any) => void = () => {}; // here so it can be used by plugins\n\n\t/** Default options before merging user options */\n\tdefaults: Options = {\n\t\tanimateHistoryBrowsing: false,\n\t\tanimationSelector: '[class*=\"transition-\"]',\n\t\tanimationScope: 'html',\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\t'Accept': 'text/html, application/xhtml+xml'\n\t\t},\n\t\tskipPopStateHandling: (event) => event.state?.source !== 'swup'\n\t};\n\n\tconstructor(options: Partial<Options> = {}) {\n\t\t// Merge defaults and options\n\t\tthis.options = { ...this.defaults, ...options };\n\n\t\tthis.linkClickHandler = this.linkClickHandler.bind(this);\n\t\tthis.popStateHandler = this.popStateHandler.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.context = this.createContext({ to: undefined });\n\n\t\tif (!this.checkRequirements()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.enable();\n\t}\n\n\tcheckRequirements() {\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\tasync enable() {\n\t\t// Add event listener\n\t\tconst { linkSelector } = this.options;\n\t\tthis.clickDelegate = this.delegateEvent(linkSelector, 'click', this.linkClickHandler);\n\n\t\twindow.addEventListener('popstate', this.popStateHandler);\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// Mount plugins\n\t\tthis.options.plugins.forEach((plugin) => this.use(plugin));\n\n\t\t// Modify initial history record\n\t\tupdateHistoryRecord(null, { index: 1 });\n\n\t\t// Trigger enable hook\n\t\tawait this.hooks.trigger('enable', undefined, () => {\n\t\t\t// Add swup-enabled class to html tag\n\t\t\tdocument.documentElement.classList.add('swup-enabled');\n\t\t});\n\n\t\tawait nextTick();\n\n\t\t// Trigger page view hook\n\t\tawait this.hooks.trigger('page:view', { url: this.currentPageUrl, title: document.title });\n\t}\n\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.popStateHandler);\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.trigger('disable', undefined, () => {\n\t\t\t// remove swup-enabled class from html tag\n\t\t\tdocument.documentElement.classList.remove('swup-enabled');\n\t\t});\n\n\t\t// remove handlers\n\t\tthis.hooks.clear();\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: DelegateEvent<MouseEvent>) {\n\t\tconst el = event.delegateTarget as HTMLAnchorElement;\n\t\tconst { href, url, hash } = Location.fromElement(el);\n\n\t\t// Get the animation name, if specified\n\t\tconst animation = el.getAttribute('data-swup-animation') || undefined;\n\n\t\t// Get the history action, if specified\n\t\tlet historyAction: HistoryAction | undefined;\n\t\tconst historyAttr = el.getAttribute('data-swup-history');\n\t\tif (historyAttr && ['push', 'replace'].includes(historyAttr)) {\n\t\t\thistoryAction = historyAttr as HistoryAction;\n\t\t}\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\tthis.context = this.createContext({\n\t\t\tto: url,\n\t\t\thash,\n\t\t\tanimation,\n\t\t\tel,\n\t\t\tevent,\n\t\t\taction: historyAction\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.hooks.trigger('link:newtab', { 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.triggerSync('link:click', { el, event }, () => {\n\t\t\tconst from = this.context.from.url ?? '';\n\n\t\t\tevent.preventDefault();\n\n\t\t\t// Handle links to the same page: with or without hash\n\t\t\tif (!url || url === from) {\n\t\t\t\tif (hash) {\n\t\t\t\t\tupdateHistoryRecord(url + hash);\n\t\t\t\t\tthis.hooks.triggerSync(\n\t\t\t\t\t\t'link:anchor',\n\t\t\t\t\t\t{ hash, options: { behavior: 'auto' } },\n\t\t\t\t\t\t(context, { hash, options }) => {\n\t\t\t\t\t\t\tconst target = this.getAnchorElement(hash);\n\t\t\t\t\t\t\tif (target) {\n\t\t\t\t\t\t\t\ttarget.scrollIntoView(options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.hooks.triggerSync('link:self', undefined, (context) => {\n\t\t\t\t\t\tif (!context.scroll.reset) return;\n\t\t\t\t\t\twindow.scroll({ top: 0, left: 0, behavior: 'auto' });\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.performVisit(url);\n\t\t});\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\tconst href = event.state?.url ?? 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\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\t\tconst animate = this.options.animateHistoryBrowsing;\n\t\tconst resetScroll = this.options.animateHistoryBrowsing;\n\n\t\tthis.context = this.createContext({\n\t\t\tto: url,\n\t\t\thash,\n\t\t\tevent,\n\t\t\tanimate,\n\t\t\tresetScroll\n\t\t});\n\n\t\t// Mark as popstate visit\n\t\tthis.context.history.popstate = true;\n\n\t\t// Determine direction of history visit\n\t\tconst index = Number(event.state?.index);\n\t\tif (index) {\n\t\t\tconst direction = index - this.currentHistoryIndex > 0 ? 'forwards' : 'backwards';\n\t\t\tthis.context.history.direction = direction;\n\t\t}\n\n\t\t// Does this even do anything?\n\t\t// if (!hash) {\n\t\t// \tevent.preventDefault();\n\t\t// }\n\n\t\tthis.hooks.triggerSync('history:popstate', { event }, () => {\n\t\t\tthis.performVisit(url);\n\t\t});\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":["classify","text","fallback","String","toLowerCase","replace","getCurrentUrl","_temp","hash","location","pathname","search","updateHistoryRecord","url","customData","data","history","state","random","Math","source","replaceState","ledger","WeakMap","editLedger","wanted","baseElement","callback","setup","has","elementMap","get","set","setups","Set","existed","add","delete","delegateEvent","selector","type","options","controller","AbortController","signal","base","document","aborted","once","nativeListenerOptions","Document","documentElement","capture","Boolean","listenerFn","event","delegateTarget","target","Text","parentElement","Element","currentTarget","closest","contains","safeClosest","Object","assign","call","removeEventListener","JSON","stringify","addEventListener","delegate","destroy","abort","Location","URL","constructor","baseURI","super","toString","this","static","el","href","getAttribute","Cache","swup","pages","Map","size","all","resolve","page","hooks","triggerSync","update","clear","prune","predicate","forEach","urlToResolve","fromUrl","resolveUrl","query","context","querySelector","queryAll","Array","from","querySelectorAll","nextTick","Promise","requestAnimationFrame","isPromise","obj","then","escapeCssIdentifier","ident","window","CSS","escape","toMs","s","Number","slice","Classes","swupClasses","selectors","scope","animation","containers","isArray","join","targets","trim","classList","arguments","remove","className","split","filter","c","isSwupClass","some","startsWith","createContext","_ref","to","currentPageUrl","animate","name","action","resetScroll","reset","wait","animationScope","animationSelector","trigger","popstate","direction","undefined","scroll","_iteratorSymbol","Symbol","iterator","_settle","pact","value","_Pact","o","bind","v","observer","onFulfilled","onRejected","result","e","_this","_isSettledPact","thenable","Hooks","registry","init","hook","create","console","error","on","handler","warn","id","registration","off","before","args","defaultHandler","after","replaced","getHandlers","execute","dispatchDomEvent","reject","executeSync","registrations","_this2","results","body","check","step","_cycle","next","done","return","_fixup","TypeError","i","length","push","array","_forTo","values","_forOf","_ref2","func","ctx","apply","runAsPromise","found","sort","sortRegistrations","_ref3","_ref4","_ref5","a","b","priority","dispatchEvent","CustomEvent","detail","getAnchorElement","charAt","substring","decoded","decodeURIComponent","element","getElementById","awaitAnimations","elements","animatedElements","awaitedAnimations","map","timeout","propCount","expectedType","styles","getComputedStyle","transitionDelays","getStyleProperties","TRANSITION","transitionDurations","transitionTimeout","calculateTimeout","animationDelays","ANIMATION","animationDurations","animationTimeout","max","getTransitionInfo","endEvent","startTime","performance","now","propsTransitioned","end","onEnd","includes","isTransitionOrAnimationEvent","Error","elapsedTime","setTimeout","awaitAnimationsOnElement","key","delays","durations","concat","duration","performVisit","historyAction","referrer","classes","_temp2","animationPromise","leavePage","pagePromise","renderPage","enterPage","fetchPage","newUrl","pushState","createHistoryRecord","index","currentHistoryIndex","html","_catch","skipPopStateHandling","go","visit","shouldIgnoreVisit","_exit","_temp5","_result","headers","requestHeaders","fetch","response","status","responseUrl","FetchError","finalUrl","cache","_temp3","triggerHooks","_temp4","message","details","replaceContent","_incomingDocument$que","incomingDocument","DOMParser","parseFromString","title","innerText","currentEl","incomingEl","replaceWith","requestedUrl","isSameResolvedUrl","behavior","scrollIntoView","scrollTo","use","plugin","maybeInvalidPlugin","isSwupPlugin","_checkRequirements","_beforeMount","mount","plugins","unuse","pluginOrName","findPlugin","unmount","_afterUnmount","p","find","version","clickDelegate","log","defaults","animateHistoryBrowsing","ignoreVisit","linkSelector","Accept","_event$state","linkClickHandler","popStateHandler","checkRequirements","enable","origin","triggerWillOpenNewWindow","fromElement","historyAttr","metaKey","ctrlKey","shiftKey","altKey","button","preventDefault","top","left","triggerEl","matches","_event$state2","_event$state3","url1","url2"],"mappings":"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"}
|
package/dist/types/Swup.d.ts
CHANGED
|
@@ -1,83 +1,92 @@
|
|
|
1
1
|
import { DelegateEvent } from 'delegate-it';
|
|
2
|
-
import {
|
|
2
|
+
import { DelegateEventUnsubscribe } from './helpers/delegateEvent.js';
|
|
3
3
|
import { Cache } from './modules/Cache.js';
|
|
4
|
-
import {
|
|
4
|
+
import { Classes } from './modules/Classes.js';
|
|
5
|
+
import { Context, createContext } from './modules/Context.js';
|
|
6
|
+
import { Hooks } from './modules/Hooks.js';
|
|
7
|
+
import { awaitAnimations } from './modules/awaitAnimations.js';
|
|
8
|
+
import { visit, performVisit } from './modules/visit.js';
|
|
5
9
|
import { fetchPage } from './modules/fetchPage.js';
|
|
6
|
-
import { loadPage, performPageLoad } from './modules/loadPage.js';
|
|
7
|
-
import { on, off, triggerEvent, Handlers } from './modules/events.js';
|
|
8
10
|
import { unuse, findPlugin, Plugin } from './modules/plugins.js';
|
|
9
|
-
import { updateTransition, shouldSkipTransition } from './modules/transitions.js';
|
|
10
|
-
export type Transition = {
|
|
11
|
-
from?: string;
|
|
12
|
-
to?: string;
|
|
13
|
-
custom?: string;
|
|
14
|
-
};
|
|
15
|
-
type DelegatedListeners = {
|
|
16
|
-
click?: Unsubscribe;
|
|
17
|
-
};
|
|
18
11
|
export type Options = {
|
|
12
|
+
/** Whether history visits are animated. Default: `false` */
|
|
19
13
|
animateHistoryBrowsing: boolean;
|
|
14
|
+
/** Selector for detecting animation timing. Default: `[class*="transition-"]` */
|
|
20
15
|
animationSelector: string | false;
|
|
21
|
-
|
|
16
|
+
/** Elements on which to add animation classes. Default: `html` element */
|
|
17
|
+
animationScope: 'html' | 'containers';
|
|
18
|
+
/** Enable in-memory page cache. Default: `true` */
|
|
22
19
|
cache: boolean;
|
|
20
|
+
/** Content containers to be replaced on page visits. Default: `['#swup']` */
|
|
23
21
|
containers: string[];
|
|
24
|
-
|
|
25
|
-
plugins: Plugin[];
|
|
26
|
-
skipPopStateHandling: (event: any) => boolean;
|
|
22
|
+
/** Callback for ignoring visits. Receives the element and event that triggered the visit. */
|
|
27
23
|
ignoreVisit: (url: string, { el, event }: {
|
|
28
24
|
el?: Element;
|
|
29
25
|
event?: Event;
|
|
30
26
|
}) => boolean;
|
|
27
|
+
/** Selector for links that trigger visits. Default: `'a[href]'` */
|
|
28
|
+
linkSelector: string;
|
|
29
|
+
/** Plugins to register on startup. */
|
|
30
|
+
plugins: Plugin[];
|
|
31
|
+
/** Custom headers sent along with fetch requests. */
|
|
32
|
+
requestHeaders: Record<string, string>;
|
|
33
|
+
/** Rewrite URLs before loading them. */
|
|
31
34
|
resolveUrl: (url: string) => string;
|
|
35
|
+
/** Callback for telling swup to ignore certain popstate events. */
|
|
36
|
+
skipPopStateHandling: (event: any) => boolean;
|
|
32
37
|
};
|
|
33
38
|
export default class Swup {
|
|
39
|
+
/** Library version */
|
|
34
40
|
version: string;
|
|
35
|
-
|
|
36
|
-
scrollToElement: string | null;
|
|
41
|
+
/** Options passed into the instance */
|
|
37
42
|
options: Options;
|
|
43
|
+
/** Registered plugin instances */
|
|
38
44
|
plugins: Plugin[];
|
|
39
|
-
|
|
45
|
+
/** Global context of the current visit */
|
|
46
|
+
context: Context;
|
|
47
|
+
/** Cache instance */
|
|
40
48
|
cache: Cache;
|
|
49
|
+
/** Hook registry */
|
|
50
|
+
hooks: Hooks;
|
|
51
|
+
/** Animation class manager */
|
|
52
|
+
classes: Classes;
|
|
53
|
+
/** URL of the currently visible page */
|
|
41
54
|
currentPageUrl: string;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
delegateEvent: <Selector extends string, TEvent extends keyof GlobalEventHandlersEventMap>(selector: Selector, type: TEvent, callback: import("delegate-it").DelegateEventHandler<GlobalEventHandlersEventMap[TEvent], Element>, options?: import("delegate-it").DelegateOptions | undefined) =>
|
|
55
|
-
on: typeof on;
|
|
56
|
-
off: typeof off;
|
|
57
|
-
updateTransition: typeof updateTransition;
|
|
58
|
-
shouldSkipTransition: typeof shouldSkipTransition;
|
|
59
|
-
getAnimationPromises: typeof getAnimationPromises;
|
|
60
|
-
getPageData: (this: Swup, request: XMLHttpRequest) => import("./modules/getPageData.js").PageData | null;
|
|
55
|
+
/** Index of the current history entry */
|
|
56
|
+
currentHistoryIndex: number;
|
|
57
|
+
/** Delegated event subscription handle */
|
|
58
|
+
private clickDelegate?;
|
|
59
|
+
visit: typeof visit;
|
|
60
|
+
performVisit: typeof performVisit;
|
|
61
|
+
leavePage: (this: Swup) => Promise<void>;
|
|
62
|
+
renderPage: (this: Swup, requestedUrl: string, page: import("./modules/fetchPage.js").PageData) => Promise<void>;
|
|
63
|
+
replaceContent: (this: Swup, { html }: import("./modules/fetchPage.js").PageData, { containers }?: {
|
|
64
|
+
containers: string[];
|
|
65
|
+
}) => boolean;
|
|
66
|
+
enterPage: (this: Swup) => Promise<void>;
|
|
67
|
+
delegateEvent: <Selector extends string, TEvent extends keyof GlobalEventHandlersEventMap>(selector: Selector, type: TEvent, callback: import("delegate-it").DelegateEventHandler<GlobalEventHandlersEventMap[TEvent], Element>, options?: import("delegate-it").DelegateOptions | undefined) => DelegateEventUnsubscribe;
|
|
61
68
|
fetchPage: typeof fetchPage;
|
|
69
|
+
awaitAnimations: typeof awaitAnimations;
|
|
62
70
|
getAnchorElement: (hash: string) => Element | null;
|
|
63
|
-
log: (message: string, context?: any) => void;
|
|
64
71
|
use: (this: Swup, plugin: unknown) => Plugin[] | undefined;
|
|
65
72
|
unuse: typeof unuse;
|
|
66
73
|
findPlugin: typeof findPlugin;
|
|
67
74
|
getCurrentUrl: ({ hash }?: {
|
|
68
75
|
hash?: boolean | undefined;
|
|
69
76
|
}) => string;
|
|
70
|
-
|
|
77
|
+
createContext: typeof createContext;
|
|
78
|
+
log: (message: string, context?: any) => void;
|
|
79
|
+
/** Default options before merging user options */
|
|
71
80
|
defaults: Options;
|
|
72
81
|
constructor(options?: Partial<Options>);
|
|
73
|
-
|
|
74
|
-
|
|
82
|
+
checkRequirements(): boolean;
|
|
83
|
+
enable(): Promise<void>;
|
|
84
|
+
destroy(): Promise<void>;
|
|
75
85
|
shouldIgnoreVisit(href: string, { el, event }?: {
|
|
76
86
|
el?: Element;
|
|
77
87
|
event?: Event;
|
|
78
88
|
}): boolean;
|
|
79
89
|
linkClickHandler(event: DelegateEvent<MouseEvent>): void;
|
|
80
|
-
handleLinkToSamePage(url: string, hash: string, event: DelegateEvent<MouseEvent>): void;
|
|
81
90
|
triggerWillOpenNewWindow(triggerEl: Element): boolean;
|
|
82
91
|
popStateHandler(event: PopStateEvent): void;
|
|
83
92
|
/**
|
|
@@ -94,4 +103,3 @@ export default class Swup {
|
|
|
94
103
|
*/
|
|
95
104
|
isSameResolvedUrl(url1: string, url2: string): boolean;
|
|
96
105
|
}
|
|
97
|
-
export {};
|
|
@@ -4,18 +4,21 @@
|
|
|
4
4
|
*
|
|
5
5
|
*/
|
|
6
6
|
export declare class Location extends URL {
|
|
7
|
-
constructor(url: string, base?: string);
|
|
7
|
+
constructor(url: URL | string, base?: string);
|
|
8
|
+
/**
|
|
9
|
+
* The full local path including query params.
|
|
10
|
+
*/
|
|
8
11
|
get url(): string;
|
|
9
12
|
/**
|
|
10
13
|
* Instantiate a Location from an element's href attribute
|
|
11
|
-
* @param
|
|
12
|
-
* @
|
|
14
|
+
* @param el
|
|
15
|
+
* @returns new Location instance
|
|
13
16
|
*/
|
|
14
|
-
static fromElement(el:
|
|
17
|
+
static fromElement(el: Element): Location;
|
|
15
18
|
/**
|
|
16
19
|
* Instantiate a Location from a URL object or string
|
|
17
|
-
* @param
|
|
18
|
-
* @
|
|
20
|
+
* @param url
|
|
21
|
+
* @returns new Location instance
|
|
19
22
|
*/
|
|
20
|
-
static fromUrl(url: string): Location;
|
|
23
|
+
static fromUrl(url: URL | string): Location;
|
|
21
24
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DelegateEventHandler, DelegateOptions } from 'delegate-it';
|
|
2
|
-
export type
|
|
2
|
+
export type DelegateEventUnsubscribe = {
|
|
3
3
|
destroy: () => void;
|
|
4
4
|
};
|
|
5
|
-
export declare const delegateEvent: <Selector extends string, TEvent extends keyof GlobalEventHandlersEventMap>(selector: Selector, type: TEvent, callback: DelegateEventHandler<GlobalEventHandlersEventMap[TEvent], Element>, options?: DelegateOptions) =>
|
|
5
|
+
export declare const delegateEvent: <Selector extends string, TEvent extends keyof GlobalEventHandlersEventMap>(selector: Selector, type: TEvent, callback: DelegateEventHandler<GlobalEventHandlersEventMap[TEvent], Element>, options?: DelegateOptions) => DelegateEventUnsubscribe;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Path, ParseOptions, TokensToRegexpOptions, RegexpToFunctionOptions, MatchFunction } from 'path-to-regexp';
|
|
2
|
+
export { Path };
|
|
3
|
+
export declare const matchPath: <P extends object = object>(path: Path, options?: ParseOptions & TokensToRegexpOptions & RegexpToFunctionOptions) => MatchFunction<P>;
|
package/dist/types/helpers.d.ts
CHANGED
|
@@ -2,9 +2,6 @@ export { classify } from './helpers/classify.js';
|
|
|
2
2
|
export { createHistoryRecord } from './helpers/createHistoryRecord.js';
|
|
3
3
|
export { updateHistoryRecord } from './helpers/updateHistoryRecord.js';
|
|
4
4
|
export { delegateEvent } from './helpers/delegateEvent.js';
|
|
5
|
-
export { getDataFromHtml } from './helpers/getDataFromHtml.js';
|
|
6
|
-
export { fetch } from './helpers/fetch.js';
|
|
7
5
|
export { getCurrentUrl } from './helpers/getCurrentUrl.js';
|
|
8
6
|
export { Location } from './helpers/Location.js';
|
|
9
|
-
export {
|
|
10
|
-
export { cleanupAnimationClasses } from './helpers/cleanupAnimationClasses.js';
|
|
7
|
+
export { matchPath } from './helpers/matchPath.js';
|