{ "version": 3, "sources": ["../shared/components/autofocus.js", "../shared/components/content_loading.js", "../shared/components/data_confirm.js", "../shared/components/file_input.js", "../shared/components/input_type_number.js", "../../../../../shared/node_modules/lazysizes/lazysizes.js", "../../../../../shared/node_modules/lazysizes/plugins/parent-fit/ls.parent-fit.js", "../frontend/components/events_page.js", "../frontend/components/filterable_list.js", "../../../../../shared/src/js/util/util.js", "../../../../../shared/src/js/util/dom-events.js", "../../../../../shared/src/js/util/viewport-size.js", "../../../../../shared/src/js/slide/pan-bounds.js", "../../../../../shared/src/js/slide/zoom-level.js", "../../../../../shared/src/js/slide/slide.js", "../../../../../shared/src/js/gestures/drag-handler.js", "../../../../../shared/src/js/gestures/zoom-handler.js", "../../../../../shared/src/js/gestures/tap-handler.js", "../../../../../shared/src/js/gestures/gestures.js", "../../../../../shared/src/js/main-scroll.js", "../../../../../shared/src/js/keyboard.js", "../../../../../shared/src/js/util/css-animation.js", "../../../../../shared/src/js/util/spring-easer.js", "../../../../../shared/src/js/util/spring-animation.js", "../../../../../shared/src/js/util/animations.js", "../../../../../shared/src/js/scroll-wheel.js", "../../../../../shared/src/js/ui/ui-element.js", "../../../../../shared/src/js/ui/button-arrow.js", "../../../../../shared/src/js/ui/button-close.js", "../../../../../shared/src/js/ui/button-zoom.js", "../../../../../shared/src/js/ui/loading-indicator.js", "../../../../../shared/src/js/ui/counter-indicator.js", "../../../../../shared/src/js/ui/ui.js", "../../../../../shared/src/js/slide/get-thumb-bounds.js", "../../../../../shared/src/js/core/eventable.js", "../../../../../shared/src/js/slide/placeholder.js", "../../../../../shared/src/js/slide/content.js", "../../../../../shared/src/js/core/base.js", "../../../../../shared/src/js/opener.js", "../../../../../shared/src/js/slide/loader.js", "../../../../../shared/src/js/photoswipe.js", "../frontend/components/lightbox_image.js", "../frontend/components/search_form.js", "../frontend/components/track_page_view.js", "../../../../../shared/node_modules/unpoly/unpoly.js", "../shared/util/environment.js", "../shared/config/unpoly.js", "../shared/config/unpoly_follow_all.js", "../frontend/config/unpoly.js", "import-glob:./shared/components/**/*.js", "../shared/util/application.js", "../shared/util/timeout.js", "../shared/components/flash_message.js", "../shared/components/lazysizes.js", "import-glob:./frontend/components/**/*.js", "../../../../../shared/src/js/util/util.js", "../../../../../shared/src/js/core/eventable.js", "../../../../../shared/src/js/slide/placeholder.js", "../../../../../shared/src/js/slide/content.js", "../../../../../shared/src/js/core/base.js", "../../../../../shared/src/js/util/viewport-size.js", "../../../../../shared/src/js/slide/zoom-level.js", "../../../../../shared/src/js/slide/loader.js", "../../../../../shared/src/js/lightbox/lightbox.js", "../frontend/components/lightbox_gallery.js"], "sourcesContent": ["up.compiler('[autofocus]', (element) => {\n // This compiler will not try to autofocus a field itself (browser handles [autofocus] itself),\n // but for autofocused input fields, it places the caret at the end of the line.\n\n if (element.matches('input')) {\n const length = element.value.length\n\n try {\n element.setSelectionRange(length, length)\n } catch (error) {\n // setSelectionRange is defined but unsupported for some input types (e.g. email), throwing an error.\n }\n }\n})\n", "up.compiler('body', (element) => {\n\n function setLoading(isLoading) {\n element.classList.toggle('content-loading', isLoading)\n }\n\n return [\n up.on('up:request:late', () => { setLoading(true) }),\n up.on('up:request:recover', () => { setLoading(false) }),\n ]\n\n})\n", "up.compiler('[data-confirm]', (element) => {\n\n function onClick(event) {\n const message = element.getAttribute('data-confirm')\n if (!confirm(message)) up.event.halt(event)\n }\n\n element.addEventListener('click', onClick)\n\n})\n", "up.compiler('[file-input]', (element) => {\n\n const input = element.querySelector('input[type=\"file\"]')\n const filename = element.querySelector('[file-input--filename]')\n\n const previewImage = element.querySelector('img[file-input--preview]')\n\n function onDragOver(event) {\n event.preventDefault()\n }\n\n function onDrop(event) {\n event.preventDefault()\n input.files = event.dataTransfer.files\n onFilePicked()\n }\n\n function onFilePicked() {\n updateFilename()\n updatePreview()\n }\n\n function updateFilename() {\n const filenames = Array.from(input.files).map(file => file.name)\n filename.innerText = filenames.join(', ')\n }\n\n function updatePreview() {\n if (!previewImage) return\n\n if (input.files.length === 1) {\n const file = input.files[0]\n\n readImageAsDataURL(file).then((dataURL) => {\n previewImage.src = dataURL\n })\n } else {\n previewImage.src = '//:0'\n }\n }\n\n function readImageAsDataURL(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.addEventListener('load', () => {\n resolve(reader.result)\n })\n reader.readAsDataURL(file)\n })\n }\n\n input.addEventListener('change', onFilePicked)\n element.addEventListener('drop', onDrop)\n element.addEventListener('dragover', onDragOver)\n element.classList.add('drop-area')\n\n})\n", "up.compiler('input[type=\"number\"]', (element) => {\n\n // Number inputs allow incrementing/decrementing with arrow keys, and support exponential notation\n // (in some browsers even regular letters). We want neither.\n element.addEventListener('keydown', (event) => {\n const key = event.key\n if (key === 'ArrowUp' || key === 'ArrowDown' || (key.length === 1 && !event.ctrlKey && !event.altKey && !key.match(/[0-9\\-+,.]/))) {\n event.preventDefault()\n }\n })\n\n // Some browser (at least Firefox) will increment/decrement a number when using the mouse's scroll wheel\n // above a focused number input. Since this can lead to users changing values by accident, we want to avoid that.\n element.addEventListener('wheel', (event) => {\n if (element.matches(':focus')) {\n event.preventDefault()\n }\n })\n\n})\n", "(function(window, factory) {\n\tvar lazySizes = factory(window, window.document, Date);\n\twindow.lazySizes = lazySizes;\n\tif(typeof module == 'object' && module.exports){\n\t\tmodule.exports = lazySizes;\n\t}\n}(typeof window != 'undefined' ?\n window : {}, \n/**\n * import(\"./types/global\")\n * @typedef { import(\"./types/lazysizes-config\").LazySizesConfigPartial } LazySizesConfigPartial\n */\nfunction l(window, document, Date) { // Pass in the window Date function also for SSR because the Date class can be lost\n\t'use strict';\n\t/*jshint eqnull:true */\n\n\tvar lazysizes,\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tlazySizesCfg;\n\n\t(function(){\n\t\tvar prop;\n\n\t\tvar lazySizesDefaults = {\n\t\t\tlazyClass: 'lazyload',\n\t\t\tloadedClass: 'lazyloaded',\n\t\t\tloadingClass: 'lazyloading',\n\t\t\tpreloadClass: 'lazypreload',\n\t\t\terrorClass: 'lazyerror',\n\t\t\t//strictClass: 'lazystrict',\n\t\t\tautosizesClass: 'lazyautosizes',\n\t\t\tfastLoadedClass: 'ls-is-cached',\n\t\t\tiframeLoadMode: 0,\n\t\t\tsrcAttr: 'data-src',\n\t\t\tsrcsetAttr: 'data-srcset',\n\t\t\tsizesAttr: 'data-sizes',\n\t\t\t//preloadAfterLoad: false,\n\t\t\tminSize: 40,\n\t\t\tcustomMedia: {},\n\t\t\tinit: true,\n\t\t\texpFactor: 1.5,\n\t\t\thFac: 0.8,\n\t\t\tloadMode: 2,\n\t\t\tloadHidden: true,\n\t\t\tricTimeout: 0,\n\t\t\tthrottleDelay: 125,\n\t\t};\n\n\t\tlazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {};\n\n\t\tfor(prop in lazySizesDefaults){\n\t\t\tif(!(prop in lazySizesCfg)){\n\t\t\t\tlazySizesCfg[prop] = lazySizesDefaults[prop];\n\t\t\t}\n\t\t}\n\t})();\n\n\tif (!document || !document.getElementsByClassName) {\n\t\treturn {\n\t\t\tinit: function () {},\n\t\t\t/**\n\t\t\t * @type { LazySizesConfigPartial }\n\t\t\t */\n\t\t\tcfg: lazySizesCfg,\n\t\t\t/**\n\t\t\t * @type { true }\n\t\t\t */\n\t\t\tnoSupport: true,\n\t\t};\n\t}\n\n\tvar docElem = document.documentElement;\n\n\tvar supportPicture = window.HTMLPictureElement;\n\n\tvar _addEventListener = 'addEventListener';\n\n\tvar _getAttribute = 'getAttribute';\n\n\t/**\n\t * Update to bind to window because 'this' becomes null during SSR\n\t * builds.\n\t */\n\tvar addEventListener = window[_addEventListener].bind(window);\n\n\tvar setTimeout = window.setTimeout;\n\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n\n\tvar requestIdleCallback = window.requestIdleCallback;\n\n\tvar regPicture = /^picture$/i;\n\n\tvar loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];\n\n\tvar regClassCache = {};\n\n\tvar forEach = Array.prototype.forEach;\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar hasClass = function(ele, cls) {\n\t\tif(!regClassCache[cls]){\n\t\t\tregClassCache[cls] = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n\t\t}\n\t\treturn regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar addClass = function(ele, cls) {\n\t\tif (!hasClass(ele, cls)){\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);\n\t\t}\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar removeClass = function(ele, cls) {\n\t\tvar reg;\n\t\tif ((reg = hasClass(ele,cls))) {\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));\n\t\t}\n\t};\n\n\tvar addRemoveLoadEvents = function(dom, fn, add){\n\t\tvar action = add ? _addEventListener : 'removeEventListener';\n\t\tif(add){\n\t\t\taddRemoveLoadEvents(dom, fn);\n\t\t}\n\t\tloadEvents.forEach(function(evt){\n\t\t\tdom[action](evt, fn);\n\t\t});\n\t};\n\n\t/**\n\t * @param elem { Element }\n\t * @param name { string }\n\t * @param detail { any }\n\t * @param noBubbles { boolean }\n\t * @param noCancelable { boolean }\n\t * @returns { CustomEvent }\n\t */\n\tvar triggerEvent = function(elem, name, detail, noBubbles, noCancelable){\n\t\tvar event = document.createEvent('Event');\n\n\t\tif(!detail){\n\t\t\tdetail = {};\n\t\t}\n\n\t\tdetail.instance = lazysizes;\n\n\t\tevent.initEvent(name, !noBubbles, !noCancelable);\n\n\t\tevent.detail = detail;\n\n\t\telem.dispatchEvent(event);\n\t\treturn event;\n\t};\n\n\tvar updatePolyfill = function (el, full){\n\t\tvar polyfill;\n\t\tif( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){\n\t\t\tif(full && full.src && !el[_getAttribute]('srcset')){\n\t\t\t\tel.setAttribute('srcset', full.src);\n\t\t\t}\n\t\t\tpolyfill({reevaluate: true, elements: [el]});\n\t\t} else if(full && full.src){\n\t\t\tel.src = full.src;\n\t\t}\n\t};\n\n\tvar getCSS = function (elem, style){\n\t\treturn (getComputedStyle(elem, null) || {})[style];\n\t};\n\n\t/**\n\t *\n\t * @param elem { Element }\n\t * @param parent { Element }\n\t * @param [width] {number}\n\t * @returns {number}\n\t */\n\tvar getWidth = function(elem, parent, width){\n\t\twidth = width || elem.offsetWidth;\n\n\t\twhile(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){\n\t\t\twidth = parent.offsetWidth;\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\treturn width;\n\t};\n\n\tvar rAF = (function(){\n\t\tvar running, waiting;\n\t\tvar firstFns = [];\n\t\tvar secondFns = [];\n\t\tvar fns = firstFns;\n\n\t\tvar run = function(){\n\t\t\tvar runFns = fns;\n\n\t\t\tfns = firstFns.length ? secondFns : firstFns;\n\n\t\t\trunning = true;\n\t\t\twaiting = false;\n\n\t\t\twhile(runFns.length){\n\t\t\t\trunFns.shift()();\n\t\t\t}\n\n\t\t\trunning = false;\n\t\t};\n\n\t\tvar rafBatch = function(fn, queue){\n\t\t\tif(running && !queue){\n\t\t\t\tfn.apply(this, arguments);\n\t\t\t} else {\n\t\t\t\tfns.push(fn);\n\n\t\t\t\tif(!waiting){\n\t\t\t\t\twaiting = true;\n\t\t\t\t\t(document.hidden ? setTimeout : requestAnimationFrame)(run);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\trafBatch._lsFlush = run;\n\n\t\treturn rafBatch;\n\t})();\n\n\tvar rAFIt = function(fn, simple){\n\t\treturn simple ?\n\t\t\tfunction() {\n\t\t\t\trAF(fn);\n\t\t\t} :\n\t\t\tfunction(){\n\t\t\t\tvar that = this;\n\t\t\t\tvar args = arguments;\n\t\t\t\trAF(function(){\n\t\t\t\t\tfn.apply(that, args);\n\t\t\t\t});\n\t\t\t}\n\t\t;\n\t};\n\n\tvar throttle = function(fn){\n\t\tvar running;\n\t\tvar lastTime = 0;\n\t\tvar gDelay = lazySizesCfg.throttleDelay;\n\t\tvar rICTimeout = lazySizesCfg.ricTimeout;\n\t\tvar run = function(){\n\t\t\trunning = false;\n\t\t\tlastTime = Date.now();\n\t\t\tfn();\n\t\t};\n\t\tvar idleCallback = requestIdleCallback && rICTimeout > 49 ?\n\t\t\tfunction(){\n\t\t\t\trequestIdleCallback(run, {timeout: rICTimeout});\n\n\t\t\t\tif(rICTimeout !== lazySizesCfg.ricTimeout){\n\t\t\t\t\trICTimeout = lazySizesCfg.ricTimeout;\n\t\t\t\t}\n\t\t\t} :\n\t\t\trAFIt(function(){\n\t\t\t\tsetTimeout(run);\n\t\t\t}, true)\n\t\t;\n\n\t\treturn function(isPriority){\n\t\t\tvar delay;\n\n\t\t\tif((isPriority = isPriority === true)){\n\t\t\t\trICTimeout = 33;\n\t\t\t}\n\n\t\t\tif(running){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trunning = true;\n\n\t\t\tdelay = gDelay - (Date.now() - lastTime);\n\n\t\t\tif(delay < 0){\n\t\t\t\tdelay = 0;\n\t\t\t}\n\n\t\t\tif(isPriority || delay < 9){\n\t\t\t\tidleCallback();\n\t\t\t} else {\n\t\t\t\tsetTimeout(idleCallback, delay);\n\t\t\t}\n\t\t};\n\t};\n\n\t//based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html\n\tvar debounce = function(func) {\n\t\tvar timeout, timestamp;\n\t\tvar wait = 99;\n\t\tvar run = function(){\n\t\t\ttimeout = null;\n\t\t\tfunc();\n\t\t};\n\t\tvar later = function() {\n\t\t\tvar last = Date.now() - timestamp;\n\n\t\t\tif (last < wait) {\n\t\t\t\tsetTimeout(later, wait - last);\n\t\t\t} else {\n\t\t\t\t(requestIdleCallback || run)(run);\n\t\t\t}\n\t\t};\n\n\t\treturn function() {\n\t\t\ttimestamp = Date.now();\n\n\t\t\tif (!timeout) {\n\t\t\t\ttimeout = setTimeout(later, wait);\n\t\t\t}\n\t\t};\n\t};\n\n\tvar loader = (function(){\n\t\tvar preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;\n\n\t\tvar eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;\n\n\t\tvar regImg = /^img$/i;\n\t\tvar regIframe = /^iframe$/i;\n\n\t\tvar supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent));\n\n\t\tvar shrinkExpand = 0;\n\t\tvar currentExpand = 0;\n\n\t\tvar isLoading = 0;\n\t\tvar lowRuns = -1;\n\n\t\tvar resetPreloading = function(e){\n\t\t\tisLoading--;\n\t\t\tif(!e || isLoading < 0 || !e.target){\n\t\t\t\tisLoading = 0;\n\t\t\t}\n\t\t};\n\n\t\tvar isVisible = function (elem) {\n\t\t\tif (isBodyHidden == null) {\n\t\t\t\tisBodyHidden = getCSS(document.body, 'visibility') == 'hidden';\n\t\t\t}\n\n\t\t\treturn isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden');\n\t\t};\n\n\t\tvar isNestedVisible = function(elem, elemExpand){\n\t\t\tvar outerRect;\n\t\t\tvar parent = elem;\n\t\t\tvar visible = isVisible(elem);\n\n\t\t\teLtop -= elemExpand;\n\t\t\teLbottom += elemExpand;\n\t\t\teLleft -= elemExpand;\n\t\t\teLright += elemExpand;\n\n\t\t\twhile(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){\n\t\t\t\tvisible = ((getCSS(parent, 'opacity') || 1) > 0);\n\n\t\t\t\tif(visible && getCSS(parent, 'overflow') != 'visible'){\n\t\t\t\t\touterRect = parent.getBoundingClientRect();\n\t\t\t\t\tvisible = eLright > outerRect.left &&\n\t\t\t\t\t\teLleft < outerRect.right &&\n\t\t\t\t\t\teLbottom > outerRect.top - 1 &&\n\t\t\t\t\t\teLtop < outerRect.bottom + 1\n\t\t\t\t\t;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn visible;\n\t\t};\n\n\t\tvar checkElements = function() {\n\t\t\tvar eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal,\n\t\t\t\tbeforeExpandVal, defaultExpand, preloadExpand, hFac;\n\t\t\tvar lazyloadElems = lazysizes.elements;\n\n\t\t\tif((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){\n\n\t\t\t\ti = 0;\n\n\t\t\t\tlowRuns++;\n\n\t\t\t\tfor(; i < eLlen; i++){\n\n\t\t\t\t\tif(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}\n\n\t\t\t\t\tif(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;}\n\n\t\t\t\t\tif(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){\n\t\t\t\t\t\telemExpand = currentExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!defaultExpand) {\n\t\t\t\t\t\tdefaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ?\n\t\t\t\t\t\t\tdocElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 :\n\t\t\t\t\t\t\tlazySizesCfg.expand;\n\n\t\t\t\t\t\tlazysizes._defEx = defaultExpand;\n\n\t\t\t\t\t\tpreloadExpand = defaultExpand * lazySizesCfg.expFactor;\n\t\t\t\t\t\thFac = lazySizesCfg.hFac;\n\t\t\t\t\t\tisBodyHidden = null;\n\n\t\t\t\t\t\tif(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){\n\t\t\t\t\t\t\tcurrentExpand = preloadExpand;\n\t\t\t\t\t\t\tlowRuns = 0;\n\t\t\t\t\t\t} else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){\n\t\t\t\t\t\t\tcurrentExpand = defaultExpand;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentExpand = shrinkExpand;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(beforeExpandVal !== elemExpand){\n\t\t\t\t\t\teLvW = innerWidth + (elemExpand * hFac);\n\t\t\t\t\t\telvH = innerHeight + elemExpand;\n\t\t\t\t\t\telemNegativeExpand = elemExpand * -1;\n\t\t\t\t\t\tbeforeExpandVal = elemExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\trect = lazyloadElems[i].getBoundingClientRect();\n\n\t\t\t\t\tif ((eLbottom = rect.bottom) >= elemNegativeExpand &&\n\t\t\t\t\t\t(eLtop = rect.top) <= elvH &&\n\t\t\t\t\t\t(eLright = rect.right) >= elemNegativeExpand * hFac &&\n\t\t\t\t\t\t(eLleft = rect.left) <= eLvW &&\n\t\t\t\t\t\t(eLbottom || eLright || eLleft || eLtop) &&\n\t\t\t\t\t\t(lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) &&\n\t\t\t\t\t\t((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){\n\t\t\t\t\t\tunveilElement(lazyloadElems[i]);\n\t\t\t\t\t\tloadedSomething = true;\n\t\t\t\t\t\tif(isLoading > 9){break;}\n\t\t\t\t\t} else if(!loadedSomething && isCompleted && !autoLoadElem &&\n\t\t\t\t\t\tisLoading < 4 && lowRuns < 4 && loadMode > 2 &&\n\t\t\t\t\t\t(preloadElems[0] || lazySizesCfg.preloadAfterLoad) &&\n\t\t\t\t\t\t(preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){\n\t\t\t\t\t\tautoLoadElem = preloadElems[0] || lazyloadElems[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(autoLoadElem && !loadedSomething){\n\t\t\t\t\tunveilElement(autoLoadElem);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar throttledCheckElements = throttle(checkElements);\n\n\t\tvar switchLoadingClass = function(e){\n\t\t\tvar elem = e.target;\n\n\t\t\tif (elem._lazyCache) {\n\t\t\t\tdelete elem._lazyCache;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresetPreloading(e);\n\t\t\taddClass(elem, lazySizesCfg.loadedClass);\n\t\t\tremoveClass(elem, lazySizesCfg.loadingClass);\n\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass);\n\t\t\ttriggerEvent(elem, 'lazyloaded');\n\t\t};\n\t\tvar rafedSwitchLoadingClass = rAFIt(switchLoadingClass);\n\t\tvar rafSwitchLoadingClass = function(e){\n\t\t\trafedSwitchLoadingClass({target: e.target});\n\t\t};\n\n\t\tvar changeIframeSrc = function(elem, src){\n\t\t\tvar loadMode = elem.getAttribute('data-load-mode') || lazySizesCfg.iframeLoadMode;\n\n\t\t\t// loadMode can be also a string!\n\t\t\tif (loadMode == 0) {\n\t\t\t\telem.contentWindow.location.replace(src);\n\t\t\t} else if (loadMode == 1) {\n\t\t\t\telem.src = src;\n\t\t\t}\n\t\t};\n\n\t\tvar handleSources = function(source){\n\t\t\tvar customMedia;\n\n\t\t\tvar sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);\n\n\t\t\tif( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){\n\t\t\t\tsource.setAttribute('media', customMedia);\n\t\t\t}\n\n\t\t\tif(sourceSrcset){\n\t\t\t\tsource.setAttribute('srcset', sourceSrcset);\n\t\t\t}\n\t\t};\n\n\t\tvar lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){\n\t\t\tvar src, srcset, parent, isPicture, event, firesLoad;\n\n\t\t\tif(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){\n\n\t\t\t\tif(sizes){\n\t\t\t\t\tif(isAuto){\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.autosizesClass);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.setAttribute('sizes', sizes);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsrcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);\n\t\t\t\tsrc = elem[_getAttribute](lazySizesCfg.srcAttr);\n\n\t\t\t\tif(isImg) {\n\t\t\t\t\tparent = elem.parentNode;\n\t\t\t\t\tisPicture = parent && regPicture.test(parent.nodeName || '');\n\t\t\t\t}\n\n\t\t\t\tfiresLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));\n\n\t\t\t\tevent = {target: elem};\n\n\t\t\t\taddClass(elem, lazySizesCfg.loadingClass);\n\n\t\t\t\tif(firesLoad){\n\t\t\t\t\tclearTimeout(resetPreloadingTimer);\n\t\t\t\t\tresetPreloadingTimer = setTimeout(resetPreloading, 2500);\n\t\t\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass, true);\n\t\t\t\t}\n\n\t\t\t\tif(isPicture){\n\t\t\t\t\tforEach.call(parent.getElementsByTagName('source'), handleSources);\n\t\t\t\t}\n\n\t\t\t\tif(srcset){\n\t\t\t\t\telem.setAttribute('srcset', srcset);\n\t\t\t\t} else if(src && !isPicture){\n\t\t\t\t\tif(regIframe.test(elem.nodeName)){\n\t\t\t\t\t\tchangeIframeSrc(elem, src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.src = src;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(isImg && (srcset || isPicture)){\n\t\t\t\t\tupdatePolyfill(elem, {src: src});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(elem._lazyRace){\n\t\t\t\tdelete elem._lazyRace;\n\t\t\t}\n\t\t\tremoveClass(elem, lazySizesCfg.lazyClass);\n\n\t\t\trAF(function(){\n\t\t\t\t// Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015)\n\t\t\t\tvar isLoaded = elem.complete && elem.naturalWidth > 1;\n\n\t\t\t\tif( !firesLoad || isLoaded){\n\t\t\t\t\tif (isLoaded) {\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.fastLoadedClass);\n\t\t\t\t\t}\n\t\t\t\t\tswitchLoadingClass(event);\n\t\t\t\t\telem._lazyCache = true;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tif ('_lazyCache' in elem) {\n\t\t\t\t\t\t\tdelete elem._lazyCache;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 9);\n\t\t\t\t}\n\t\t\t\tif (elem.loading == 'lazy') {\n\t\t\t\t\tisLoading--;\n\t\t\t\t}\n\t\t\t}, true);\n\t\t});\n\n\t\t/**\n\t\t *\n\t\t * @param elem { Element }\n\t\t */\n\t\tvar unveilElement = function (elem){\n\t\t\tif (elem._lazyRace) {return;}\n\t\t\tvar detail;\n\n\t\t\tvar isImg = regImg.test(elem.nodeName);\n\n\t\t\t//allow using sizes=\"auto\", but don't use. it's invalid. Use data-sizes=\"auto\" or a valid value for sizes instead (i.e.: sizes=\"80vw\")\n\t\t\tvar sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes'));\n\t\t\tvar isAuto = sizes == 'auto';\n\n\t\t\tif( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;}\n\n\t\t\tdetail = triggerEvent(elem, 'lazyunveilread').detail;\n\n\t\t\tif(isAuto){\n\t\t\t\t autoSizer.updateElem(elem, true, elem.offsetWidth);\n\t\t\t}\n\n\t\t\telem._lazyRace = true;\n\t\t\tisLoading++;\n\n\t\t\tlazyUnveil(elem, detail, isAuto, sizes, isImg);\n\t\t};\n\n\t\tvar afterScroll = debounce(function(){\n\t\t\tlazySizesCfg.loadMode = 3;\n\t\t\tthrottledCheckElements();\n\t\t});\n\n\t\tvar altLoadmodeScrollListner = function(){\n\t\t\tif(lazySizesCfg.loadMode == 3){\n\t\t\t\tlazySizesCfg.loadMode = 2;\n\t\t\t}\n\t\t\tafterScroll();\n\t\t};\n\n\t\tvar onload = function(){\n\t\t\tif(isCompleted){return;}\n\t\t\tif(Date.now() - started < 999){\n\t\t\t\tsetTimeout(onload, 999);\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\tisCompleted = true;\n\n\t\t\tlazySizesCfg.loadMode = 3;\n\n\t\t\tthrottledCheckElements();\n\n\t\t\taddEventListener('scroll', altLoadmodeScrollListner, true);\n\t\t};\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tstarted = Date.now();\n\n\t\t\t\tlazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass);\n\t\t\t\tpreloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass);\n\n\t\t\t\taddEventListener('scroll', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('resize', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('pageshow', function (e) {\n\t\t\t\t\tif (e.persisted) {\n\t\t\t\t\t\tvar loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass);\n\n\t\t\t\t\t\tif (loadingElements.length && loadingElements.forEach) {\n\t\t\t\t\t\t\trequestAnimationFrame(function () {\n\t\t\t\t\t\t\t\tloadingElements.forEach( function (img) {\n\t\t\t\t\t\t\t\t\tif (img.complete) {\n\t\t\t\t\t\t\t\t\t\tunveilElement(img);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\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});\n\n\t\t\t\tif(window.MutationObserver){\n\t\t\t\t\tnew MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );\n\t\t\t\t} else {\n\t\t\t\t\tdocElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);\n\t\t\t\t\tdocElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);\n\t\t\t\t\tsetInterval(throttledCheckElements, 999);\n\t\t\t\t}\n\n\t\t\t\taddEventListener('hashchange', throttledCheckElements, true);\n\n\t\t\t\t//, 'fullscreenchange'\n\t\t\t\t['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){\n\t\t\t\t\tdocument[_addEventListener](name, throttledCheckElements, true);\n\t\t\t\t});\n\n\t\t\t\tif((/d$|^c/.test(document.readyState))){\n\t\t\t\t\tonload();\n\t\t\t\t} else {\n\t\t\t\t\taddEventListener('load', onload);\n\t\t\t\t\tdocument[_addEventListener]('DOMContentLoaded', throttledCheckElements);\n\t\t\t\t\tsetTimeout(onload, 20000);\n\t\t\t\t}\n\n\t\t\t\tif(lazysizes.elements.length){\n\t\t\t\t\tcheckElements();\n\t\t\t\t\trAF._lsFlush();\n\t\t\t\t} else {\n\t\t\t\t\tthrottledCheckElements();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcheckElems: throttledCheckElements,\n\t\t\tunveil: unveilElement,\n\t\t\t_aLSL: altLoadmodeScrollListner,\n\t\t};\n\t})();\n\n\n\tvar autoSizer = (function(){\n\t\tvar autosizesElems;\n\n\t\tvar sizeElement = rAFIt(function(elem, parent, event, width){\n\t\t\tvar sources, i, len;\n\t\t\telem._lazysizesWidth = width;\n\t\t\twidth += 'px';\n\n\t\t\telem.setAttribute('sizes', width);\n\n\t\t\tif(regPicture.test(parent.nodeName || '')){\n\t\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tsources[i].setAttribute('sizes', width);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!event.detail.dataAttr){\n\t\t\t\tupdatePolyfill(elem, event.detail);\n\t\t\t}\n\t\t});\n\t\t/**\n\t\t *\n\t\t * @param elem {Element}\n\t\t * @param dataAttr\n\t\t * @param [width] { number }\n\t\t */\n\t\tvar getSizeElement = function (elem, dataAttr, width){\n\t\t\tvar event;\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif(parent){\n\t\t\t\twidth = getWidth(elem, parent, width);\n\t\t\t\tevent = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});\n\n\t\t\t\tif(!event.defaultPrevented){\n\t\t\t\t\twidth = event.detail.width;\n\n\t\t\t\t\tif(width && width !== elem._lazysizesWidth){\n\t\t\t\t\t\tsizeElement(elem, parent, event, width);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar updateElementsSizes = function(){\n\t\t\tvar i;\n\t\t\tvar len = autosizesElems.length;\n\t\t\tif(len){\n\t\t\t\ti = 0;\n\n\t\t\t\tfor(; i < len; i++){\n\t\t\t\t\tgetSizeElement(autosizesElems[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar debouncedUpdateElementsSizes = debounce(updateElementsSizes);\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tautosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass);\n\t\t\t\taddEventListener('resize', debouncedUpdateElementsSizes);\n\t\t\t},\n\t\t\tcheckElems: debouncedUpdateElementsSizes,\n\t\t\tupdateElem: getSizeElement\n\t\t};\n\t})();\n\n\tvar init = function(){\n\t\tif(!init.i && document.getElementsByClassName){\n\t\t\tinit.i = true;\n\t\t\tautoSizer._();\n\t\t\tloader._();\n\t\t}\n\t};\n\n\tsetTimeout(function(){\n\t\tif(lazySizesCfg.init){\n\t\t\tinit();\n\t\t}\n\t});\n\n\tlazysizes = {\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tcfg: lazySizesCfg,\n\t\tautoSizer: autoSizer,\n\t\tloader: loader,\n\t\tinit: init,\n\t\tuP: updatePolyfill,\n\t\taC: addClass,\n\t\trC: removeClass,\n\t\thC: hasClass,\n\t\tfire: triggerEvent,\n\t\tgW: getWidth,\n\t\trAF: rAF,\n\t};\n\n\treturn lazysizes;\n}\n));\n", "(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes) {\n\t'use strict';\n\n\tif(!window.addEventListener){return;}\n\n\tvar regDescriptors = /\\s+(\\d+)(w|h)\\s+(\\d+)(w|h)/;\n\tvar regCssFit = /parent-fit[\"']*\\s*:\\s*[\"']*(contain|cover|width)/;\n\tvar regCssObject = /parent-container[\"']*\\s*:\\s*[\"']*(.+?)(?=(\\s|$|,|'|\"|;))/;\n\tvar regPicture = /^picture$/i;\n\tvar cfg = lazySizes.cfg;\n\n\tvar getCSS = function (elem){\n\t\treturn (getComputedStyle(elem, null) || {});\n\t};\n\n\tvar parentFit = {\n\n\t\tgetParent: function(element, parentSel){\n\t\t\tvar parent = element;\n\t\t\tvar parentNode = element.parentNode;\n\n\t\t\tif((!parentSel || parentSel == 'prev') && parentNode && regPicture.test(parentNode.nodeName || '')){\n\t\t\t\tparentNode = parentNode.parentNode;\n\t\t\t}\n\n\t\t\tif(parentSel != 'self'){\n\t\t\t\tif(parentSel == 'prev'){\n\t\t\t\t\tparent = element.previousElementSibling;\n\t\t\t\t} else if(parentSel && (parentNode.closest || window.jQuery)){\n\t\t\t\t\tparent = (parentNode.closest ?\n\t\t\t\t\t\t\tparentNode.closest(parentSel) :\n\t\t\t\t\t\t\tjQuery(parentNode).closest(parentSel)[0]) ||\n\t\t\t\t\t\tparentNode\n\t\t\t\t\t;\n\t\t\t\t} else {\n\t\t\t\t\tparent = parentNode;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn parent;\n\t\t},\n\n\t\tgetFit: function(element){\n\t\t\tvar tmpMatch, parentObj;\n\t\t\tvar css = getCSS(element);\n\t\t\tvar content = css.content || css.fontFamily;\n\t\t\tvar obj = {\n\t\t\t\tfit: element._lazysizesParentFit || element.getAttribute('data-parent-fit')\n\t\t\t};\n\n\t\t\tif(!obj.fit && content && (tmpMatch = content.match(regCssFit))){\n\t\t\t\tobj.fit = tmpMatch[1];\n\t\t\t}\n\n\t\t\tif(obj.fit){\n\t\t\t\tparentObj = element._lazysizesParentContainer || element.getAttribute('data-parent-container');\n\n\t\t\t\tif(!parentObj && content && (tmpMatch = content.match(regCssObject))){\n\t\t\t\t\tparentObj = tmpMatch[1];\n\t\t\t\t}\n\n\t\t\t\tobj.parent = parentFit.getParent(element, parentObj);\n\n\n\t\t\t} else {\n\t\t\t\tobj.fit = css.objectFit;\n\t\t\t}\n\n\t\t\treturn obj;\n\t\t},\n\n\t\tgetImageRatio: function(element){\n\t\t\tvar i, srcset, media, ratio, match, width, height;\n\t\t\tvar parent = element.parentNode;\n\t\t\tvar elements = parent && regPicture.test(parent.nodeName || '') ?\n\t\t\t\t\tparent.querySelectorAll('source, img') :\n\t\t\t\t\t[element]\n\t\t\t\t;\n\n\t\t\tfor(i = 0; i < elements.length; i++){\n\t\t\t\telement = elements[i];\n\t\t\t\tsrcset = element.getAttribute(cfg.srcsetAttr) || element.getAttribute('srcset') || element.getAttribute('data-pfsrcset') || element.getAttribute('data-risrcset') || '';\n\t\t\t\tmedia = element._lsMedia || element.getAttribute('media');\n\t\t\t\tmedia = cfg.customMedia[element.getAttribute('data-media') || media] || media;\n\n\t\t\t\tif(srcset && (!media || (window.matchMedia && matchMedia(media) || {}).matches )){\n\t\t\t\t\tratio = parseFloat(element.getAttribute('data-aspectratio'));\n\n\t\t\t\t\tif (!ratio) {\n\t\t\t\t\t\tmatch = srcset.match(regDescriptors);\n\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\tif(match[2] == 'w'){\n\t\t\t\t\t\t\t\twidth = match[1];\n\t\t\t\t\t\t\t\theight = match[3];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidth = match[3];\n\t\t\t\t\t\t\t\theight = match[1];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twidth = element.getAttribute('width');\n\t\t\t\t\t\t\theight = element.getAttribute('height');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tratio = width / height;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ratio;\n\t\t},\n\n\t\tcalculateSize: function(element, width){\n\t\t\tvar displayRatio, height, imageRatio, retWidth;\n\t\t\tvar fitObj = this.getFit(element);\n\t\t\tvar fit = fitObj.fit;\n\t\t\tvar fitElem = fitObj.parent;\n\n\t\t\tif(fit != 'width' && ((fit != 'contain' && fit != 'cover') || !(imageRatio = this.getImageRatio(element)))){\n\t\t\t\treturn width;\n\t\t\t}\n\n\t\t\tif(fitElem){\n\t\t\t\twidth = fitElem.clientWidth;\n\t\t\t} else {\n\t\t\t\tfitElem = element;\n\t\t\t}\n\n\t\t\tretWidth = width;\n\n\t\t\tif(fit == 'width'){\n\t\t\t\tretWidth = width;\n\t\t\t} else {\n\t\t\t\theight = fitElem.clientHeight;\n\n\t\t\t\tif((displayRatio = width / height) && ((fit == 'cover' && displayRatio < imageRatio) || (fit == 'contain' && displayRatio > imageRatio))){\n\t\t\t\t\tretWidth = width * (imageRatio / displayRatio);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn retWidth;\n\t\t}\n\t};\n\n\tlazySizes.parentFit = parentFit;\n\n\tdocument.addEventListener('lazybeforesizes', function(e){\n\t\tif(e.defaultPrevented || e.detail.instance != lazySizes){return;}\n\n\t\tvar element = e.target;\n\t\te.detail.width = parentFit.calculateSize(element, e.detail.width);\n\t});\n}));\n", "up.compiler('[events-page]', (element) => {\n\n function getPastEventsContainer() {\n return element.querySelector('[events-page--past-events]')\n }\n\n function isChecked() {\n return getPastEventsContainer().querySelector('input[type=\"checkbox\"]').checked\n }\n\n let lastChecked = isChecked()\n\n up.on(element, 'up:fragment:inserted', (_event) => {\n const nowChecked = isChecked()\n\n if (!lastChecked && nowChecked) {\n up.reveal(getPastEventsContainer(), {\n revealTop: true,\n revealSnap: 0,\n revealPadding: 95,\n })\n }\n\n lastChecked = nowChecked\n })\n\n})\n", "up.compiler('.filterable-list', (element) => {\n\n const filters = element.querySelector('.filterable-list--filters')\n\n element.addEventListener('up:fragment:inserted', function(event) {\n const updatedByFilters = filters.contains(event.origin) // don't scroll when list was updated by \"load more\" button\n const userScrolledDown = element.offsetTop < window.scrollY // only scroll when user scrolled past the top of the list\n\n if (updatedByFilters && userScrolledDown) {\n up.reveal(element, {\n revealTop: true,\n revealSnap: 0,\n revealPadding: 95,\n })\n }\n })\n\n})\n", "/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n/** @typedef {undefined | null | false | '' | 0} Falsy */\r\n/** @typedef {keyof HTMLElementTagNameMap} HTMLElementTagName */\r\n\r\n/**\r\n * @template {HTMLElementTagName | Falsy} [T=\"div\"]\r\n * @template {Node | undefined} [NodeToAppendElementTo=undefined]\r\n * @param {string=} className\r\n * @param {T=} [tagName]\r\n * @param {NodeToAppendElementTo=} appendToEl\r\n * @returns {T extends HTMLElementTagName ? HTMLElementTagNameMap[T] : HTMLElementTagNameMap['div']}\r\n */\r\nexport function createElement(className, tagName, appendToEl) {\r\n const el = document.createElement(tagName || 'div');\r\n if (className) {\r\n el.className = className;\r\n }\r\n if (appendToEl) {\r\n appendToEl.appendChild(el);\r\n }\r\n // @ts-expect-error\r\n return el;\r\n}\r\n\r\n/**\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nexport function equalizePoints(p1, p2) {\r\n p1.x = p2.x;\r\n p1.y = p2.y;\r\n if (p2.id !== undefined) {\r\n p1.id = p2.id;\r\n }\r\n return p1;\r\n}\r\n\r\n/**\r\n * @param {Point} p\r\n */\r\nexport function roundPoint(p) {\r\n p.x = Math.round(p.x);\r\n p.y = Math.round(p.y);\r\n}\r\n\r\n/**\r\n * Returns distance between two points.\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nexport function getDistanceBetween(p1, p2) {\r\n const x = Math.abs(p1.x - p2.x);\r\n const y = Math.abs(p1.y - p2.y);\r\n return Math.sqrt((x * x) + (y * y));\r\n}\r\n\r\n/**\r\n * Whether X and Y positions of points are qual\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nexport function pointsEqual(p1, p2) {\r\n return p1.x === p2.x && p1.y === p2.y;\r\n}\r\n\r\n/**\r\n * The float result between the min and max values.\r\n *\r\n * @param {number} val\r\n * @param {number} min\r\n * @param {number} max\r\n */\r\nexport function clamp(val, min, max) {\r\n return Math.min(Math.max(val, min), max);\r\n}\r\n\r\n/**\r\n * Get transform string\r\n *\r\n * @param {number} x\r\n * @param {number=} y\r\n * @param {number=} scale\r\n */\r\nexport function toTransformString(x, y, scale) {\r\n let propValue = 'translate3d('\r\n + x + 'px,' + (y || 0) + 'px'\r\n + ',0)';\r\n\r\n if (scale !== undefined) {\r\n propValue += ' scale3d('\r\n + scale + ',' + scale\r\n + ',1)';\r\n }\r\n\r\n return propValue;\r\n}\r\n\r\n/**\r\n * Apply transform:translate(x, y) scale(scale) to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {number} x\r\n * @param {number=} y\r\n * @param {number=} scale\r\n */\r\nexport function setTransform(el, x, y, scale) {\r\n el.style.transform = toTransformString(x, y, scale);\r\n}\r\n\r\nconst defaultCSSEasing = 'cubic-bezier(.4,0,.22,1)';\r\n\r\n/**\r\n * Apply CSS transition to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string=} prop CSS property to animate\r\n * @param {number=} duration in ms\r\n * @param {string=} ease CSS easing function\r\n */\r\nexport function setTransitionStyle(el, prop, duration, ease) {\r\n // inOut: 'cubic-bezier(.4, 0, .22, 1)', // for \"toggle state\" transitions\r\n // out: 'cubic-bezier(0, 0, .22, 1)', // for \"show\" transitions\r\n // in: 'cubic-bezier(.4, 0, 1, 1)'// for \"hide\" transitions\r\n el.style.transition = prop\r\n ? (prop + ' ' + duration + 'ms ' + (ease || defaultCSSEasing))\r\n : 'none';\r\n}\r\n\r\n/**\r\n * Apply width and height CSS properties to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string | number} w\r\n * @param {string | number} h\r\n */\r\nexport function setWidthHeight(el, w, h) {\r\n el.style.width = (typeof w === 'number') ? (w + 'px') : w;\r\n el.style.height = (typeof h === 'number') ? (h + 'px') : h;\r\n}\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n */\r\nexport function removeTransitionStyle(el) {\r\n setTransitionStyle(el);\r\n}\r\n\r\n/**\r\n * @param {HTMLImageElement} img\r\n * @returns {Promise}\r\n */\r\nexport function decodeImage(img) {\r\n if ('decode' in img) {\r\n return img.decode();\r\n }\r\n\r\n if (img.complete) {\r\n return Promise.resolve(img);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n img.onload = () => resolve(img);\r\n img.onerror = reject;\r\n });\r\n}\r\n\r\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\r\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\r\nexport const LOAD_STATE = {\r\n IDLE: 'idle',\r\n LOADING: 'loading',\r\n LOADED: 'loaded',\r\n ERROR: 'error',\r\n};\r\n\r\n\r\n/**\r\n * Check if click or keydown event was dispatched\r\n * with a special key or via mouse wheel.\r\n *\r\n * @param {MouseEvent | KeyboardEvent} e\r\n */\r\nexport function specialKeyUsed(e) {\r\n if (e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Parse `gallery` or `children` options.\r\n *\r\n * @param {HTMLElement | NodeListOf | string} option\r\n * @param {string=} legacySelector\r\n * @param {HTMLElement | Document} [parent]\r\n * @returns HTMLElement[]\r\n */\r\nexport function getElementsFromOption(option, legacySelector, parent = document) {\r\n /** @type {HTMLElement[]} */\r\n let elements = [];\r\n\r\n if (option instanceof Element) {\r\n elements = [option];\r\n } else if (option instanceof NodeList || Array.isArray(option)) {\r\n elements = Array.from(option);\r\n } else {\r\n const selector = typeof option === 'string' ? option : legacySelector;\r\n if (selector) {\r\n elements = Array.from(parent.querySelectorAll(selector));\r\n }\r\n }\r\n\r\n return elements;\r\n}\r\n\r\n/**\r\n * Check if variable is PhotoSwipe class\r\n *\r\n * @param {any} fn\r\n */\r\nexport function isPswpClass(fn) {\r\n return typeof fn === 'function'\r\n && fn.prototype\r\n && fn.prototype.goTo;\r\n}\r\n", "// Detect passive event listener support\r\nlet supportsPassive = false;\r\n/* eslint-disable */\r\ntry {\r\n window.addEventListener('test', null, Object.defineProperty({}, 'passive', {\r\n get: () => {\r\n supportsPassive = true;\r\n }\r\n }));\r\n} catch (e) {}\r\n/* eslint-enable */\r\n\r\n\r\n/**\r\n * @typedef {Object} PoolItem\r\n * @prop {HTMLElement | Window | Document} target\r\n * @prop {string} type\r\n * @prop {(e: any) => void} listener\r\n * @prop {boolean} passive\r\n */\r\n\r\nclass DOMEvents {\r\n constructor() {\r\n /**\r\n * @type {PoolItem[]}\r\n * @private\r\n */\r\n this._pool = [];\r\n }\r\n\r\n /**\r\n * Adds event listeners\r\n *\r\n * @param {HTMLElement | Window | Document} target\r\n * @param {string} type Can be multiple, separated by space.\r\n * @param {(e: any) => void} listener\r\n * @param {boolean=} passive\r\n */\r\n add(target, type, listener, passive) {\r\n this._toggleListener(target, type, listener, passive);\r\n }\r\n\r\n /**\r\n * Removes event listeners\r\n *\r\n * @param {HTMLElement | Window | Document} target\r\n * @param {string} type\r\n * @param {(e: any) => void} listener\r\n * @param {boolean=} passive\r\n */\r\n remove(target, type, listener, passive) {\r\n this._toggleListener(target, type, listener, passive, true);\r\n }\r\n\r\n /**\r\n * Removes all bound events\r\n */\r\n removeAll() {\r\n this._pool.forEach((poolItem) => {\r\n this._toggleListener(\r\n poolItem.target,\r\n poolItem.type,\r\n poolItem.listener,\r\n poolItem.passive,\r\n true,\r\n true\r\n );\r\n });\r\n this._pool = [];\r\n }\r\n\r\n /**\r\n * Adds or removes event\r\n *\r\n * @param {HTMLElement | Window | Document} target\r\n * @param {string} type\r\n * @param {(e: any) => void} listener\r\n * @param {boolean} passive\r\n * @param {boolean=} unbind Whether the event should be added or removed\r\n * @param {boolean=} skipPool Whether events pool should be skipped\r\n */\r\n _toggleListener(target, type, listener, passive, unbind, skipPool) {\r\n if (!target) {\r\n return;\r\n }\r\n\r\n const methodName = unbind ? 'removeEventListener' : 'addEventListener';\r\n const types = type.split(' ');\r\n types.forEach((eType) => {\r\n if (eType) {\r\n // Events pool is used to easily unbind all events when PhotoSwipe is closed,\r\n // so developer doesn't need to do this manually\r\n if (!skipPool) {\r\n if (unbind) {\r\n // Remove from the events pool\r\n this._pool = this._pool.filter((poolItem) => {\r\n return poolItem.type !== eType\r\n || poolItem.listener !== listener\r\n || poolItem.target !== target;\r\n });\r\n } else {\r\n // Add to the events pool\r\n this._pool.push({\r\n target,\r\n type: eType,\r\n listener,\r\n passive\r\n });\r\n }\r\n }\r\n\r\n\r\n // most PhotoSwipe events call preventDefault,\r\n // and we do not need browser to scroll the page\r\n const eventOptions = supportsPassive ? { passive: (passive || false) } : false;\r\n\r\n target[methodName](\r\n eType,\r\n listener,\r\n eventOptions\r\n );\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default DOMEvents;\r\n", "/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipe} pswp\r\n */\r\nexport function getViewportSize(options, pswp) {\r\n if (options.getViewportSizeFn) {\r\n const newViewportSize = options.getViewportSizeFn(options, pswp);\r\n if (newViewportSize) {\r\n return newViewportSize;\r\n }\r\n }\r\n\r\n return {\r\n x: document.documentElement.clientWidth,\r\n\r\n // TODO: height on mobile is very incosistent due to toolbar\r\n // find a way to improve this\r\n //\r\n // document.documentElement.clientHeight - doesn't seem to work well\r\n y: window.innerHeight\r\n };\r\n}\r\n\r\n/**\r\n * Parses padding option.\r\n * Supported formats:\r\n *\r\n * // Object\r\n * padding: {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * }\r\n *\r\n * // A function that returns the object\r\n * paddingFn: (viewportSize, itemData, index) => {\r\n * return {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * };\r\n * }\r\n *\r\n * // Legacy variant\r\n * paddingLeft: 0,\r\n * paddingRight: 0,\r\n * paddingTop: 0,\r\n * paddingBottom: 0,\r\n *\r\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {{ x?: number; y?: number }} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index Slide index\r\n * @returns {number}\r\n */\r\nexport function parsePaddingOption(prop, options, viewportSize, itemData, index) {\r\n /** @type {number} */\r\n let paddingValue;\r\n\r\n if (options.paddingFn) {\r\n paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\r\n } else if (options.padding) {\r\n paddingValue = options.padding[prop];\r\n } else {\r\n const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1);\r\n // @ts-expect-error\r\n if (options[legacyPropName]) {\r\n // @ts-expect-error\r\n paddingValue = options[legacyPropName];\r\n }\r\n }\r\n\r\n return paddingValue || 0;\r\n}\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {{ x?: number; y?: number }} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n */\r\nexport function getPanAreaSize(options, viewportSize, itemData, index) {\r\n return {\r\n x: viewportSize.x\r\n - parsePaddingOption('left', options, viewportSize, itemData, index)\r\n - parsePaddingOption('right', options, viewportSize, itemData, index),\r\n y: viewportSize.y\r\n - parsePaddingOption('top', options, viewportSize, itemData, index)\r\n - parsePaddingOption('bottom', options, viewportSize, itemData, index)\r\n };\r\n}\r\n", "import {\r\n clamp\r\n} from '../util/util.js';\r\nimport { parsePaddingOption } from '../util/viewport-size.js';\r\n\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n/** @typedef {'x' | 'y'} Axis */\r\n\r\n/**\r\n * Calculates minimum, maximum and initial (center) bounds of a slide\r\n */\r\nclass PanBounds {\r\n /**\r\n * @param {Slide} slide\r\n */\r\n constructor(slide) {\r\n this.slide = slide;\r\n\r\n this.currZoomLevel = 1;\r\n\r\n /** @type {Point} */\r\n this.center = {};\r\n /** @type {Point} */\r\n this.max = {};\r\n /** @type {Point} */\r\n this.min = {};\r\n\r\n this.reset();\r\n }\r\n\r\n /**\r\n * _getItemBounds\r\n *\r\n * @param {number} currZoomLevel\r\n */\r\n update(currZoomLevel) {\r\n this.currZoomLevel = currZoomLevel;\r\n\r\n if (!this.slide.width) {\r\n this.reset();\r\n } else {\r\n this._updateAxis('x');\r\n this._updateAxis('y');\r\n this.slide.pswp.dispatch('calcBounds', { slide: this.slide });\r\n }\r\n }\r\n\r\n /**\r\n * _calculateItemBoundsForAxis\r\n *\r\n * @param {Axis} axis\r\n */\r\n _updateAxis(axis) {\r\n const { pswp } = this.slide;\r\n const elSize = this.slide[axis === 'x' ? 'width' : 'height'] * this.currZoomLevel;\r\n const paddingProp = axis === 'x' ? 'left' : 'top';\r\n const padding = parsePaddingOption(\r\n paddingProp,\r\n pswp.options,\r\n pswp.viewportSize,\r\n this.slide.data,\r\n this.slide.index\r\n );\r\n\r\n const panAreaSize = this.slide.panAreaSize[axis];\r\n\r\n // Default position of element.\r\n // By defaul it is center of viewport:\r\n this.center[axis] = Math.round((panAreaSize - elSize) / 2) + padding;\r\n\r\n // maximum pan position\r\n this.max[axis] = (elSize > panAreaSize)\r\n ? Math.round(panAreaSize - elSize) + padding\r\n : this.center[axis];\r\n\r\n // minimum pan position\r\n this.min[axis] = (elSize > panAreaSize)\r\n ? padding\r\n : this.center[axis];\r\n }\r\n\r\n // _getZeroBounds\r\n reset() {\r\n this.center.x = 0;\r\n this.center.y = 0;\r\n this.max.x = 0;\r\n this.max.y = 0;\r\n this.min.x = 0;\r\n this.min.y = 0;\r\n }\r\n\r\n /**\r\n * Correct pan position if it's beyond the bounds\r\n *\r\n * @param {Axis} axis x or y\r\n * @param {number} panOffset\r\n */\r\n correctPan(axis, panOffset) { // checkPanBounds\r\n return clamp(panOffset, this.max[axis], this.min[axis]);\r\n }\r\n}\r\n\r\nexport default PanBounds;\r\n", "const MAX_IMAGE_WIDTH = 4000;\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\r\n\r\n/**\r\n * Calculates zoom levels for specific slide.\r\n * Depends on viewport size and image size.\r\n */\r\nclass ZoomLevel {\r\n /**\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {SlideData} itemData Slide data\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe=} pswp PhotoSwipe instance, can be undefined if not initialized yet\r\n */\r\n constructor(options, itemData, index, pswp) {\r\n this.pswp = pswp;\r\n this.options = options;\r\n this.itemData = itemData;\r\n this.index = index;\r\n }\r\n\r\n /**\r\n * Calculate initial, secondary and maximum zoom level for the specified slide.\r\n *\r\n * It should be called when either image or viewport size changes.\r\n *\r\n * @param {number} maxWidth\r\n * @param {number} maxHeight\r\n * @param {{ x?: number; y?: number }} panAreaSize\r\n */\r\n update(maxWidth, maxHeight, panAreaSize) {\r\n this.elementSize = {\r\n x: maxWidth,\r\n y: maxHeight\r\n };\r\n\r\n this.panAreaSize = panAreaSize;\r\n\r\n const hRatio = this.panAreaSize.x / this.elementSize.x;\r\n const vRatio = this.panAreaSize.y / this.elementSize.y;\r\n\r\n this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\r\n this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio);\r\n\r\n // zoom.vFill defines zoom level of the image\r\n // when it has 100% of viewport vertical space (height)\r\n this.vFill = Math.min(1, vRatio);\r\n\r\n this.initial = this._getInitial();\r\n this.secondary = this._getSecondary();\r\n this.max = Math.max(\r\n this.initial,\r\n this.secondary,\r\n this._getMax()\r\n );\r\n\r\n this.min = Math.min(\r\n this.fit,\r\n this.initial,\r\n this.secondary\r\n );\r\n\r\n if (this.pswp) {\r\n this.pswp.dispatch('zoomLevelsUpdate', { zoomLevels: this, slideData: this.itemData });\r\n }\r\n }\r\n\r\n /**\r\n * Parses user-defined zoom option.\r\n *\r\n * @private\r\n * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\r\n */\r\n _parseZoomLevelOption(optionPrefix) {\r\n // eslint-disable-next-line max-len\r\n const optionName = /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */ (optionPrefix + 'ZoomLevel');\r\n const optionValue = this.options[optionName];\r\n\r\n if (!optionValue) {\r\n return;\r\n }\r\n\r\n if (typeof optionValue === 'function') {\r\n return optionValue(this);\r\n }\r\n\r\n if (optionValue === 'fill') {\r\n return this.fill;\r\n }\r\n\r\n if (optionValue === 'fit') {\r\n return this.fit;\r\n }\r\n\r\n return Number(optionValue);\r\n }\r\n\r\n /**\r\n * Get zoom level to which image will be zoomed after double-tap gesture,\r\n * or when user clicks on zoom icon,\r\n * or mouse-click on image itself.\r\n * If you return 1 image will be zoomed to its original size.\r\n *\r\n * @private\r\n * @return {number}\r\n */\r\n _getSecondary() {\r\n let currZoomLevel = this._parseZoomLevelOption('secondary');\r\n\r\n if (currZoomLevel) {\r\n return currZoomLevel;\r\n }\r\n\r\n // 3x of \"fit\" state, but not larger than original\r\n currZoomLevel = Math.min(1, this.fit * 3);\r\n\r\n if (currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\r\n currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\r\n }\r\n\r\n return currZoomLevel;\r\n }\r\n\r\n /**\r\n * Get initial image zoom level.\r\n *\r\n * @private\r\n * @return {number}\r\n */\r\n _getInitial() {\r\n return this._parseZoomLevelOption('initial') || this.fit;\r\n }\r\n\r\n /**\r\n * Maximum zoom level when user zooms\r\n * via zoom/pinch gesture,\r\n * via cmd/ctrl-wheel or via trackpad.\r\n *\r\n * @private\r\n * @return {number}\r\n */\r\n _getMax() {\r\n const currZoomLevel = this._parseZoomLevelOption('max');\r\n\r\n if (currZoomLevel) {\r\n return currZoomLevel;\r\n }\r\n\r\n // max zoom level is x4 from \"fit state\",\r\n // used for zoom gesture and ctrl/trackpad zoom\r\n return Math.max(1, this.fit * 4);\r\n }\r\n}\r\n\r\nexport default ZoomLevel;\r\n", "/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n/**\r\n * @typedef {_SlideData & Record} SlideData\r\n * @typedef {Object} _SlideData\r\n * @prop {HTMLElement=} element thumbnail element\r\n * @prop {string=} src image URL\r\n * @prop {string=} srcset image srcset\r\n * @prop {number=} w image width (deprecated)\r\n * @prop {number=} h image height (deprecated)\r\n * @prop {number=} width image width\r\n * @prop {number=} height image height\r\n * @prop {string=} msrc placeholder image URL that's displayed before large image is loaded\r\n * @prop {string=} alt image alt text\r\n * @prop {boolean=} thumbCropped whether thumbnail is cropped client-side or not\r\n * @prop {string=} html html content of a slide\r\n * @prop {'image' | 'html' | string} [type] slide type\r\n */\r\n\r\nimport {\r\n createElement,\r\n setTransform,\r\n equalizePoints,\r\n roundPoint,\r\n toTransformString,\r\n clamp,\r\n} from '../util/util.js';\r\n\r\nimport PanBounds from './pan-bounds.js';\r\nimport ZoomLevel from './zoom-level.js';\r\nimport { getPanAreaSize } from '../util/viewport-size.js';\r\n\r\n/**\r\n * Renders and allows to control a single slide\r\n */\r\nclass Slide {\r\n /**\r\n * @param {SlideData} data\r\n * @param {number} index\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(data, index, pswp) {\r\n this.data = data;\r\n this.index = index;\r\n this.pswp = pswp;\r\n this.isActive = (index === pswp.currIndex);\r\n this.currentResolution = 0;\r\n /** @type {Point} */\r\n this.panAreaSize = {};\r\n\r\n this.isFirstSlide = (this.isActive && !pswp.opener.isOpen);\r\n\r\n this.zoomLevels = new ZoomLevel(pswp.options, data, index, pswp);\r\n\r\n this.pswp.dispatch('gettingData', {\r\n slide: this,\r\n data: this.data,\r\n index\r\n });\r\n\r\n this.pan = {\r\n x: 0,\r\n y: 0\r\n };\r\n\r\n this.content = this.pswp.contentLoader.getContentBySlide(this);\r\n this.container = createElement('pswp__zoom-wrap');\r\n\r\n this.currZoomLevel = 1;\r\n /** @type {number} */\r\n this.width = this.content.width;\r\n /** @type {number} */\r\n this.height = this.content.height;\r\n\r\n this.bounds = new PanBounds(this);\r\n\r\n this.prevDisplayedWidth = -1;\r\n this.prevDisplayedHeight = -1;\r\n\r\n this.pswp.dispatch('slideInit', { slide: this });\r\n }\r\n\r\n /**\r\n * If this slide is active/current/visible\r\n *\r\n * @param {boolean} isActive\r\n */\r\n setIsActive(isActive) {\r\n if (isActive && !this.isActive) {\r\n // slide just became active\r\n this.activate();\r\n } else if (!isActive && this.isActive) {\r\n // slide just became non-active\r\n this.deactivate();\r\n }\r\n }\r\n\r\n /**\r\n * Appends slide content to DOM\r\n *\r\n * @param {HTMLElement} holderElement\r\n */\r\n append(holderElement) {\r\n this.holderElement = holderElement;\r\n\r\n // Slide appended to DOM\r\n if (!this.data) {\r\n this.holderElement.innerHTML = '';\r\n return;\r\n }\r\n\r\n this.calculateSize();\r\n\r\n this.container.style.transformOrigin = '0 0';\r\n\r\n this.load();\r\n this.appendHeavy();\r\n this.updateContentSize();\r\n\r\n this.holderElement.innerHTML = '';\r\n this.holderElement.appendChild(this.container);\r\n\r\n this.zoomAndPanToInitial();\r\n\r\n this.pswp.dispatch('firstZoomPan', { slide: this });\r\n\r\n this.applyCurrentZoomPan();\r\n\r\n this.pswp.dispatch('afterSetContent', { slide: this });\r\n\r\n if (this.isActive) {\r\n this.activate();\r\n }\r\n }\r\n\r\n load() {\r\n this.content.load();\r\n this.pswp.dispatch('slideLoad', { slide: this });\r\n }\r\n\r\n /**\r\n * Append \"heavy\" DOM elements\r\n *\r\n * This may depend on a type of slide,\r\n * but generally these are large images.\r\n */\r\n appendHeavy() {\r\n const { pswp } = this;\r\n const appendHeavyNearby = true; // todo\r\n\r\n // Avoid appending heavy elements during animations\r\n if (this.heavyAppended\r\n || !pswp.opener.isOpen\r\n || pswp.mainScroll.isShifted()\r\n || (!this.isActive && !appendHeavyNearby)) {\r\n return;\r\n }\r\n\r\n if (this.pswp.dispatch('appendHeavy', { slide: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n this.heavyAppended = true;\r\n\r\n this.content.append();\r\n\r\n this.pswp.dispatch('appendHeavyContent', { slide: this });\r\n }\r\n\r\n /**\r\n * Triggered when this slide is active (selected).\r\n *\r\n * If it's part of opening/closing transition -\r\n * activate() will trigger after the transition is ended.\r\n */\r\n activate() {\r\n this.isActive = true;\r\n this.appendHeavy();\r\n this.content.activate();\r\n this.pswp.dispatch('slideActivate', { slide: this });\r\n }\r\n\r\n /**\r\n * Triggered when this slide becomes inactive.\r\n *\r\n * Slide can become inactive only after it was active.\r\n */\r\n deactivate() {\r\n this.isActive = false;\r\n this.content.deactivate();\r\n\r\n // reset zoom level\r\n this.currentResolution = 0;\r\n this.zoomAndPanToInitial();\r\n this.applyCurrentZoomPan();\r\n this.updateContentSize();\r\n\r\n this.pswp.dispatch('slideDeactivate', { slide: this });\r\n }\r\n\r\n /**\r\n * The slide should destroy itself, it will never be used again.\r\n * (unbind all events and destroy internal components)\r\n */\r\n destroy() {\r\n this.content.hasSlide = false;\r\n this.content.remove();\r\n this.pswp.dispatch('slideDestroy', { slide: this });\r\n }\r\n\r\n resize() {\r\n if (this.currZoomLevel === this.zoomLevels.initial || !this.isActive) {\r\n // Keep initial zoom level if it was before the resize,\r\n // as well as when this slide is not active\r\n\r\n // Reset position and scale to original state\r\n this.calculateSize();\r\n this.currentResolution = 0;\r\n this.zoomAndPanToInitial();\r\n this.applyCurrentZoomPan();\r\n this.updateContentSize();\r\n } else {\r\n // readjust pan position if it's beyond the bounds\r\n this.calculateSize();\r\n this.bounds.update(this.currZoomLevel);\r\n this.panTo(this.pan.x, this.pan.y);\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Apply size to current slide content,\r\n * based on the current resolution and scale.\r\n *\r\n * @param {boolean=} force if size should be updated even if dimensions weren't changed\r\n */\r\n updateContentSize(force) {\r\n // Use initial zoom level\r\n // if resolution is not defined (user didn't zoom yet)\r\n const scaleMultiplier = this.currentResolution || this.zoomLevels.initial;\r\n\r\n if (!scaleMultiplier) {\r\n return;\r\n }\r\n\r\n const width = Math.round(this.width * scaleMultiplier) || this.pswp.viewportSize.x;\r\n const height = Math.round(this.height * scaleMultiplier) || this.pswp.viewportSize.y;\r\n\r\n if (!this.sizeChanged(width, height) && !force) {\r\n return;\r\n }\r\n this.content.setDisplayedSize(width, height);\r\n }\r\n\r\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n sizeChanged(width, height) {\r\n if (width !== this.prevDisplayedWidth\r\n || height !== this.prevDisplayedHeight) {\r\n this.prevDisplayedWidth = width;\r\n this.prevDisplayedHeight = height;\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n getPlaceholderElement() {\r\n if (this.content.placeholder) {\r\n return this.content.placeholder.element;\r\n }\r\n }\r\n\r\n /**\r\n * Zoom current slide image to...\r\n *\r\n * @param {number} destZoomLevel Destination zoom level.\r\n * @param {{ x?: number; y?: number }} centerPoint\r\n * Transform origin center point, or false if viewport center should be used.\r\n * @param {number | false} [transitionDuration] Transition duration, may be set to 0.\r\n * @param {boolean=} ignoreBounds Minimum and maximum zoom levels will be ignored.\r\n * @return {boolean=} Returns true if animated.\r\n */\r\n zoomTo(destZoomLevel, centerPoint, transitionDuration, ignoreBounds) {\r\n const { pswp } = this;\r\n if (!this.isZoomable()\r\n || pswp.mainScroll.isShifted()) {\r\n return;\r\n }\r\n\r\n pswp.dispatch('beforeZoomTo', {\r\n destZoomLevel, centerPoint, transitionDuration\r\n });\r\n\r\n // stop all pan and zoom transitions\r\n pswp.animations.stopAllPan();\r\n\r\n // if (!centerPoint) {\r\n // centerPoint = pswp.getViewportCenterPoint();\r\n // }\r\n\r\n const prevZoomLevel = this.currZoomLevel;\r\n\r\n if (!ignoreBounds) {\r\n destZoomLevel = clamp(destZoomLevel, this.zoomLevels.min, this.zoomLevels.max);\r\n }\r\n\r\n // if (transitionDuration === undefined) {\r\n // transitionDuration = this.pswp.options.zoomAnimationDuration;\r\n // }\r\n\r\n this.setZoomLevel(destZoomLevel);\r\n this.pan.x = this.calculateZoomToPanOffset('x', centerPoint, prevZoomLevel);\r\n this.pan.y = this.calculateZoomToPanOffset('y', centerPoint, prevZoomLevel);\r\n roundPoint(this.pan);\r\n\r\n const finishTransition = () => {\r\n this._setResolution(destZoomLevel);\r\n this.applyCurrentZoomPan();\r\n };\r\n\r\n if (!transitionDuration) {\r\n finishTransition();\r\n } else {\r\n pswp.animations.startTransition({\r\n isPan: true,\r\n name: 'zoomTo',\r\n target: this.container,\r\n transform: this.getCurrentTransform(),\r\n onComplete: finishTransition,\r\n duration: transitionDuration,\r\n easing: pswp.options.easing\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * @param {{ x?: number, y?: number }} [centerPoint]\r\n */\r\n toggleZoom(centerPoint) {\r\n this.zoomTo(\r\n this.currZoomLevel === this.zoomLevels.initial\r\n ? this.zoomLevels.secondary : this.zoomLevels.initial,\r\n centerPoint,\r\n this.pswp.options.zoomAnimationDuration\r\n );\r\n }\r\n\r\n /**\r\n * Updates zoom level property and recalculates new pan bounds,\r\n * unlike zoomTo it does not apply transform (use applyCurrentZoomPan)\r\n *\r\n * @param {number} currZoomLevel\r\n */\r\n setZoomLevel(currZoomLevel) {\r\n this.currZoomLevel = currZoomLevel;\r\n this.bounds.update(this.currZoomLevel);\r\n }\r\n\r\n /**\r\n * Get pan position after zoom at a given `point`.\r\n *\r\n * Always call setZoomLevel(newZoomLevel) beforehand to recalculate\r\n * pan bounds according to the new zoom level.\r\n *\r\n * @param {'x' | 'y'} axis\r\n * @param {{ x?: number; y?: number }} [point]\r\n * point based on which zoom is performed, usually refers to the current mouse position,\r\n * if false - viewport center will be used.\r\n * @param {number=} prevZoomLevel Zoom level before new zoom was applied.\r\n */\r\n calculateZoomToPanOffset(axis, point, prevZoomLevel) {\r\n const totalPanDistance = this.bounds.max[axis] - this.bounds.min[axis];\r\n if (totalPanDistance === 0) {\r\n return this.bounds.center[axis];\r\n }\r\n\r\n if (!point) {\r\n point = this.pswp.getViewportCenterPoint();\r\n }\r\n\r\n const zoomFactor = this.currZoomLevel / prevZoomLevel;\r\n return this.bounds.correctPan(\r\n axis,\r\n (this.pan[axis] - point[axis]) * zoomFactor + point[axis]\r\n );\r\n }\r\n\r\n /**\r\n * Apply pan and keep it within bounds.\r\n *\r\n * @param {number} panX\r\n * @param {number} panY\r\n */\r\n panTo(panX, panY) {\r\n this.pan.x = this.bounds.correctPan('x', panX);\r\n this.pan.y = this.bounds.correctPan('y', panY);\r\n this.applyCurrentZoomPan();\r\n }\r\n\r\n /**\r\n * If the slide in the current state can be panned by the user\r\n */\r\n isPannable() {\r\n return this.width && (this.currZoomLevel > this.zoomLevels.fit);\r\n }\r\n\r\n /**\r\n * If the slide can be zoomed\r\n */\r\n isZoomable() {\r\n return this.width && this.content.isZoomable();\r\n }\r\n\r\n /**\r\n * Apply transform and scale based on\r\n * the current pan position (this.pan) and zoom level (this.currZoomLevel)\r\n */\r\n applyCurrentZoomPan() {\r\n this._applyZoomTransform(this.pan.x, this.pan.y, this.currZoomLevel);\r\n if (this === this.pswp.currSlide) {\r\n this.pswp.dispatch('zoomPanUpdate', { slide: this });\r\n }\r\n }\r\n\r\n zoomAndPanToInitial() {\r\n this.currZoomLevel = this.zoomLevels.initial;\r\n\r\n // pan according to the zoom level\r\n this.bounds.update(this.currZoomLevel);\r\n equalizePoints(this.pan, this.bounds.center);\r\n this.pswp.dispatch('initialZoomPan', { slide: this });\r\n }\r\n\r\n /**\r\n * Set translate and scale based on current resolution\r\n *\r\n * @param {number} x\r\n * @param {number} y\r\n * @param {number} zoom\r\n */\r\n _applyZoomTransform(x, y, zoom) {\r\n zoom /= this.currentResolution || this.zoomLevels.initial;\r\n setTransform(this.container, x, y, zoom);\r\n }\r\n\r\n calculateSize() {\r\n const { pswp } = this;\r\n\r\n equalizePoints(\r\n this.panAreaSize,\r\n getPanAreaSize(pswp.options, pswp.viewportSize, this.data, this.index)\r\n );\r\n\r\n this.zoomLevels.update(this.width, this.height, this.panAreaSize);\r\n\r\n pswp.dispatch('calcSlideSize', {\r\n slide: this\r\n });\r\n }\r\n\r\n getCurrentTransform() {\r\n const scale = this.currZoomLevel / (this.currentResolution || this.zoomLevels.initial);\r\n return toTransformString(this.pan.x, this.pan.y, scale);\r\n }\r\n\r\n /**\r\n * Set resolution and re-render the image.\r\n *\r\n * For example, if the real image size is 2000x1500,\r\n * and resolution is 0.5 - it will be rendered as 1000x750.\r\n *\r\n * Image with zoom level 2 and resolution 0.5 is\r\n * the same as image with zoom level 1 and resolution 1.\r\n *\r\n * Used to optimize animations and make\r\n * sure that browser renders image in highest quality.\r\n * Also used by responsive images to load the correct one.\r\n *\r\n * @param {number} newResolution\r\n */\r\n _setResolution(newResolution) {\r\n if (newResolution === this.currentResolution) {\r\n return;\r\n }\r\n\r\n this.currentResolution = newResolution;\r\n this.updateContentSize();\r\n\r\n this.pswp.dispatch('resolutionChanged');\r\n }\r\n}\r\n\r\nexport default Slide;\r\n", "import {\r\n equalizePoints, roundPoint, clamp\r\n} from '../util/util.js';\r\n\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n/** @typedef {import('./gestures.js').default} Gestures */\r\n\r\nconst PAN_END_FRICTION = 0.35;\r\nconst VERTICAL_DRAG_FRICTION = 0.6;\r\n\r\n// 1 corresponds to the third of viewport height\r\nconst MIN_RATIO_TO_CLOSE = 0.4;\r\n\r\n// Minimum speed required to navigate\r\n// to next or previous slide\r\nconst MIN_NEXT_SLIDE_SPEED = 0.5;\r\n\r\n/**\r\n * @param {number} initialVelocity\r\n * @param {number} decelerationRate\r\n */\r\nfunction project(initialVelocity, decelerationRate) {\r\n return initialVelocity * decelerationRate / (1 - decelerationRate);\r\n}\r\n\r\n/**\r\n * Handles single pointer dragging\r\n */\r\nclass DragHandler {\r\n /**\r\n * @param {Gestures} gestures\r\n */\r\n constructor(gestures) {\r\n this.gestures = gestures;\r\n this.pswp = gestures.pswp;\r\n /** @type {Point} */\r\n this.startPan = {};\r\n }\r\n\r\n start() {\r\n equalizePoints(this.startPan, this.pswp.currSlide.pan);\r\n this.pswp.animations.stopAll();\r\n }\r\n\r\n change() {\r\n const { p1, prevP1, dragAxis, pswp } = this.gestures;\r\n const { currSlide } = pswp;\r\n\r\n if (dragAxis === 'y'\r\n && pswp.options.closeOnVerticalDrag\r\n && currSlide.currZoomLevel <= currSlide.zoomLevels.fit\r\n && !this.gestures.isMultitouch) {\r\n // Handle vertical drag to close\r\n const panY = currSlide.pan.y + (p1.y - prevP1.y);\r\n if (!pswp.dispatch('verticalDrag', { panY }).defaultPrevented) {\r\n this._setPanWithFriction('y', panY, VERTICAL_DRAG_FRICTION);\r\n const bgOpacity = 1 - Math.abs(this._getVerticalDragRatio(currSlide.pan.y));\r\n pswp.applyBgOpacity(bgOpacity);\r\n currSlide.applyCurrentZoomPan();\r\n }\r\n } else {\r\n const mainScrollChanged = this._panOrMoveMainScroll('x');\r\n if (!mainScrollChanged) {\r\n this._panOrMoveMainScroll('y');\r\n\r\n roundPoint(currSlide.pan);\r\n currSlide.applyCurrentZoomPan();\r\n }\r\n }\r\n }\r\n\r\n end() {\r\n const { pswp, velocity } = this.gestures;\r\n const { mainScroll } = pswp;\r\n let indexDiff = 0;\r\n\r\n pswp.animations.stopAll();\r\n\r\n // Handle main scroll if it's shifted\r\n if (mainScroll.isShifted()) {\r\n // Position of the main scroll relative to the viewport\r\n const mainScrollShiftDiff = mainScroll.x - mainScroll.getCurrSlideX();\r\n\r\n // Ratio between 0 and 1:\r\n // 0 - slide is not visible at all,\r\n // 0.5 - half of the slide is vicible\r\n // 1 - slide is fully visible\r\n const currentSlideVisibilityRatio = (mainScrollShiftDiff / pswp.viewportSize.x);\r\n\r\n // Go next slide.\r\n //\r\n // - if velocity and its direction is matched\r\n // and we see at least tiny part of the next slide\r\n //\r\n // - or if we see less than 50% of the current slide\r\n // and velocity is close to 0\r\n //\r\n if ((velocity.x < -MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio < 0)\r\n || (velocity.x < 0.1 && currentSlideVisibilityRatio < -0.5)) {\r\n // Go to next slide\r\n indexDiff = 1;\r\n velocity.x = Math.min(velocity.x, 0);\r\n } else if ((velocity.x > MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio > 0)\r\n || (velocity.x > -0.1 && currentSlideVisibilityRatio > 0.5)) {\r\n // Go to prev slide\r\n indexDiff = -1;\r\n velocity.x = Math.max(velocity.x, 0);\r\n }\r\n\r\n mainScroll.moveIndexBy(indexDiff, true, velocity.x);\r\n }\r\n\r\n // Restore zoom level\r\n if (pswp.currSlide.currZoomLevel > pswp.currSlide.zoomLevels.max\r\n || this.gestures.isMultitouch) {\r\n this.gestures.zoomLevels.correctZoomPan(true);\r\n } else {\r\n // we run two animations instead of one,\r\n // as each axis has own pan boundaries and thus different spring function\r\n // (correctZoomPan does not have this functionality,\r\n // it animates all properties with single timing function)\r\n this._finishPanGestureForAxis('x');\r\n this._finishPanGestureForAxis('y');\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n */\r\n _finishPanGestureForAxis(axis) {\r\n const { pswp } = this;\r\n const { currSlide } = pswp;\r\n const { velocity } = this.gestures;\r\n const { pan, bounds } = currSlide;\r\n const panPos = pan[axis];\r\n const restoreBgOpacity = (pswp.bgOpacity < 1 && axis === 'y');\r\n\r\n // 0.995 means - scroll view loses 0.5% of its velocity per millisecond\r\n // Inceasing this number will reduce travel distance\r\n const decelerationRate = 0.995; // 0.99\r\n\r\n // Pan position if there is no bounds\r\n const projectedPosition = panPos + project(velocity[axis], decelerationRate);\r\n\r\n if (restoreBgOpacity) {\r\n const vDragRatio = this._getVerticalDragRatio(panPos);\r\n const projectedVDragRatio = this._getVerticalDragRatio(projectedPosition);\r\n\r\n // If we are above and moving upwards,\r\n // or if we are below and moving downwards\r\n if ((vDragRatio < 0 && projectedVDragRatio < -MIN_RATIO_TO_CLOSE)\r\n || (vDragRatio > 0 && projectedVDragRatio > MIN_RATIO_TO_CLOSE)) {\r\n pswp.close();\r\n return;\r\n }\r\n }\r\n\r\n // Pan position with corrected bounds\r\n const correctedPanPosition = bounds.correctPan(axis, projectedPosition);\r\n\r\n // Exit if pan position should not be changed\r\n // or if speed it too low\r\n if (panPos === correctedPanPosition) {\r\n return;\r\n }\r\n\r\n // Overshoot if the final position is out of pan bounds\r\n const dampingRatio = (correctedPanPosition === projectedPosition) ? 1 : 0.82;\r\n\r\n const initialBgOpacity = pswp.bgOpacity;\r\n const totalPanDist = correctedPanPosition - panPos;\r\n\r\n pswp.animations.startSpring({\r\n name: 'panGesture' + axis,\r\n isPan: true,\r\n start: panPos,\r\n end: correctedPanPosition,\r\n velocity: velocity[axis],\r\n dampingRatio,\r\n onUpdate: (pos) => {\r\n // Animate opacity of background relative to Y pan position of an image\r\n if (restoreBgOpacity && pswp.bgOpacity < 1) {\r\n // 0 - start of animation, 1 - end of animation\r\n const animationProgressRatio = 1 - (correctedPanPosition - pos) / totalPanDist;\r\n\r\n // We clamp opacity to keep it between 0 and 1.\r\n // As progress ratio can be larger than 1 due to overshoot,\r\n // and we do not want to bounce opacity.\r\n pswp.applyBgOpacity(clamp(\r\n initialBgOpacity + (1 - initialBgOpacity) * animationProgressRatio,\r\n 0,\r\n 1\r\n ));\r\n }\r\n\r\n pan[axis] = Math.floor(pos);\r\n currSlide.applyCurrentZoomPan();\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Update position of the main scroll,\r\n * or/and update pan position of the current slide.\r\n *\r\n * Should return true if it changes (or can change) main scroll.\r\n *\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n */\r\n _panOrMoveMainScroll(axis) {\r\n const { p1, pswp, dragAxis, prevP1, isMultitouch } = this.gestures;\r\n const { currSlide, mainScroll } = pswp;\r\n const delta = (p1[axis] - prevP1[axis]);\r\n const newMainScrollX = mainScroll.x + delta;\r\n\r\n if (!delta) {\r\n return;\r\n }\r\n\r\n // Always move main scroll if image can not be panned\r\n if (axis === 'x' && !currSlide.isPannable() && !isMultitouch) {\r\n mainScroll.moveTo(newMainScrollX, true);\r\n return true; // changed main scroll\r\n }\r\n\r\n const { bounds } = currSlide;\r\n const newPan = currSlide.pan[axis] + delta;\r\n\r\n if (pswp.options.allowPanToNext\r\n && dragAxis === 'x'\r\n && axis === 'x'\r\n && !isMultitouch) {\r\n const currSlideMainScrollX = mainScroll.getCurrSlideX();\r\n\r\n // Position of the main scroll relative to the viewport\r\n const mainScrollShiftDiff = mainScroll.x - currSlideMainScrollX;\r\n\r\n const isLeftToRight = delta > 0;\r\n const isRightToLeft = !isLeftToRight;\r\n\r\n if (newPan > bounds.min[axis] && isLeftToRight) {\r\n // Panning from left to right, beyond the left edge\r\n\r\n // Wether the image was at minimum pan position (or less)\r\n // when this drag gesture started.\r\n // Minimum pan position refers to the left edge of the image.\r\n const wasAtMinPanPosition = (bounds.min[axis] <= this.startPan[axis]);\r\n\r\n if (wasAtMinPanPosition) {\r\n mainScroll.moveTo(newMainScrollX, true);\r\n return true;\r\n } else {\r\n this._setPanWithFriction(axis, newPan);\r\n //currSlide.pan[axis] = newPan;\r\n }\r\n } else if (newPan < bounds.max[axis] && isRightToLeft) {\r\n // Paning from right to left, beyond the right edge\r\n\r\n // Maximum pan position refers to the right edge of the image.\r\n const wasAtMaxPanPosition = (this.startPan[axis] <= bounds.max[axis]);\r\n\r\n if (wasAtMaxPanPosition) {\r\n mainScroll.moveTo(newMainScrollX, true);\r\n return true;\r\n } else {\r\n this._setPanWithFriction(axis, newPan);\r\n //currSlide.pan[axis] = newPan;\r\n }\r\n } else {\r\n // If main scroll is shifted\r\n if (mainScrollShiftDiff !== 0) {\r\n // If main scroll is shifted right\r\n if (mainScrollShiftDiff > 0 /*&& isRightToLeft*/) {\r\n mainScroll.moveTo(Math.max(newMainScrollX, currSlideMainScrollX), true);\r\n return true;\r\n } else if (mainScrollShiftDiff < 0 /*&& isLeftToRight*/) {\r\n // Main scroll is shifted left (Position is less than 0 comparing to the viewport 0)\r\n mainScroll.moveTo(Math.min(newMainScrollX, currSlideMainScrollX), true);\r\n return true;\r\n }\r\n } else {\r\n // We are within pan bounds, so just pan\r\n this._setPanWithFriction(axis, newPan);\r\n }\r\n }\r\n } else {\r\n if (axis === 'y') {\r\n // Do not pan vertically if main scroll is shifted o\r\n if (!mainScroll.isShifted() && bounds.min.y !== bounds.max.y) {\r\n this._setPanWithFriction(axis, newPan);\r\n }\r\n } else {\r\n this._setPanWithFriction(axis, newPan);\r\n }\r\n }\r\n }\r\n //\r\n // If we move above - the ratio is negative\r\n // If we move below the ratio is positive\r\n\r\n /**\r\n * Relation between pan Y position and third of viewport height.\r\n *\r\n * When we are at initial position (center bounds) - the ratio is 0,\r\n * if position is shifted upwards - the ratio is negative,\r\n * if position is shifted downwards - the ratio is positive.\r\n *\r\n * @private\r\n * @param {number} panY The current pan Y position.\r\n */\r\n _getVerticalDragRatio(panY) {\r\n return (panY - this.pswp.currSlide.bounds.center.y)\r\n / (this.pswp.viewportSize.y / 3);\r\n }\r\n\r\n /**\r\n * Set pan position of the current slide.\r\n * Apply friction if the position is beyond the pan bounds,\r\n * or if custom friction is defined.\r\n *\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @param {number} potentialPan\r\n * @param {number=} customFriction (0.1 - 1)\r\n */\r\n _setPanWithFriction(axis, potentialPan, customFriction) {\r\n const { pan, bounds } = this.pswp.currSlide;\r\n const correctedPan = bounds.correctPan(axis, potentialPan);\r\n // If we are out of pan bounds\r\n if (correctedPan !== potentialPan || customFriction) {\r\n const delta = Math.round(potentialPan - pan[axis]);\r\n pan[axis] += delta * (customFriction || PAN_END_FRICTION);\r\n } else {\r\n pan[axis] = potentialPan;\r\n }\r\n }\r\n}\r\n\r\nexport default DragHandler;\r\n", "import {\r\n equalizePoints, getDistanceBetween, clamp, pointsEqual\r\n} from '../util/util.js';\r\n\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n/** @typedef {import('./gestures.js').default} Gestures */\r\n\r\nconst UPPER_ZOOM_FRICTION = 0.05;\r\nconst LOWER_ZOOM_FRICTION = 0.15;\r\n\r\n\r\n/**\r\n * Get center point between two points\r\n *\r\n * @param {Point} p\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nfunction getZoomPointsCenter(p, p1, p2) {\r\n p.x = (p1.x + p2.x) / 2;\r\n p.y = (p1.y + p2.y) / 2;\r\n return p;\r\n}\r\n\r\nclass ZoomHandler {\r\n /**\r\n * @param {Gestures} gestures\r\n */\r\n constructor(gestures) {\r\n this.gestures = gestures;\r\n this.pswp = this.gestures.pswp;\r\n /** @type {Point} */\r\n this._startPan = {};\r\n\r\n /** @type {Point} */\r\n this._startZoomPoint = {};\r\n /** @type {Point} */\r\n this._zoomPoint = {};\r\n }\r\n\r\n start() {\r\n this._startZoomLevel = this.pswp.currSlide.currZoomLevel;\r\n equalizePoints(this._startPan, this.pswp.currSlide.pan);\r\n this.pswp.animations.stopAllPan();\r\n this._wasOverFitZoomLevel = false;\r\n }\r\n\r\n change() {\r\n const { p1, startP1, p2, startP2, pswp } = this.gestures;\r\n const { currSlide } = pswp;\r\n const minZoomLevel = currSlide.zoomLevels.min;\r\n const maxZoomLevel = currSlide.zoomLevels.max;\r\n\r\n if (!currSlide.isZoomable() || pswp.mainScroll.isShifted()) {\r\n return;\r\n }\r\n\r\n getZoomPointsCenter(this._startZoomPoint, startP1, startP2);\r\n getZoomPointsCenter(this._zoomPoint, p1, p2);\r\n\r\n let currZoomLevel = (1 / getDistanceBetween(startP1, startP2))\r\n * getDistanceBetween(p1, p2)\r\n * this._startZoomLevel;\r\n\r\n // slightly over the zoom.fit\r\n if (currZoomLevel > currSlide.zoomLevels.initial + (currSlide.zoomLevels.initial / 15)) {\r\n this._wasOverFitZoomLevel = true;\r\n }\r\n\r\n if (currZoomLevel < minZoomLevel) {\r\n if (pswp.options.pinchToClose\r\n && !this._wasOverFitZoomLevel\r\n && this._startZoomLevel <= currSlide.zoomLevels.initial) {\r\n // fade out background if zooming out\r\n const bgOpacity = 1 - ((minZoomLevel - currZoomLevel) / (minZoomLevel / 1.2));\r\n if (!pswp.dispatch('pinchClose', { bgOpacity }).defaultPrevented) {\r\n pswp.applyBgOpacity(bgOpacity);\r\n }\r\n } else {\r\n // Apply the friction if zoom level is below the min\r\n currZoomLevel = minZoomLevel - (minZoomLevel - currZoomLevel) * LOWER_ZOOM_FRICTION;\r\n }\r\n } else if (currZoomLevel > maxZoomLevel) {\r\n // Apply the friction if zoom level is above the max\r\n currZoomLevel = maxZoomLevel + (currZoomLevel - maxZoomLevel) * UPPER_ZOOM_FRICTION;\r\n }\r\n\r\n currSlide.pan.x = this._calculatePanForZoomLevel('x', currZoomLevel);\r\n currSlide.pan.y = this._calculatePanForZoomLevel('y', currZoomLevel);\r\n\r\n currSlide.setZoomLevel(currZoomLevel);\r\n currSlide.applyCurrentZoomPan();\r\n }\r\n\r\n end() {\r\n const { pswp } = this;\r\n const { currSlide } = pswp;\r\n if (currSlide.currZoomLevel < currSlide.zoomLevels.initial\r\n && !this._wasOverFitZoomLevel\r\n && pswp.options.pinchToClose) {\r\n pswp.close();\r\n } else {\r\n this.correctZoomPan();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @param {number} currZoomLevel\r\n */\r\n _calculatePanForZoomLevel(axis, currZoomLevel) {\r\n const zoomFactor = currZoomLevel / this._startZoomLevel;\r\n return this._zoomPoint[axis]\r\n - ((this._startZoomPoint[axis] - this._startPan[axis]) * zoomFactor);\r\n }\r\n\r\n /**\r\n * Correct currZoomLevel and pan if they are\r\n * beyond minimum or maximum values.\r\n * With animation.\r\n *\r\n * @param {boolean=} ignoreGesture\r\n * Wether gesture coordinates should be ignored when calculating destination pan position.\r\n */\r\n correctZoomPan(ignoreGesture) {\r\n const { pswp } = this;\r\n const { currSlide } = pswp;\r\n\r\n if (!currSlide.isZoomable()) {\r\n return;\r\n }\r\n\r\n if (this._zoomPoint.x === undefined) {\r\n ignoreGesture = true;\r\n }\r\n\r\n const prevZoomLevel = currSlide.currZoomLevel;\r\n\r\n /** @type {number} */\r\n let destinationZoomLevel;\r\n let currZoomLevelNeedsChange = true;\r\n\r\n if (prevZoomLevel < currSlide.zoomLevels.initial) {\r\n destinationZoomLevel = currSlide.zoomLevels.initial;\r\n // zoom to min\r\n } else if (prevZoomLevel > currSlide.zoomLevels.max) {\r\n destinationZoomLevel = currSlide.zoomLevels.max;\r\n // zoom to max\r\n } else {\r\n currZoomLevelNeedsChange = false;\r\n destinationZoomLevel = prevZoomLevel;\r\n }\r\n\r\n const initialBgOpacity = pswp.bgOpacity;\r\n const restoreBgOpacity = pswp.bgOpacity < 1;\r\n\r\n const initialPan = equalizePoints({}, currSlide.pan);\r\n let destinationPan = equalizePoints({}, initialPan);\r\n\r\n if (ignoreGesture) {\r\n this._zoomPoint.x = 0;\r\n this._zoomPoint.y = 0;\r\n this._startZoomPoint.x = 0;\r\n this._startZoomPoint.y = 0;\r\n this._startZoomLevel = prevZoomLevel;\r\n equalizePoints(this._startPan, initialPan);\r\n }\r\n\r\n if (currZoomLevelNeedsChange) {\r\n destinationPan = {\r\n x: this._calculatePanForZoomLevel('x', destinationZoomLevel),\r\n y: this._calculatePanForZoomLevel('y', destinationZoomLevel)\r\n };\r\n }\r\n\r\n // set zoom level, so pan bounds are updated according to it\r\n currSlide.setZoomLevel(destinationZoomLevel);\r\n\r\n destinationPan = {\r\n x: currSlide.bounds.correctPan('x', destinationPan.x),\r\n y: currSlide.bounds.correctPan('y', destinationPan.y)\r\n };\r\n\r\n // return zoom level and its bounds to initial\r\n currSlide.setZoomLevel(prevZoomLevel);\r\n\r\n let panNeedsChange = true;\r\n if (pointsEqual(destinationPan, initialPan)) {\r\n panNeedsChange = false;\r\n }\r\n\r\n if (!panNeedsChange && !currZoomLevelNeedsChange && !restoreBgOpacity) {\r\n // update resolution after gesture\r\n currSlide._setResolution(destinationZoomLevel);\r\n currSlide.applyCurrentZoomPan();\r\n\r\n // nothing to animate\r\n return;\r\n }\r\n\r\n pswp.animations.stopAllPan();\r\n\r\n pswp.animations.startSpring({\r\n isPan: true,\r\n start: 0,\r\n end: 1000,\r\n velocity: 0,\r\n dampingRatio: 1,\r\n naturalFrequency: 40,\r\n onUpdate: (now) => {\r\n now /= 1000; // 0 - start, 1 - end\r\n\r\n if (panNeedsChange || currZoomLevelNeedsChange) {\r\n if (panNeedsChange) {\r\n currSlide.pan.x = initialPan.x + (destinationPan.x - initialPan.x) * now;\r\n currSlide.pan.y = initialPan.y + (destinationPan.y - initialPan.y) * now;\r\n }\r\n\r\n if (currZoomLevelNeedsChange) {\r\n const newZoomLevel = prevZoomLevel\r\n + (destinationZoomLevel - prevZoomLevel) * now;\r\n currSlide.setZoomLevel(newZoomLevel);\r\n }\r\n\r\n currSlide.applyCurrentZoomPan();\r\n }\r\n\r\n // Restore background opacity\r\n if (restoreBgOpacity && pswp.bgOpacity < 1) {\r\n // We clamp opacity to keep it between 0 and 1.\r\n // As progress ratio can be larger than 1 due to overshoot,\r\n // and we do not want to bounce opacity.\r\n pswp.applyBgOpacity(clamp(\r\n initialBgOpacity + (1 - initialBgOpacity) * now, 0, 1\r\n ));\r\n }\r\n },\r\n onComplete: () => {\r\n // update resolution after transition ends\r\n currSlide._setResolution(destinationZoomLevel);\r\n currSlide.applyCurrentZoomPan();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default ZoomHandler;\r\n", "/**\r\n * @template T\r\n * @template P\r\n * @typedef {import('../types.js').AddPostfix} AddPostfix\r\n */\r\n\r\n/** @typedef {import('./gestures.js').default} Gestures */\r\n\r\n/** @typedef {'imageClick' | 'bgClick' | 'tap' | 'doubleTap'} Actions */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n\r\n/**\r\n * Whether the tap was performed on the main slide\r\n * (rather than controls or caption).\r\n *\r\n * @param {PointerEvent} event\r\n */\r\nfunction didTapOnMainContent(event) {\r\n return !!(/** @type {HTMLElement} */ (event.target).closest('.pswp__container'));\r\n}\r\n\r\n/**\r\n * Tap, double-tap handler.\r\n */\r\nclass TapHandler {\r\n /**\r\n * @param {Gestures} gestures\r\n */\r\n constructor(gestures) {\r\n this.gestures = gestures;\r\n }\r\n\r\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\r\n click(point, originalEvent) {\r\n const targetClassList = /** @type {HTMLElement} */ (originalEvent.target).classList;\r\n const isImageClick = targetClassList.contains('pswp__img');\r\n const isBackgroundClick = targetClassList.contains('pswp__item')\r\n || targetClassList.contains('pswp__zoom-wrap');\r\n\r\n if (isImageClick) {\r\n this._doClickOrTapAction('imageClick', point, originalEvent);\r\n } else if (isBackgroundClick) {\r\n this._doClickOrTapAction('bgClick', point, originalEvent);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\r\n tap(point, originalEvent) {\r\n if (didTapOnMainContent(originalEvent)) {\r\n this._doClickOrTapAction('tap', point, originalEvent);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\r\n doubleTap(point, originalEvent) {\r\n if (didTapOnMainContent(originalEvent)) {\r\n this._doClickOrTapAction('doubleTap', point, originalEvent);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Actions} actionName\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\r\n _doClickOrTapAction(actionName, point, originalEvent) {\r\n const { pswp } = this.gestures;\r\n const { currSlide } = pswp;\r\n const actionFullName = /** @type {AddPostfix} */ (actionName + 'Action');\r\n const optionValue = pswp.options[actionFullName];\r\n\r\n if (pswp.dispatch(actionFullName, { point, originalEvent }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (typeof optionValue === 'function') {\r\n optionValue.call(pswp, point, originalEvent);\r\n return;\r\n }\r\n\r\n switch (optionValue) {\r\n case 'close':\r\n case 'next':\r\n pswp[optionValue]();\r\n break;\r\n case 'zoom':\r\n currSlide.toggleZoom(point);\r\n break;\r\n case 'zoom-or-close':\r\n // by default click zooms current image,\r\n // if it can not be zoomed - gallery will be closed\r\n if (currSlide.isZoomable()\r\n && currSlide.zoomLevels.secondary !== currSlide.zoomLevels.initial) {\r\n currSlide.toggleZoom(point);\r\n } else if (pswp.options.clickToCloseNonZoomable) {\r\n pswp.close();\r\n }\r\n break;\r\n case 'toggle-controls':\r\n this.gestures.pswp.element.classList.toggle('pswp--ui-visible');\r\n // if (_controlsVisible) {\r\n // _ui.hideControls();\r\n // } else {\r\n // _ui.showControls();\r\n // }\r\n break;\r\n }\r\n }\r\n}\r\n\r\nexport default TapHandler;\r\n", "import {\r\n equalizePoints, pointsEqual, getDistanceBetween\r\n} from '../util/util.js';\r\n\r\nimport DragHandler from './drag-handler.js';\r\nimport ZoomHandler from './zoom-handler.js';\r\nimport TapHandler from './tap-handler.js';\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n// How far should user should drag\r\n// until we can determine that the gesture is swipe and its direction\r\nconst AXIS_SWIPE_HYSTERISIS = 10;\r\n//const PAN_END_FRICTION = 0.35;\r\n\r\nconst DOUBLE_TAP_DELAY = 300; // ms\r\nconst MIN_TAP_DISTANCE = 25; // px\r\n\r\n/**\r\n * Gestures class bind touch, pointer or mouse events\r\n * and emits drag to drag-handler and zoom events zoom-handler.\r\n *\r\n * Drag and zoom events are emited in requestAnimationFrame,\r\n * and only when one of pointers was actually changed.\r\n */\r\nclass Gestures {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n\r\n /** @type {'x' | 'y'} */\r\n this.dragAxis = undefined;\r\n\r\n // point objects are defined once and reused\r\n // PhotoSwipe keeps track only of two pointers, others are ignored\r\n /** @type {Point} */\r\n this.p1 = {}; // the first pressed pointer\r\n /** @type {Point} */\r\n this.p2 = {}; // the second pressed pointer\r\n /** @type {Point} */\r\n this.prevP1 = {};\r\n /** @type {Point} */\r\n this.prevP2 = {};\r\n /** @type {Point} */\r\n this.startP1 = {};\r\n /** @type {Point} */\r\n this.startP2 = {};\r\n /** @type {Point} */\r\n this.velocity = {};\r\n\r\n /** @type {Point} */\r\n this._lastStartP1 = {};\r\n /** @type {Point} */\r\n this._intervalP1 = {};\r\n this._numActivePoints = 0;\r\n /** @type {Point[]} */\r\n this._ongoingPointers = [];\r\n\r\n this._touchEventEnabled = 'ontouchstart' in window;\r\n this._pointerEventEnabled = !!(window.PointerEvent);\r\n this.supportsTouch = this._touchEventEnabled\r\n || (this._pointerEventEnabled && navigator.maxTouchPoints > 1);\r\n\r\n if (!this.supportsTouch) {\r\n // disable pan to next slide for non-touch devices\r\n pswp.options.allowPanToNext = false;\r\n }\r\n\r\n this.drag = new DragHandler(this);\r\n this.zoomLevels = new ZoomHandler(this);\r\n this.tapHandler = new TapHandler(this);\r\n\r\n pswp.on('bindEvents', () => {\r\n pswp.events.add(pswp.scrollWrap, 'click', e => this._onClick(e));\r\n\r\n if (this._pointerEventEnabled) {\r\n this._bindEvents('pointer', 'down', 'up', 'cancel');\r\n } else if (this._touchEventEnabled) {\r\n this._bindEvents('touch', 'start', 'end', 'cancel');\r\n\r\n // In previous versions we also bound mouse event here,\r\n // in case device supports both touch and mouse events,\r\n // but newer versions of browsers now support PointerEvent.\r\n\r\n // on iOS10 if you bind touchmove/end after touchstart,\r\n // and you don't preventDefault touchstart (which PhotoSwipe does),\r\n // preventDefault will have no effect on touchmove and touchend.\r\n // Unless you bind it previously.\r\n pswp.scrollWrap.ontouchmove = () => {}; // eslint-disable-line\r\n pswp.scrollWrap.ontouchend = () => {}; // eslint-disable-line\r\n } else {\r\n this._bindEvents('mouse', 'down', 'up');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * @param {'mouse' | 'touch' | 'pointer'} pref\r\n * @param {'down' | 'start'} down\r\n * @param {'up' | 'end'} up\r\n * @param {'cancel'} [cancel]\r\n */\r\n _bindEvents(pref, down, up, cancel) {\r\n const { pswp } = this;\r\n const { events } = pswp;\r\n\r\n const cancelEvent = cancel ? pref + cancel : '';\r\n\r\n events.add(pswp.scrollWrap, pref + down, this.onPointerDown.bind(this));\r\n events.add(window, pref + 'move', this.onPointerMove.bind(this));\r\n events.add(window, pref + up, this.onPointerUp.bind(this));\r\n if (cancelEvent) {\r\n events.add(pswp.scrollWrap, cancelEvent, this.onPointerUp.bind(this));\r\n }\r\n }\r\n\r\n /**\r\n * @param {PointerEvent} e\r\n */\r\n onPointerDown(e) {\r\n // We do not call preventDefault for touch events\r\n // to allow browser to show native dialog on longpress\r\n // (the one that allows to save image or open it in new tab).\r\n //\r\n // Desktop Safari allows to drag images when preventDefault isn't called on mousedown,\r\n // even though preventDefault IS called on mousemove. That's why we preventDefault mousedown.\r\n let isMousePointer;\r\n if (e.type === 'mousedown' || e.pointerType === 'mouse') {\r\n isMousePointer = true;\r\n }\r\n\r\n // Allow dragging only via left mouse button.\r\n // http://www.quirksmode.org/js/events_properties.html\r\n // https://developer.mozilla.org/en-US/docs/Web/API/event.button\r\n if (isMousePointer && e.button > 0) {\r\n return;\r\n }\r\n\r\n const { pswp } = this;\r\n\r\n // if PhotoSwipe is opening or closing\r\n if (!pswp.opener.isOpen) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n if (pswp.dispatch('pointerDown', { originalEvent: e }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (isMousePointer) {\r\n pswp.mouseDetected();\r\n\r\n // preventDefault mouse event to prevent\r\n // browser image drag feature\r\n this._preventPointerEventBehaviour(e);\r\n }\r\n\r\n pswp.animations.stopAll();\r\n\r\n this._updatePoints(e, 'down');\r\n\r\n this.pointerDown = true;\r\n\r\n if (this._numActivePoints === 1) {\r\n this.dragAxis = null;\r\n // we need to store initial point to determine the main axis,\r\n // drag is activated only after the axis is determined\r\n equalizePoints(this.startP1, this.p1);\r\n }\r\n\r\n if (this._numActivePoints > 1) {\r\n // Tap or double tap should not trigger if more than one pointer\r\n this._clearTapTimer();\r\n this.isMultitouch = true;\r\n } else {\r\n this.isMultitouch = false;\r\n }\r\n }\r\n\r\n /**\r\n * @param {PointerEvent} e\r\n */\r\n onPointerMove(e) {\r\n e.preventDefault(); // always preventDefault move event\r\n\r\n if (!this._numActivePoints) {\r\n return;\r\n }\r\n\r\n this._updatePoints(e, 'move');\r\n\r\n if (this.pswp.dispatch('pointerMove', { originalEvent: e }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this._numActivePoints === 1 && !this.isDragging) {\r\n if (!this.dragAxis) {\r\n this._calculateDragDirection();\r\n }\r\n\r\n // Drag axis was detected, emit drag.start\r\n if (this.dragAxis && !this.isDragging) {\r\n if (this.isZooming) {\r\n this.isZooming = false;\r\n this.zoomLevels.end();\r\n }\r\n\r\n this.isDragging = true;\r\n this._clearTapTimer(); // Tap can not trigger after drag\r\n\r\n // Adjust starting point\r\n this._updateStartPoints();\r\n this._intervalTime = Date.now();\r\n //this._startTime = this._intervalTime;\r\n this._velocityCalculated = false;\r\n equalizePoints(this._intervalP1, this.p1);\r\n this.velocity.x = 0;\r\n this.velocity.y = 0;\r\n this.drag.start();\r\n\r\n this._rafStopLoop();\r\n this._rafRenderLoop();\r\n }\r\n } else if (this._numActivePoints > 1 && !this.isZooming) {\r\n this._finishDrag();\r\n\r\n this.isZooming = true;\r\n\r\n // Adjust starting points\r\n this._updateStartPoints();\r\n\r\n this.zoomLevels.start();\r\n\r\n this._rafStopLoop();\r\n this._rafRenderLoop();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _finishDrag() {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n\r\n // Try to calculate velocity,\r\n // if it wasn't calculated yet in drag.change\r\n if (!this._velocityCalculated) {\r\n this._updateVelocity(true);\r\n }\r\n\r\n this.drag.end();\r\n this.dragAxis = null;\r\n }\r\n }\r\n\r\n /**\r\n * @param {PointerEvent} e\r\n */\r\n onPointerUp(e) {\r\n if (!this._numActivePoints) {\r\n return;\r\n }\r\n\r\n this._updatePoints(e, 'up');\r\n\r\n if (this.pswp.dispatch('pointerUp', { originalEvent: e }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this._numActivePoints === 0) {\r\n this.pointerDown = false;\r\n this._rafStopLoop();\r\n\r\n if (this.isDragging) {\r\n this._finishDrag();\r\n } else if (!this.isZooming && !this.isMultitouch) {\r\n //this.zoomLevels.correctZoomPan();\r\n this._finishTap(e);\r\n }\r\n }\r\n\r\n if (this._numActivePoints < 2 && this.isZooming) {\r\n this.isZooming = false;\r\n this.zoomLevels.end();\r\n\r\n if (this._numActivePoints === 1) {\r\n // Since we have 1 point left, we need to reinitiate drag\r\n this.dragAxis = null;\r\n this._updateStartPoints();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _rafRenderLoop() {\r\n if (this.isDragging || this.isZooming) {\r\n this._updateVelocity();\r\n\r\n if (this.isDragging) {\r\n // make sure that pointer moved since the last update\r\n if (!pointsEqual(this.p1, this.prevP1)) {\r\n this.drag.change();\r\n }\r\n } else /* if (this.isZooming) */ {\r\n if (!pointsEqual(this.p1, this.prevP1)\r\n || !pointsEqual(this.p2, this.prevP2)) {\r\n this.zoomLevels.change();\r\n }\r\n }\r\n\r\n this._updatePrevPoints();\r\n this.raf = requestAnimationFrame(this._rafRenderLoop.bind(this));\r\n }\r\n }\r\n\r\n /**\r\n * Update velocity at 50ms interval\r\n *\r\n * @param {boolean=} force\r\n */\r\n _updateVelocity(force) {\r\n const time = Date.now();\r\n const duration = time - this._intervalTime;\r\n\r\n if (duration < 50 && !force) {\r\n return;\r\n }\r\n\r\n\r\n this.velocity.x = this._getVelocity('x', duration);\r\n this.velocity.y = this._getVelocity('y', duration);\r\n\r\n this._intervalTime = time;\r\n equalizePoints(this._intervalP1, this.p1);\r\n this._velocityCalculated = true;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n */\r\n _finishTap(e) {\r\n const { mainScroll } = this.pswp;\r\n\r\n // Do not trigger tap events if main scroll is shifted\r\n if (mainScroll.isShifted()) {\r\n // restore main scroll position\r\n // (usually happens if stopped in the middle of animation)\r\n mainScroll.moveIndexBy(0, true);\r\n return;\r\n }\r\n\r\n // Do not trigger tap for touchcancel or pointercancel\r\n if (e.type.indexOf('cancel') > 0) {\r\n return;\r\n }\r\n\r\n // Trigger click instead of tap for mouse events\r\n if (e.type === 'mouseup' || e.pointerType === 'mouse') {\r\n this.tapHandler.click(this.startP1, e);\r\n return;\r\n }\r\n\r\n // Disable delay if there is no doubleTapAction\r\n const tapDelay = this.pswp.options.doubleTapAction ? DOUBLE_TAP_DELAY : 0;\r\n\r\n // If tapTimer is defined - we tapped recently,\r\n // check if the current tap is close to the previous one,\r\n // if yes - trigger double tap\r\n if (this._tapTimer) {\r\n this._clearTapTimer();\r\n // Check if two taps were more or less on the same place\r\n if (getDistanceBetween(this._lastStartP1, this.startP1) < MIN_TAP_DISTANCE) {\r\n this.tapHandler.doubleTap(this.startP1, e);\r\n }\r\n } else {\r\n equalizePoints(this._lastStartP1, this.startP1);\r\n this._tapTimer = setTimeout(() => {\r\n this.tapHandler.tap(this.startP1, e);\r\n this._clearTapTimer();\r\n }, tapDelay);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _clearTapTimer() {\r\n if (this._tapTimer) {\r\n clearTimeout(this._tapTimer);\r\n this._tapTimer = null;\r\n }\r\n }\r\n\r\n /**\r\n * Get velocity for axis\r\n *\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @param {number} duration\r\n */\r\n _getVelocity(axis, duration) {\r\n // displacement is like distance, but can be negative.\r\n const displacement = this.p1[axis] - this._intervalP1[axis];\r\n\r\n if (Math.abs(displacement) > 1 && duration > 5) {\r\n return displacement / duration;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _rafStopLoop() {\r\n if (this.raf) {\r\n cancelAnimationFrame(this.raf);\r\n this.raf = null;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n */\r\n _preventPointerEventBehaviour(e) {\r\n // TODO find a way to disable e.preventDefault on some elements\r\n // via event or some class or something\r\n e.preventDefault();\r\n return true;\r\n }\r\n\r\n /**\r\n * Parses and normalizes points from the touch, mouse or pointer event.\r\n * Updates p1 and p2.\r\n *\r\n * @private\r\n * @param {PointerEvent | TouchEvent} e\r\n * @param {'up' | 'down' | 'move'} pointerType Normalized pointer type\r\n */\r\n _updatePoints(e, pointerType) {\r\n if (this._pointerEventEnabled) {\r\n const pointerEvent = /** @type {PointerEvent} */ (e);\r\n // Try to find the current pointer in ongoing pointers by its ID\r\n const pointerIndex = this._ongoingPointers.findIndex((ongoingPoiner) => {\r\n return ongoingPoiner.id === pointerEvent.pointerId;\r\n });\r\n\r\n if (pointerType === 'up' && pointerIndex > -1) {\r\n // release the pointer - remove it from ongoing\r\n this._ongoingPointers.splice(pointerIndex, 1);\r\n } else if (pointerType === 'down' && pointerIndex === -1) {\r\n // add new pointer\r\n this._ongoingPointers.push(this._convertEventPosToPoint(pointerEvent, {}));\r\n } else if (pointerIndex > -1) {\r\n // update existing pointer\r\n this._convertEventPosToPoint(pointerEvent, this._ongoingPointers[pointerIndex]);\r\n }\r\n\r\n this._numActivePoints = this._ongoingPointers.length;\r\n\r\n // update points that PhotoSwipe uses\r\n // to calculate position and scale\r\n if (this._numActivePoints > 0) {\r\n equalizePoints(this.p1, this._ongoingPointers[0]);\r\n }\r\n\r\n if (this._numActivePoints > 1) {\r\n equalizePoints(this.p2, this._ongoingPointers[1]);\r\n }\r\n } else {\r\n const touchEvent = /** @type {TouchEvent} */ (e);\r\n\r\n this._numActivePoints = 0;\r\n if (touchEvent.type.indexOf('touch') > -1) {\r\n // Touch Event\r\n // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\r\n if (touchEvent.touches && touchEvent.touches.length > 0) {\r\n this._convertEventPosToPoint(touchEvent.touches[0], this.p1);\r\n this._numActivePoints++;\r\n if (touchEvent.touches.length > 1) {\r\n this._convertEventPosToPoint(touchEvent.touches[1], this.p2);\r\n this._numActivePoints++;\r\n }\r\n }\r\n } else {\r\n // Mouse Event\r\n this._convertEventPosToPoint(/** @type {PointerEvent} */ (e), this.p1);\r\n if (pointerType === 'up') {\r\n // clear all points on mouseup\r\n this._numActivePoints = 0;\r\n } else {\r\n this._numActivePoints++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // update points that were used during previous rAF tick\r\n _updatePrevPoints() {\r\n equalizePoints(this.prevP1, this.p1);\r\n equalizePoints(this.prevP2, this.p2);\r\n }\r\n\r\n // update points at the start of gesture\r\n _updateStartPoints() {\r\n equalizePoints(this.startP1, this.p1);\r\n equalizePoints(this.startP2, this.p2);\r\n this._updatePrevPoints();\r\n }\r\n\r\n _calculateDragDirection() {\r\n if (this.pswp.mainScroll.isShifted()) {\r\n // if main scroll position is shifted \u2013 direction is always horizontal\r\n this.dragAxis = 'x';\r\n } else {\r\n // calculate delta of the last touchmove tick\r\n const diff = Math.abs(this.p1.x - this.startP1.x) - Math.abs(this.p1.y - this.startP1.y);\r\n\r\n if (diff !== 0) {\r\n // check if pointer was shifted horizontally or vertically\r\n const axisToCheck = diff > 0 ? 'x' : 'y';\r\n\r\n if (Math.abs(this.p1[axisToCheck] - this.startP1[axisToCheck]) >= AXIS_SWIPE_HYSTERISIS) {\r\n this.dragAxis = axisToCheck;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Converts touch, pointer or mouse event\r\n * to PhotoSwipe point.\r\n *\r\n * @private\r\n * @param {Touch | PointerEvent} e\r\n * @param {Point} p\r\n */\r\n _convertEventPosToPoint(e, p) {\r\n p.x = e.pageX - this.pswp.offset.x;\r\n p.y = e.pageY - this.pswp.offset.y;\r\n\r\n if ('pointerId' in e) {\r\n p.id = e.pointerId;\r\n } else if (e.identifier !== undefined) {\r\n p.id = e.identifier;\r\n }\r\n\r\n return p;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n */\r\n _onClick(e) {\r\n // Do not allow click event to pass through after drag\r\n if (this.pswp.mainScroll.isShifted()) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n }\r\n}\r\n\r\nexport default Gestures;\r\n", "import {\r\n setTransform,\r\n createElement,\r\n} from './util/util.js';\r\n\r\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('./slide/slide.js').default} Slide */\r\n\r\n/** @typedef {{ el: HTMLDivElement; slide?: Slide }} ItemHolder */\r\n\r\nconst MAIN_SCROLL_END_FRICTION = 0.35;\r\n\r\n\r\n// const MIN_SWIPE_TRANSITION_DURATION = 250;\r\n// const MAX_SWIPE_TRABSITION_DURATION = 500;\r\n// const DEFAULT_SWIPE_TRANSITION_DURATION = 333;\r\n\r\n/**\r\n * Handles movement of the main scrolling container\r\n * (for example, it repositions when user swipes left or right).\r\n *\r\n * Also stores its state.\r\n */\r\nclass MainScroll {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n this.x = 0;\r\n\r\n /** @type {number} */\r\n this.slideWidth = undefined;\r\n\r\n /** @type {ItemHolder[]} */\r\n this.itemHolders = undefined;\r\n\r\n this.resetPosition();\r\n }\r\n\r\n /**\r\n * Position the scroller and slide containers\r\n * according to viewport size.\r\n *\r\n * @param {boolean=} resizeSlides Whether slides content should resized\r\n */\r\n resize(resizeSlides) {\r\n const { pswp } = this;\r\n const newSlideWidth = Math.round(\r\n pswp.viewportSize.x + pswp.viewportSize.x * pswp.options.spacing\r\n );\r\n // Mobile browsers might trigger a resize event during a gesture.\r\n // (due to toolbar appearing or hiding).\r\n // Avoid re-adjusting main scroll position if width wasn't changed\r\n const slideWidthChanged = (newSlideWidth !== this.slideWidth);\r\n\r\n if (slideWidthChanged) {\r\n this.slideWidth = newSlideWidth;\r\n this.moveTo(this.getCurrSlideX());\r\n }\r\n\r\n this.itemHolders.forEach((itemHolder, index) => {\r\n if (slideWidthChanged) {\r\n setTransform(itemHolder.el, (index + this._containerShiftIndex)\r\n * this.slideWidth);\r\n }\r\n\r\n if (resizeSlides && itemHolder.slide) {\r\n itemHolder.slide.resize();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Reset X position of the main scroller to zero\r\n */\r\n resetPosition() {\r\n // Position on the main scroller (offset)\r\n // it is independent from slide index\r\n this._currPositionIndex = 0;\r\n this._prevPositionIndex = 0;\r\n\r\n // This will force recalculation of size on next resize()\r\n this.slideWidth = 0;\r\n\r\n // _containerShiftIndex*viewportSize will give you amount of transform of the current slide\r\n this._containerShiftIndex = -1;\r\n }\r\n\r\n /**\r\n * Create and append array of three items\r\n * that hold data about slides in DOM\r\n */\r\n appendHolders() {\r\n this.itemHolders = [];\r\n\r\n // append our three slide holders -\r\n // previous, current, and next\r\n for (let i = 0; i < 3; i++) {\r\n const el = createElement('pswp__item', false, this.pswp.container);\r\n\r\n // hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\r\n el.style.display = (i === 1) ? 'block' : 'none';\r\n\r\n this.itemHolders.push({\r\n el,\r\n //index: -1\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Whether the main scroll can be horizontally swiped to the next or previous slide.\r\n */\r\n canBeSwiped() {\r\n return this.pswp.getNumItems() > 1;\r\n }\r\n\r\n /**\r\n * Move main scroll by X amount of slides.\r\n * For example:\r\n * `-1` will move to the previous slide,\r\n * `0` will reset the scroll position of the current slide,\r\n * `3` will move three slides forward\r\n *\r\n * If loop option is enabled - index will be automatically looped too,\r\n * (for example `-1` will move to the last slide of the gallery).\r\n *\r\n * @param {number} diff\r\n * @param {boolean=} animate\r\n * @param {number=} velocityX\r\n * @returns {boolean} whether index was changed or not\r\n */\r\n moveIndexBy(diff, animate, velocityX) {\r\n const { pswp } = this;\r\n let newIndex = pswp.potentialIndex + diff;\r\n const numSlides = pswp.getNumItems();\r\n\r\n if (pswp.canLoop()) {\r\n newIndex = pswp.getLoopedIndex(newIndex);\r\n const distance = (diff + numSlides) % numSlides;\r\n if (distance <= numSlides / 2) {\r\n // go forward\r\n diff = distance;\r\n } else {\r\n // go backwards\r\n diff = distance - numSlides;\r\n }\r\n } else {\r\n if (newIndex < 0) {\r\n newIndex = 0;\r\n } else if (newIndex >= numSlides) {\r\n newIndex = numSlides - 1;\r\n }\r\n diff = newIndex - pswp.potentialIndex;\r\n }\r\n\r\n pswp.potentialIndex = newIndex;\r\n this._currPositionIndex -= diff;\r\n\r\n pswp.animations.stopMainScroll();\r\n\r\n const destinationX = this.getCurrSlideX();\r\n if (!animate) {\r\n this.moveTo(destinationX);\r\n this.updateCurrItem();\r\n } else {\r\n pswp.animations.startSpring({\r\n isMainScroll: true,\r\n start: this.x,\r\n end: destinationX,\r\n velocity: velocityX || 0,\r\n naturalFrequency: 30,\r\n dampingRatio: 1, //0.7,\r\n onUpdate: (x) => {\r\n this.moveTo(x);\r\n },\r\n onComplete: () => {\r\n this.updateCurrItem();\r\n pswp.appendHeavy();\r\n }\r\n });\r\n\r\n let currDiff = pswp.potentialIndex - pswp.currIndex;\r\n if (pswp.canLoop()) {\r\n const currDistance = (currDiff + numSlides) % numSlides;\r\n if (currDistance <= numSlides / 2) {\r\n // go forward\r\n currDiff = currDistance;\r\n } else {\r\n // go backwards\r\n currDiff = currDistance - numSlides;\r\n }\r\n }\r\n\r\n // Force-append new slides during transition\r\n // if difference between slides is more than 1\r\n if (Math.abs(currDiff) > 1) {\r\n this.updateCurrItem();\r\n }\r\n }\r\n\r\n if (diff) {\r\n return true;\r\n }\r\n }\r\n\r\n /**\r\n * X position of the main scroll for the current slide\r\n * (ignores position during dragging)\r\n */\r\n getCurrSlideX() {\r\n return this.slideWidth * this._currPositionIndex;\r\n }\r\n\r\n /**\r\n * Whether scroll position is shifted.\r\n * For example, it will return true if the scroll is being dragged or animated.\r\n */\r\n isShifted() {\r\n return this.x !== this.getCurrSlideX();\r\n }\r\n\r\n /**\r\n * Update slides X positions and set their content\r\n */\r\n updateCurrItem() {\r\n const { pswp } = this;\r\n const positionDifference = this._prevPositionIndex - this._currPositionIndex;\r\n\r\n if (!positionDifference) {\r\n return;\r\n }\r\n\r\n this._prevPositionIndex = this._currPositionIndex;\r\n\r\n pswp.currIndex = pswp.potentialIndex;\r\n\r\n let diffAbs = Math.abs(positionDifference);\r\n let tempHolder;\r\n\r\n if (diffAbs >= 3) {\r\n this._containerShiftIndex += positionDifference + (positionDifference > 0 ? -3 : 3);\r\n diffAbs = 3;\r\n }\r\n\r\n for (let i = 0; i < diffAbs; i++) {\r\n if (positionDifference > 0) {\r\n tempHolder = this.itemHolders.shift();\r\n this.itemHolders[2] = tempHolder; // move first to last\r\n\r\n this._containerShiftIndex++;\r\n\r\n setTransform(tempHolder.el, (this._containerShiftIndex + 2) * this.slideWidth);\r\n\r\n pswp.setContent(tempHolder, (pswp.currIndex - diffAbs) + i + 2);\r\n } else {\r\n tempHolder = this.itemHolders.pop();\r\n this.itemHolders.unshift(tempHolder); // move last to first\r\n\r\n this._containerShiftIndex--;\r\n\r\n setTransform(tempHolder.el, this._containerShiftIndex * this.slideWidth);\r\n\r\n pswp.setContent(tempHolder, (pswp.currIndex + diffAbs) - i - 2);\r\n }\r\n }\r\n\r\n // Reset transfrom every 50ish navigations in one direction.\r\n //\r\n // Otherwise transform will keep growing indefinitely,\r\n // which might cause issues as browsers have a maximum transform limit.\r\n // I wasn't able to reach it, but just to be safe.\r\n // This should not cause noticable lag.\r\n if (Math.abs(this._containerShiftIndex) > 50 && !this.isShifted()) {\r\n this.resetPosition();\r\n this.resize();\r\n }\r\n\r\n // Pan transition might be running (and consntantly updating pan position)\r\n pswp.animations.stopAllPan();\r\n\r\n this.itemHolders.forEach((itemHolder, i) => {\r\n if (itemHolder.slide) {\r\n // Slide in the 2nd holder is always active\r\n itemHolder.slide.setIsActive(i === 1);\r\n }\r\n });\r\n\r\n pswp.currSlide = this.itemHolders[1].slide;\r\n pswp.contentLoader.updateLazy(positionDifference);\r\n\r\n pswp.currSlide.applyCurrentZoomPan();\r\n pswp.dispatch('change');\r\n }\r\n\r\n /**\r\n * Move the X position of the main scroll container\r\n *\r\n * @param {number} x\r\n * @param {boolean=} dragging\r\n */\r\n moveTo(x, dragging) {\r\n /** @type {number} */\r\n let newSlideIndexOffset;\r\n /** @type {number} */\r\n let delta;\r\n\r\n if (!this.pswp.canLoop() && dragging) {\r\n // Apply friction\r\n newSlideIndexOffset = ((this.slideWidth * this._currPositionIndex) - x) / this.slideWidth;\r\n newSlideIndexOffset += this.pswp.currIndex;\r\n delta = Math.round(x - this.x);\r\n\r\n if ((newSlideIndexOffset < 0 && delta > 0)\r\n || (newSlideIndexOffset >= this.pswp.getNumItems() - 1 && delta < 0)) {\r\n x = this.x + (delta * MAIN_SCROLL_END_FRICTION);\r\n }\r\n }\r\n\r\n this.x = x;\r\n setTransform(this.pswp.container, x);\r\n\r\n this.pswp.dispatch('moveMainScroll', { x, dragging });\r\n }\r\n}\r\n\r\nexport default MainScroll;\r\n", "import { specialKeyUsed } from './util/util.js';\r\n\r\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Methods} Methods\r\n */\r\n\r\n/**\r\n * - Manages keyboard shortcuts.\r\n * - Heps trap focus within photoswipe.\r\n */\r\nclass Keyboard {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n\r\n pswp.on('bindEvents', () => {\r\n // Dialog was likely opened by keyboard if initial point is not defined\r\n if (!pswp.options.initialPointerPos) {\r\n // focus causes layout,\r\n // which causes lag during the animation,\r\n // that's why we delay it until the opener transition ends\r\n this._focusRoot();\r\n }\r\n\r\n pswp.events.add(document, 'focusin', this._onFocusIn.bind(this));\r\n pswp.events.add(document, 'keydown', this._onKeyDown.bind(this));\r\n });\r\n\r\n const lastActiveElement = /** @type {HTMLElement} */ (document.activeElement);\r\n pswp.on('destroy', () => {\r\n if (pswp.options.returnFocus\r\n && lastActiveElement\r\n && this._wasFocused) {\r\n lastActiveElement.focus();\r\n }\r\n });\r\n }\r\n\r\n _focusRoot() {\r\n if (!this._wasFocused) {\r\n this.pswp.element.focus();\r\n this._wasFocused = true;\r\n }\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} e\r\n */\r\n _onKeyDown(e) {\r\n const { pswp } = this;\r\n\r\n if (pswp.dispatch('keydown', { originalEvent: e }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (specialKeyUsed(e)) {\r\n // don't do anything if special key pressed\r\n // to prevent from overriding default browser actions\r\n // for example, in Chrome on Mac cmd+arrow-left returns to previous page\r\n return;\r\n }\r\n\r\n /** @type {Methods} */\r\n let keydownAction;\r\n /** @type {'x' | 'y'} */\r\n let axis;\r\n let isForward;\r\n\r\n switch (e.keyCode) {\r\n case 27: // esc\r\n if (pswp.options.escKey) {\r\n keydownAction = 'close';\r\n }\r\n break;\r\n case 90: // z key\r\n keydownAction = 'toggleZoom';\r\n break;\r\n case 37: // left\r\n axis = 'x';\r\n break;\r\n case 38: // top\r\n axis = 'y';\r\n break;\r\n case 39: // right\r\n axis = 'x';\r\n isForward = true;\r\n break;\r\n case 40: // bottom\r\n isForward = true;\r\n axis = 'y';\r\n break;\r\n case 9: // tab\r\n this._focusRoot();\r\n break;\r\n default:\r\n }\r\n\r\n // if left/right/top/bottom key\r\n if (axis) {\r\n // prevent page scroll\r\n e.preventDefault();\r\n\r\n const { currSlide } = pswp;\r\n\r\n if (pswp.options.arrowKeys\r\n && axis === 'x'\r\n && pswp.getNumItems() > 1) {\r\n keydownAction = isForward ? 'next' : 'prev';\r\n } else if (currSlide && currSlide.currZoomLevel > currSlide.zoomLevels.fit) {\r\n // up/down arrow keys pan the image vertically\r\n // left/right arrow keys pan horizontally.\r\n // Unless there is only one image,\r\n // or arrowKeys option is disabled\r\n currSlide.pan[axis] += isForward ? -80 : 80;\r\n currSlide.panTo(currSlide.pan.x, currSlide.pan.y);\r\n }\r\n }\r\n\r\n if (keydownAction) {\r\n e.preventDefault();\r\n pswp[keydownAction]();\r\n }\r\n }\r\n\r\n /**\r\n * Trap focus inside photoswipe\r\n *\r\n * @param {FocusEvent} e\r\n */\r\n _onFocusIn(e) {\r\n const { template } = this.pswp;\r\n if (document !== e.target\r\n && template !== e.target\r\n && !template.contains(/** @type {Node} */ (e.target))) {\r\n // focus root element\r\n template.focus();\r\n }\r\n }\r\n}\r\n\r\nexport default Keyboard;\r\n", "import { setTransitionStyle, removeTransitionStyle } from './util.js';\r\n\r\nconst DEFAULT_EASING = 'cubic-bezier(.4,0,.22,1)';\r\n\r\n/** @typedef {import('./animations.js').AnimationProps} AnimationProps */\r\n\r\n/**\r\n * Runs CSS transition.\r\n */\r\nclass CSSAnimation {\r\n /**\r\n * onComplete can be unpredictable, be careful about current state\r\n *\r\n * @param {AnimationProps} props\r\n */\r\n constructor(props) {\r\n this.props = props;\r\n const {\r\n target,\r\n onComplete,\r\n transform,\r\n onFinish\r\n // opacity\r\n } = props;\r\n\r\n let {\r\n duration,\r\n easing,\r\n } = props;\r\n\r\n /** @type {() => void} */\r\n this.onFinish = onFinish;\r\n\r\n // support only transform and opacity\r\n const prop = transform ? 'transform' : 'opacity';\r\n const propValue = props[prop];\r\n\r\n /** @private */\r\n this._target = target;\r\n /** @private */\r\n this._onComplete = onComplete;\r\n\r\n duration = duration || 333;\r\n easing = easing || DEFAULT_EASING;\r\n\r\n /** @private */\r\n this._onTransitionEnd = this._onTransitionEnd.bind(this);\r\n\r\n // Using timeout hack to make sure that animation\r\n // starts even if the animated property was changed recently,\r\n // otherwise transitionend might not fire or transiton won't start.\r\n // https://drafts.csswg.org/css-transitions/#starting\r\n //\r\n // \u00AF\\_(\u30C4)_/\u00AF\r\n /** @private */\r\n this._firstFrameTimeout = setTimeout(() => {\r\n setTransitionStyle(target, prop, duration, easing);\r\n this._firstFrameTimeout = setTimeout(() => {\r\n target.addEventListener('transitionend', this._onTransitionEnd, false);\r\n target.addEventListener('transitioncancel', this._onTransitionEnd, false);\r\n target.style[prop] = propValue;\r\n }, 30); // Do not reduce this number\r\n }, 0);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {TransitionEvent} e\r\n */\r\n _onTransitionEnd(e) {\r\n if (e.target === this._target) {\r\n this._finalizeAnimation();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _finalizeAnimation() {\r\n if (!this._finished) {\r\n this._finished = true;\r\n this.onFinish();\r\n if (this._onComplete) {\r\n this._onComplete();\r\n }\r\n }\r\n }\r\n\r\n // Destroy is called automatically onFinish\r\n destroy() {\r\n if (this._firstFrameTimeout) {\r\n clearTimeout(this._firstFrameTimeout);\r\n }\r\n removeTransitionStyle(this._target);\r\n this._target.removeEventListener('transitionend', this._onTransitionEnd, false);\r\n this._target.removeEventListener('transitioncancel', this._onTransitionEnd, false);\r\n if (!this._finished) {\r\n this._finalizeAnimation();\r\n }\r\n }\r\n}\r\n\r\nexport default CSSAnimation;\r\n", "const DEFAULT_NATURAL_FREQUENCY = 12;\r\nconst DEFAULT_DAMPING_RATIO = 0.75;\r\n\r\n/**\r\n * Spring easing helper\r\n */\r\nclass SpringEaser {\r\n /**\r\n * @param {number} initialVelocity Initial velocity, px per ms.\r\n *\r\n * @param {number} dampingRatio\r\n * Determines how bouncy animation will be.\r\n * From 0 to 1, 0 - always overshoot, 1 - do not overshoot.\r\n * \"overshoot\" refers to part of animation that\r\n * goes beyond the final value.\r\n *\r\n * @param {number} naturalFrequency\r\n * Determines how fast animation will slow down.\r\n * The higher value - the stiffer the transition will be,\r\n * and the faster it will slow down.\r\n * Recommended value from 10 to 50\r\n */\r\n constructor(initialVelocity, dampingRatio, naturalFrequency) {\r\n this.velocity = initialVelocity * 1000; // convert to \"pixels per second\"\r\n\r\n // https://en.wikipedia.org/wiki/Damping_ratio\r\n this._dampingRatio = dampingRatio || DEFAULT_DAMPING_RATIO;\r\n\r\n // https://en.wikipedia.org/wiki/Natural_frequency\r\n this._naturalFrequency = naturalFrequency || DEFAULT_NATURAL_FREQUENCY;\r\n\r\n if (this._dampingRatio < 1) {\r\n this._dampedFrequency = this._naturalFrequency\r\n * Math.sqrt(1 - this._dampingRatio * this._dampingRatio);\r\n }\r\n }\r\n\r\n /**\r\n * @param {number} deltaPosition Difference between current and end position of the animation\r\n * @param {number} deltaTime Frame duration in milliseconds\r\n *\r\n * @returns {number} Displacement, relative to the end position.\r\n */\r\n easeFrame(deltaPosition, deltaTime) {\r\n // Inspired by Apple Webkit and Android spring function implementation\r\n // https://en.wikipedia.org/wiki/Oscillation\r\n // https://en.wikipedia.org/wiki/Damping_ratio\r\n // we ignore mass (assume that it's 1kg)\r\n\r\n let displacement = 0;\r\n let coeff;\r\n\r\n deltaTime /= 1000;\r\n\r\n const naturalDumpingPow = Math.E ** (-this._dampingRatio * this._naturalFrequency * deltaTime);\r\n\r\n if (this._dampingRatio === 1) {\r\n coeff = this.velocity + this._naturalFrequency * deltaPosition;\r\n\r\n displacement = (deltaPosition + coeff * deltaTime) * naturalDumpingPow;\r\n\r\n this.velocity = displacement\r\n * (-this._naturalFrequency) + coeff\r\n * naturalDumpingPow;\r\n } else if (this._dampingRatio < 1) {\r\n coeff = (1 / this._dampedFrequency)\r\n * (this._dampingRatio * this._naturalFrequency * deltaPosition + this.velocity);\r\n\r\n const dumpedFCos = Math.cos(this._dampedFrequency * deltaTime);\r\n const dumpedFSin = Math.sin(this._dampedFrequency * deltaTime);\r\n\r\n displacement = naturalDumpingPow\r\n * (deltaPosition * dumpedFCos + coeff * dumpedFSin);\r\n\r\n this.velocity = displacement\r\n * (-this._naturalFrequency)\r\n * this._dampingRatio\r\n + naturalDumpingPow\r\n * (-this._dampedFrequency * deltaPosition * dumpedFSin\r\n + this._dampedFrequency * coeff * dumpedFCos);\r\n }\r\n\r\n // Overdamped (>1) damping ratio is not supported\r\n\r\n return displacement;\r\n }\r\n}\r\n\r\nexport default SpringEaser;\r\n", "import SpringEaser from './spring-easer.js';\r\n\r\n/** @typedef {import('./animations.js').AnimationProps} AnimationProps */\r\n\r\nclass SpringAnimation {\r\n /**\r\n * @param {AnimationProps} props\r\n */\r\n constructor(props) {\r\n this.props = props;\r\n\r\n const {\r\n start,\r\n end,\r\n velocity,\r\n onUpdate,\r\n onComplete,\r\n onFinish,\r\n dampingRatio,\r\n naturalFrequency\r\n } = props;\r\n\r\n /** @type {() => void} */\r\n this.onFinish = onFinish;\r\n\r\n const easer = new SpringEaser(velocity, dampingRatio, naturalFrequency);\r\n let prevTime = Date.now();\r\n let deltaPosition = start - end;\r\n\r\n const animationLoop = () => {\r\n if (this._raf) {\r\n deltaPosition = easer.easeFrame(deltaPosition, Date.now() - prevTime);\r\n\r\n // Stop the animation if velocity is low and position is close to end\r\n if (Math.abs(deltaPosition) < 1 && Math.abs(easer.velocity) < 50) {\r\n // Finalize the animation\r\n onUpdate(end);\r\n if (onComplete) {\r\n onComplete();\r\n }\r\n this.onFinish();\r\n } else {\r\n prevTime = Date.now();\r\n onUpdate(deltaPosition + end);\r\n this._raf = requestAnimationFrame(animationLoop);\r\n }\r\n }\r\n };\r\n\r\n this._raf = requestAnimationFrame(animationLoop);\r\n }\r\n\r\n // Destroy is called automatically onFinish\r\n destroy() {\r\n if (this._raf >= 0) {\r\n cancelAnimationFrame(this._raf);\r\n }\r\n this._raf = null;\r\n }\r\n}\r\n\r\nexport default SpringAnimation;\r\n", "import CSSAnimation from './css-animation.js';\r\nimport SpringAnimation from './spring-animation.js';\r\n\r\n/** @typedef {SpringAnimation | CSSAnimation} Animation */\r\n\r\n/**\r\n * @typedef {Object} AnimationProps\r\n *\r\n * @prop {HTMLElement=} target\r\n *\r\n * @prop {string=} name\r\n *\r\n * @prop {number=} start\r\n * @prop {number=} end\r\n * @prop {number=} duration\r\n * @prop {number=} velocity\r\n * @prop {number=} dampingRatio\r\n * @prop {number=} naturalFrequency\r\n *\r\n * @prop {(end: number) => void} [onUpdate]\r\n * @prop {() => void} [onComplete]\r\n * @prop {() => void} [onFinish]\r\n *\r\n * @prop {string=} transform\r\n * @prop {string=} opacity\r\n * @prop {string=} easing\r\n *\r\n * @prop {boolean=} isPan\r\n * @prop {boolean=} isMainScroll\r\n */\r\n\r\n/**\r\n * Manages animations\r\n */\r\nclass Animations {\r\n constructor() {\r\n /** @type {Animation[]} */\r\n this.activeAnimations = [];\r\n }\r\n\r\n /**\r\n * @param {AnimationProps} props\r\n */\r\n startSpring(props) {\r\n this._start(props, true);\r\n }\r\n\r\n /**\r\n * @param {AnimationProps} props\r\n */\r\n startTransition(props) {\r\n this._start(props);\r\n }\r\n\r\n /**\r\n * @param {AnimationProps} props\r\n * @param {boolean=} isSpring\r\n */\r\n _start(props, isSpring) {\r\n /** @type {Animation} */\r\n let animation;\r\n if (isSpring) {\r\n animation = new SpringAnimation(props);\r\n } else {\r\n animation = new CSSAnimation(props);\r\n }\r\n\r\n this.activeAnimations.push(animation);\r\n animation.onFinish = () => this.stop(animation);\r\n\r\n return animation;\r\n }\r\n\r\n /**\r\n * @param {Animation} animation\r\n */\r\n stop(animation) {\r\n animation.destroy();\r\n const index = this.activeAnimations.indexOf(animation);\r\n if (index > -1) {\r\n this.activeAnimations.splice(index, 1);\r\n }\r\n }\r\n\r\n stopAll() { // _stopAllAnimations\r\n this.activeAnimations.forEach((animation) => {\r\n animation.destroy();\r\n });\r\n this.activeAnimations = [];\r\n }\r\n\r\n /**\r\n * Stop all pan or zoom transitions\r\n */\r\n stopAllPan() {\r\n this.activeAnimations = this.activeAnimations.filter((animation) => {\r\n if (animation.props.isPan) {\r\n animation.destroy();\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n }\r\n\r\n stopMainScroll() {\r\n this.activeAnimations = this.activeAnimations.filter((animation) => {\r\n if (animation.props.isMainScroll) {\r\n animation.destroy();\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n }\r\n\r\n /**\r\n * Returns true if main scroll transition is running\r\n */\r\n // isMainScrollRunning() {\r\n // return this.activeAnimations.some((animation) => {\r\n // return animation.props.isMainScroll;\r\n // });\r\n // }\r\n\r\n /**\r\n * Returns true if any pan or zoom transition is running\r\n */\r\n isPanRunning() {\r\n return this.activeAnimations.some((animation) => {\r\n return animation.props.isPan;\r\n });\r\n }\r\n}\r\n\r\nexport default Animations;\r\n", "/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * Handles scroll wheel.\r\n * Can pan and zoom current slide image.\r\n */\r\nclass ScrollWheel {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n pswp.events.add(pswp.element, 'wheel', this._onWheel.bind(this));\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {WheelEvent} e\r\n */\r\n _onWheel(e) {\r\n e.preventDefault();\r\n const { currSlide } = this.pswp;\r\n let { deltaX, deltaY } = e;\r\n\r\n if (!currSlide) {\r\n return;\r\n }\r\n\r\n if (this.pswp.dispatch('wheel', { originalEvent: e }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (e.ctrlKey || this.pswp.options.wheelToZoom) {\r\n // zoom\r\n if (currSlide.isZoomable()) {\r\n let zoomFactor = -deltaY;\r\n if (e.deltaMode === 1 /* DOM_DELTA_LINE */) {\r\n zoomFactor *= 0.05;\r\n } else {\r\n zoomFactor *= e.deltaMode ? 1 : 0.002;\r\n }\r\n zoomFactor = 2 ** zoomFactor;\r\n\r\n const destZoomLevel = currSlide.currZoomLevel * zoomFactor;\r\n currSlide.zoomTo(destZoomLevel, {\r\n x: e.clientX,\r\n y: e.clientY\r\n });\r\n }\r\n } else {\r\n // pan\r\n if (currSlide.isPannable()) {\r\n if (e.deltaMode === 1 /* DOM_DELTA_LINE */) {\r\n // 18 - average line height\r\n deltaX *= 18;\r\n deltaY *= 18;\r\n }\r\n\r\n currSlide.panTo(\r\n currSlide.pan.x - deltaX,\r\n currSlide.pan.y - deltaY\r\n );\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default ScrollWheel;\r\n", "import { createElement } from '../util/util.js';\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Methods} Methods\r\n */\r\n\r\n/**\r\n * @typedef {Object} UIElementMarkupProps\r\n * @prop {boolean=} isCustomSVG\r\n * @prop {string} inner\r\n * @prop {string=} outlineID\r\n * @prop {number | string} [size]\r\n */\r\n\r\n/**\r\n * @typedef {Object} UIElementData\r\n * @prop {DefaultUIElements | string} [name]\r\n * @prop {string=} className\r\n * @prop {UIElementMarkup=} html\r\n * @prop {boolean=} isButton\r\n * @prop {keyof HTMLElementTagNameMap} [tagName]\r\n * @prop {string=} title\r\n * @prop {string=} ariaLabel\r\n * @prop {(element: HTMLElement, pswp: PhotoSwipe) => void} [onInit]\r\n * @prop {Methods | ((e: MouseEvent, element: HTMLElement, pswp: PhotoSwipe) => void)} [onClick]\r\n * @prop {'bar' | 'wrapper' | 'root'} [appendTo]\r\n * @prop {number=} order\r\n */\r\n\r\n/** @typedef {'arrowPrev' | 'arrowNext' | 'close' | 'zoom' | 'counter'} DefaultUIElements */\r\n\r\n/** @typedef {string | UIElementMarkupProps} UIElementMarkup */\r\n\r\n/**\r\n * @param {UIElementMarkup} [htmlData]\r\n */\r\nfunction addElementHTML(htmlData) {\r\n if (typeof htmlData === 'string') {\r\n // Allow developers to provide full svg,\r\n // For example:\r\n // \r\n // \r\n // \r\n // \r\n // Can also be any HTML string.\r\n return htmlData;\r\n }\r\n\r\n if (!htmlData || !htmlData.isCustomSVG) {\r\n return '';\r\n }\r\n\r\n const svgData = htmlData;\r\n let out = '';\r\n // replace all %d with size\r\n out = out.split('%d').join(/** @type {string} */ (svgData.size || 32));\r\n\r\n // Icons may contain outline/shadow,\r\n // to make it we \"clone\" base icon shape and add border to it.\r\n // Icon itself and border are styled via CSS.\r\n //\r\n // Property shadowID defines ID of element that should be cloned.\r\n if (svgData.outlineID) {\r\n out += '';\r\n }\r\n\r\n out += svgData.inner;\r\n\r\n out += '';\r\n\r\n return out;\r\n}\r\n\r\nclass UIElement {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n * @param {UIElementData} data\r\n */\r\n constructor(pswp, data) {\r\n const name = data.name || data.className;\r\n let elementHTML = data.html;\r\n\r\n // @ts-expect-error lookup only by `data.name` maybe?\r\n if (pswp.options[name] === false) {\r\n // exit if element is disabled from options\r\n return;\r\n }\r\n\r\n // Allow to override SVG icons from options\r\n // @ts-expect-error lookup only by `data.name` maybe?\r\n if (typeof pswp.options[name + 'SVG'] === 'string') {\r\n // arrowPrevSVG\r\n // arrowNextSVG\r\n // closeSVG\r\n // zoomSVG\r\n // @ts-expect-error lookup only by `data.name` maybe?\r\n elementHTML = pswp.options[name + 'SVG'];\r\n }\r\n\r\n pswp.dispatch('uiElementCreate', { data });\r\n\r\n let className = '';\r\n if (data.isButton) {\r\n className += 'pswp__button ';\r\n className += (data.className || `pswp__button--${data.name}`);\r\n } else {\r\n className += (data.className || `pswp__${data.name}`);\r\n }\r\n\r\n /** @type {HTMLElement} */\r\n let element;\r\n let tagName = data.isButton ? (data.tagName || 'button') : (data.tagName || 'div');\r\n tagName = /** @type {keyof HTMLElementTagNameMap} */ (tagName.toLowerCase());\r\n element = createElement(className, tagName);\r\n\r\n if (data.isButton) {\r\n // create button element\r\n element = createElement(className, tagName);\r\n if (tagName === 'button') {\r\n /** @type {HTMLButtonElement} */ (element).type = 'button';\r\n }\r\n\r\n let { title } = data;\r\n const { ariaLabel } = data;\r\n\r\n // @ts-expect-error lookup only by `data.name` maybe?\r\n if (typeof pswp.options[name + 'Title'] === 'string') {\r\n // @ts-expect-error lookup only by `data.name` maybe?\r\n title = pswp.options[name + 'Title'];\r\n }\r\n\r\n if (title) {\r\n element.title = title;\r\n }\r\n\r\n if (ariaLabel || title) {\r\n /** @type {HTMLElement} */ (element).setAttribute('aria-label', ariaLabel || title);\r\n }\r\n }\r\n\r\n element.innerHTML = addElementHTML(elementHTML);\r\n\r\n if (data.onInit) {\r\n data.onInit(element, pswp);\r\n }\r\n\r\n if (data.onClick) {\r\n element.onclick = (e) => {\r\n if (typeof data.onClick === 'string') {\r\n pswp[data.onClick]();\r\n } else {\r\n data.onClick(e, element, pswp);\r\n }\r\n };\r\n }\r\n\r\n // Top bar is default position\r\n const appendTo = data.appendTo || 'bar';\r\n let container;\r\n if (appendTo === 'bar') {\r\n if (!pswp.topBar) {\r\n pswp.topBar = createElement('pswp__top-bar pswp__hide-on-close', 'div', pswp.scrollWrap);\r\n }\r\n container = pswp.topBar;\r\n } else {\r\n // element outside of top bar gets a secondary class\r\n // that makes element fade out on close\r\n element.classList.add('pswp__hide-on-close');\r\n\r\n if (appendTo === 'wrapper') {\r\n container = pswp.scrollWrap;\r\n } else {\r\n // root element\r\n container = pswp.element;\r\n }\r\n }\r\n\r\n container.appendChild(pswp.applyFilters('uiElement', element, data));\r\n }\r\n}\r\n\r\nexport default UIElement;\r\n", "/*\r\n Backward and forward arrow buttons\r\n */\r\n\r\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n *\r\n * @param {HTMLElement} element\r\n * @param {PhotoSwipe} pswp\r\n * @param {boolean=} isNextButton\r\n */\r\nfunction initArrowButton(element, pswp, isNextButton) {\r\n element.classList.add('pswp__button--arrow');\r\n pswp.on('change', () => {\r\n if (!pswp.options.loop) {\r\n if (isNextButton) {\r\n /** @type {HTMLButtonElement} */\r\n (element).disabled = !(pswp.currIndex < pswp.getNumItems() - 1);\r\n } else {\r\n /** @type {HTMLButtonElement} */\r\n (element).disabled = !(pswp.currIndex > 0);\r\n }\r\n }\r\n });\r\n}\r\n\r\n/** @type {UIElementData} */\r\nexport const arrowPrev = {\r\n name: 'arrowPrev',\r\n className: 'pswp__button--arrow--prev',\r\n title: 'Previous',\r\n order: 10,\r\n isButton: true,\r\n appendTo: 'wrapper',\r\n html: {\r\n isCustomSVG: true,\r\n size: 60,\r\n inner: '',\r\n outlineID: 'pswp__icn-arrow'\r\n },\r\n onClick: 'prev',\r\n onInit: initArrowButton\r\n};\r\n\r\n/** @type {UIElementData} */\r\nexport const arrowNext = {\r\n name: 'arrowNext',\r\n className: 'pswp__button--arrow--next',\r\n title: 'Next',\r\n order: 11,\r\n isButton: true,\r\n appendTo: 'wrapper',\r\n html: {\r\n isCustomSVG: true,\r\n size: 60,\r\n inner: '',\r\n outlineID: 'pswp__icn-arrow'\r\n },\r\n onClick: 'next',\r\n onInit: (el, pswp) => {\r\n initArrowButton(el, pswp, true);\r\n }\r\n};\r\n", "/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nconst closeButton = {\r\n name: 'close',\r\n title: 'Close',\r\n order: 20,\r\n isButton: true,\r\n html: {\r\n isCustomSVG: true,\r\n inner: '',\r\n outlineID: 'pswp__icn-close'\r\n },\r\n onClick: 'close'\r\n};\r\n\r\nexport default closeButton;\r\n", "/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nconst zoomButton = {\r\n name: 'zoom',\r\n title: 'Zoom',\r\n order: 10,\r\n isButton: true,\r\n html: {\r\n isCustomSVG: true,\r\n // eslint-disable-next-line max-len\r\n inner: ''\r\n + ''\r\n + '',\r\n outlineID: 'pswp__icn-zoom'\r\n },\r\n onClick: 'toggleZoom'\r\n};\r\n\r\nexport default zoomButton;\r\n", "/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nexport const loadingIndicator = {\r\n name: 'preloader',\r\n appendTo: 'bar',\r\n order: 7,\r\n html: {\r\n isCustomSVG: true,\r\n // eslint-disable-next-line max-len\r\n inner: '',\r\n outlineID: 'pswp__icn-loading'\r\n },\r\n onInit: (indicatorElement, pswp) => {\r\n /** @type {boolean} */\r\n let isVisible;\r\n /** @type {NodeJS.Timeout} */\r\n let delayTimeout;\r\n\r\n /**\r\n * @param {string} className\r\n * @param {boolean} add\r\n */\r\n const toggleIndicatorClass = (className, add) => {\r\n indicatorElement.classList[add ? 'add' : 'remove']('pswp__preloader--' + className);\r\n };\r\n\r\n /**\r\n * @param {boolean} visible\r\n */\r\n const setIndicatorVisibility = (visible) => {\r\n if (isVisible !== visible) {\r\n isVisible = visible;\r\n toggleIndicatorClass('active', visible);\r\n }\r\n };\r\n\r\n const updatePreloaderVisibility = () => {\r\n if (!pswp.currSlide.content.isLoading()) {\r\n setIndicatorVisibility(false);\r\n if (delayTimeout) {\r\n clearTimeout(delayTimeout);\r\n delayTimeout = null;\r\n }\r\n return;\r\n }\r\n\r\n if (!delayTimeout) {\r\n // display loading indicator with delay\r\n delayTimeout = setTimeout(() => {\r\n setIndicatorVisibility(pswp.currSlide.content.isLoading());\r\n delayTimeout = null;\r\n }, pswp.options.preloaderDelay);\r\n }\r\n };\r\n\r\n pswp.on('change', updatePreloaderVisibility);\r\n\r\n pswp.on('loadComplete', (e) => {\r\n if (pswp.currSlide === e.slide) {\r\n updatePreloaderVisibility();\r\n }\r\n });\r\n\r\n // expose the method\r\n pswp.ui.updatePreloaderVisibility = updatePreloaderVisibility;\r\n }\r\n};\r\n", "/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nexport const counterIndicator = {\r\n name: 'counter',\r\n order: 5,\r\n onInit: (counterElement, pswp) => {\r\n pswp.on('change', () => {\r\n counterElement.innerText = (pswp.currIndex + 1)\r\n + pswp.options.indexIndicatorSep\r\n + pswp.getNumItems();\r\n });\r\n }\r\n};\r\n", "import UIElement from './ui-element.js';\r\nimport { arrowPrev, arrowNext } from './button-arrow.js';\r\nimport closeButton from './button-close.js';\r\nimport zoomButton from './button-zoom.js';\r\nimport { loadingIndicator } from './loading-indicator.js';\r\nimport { counterIndicator } from './counter-indicator.js';\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\r\n\r\n/**\r\n * Set special class on element when image is zoomed.\r\n *\r\n * By default it is used to adjust\r\n * zoom icon and zoom cursor via CSS.\r\n *\r\n * @param {HTMLElement} el\r\n * @param {boolean} isZoomedIn\r\n */\r\nfunction setZoomedIn(el, isZoomedIn) {\r\n el.classList[isZoomedIn ? 'add' : 'remove']('pswp--zoomed-in');\r\n}\r\n\r\nclass UI {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n\r\n /** @type {() => void} */\r\n this.updatePreloaderVisibility = undefined;\r\n\r\n /** @type {number} */\r\n this._lastUpdatedZoomLevel = undefined;\r\n }\r\n\r\n init() {\r\n const { pswp } = this;\r\n this.isRegistered = false;\r\n /** @type {UIElementData[]} */\r\n this.uiElementsData = [\r\n closeButton,\r\n arrowPrev,\r\n arrowNext,\r\n zoomButton,\r\n loadingIndicator,\r\n counterIndicator\r\n ];\r\n\r\n pswp.dispatch('uiRegister');\r\n\r\n // sort by order\r\n this.uiElementsData.sort((a, b) => {\r\n // default order is 0\r\n return (a.order || 0) - (b.order || 0);\r\n });\r\n\r\n /** @type {(UIElement | UIElementData)[]} */\r\n this.items = [];\r\n\r\n this.isRegistered = true;\r\n this.uiElementsData.forEach((uiElementData) => {\r\n this.registerElement(uiElementData);\r\n });\r\n\r\n pswp.on('change', () => {\r\n pswp.element.classList[pswp.getNumItems() === 1 ? 'add' : 'remove']('pswp--one-slide');\r\n });\r\n\r\n pswp.on('zoomPanUpdate', () => this._onZoomPanUpdate());\r\n }\r\n\r\n /**\r\n * @param {UIElementData} elementData\r\n */\r\n registerElement(elementData) {\r\n if (this.isRegistered) {\r\n this.items.push(\r\n new UIElement(this.pswp, elementData)\r\n );\r\n } else {\r\n this.uiElementsData.push(elementData);\r\n }\r\n }\r\n\r\n /**\r\n * Fired each time zoom or pan position is changed.\r\n * Update classes that control visibility of zoom button and cursor icon.\r\n */\r\n _onZoomPanUpdate() {\r\n const { template, currSlide, options } = this.pswp;\r\n let { currZoomLevel } = currSlide;\r\n\r\n if (this.pswp.opener.isClosing) {\r\n return;\r\n }\r\n\r\n // if not open yet - check against initial zoom level\r\n if (!this.pswp.opener.isOpen) {\r\n currZoomLevel = currSlide.zoomLevels.initial;\r\n }\r\n\r\n if (currZoomLevel === this._lastUpdatedZoomLevel) {\r\n return;\r\n }\r\n this._lastUpdatedZoomLevel = currZoomLevel;\r\n\r\n const currZoomLevelDiff = currSlide.zoomLevels.initial - currSlide.zoomLevels.secondary;\r\n\r\n // Initial and secondary zoom levels are almost equal\r\n if (Math.abs(currZoomLevelDiff) < 0.01 || !currSlide.isZoomable()) {\r\n // disable zoom\r\n setZoomedIn(template, false);\r\n template.classList.remove('pswp--zoom-allowed');\r\n return;\r\n }\r\n\r\n template.classList.add('pswp--zoom-allowed');\r\n const secondaryIsHigher = (currZoomLevelDiff < 0);\r\n\r\n if (currZoomLevel === currSlide.zoomLevels.secondary) {\r\n setZoomedIn(template, secondaryIsHigher);\r\n } else if (currZoomLevel > currSlide.zoomLevels.secondary) {\r\n setZoomedIn(template, true);\r\n } else {\r\n // if (currZoomLevel < currSlide.zoomLevels.secondary)\r\n setZoomedIn(template, false);\r\n }\r\n\r\n if (options.imageClickAction === 'zoom'\r\n || options.imageClickAction === 'zoom-or-close') {\r\n template.classList.add('pswp--click-to-zoom');\r\n }\r\n }\r\n}\r\n\r\nexport default UI;\r\n", "/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/** @typedef {{ x: number; y: number; w: number; innerRect?: { w: number; h: number; x: number; y: number } }} Bounds */\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n */\r\nfunction getBoundsByElement(el) {\r\n const thumbAreaRect = el.getBoundingClientRect();\r\n return {\r\n x: thumbAreaRect.left,\r\n y: thumbAreaRect.top,\r\n w: thumbAreaRect.width\r\n };\r\n}\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n * @param {number} imageWidth\r\n * @param {number} imageHeight\r\n */\r\nfunction getCroppedBoundsByElement(el, imageWidth, imageHeight) {\r\n const thumbAreaRect = el.getBoundingClientRect();\r\n\r\n // fill image into the area\r\n // (do they same as object-fit:cover does to retrieve coordinates)\r\n const hRatio = thumbAreaRect.width / imageWidth;\r\n const vRatio = thumbAreaRect.height / imageHeight;\r\n const fillZoomLevel = hRatio > vRatio ? hRatio : vRatio;\r\n\r\n const offsetX = (thumbAreaRect.width - imageWidth * fillZoomLevel) / 2;\r\n const offsetY = (thumbAreaRect.height - imageHeight * fillZoomLevel) / 2;\r\n\r\n /**\r\n * Coordinates of the image,\r\n * as if it was not cropped,\r\n * height is calculated automatically\r\n *\r\n * @type {Bounds}\r\n */\r\n const bounds = {\r\n x: thumbAreaRect.left + offsetX,\r\n y: thumbAreaRect.top + offsetY,\r\n w: imageWidth * fillZoomLevel\r\n };\r\n\r\n // Coordinates of inner crop area\r\n // relative to the image\r\n bounds.innerRect = {\r\n w: thumbAreaRect.width,\r\n h: thumbAreaRect.height,\r\n x: offsetX,\r\n y: offsetY\r\n };\r\n\r\n return bounds;\r\n}\r\n\r\n/**\r\n * Get dimensions of thumbnail image\r\n * (click on which opens photoswipe or closes photoswipe to)\r\n *\r\n * @param {number} index\r\n * @param {SlideData} itemData\r\n * @param {PhotoSwipe} instance PhotoSwipe instance\r\n * @returns {Bounds | undefined}\r\n */\r\nexport function getThumbBounds(index, itemData, instance) {\r\n // legacy event, before filters were introduced\r\n const event = instance.dispatch('thumbBounds', {\r\n index,\r\n itemData,\r\n instance\r\n });\r\n // @ts-expect-error\r\n if (event.thumbBounds) {\r\n // @ts-expect-error\r\n return event.thumbBounds;\r\n }\r\n\r\n const { element } = itemData;\r\n let thumbBounds;\r\n /** @type {HTMLElement} */\r\n let thumbnail;\r\n\r\n if (element && instance.options.thumbSelector !== false) {\r\n const thumbSelector = instance.options.thumbSelector || 'img';\r\n thumbnail = element.matches(thumbSelector)\r\n ? element : element.querySelector(thumbSelector);\r\n }\r\n\r\n thumbnail = instance.applyFilters('thumbEl', thumbnail, itemData, index);\r\n\r\n if (thumbnail) {\r\n if (!itemData.thumbCropped) {\r\n thumbBounds = getBoundsByElement(thumbnail);\r\n } else {\r\n thumbBounds = getCroppedBoundsByElement(\r\n thumbnail,\r\n itemData.width || itemData.w,\r\n itemData.height || itemData.h\r\n );\r\n }\r\n }\r\n\r\n return instance.applyFilters('thumbBounds', thumbBounds, itemData, index);\r\n}\r\n", "/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\r\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('../slide/content.js').default} ContentDefault */\r\n/** @typedef {import('../slide/slide.js').default} Slide */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\r\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\r\n\r\n/**\r\n * Allow adding an arbitrary props to the Content\r\n * https://photoswipe.com/custom-content/#using-webp-image-format\r\n * @typedef {ContentDefault & Record} Content\r\n */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\r\n *\r\n *\r\n * https://photoswipe.com/adding-ui-elements/\r\n *\r\n * @prop {undefined} uiRegister\r\n * @prop {{ data: UIElementData }} uiElementCreate\r\n *\r\n *\r\n * https://photoswipe.com/events/#initialization-events\r\n *\r\n * @prop {undefined} beforeOpen\r\n * @prop {undefined} firstUpdate\r\n * @prop {undefined} initialLayout\r\n * @prop {undefined} change\r\n * @prop {undefined} afterInit\r\n * @prop {undefined} bindEvents\r\n *\r\n *\r\n * https://photoswipe.com/events/#opening-or-closing-transition-events\r\n *\r\n * @prop {undefined} openingAnimationStart\r\n * @prop {undefined} openingAnimationEnd\r\n * @prop {undefined} closingAnimationStart\r\n * @prop {undefined} closingAnimationEnd\r\n *\r\n *\r\n * https://photoswipe.com/events/#closing-events\r\n *\r\n * @prop {undefined} close\r\n * @prop {undefined} destroy\r\n *\r\n *\r\n * https://photoswipe.com/events/#pointer-and-gesture-events\r\n *\r\n * @prop {{ originalEvent: PointerEvent }} pointerDown\r\n * @prop {{ originalEvent: PointerEvent }} pointerMove\r\n * @prop {{ originalEvent: PointerEvent }} pointerUp\r\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\r\n * @prop {{ panY: number }} verticalDrag can be default prevented\r\n *\r\n *\r\n * https://photoswipe.com/events/#slide-content-events\r\n *\r\n * @prop {{ content: Content }} contentInit\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\r\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\r\n * @prop {{ content: Content; slide: Slide }} loadError\r\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\r\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\r\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\r\n * @prop {{ content: Content }} contentAppend can be default prevented\r\n * @prop {{ content: Content }} contentActivate can be default prevented\r\n * @prop {{ content: Content }} contentDeactivate can be default prevented\r\n * @prop {{ content: Content }} contentRemove can be default prevented\r\n * @prop {{ content: Content }} contentDestroy can be default prevented\r\n *\r\n *\r\n * undocumented\r\n *\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\r\n *\r\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\r\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\r\n * @prop {{ slide: Slide }} firstZoomPan\r\n * @prop {{ slide: Slide, data: SlideData, index: number }} gettingData\r\n * @prop {undefined} beforeResize\r\n * @prop {undefined} resize\r\n * @prop {undefined} viewportSize\r\n * @prop {undefined} updateScrollOffset\r\n * @prop {{ slide: Slide }} slideInit\r\n * @prop {{ slide: Slide }} afterSetContent\r\n * @prop {{ slide: Slide }} slideLoad\r\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\r\n * @prop {{ slide: Slide }} appendHeavyContent\r\n * @prop {{ slide: Slide }} slideActivate\r\n * @prop {{ slide: Slide }} slideDeactivate\r\n * @prop {{ slide: Slide }} slideDestroy\r\n * @prop {{ destZoomLevel: number, centerPoint: Point, transitionDuration: number | false }} beforeZoomTo\r\n * @prop {{ slide: Slide }} zoomPanUpdate\r\n * @prop {{ slide: Slide }} initialZoomPan\r\n * @prop {{ slide: Slide }} calcSlideSize\r\n * @prop {undefined} resolutionChanged\r\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\r\n * @prop {{ content: Content }} contentAppendImage can be default prevented\r\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\r\n * @prop {undefined} lazyLoad\r\n * @prop {{ slide: Slide }} calcBounds\r\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\r\n *\r\n *\r\n * legacy\r\n *\r\n * @prop {undefined} init\r\n * @prop {undefined} initialZoomIn\r\n * @prop {undefined} initialZoomOut\r\n * @prop {undefined} initialZoomInEnd\r\n * @prop {undefined} initialZoomOutEnd\r\n * @prop {{ dataSource: DataSource, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource) => number} numItems\r\n * Modify the total amount of slides. Example on Data sources page.\r\n * https://photoswipe.com/filters/#numitems\r\n *\r\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\r\n * Modify slide item data. Example on Data sources page.\r\n * https://photoswipe.com/filters/#itemdata\r\n *\r\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\r\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\r\n * https://photoswipe.com/filters/#domitemdata\r\n *\r\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\r\n * Modify clicked gallery item index.\r\n * https://photoswipe.com/filters/#clickedindex\r\n *\r\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\r\n * Modify placeholder image source.\r\n * https://photoswipe.com/filters/#placeholdersrc\r\n *\r\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\r\n * Modify if the content is currently loading.\r\n * https://photoswipe.com/filters/#iscontentloading\r\n *\r\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\r\n * Modify if the content can be zoomed.\r\n * https://photoswipe.com/filters/#iscontentzoomable\r\n *\r\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\r\n * Modify if the placeholder should be used for the content.\r\n * https://photoswipe.com/filters/#usecontentplaceholder\r\n *\r\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\r\n * Modify if the placeholder should be kept after the content is loaded.\r\n * https://photoswipe.com/filters/#iskeepingplaceholder\r\n *\r\n *\r\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\r\n * Modify an element when the content has error state (for example, if image cannot be loaded).\r\n * https://photoswipe.com/filters/#contenterrorelement\r\n *\r\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\r\n * Modify a UI element that's being created.\r\n * https://photoswipe.com/filters/#uielement\r\n *\r\n * @prop {(thumbnail: HTMLElement, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thubmnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the thubmnail bounds from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbbounds\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent : PhotoSwipeEvent & PhotoSwipeEventsMap[T]} AugmentedEvent\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {(event: AugmentedEvent) => void} EventCallback\r\n */\r\n\r\n/**\r\n * Base PhotoSwipe event object\r\n *\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n */\r\nclass PhotoSwipeEvent {\r\n /**\r\n * @param {T} type\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n */\r\n constructor(type, details) {\r\n this.type = type;\r\n if (details) {\r\n Object.assign(this, details);\r\n }\r\n }\r\n\r\n preventDefault() {\r\n this.defaultPrevented = true;\r\n }\r\n}\r\n\r\n/**\r\n * PhotoSwipe base class that can listen and dispatch for events.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\r\n */\r\nclass Eventable {\r\n constructor() {\r\n /**\r\n * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent) => void)[] }}\r\n */\r\n this._listeners = {};\r\n\r\n /**\r\n * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter[] }}\r\n */\r\n this._filters = {};\r\n\r\n /** @type {PhotoSwipe=} */\r\n this.pswp = undefined;\r\n\r\n /** @type {PhotoSwipeOptions} */\r\n this.options = undefined;\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n * @param {number} priority\r\n */\r\n addFilter(name, fn, priority = 100) {\r\n if (!this._filters[name]) {\r\n this._filters[name] = [];\r\n }\r\n\r\n this._filters[name].push({ fn, priority });\r\n this._filters[name].sort((f1, f2) => f1.priority - f2.priority);\r\n\r\n if (this.pswp) {\r\n this.pswp.addFilter(name, fn, priority);\r\n }\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n */\r\n removeFilter(name, fn) {\r\n if (this._filters[name]) {\r\n // @ts-expect-error\r\n this._filters[name] = this._filters[name].filter(filter => (filter.fn !== fn));\r\n }\r\n\r\n if (this.pswp) {\r\n this.pswp.removeFilter(name, fn);\r\n }\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {Parameters} args\r\n * @returns {Parameters[0]}\r\n */\r\n applyFilters(name, ...args) {\r\n if (this._filters[name]) {\r\n this._filters[name].forEach((filter) => {\r\n // @ts-expect-error\r\n args[0] = filter.fn.apply(this, args);\r\n });\r\n }\r\n return args[0];\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback} fn\r\n */\r\n on(name, fn) {\r\n if (!this._listeners[name]) {\r\n this._listeners[name] = [];\r\n }\r\n this._listeners[name].push(fn);\r\n\r\n // When binding events to lightbox,\r\n // also bind events to PhotoSwipe Core,\r\n // if it's open.\r\n if (this.pswp) {\r\n this.pswp.on(name, fn);\r\n }\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback} fn\r\n */\r\n off(name, fn) {\r\n if (this._listeners[name]) {\r\n // @ts-expect-error\r\n this._listeners[name] = this._listeners[name].filter(listener => (fn !== listener));\r\n }\r\n\r\n if (this.pswp) {\r\n this.pswp.off(name, fn);\r\n }\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n * @returns {AugmentedEvent}\r\n */\r\n dispatch(name, details) {\r\n if (this.pswp) {\r\n return this.pswp.dispatch(name, details);\r\n }\r\n\r\n const event = /** @type {AugmentedEvent} */ (new PhotoSwipeEvent(name, details));\r\n\r\n if (!this._listeners) {\r\n return event;\r\n }\r\n\r\n if (this._listeners[name]) {\r\n this._listeners[name].forEach((listener) => {\r\n listener.call(this, event);\r\n });\r\n }\r\n\r\n return event;\r\n }\r\n}\r\n\r\nexport default Eventable;\r\n", "import { createElement, setWidthHeight, toTransformString } from '../util/util.js';\r\n\r\nclass Placeholder {\r\n /**\r\n * @param {string | false} imageSrc\r\n * @param {HTMLElement} container\r\n */\r\n constructor(imageSrc, container) {\r\n // Create placeholder\r\n // (stretched thumbnail or simple div behind the main image)\r\n this.element = createElement(\r\n 'pswp__img pswp__img--placeholder',\r\n imageSrc ? 'img' : '',\r\n container\r\n );\r\n\r\n if (imageSrc) {\r\n /** @type {HTMLImageElement} */\r\n (this.element).decoding = 'async';\r\n /** @type {HTMLImageElement} */\r\n (this.element).alt = '';\r\n /** @type {HTMLImageElement} */\r\n (this.element).src = imageSrc;\r\n this.element.setAttribute('role', 'presentation');\r\n }\r\n\r\n this.element.setAttribute('aria-hiden', 'true');\r\n }\r\n\r\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n setDisplayedSize(width, height) {\r\n if (!this.element) {\r\n return;\r\n }\r\n\r\n if (this.element.tagName === 'IMG') {\r\n // Use transform scale() to modify img placeholder size\r\n // (instead of changing width/height directly).\r\n // This helps with performance, specifically in iOS15 Safari.\r\n setWidthHeight(this.element, 250, 'auto');\r\n this.element.style.transformOrigin = '0 0';\r\n this.element.style.transform = toTransformString(0, 0, width / 250);\r\n } else {\r\n setWidthHeight(this.element, width, height);\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this.element.parentNode) {\r\n this.element.remove();\r\n }\r\n this.element = null;\r\n }\r\n}\r\n\r\nexport default Placeholder;\r\n", "import { createElement, LOAD_STATE, setWidthHeight } from '../util/util.js';\r\nimport Placeholder from './placeholder.js';\r\n\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../util/util.js').LoadState} LoadState */\r\n\r\nclass Content {\r\n /**\r\n * @param {SlideData} itemData Slide data\r\n * @param {PhotoSwipe} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n */\r\n constructor(itemData, instance, index) {\r\n this.instance = instance;\r\n this.data = itemData;\r\n this.index = index;\r\n\r\n /** @type {HTMLImageElement | HTMLDivElement} */\r\n this.element = undefined;\r\n\r\n this.width = Number(this.data.w) || Number(this.data.width) || 0;\r\n this.height = Number(this.data.h) || Number(this.data.height) || 0;\r\n\r\n this.isAttached = false;\r\n this.hasSlide = false;\r\n /** @type {LoadState} */\r\n this.state = LOAD_STATE.IDLE;\r\n\r\n if (this.data.type) {\r\n this.type = this.data.type;\r\n } else if (this.data.src) {\r\n this.type = 'image';\r\n } else {\r\n this.type = 'html';\r\n }\r\n\r\n this.instance.dispatch('contentInit', { content: this });\r\n }\r\n\r\n removePlaceholder() {\r\n if (this.placeholder && !this.keepPlaceholder()) {\r\n // With delay, as image might be loaded, but not rendered\r\n setTimeout(() => {\r\n if (this.placeholder) {\r\n this.placeholder.destroy();\r\n this.placeholder = null;\r\n }\r\n }, 500);\r\n }\r\n }\r\n\r\n /**\r\n * Preload content\r\n *\r\n * @param {boolean=} isLazy\r\n * @param {boolean=} reload\r\n */\r\n load(isLazy, reload) {\r\n if (!this.placeholder && this.slide && this.usePlaceholder()) {\r\n // use -based placeholder only for the first slide,\r\n // as rendering (even small stretched thumbnail) is an expensive operation\r\n const placeholderSrc = this.instance.applyFilters(\r\n 'placeholderSrc',\r\n (this.data.msrc && this.slide.isFirstSlide) ? this.data.msrc : false,\r\n this\r\n );\r\n this.placeholder = new Placeholder(\r\n placeholderSrc,\r\n this.slide.container\r\n );\r\n }\r\n\r\n if (this.element && !reload) {\r\n return;\r\n }\r\n\r\n if (this.instance.dispatch('contentLoad', { content: this, isLazy }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.isImageContent()) {\r\n this.loadImage(isLazy);\r\n } else {\r\n this.element = createElement('pswp__content');\r\n this.element.innerHTML = this.data.html || '';\r\n }\r\n\r\n if (reload && this.slide) {\r\n this.slide.updateContentSize(true);\r\n }\r\n }\r\n\r\n /**\r\n * Preload image\r\n *\r\n * @param {boolean} isLazy\r\n */\r\n loadImage(isLazy) {\r\n const imageElement = createElement('pswp__img', 'img');\r\n this.element = imageElement;\r\n\r\n if (this.instance.dispatch('contentLoadImage', { content: this, isLazy }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.data.srcset) {\r\n imageElement.srcset = this.data.srcset;\r\n }\r\n\r\n imageElement.src = this.data.src;\r\n\r\n imageElement.alt = this.data.alt || '';\r\n\r\n this.state = LOAD_STATE.LOADING;\r\n\r\n if (imageElement.complete) {\r\n this.onLoaded();\r\n } else {\r\n imageElement.onload = () => {\r\n this.onLoaded();\r\n };\r\n\r\n imageElement.onerror = () => {\r\n this.onError();\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Assign slide to content\r\n *\r\n * @param {Slide} slide\r\n */\r\n setSlide(slide) {\r\n this.slide = slide;\r\n this.hasSlide = true;\r\n this.instance = slide.pswp;\r\n\r\n // todo: do we need to unset slide?\r\n }\r\n\r\n /**\r\n * Content load success handler\r\n */\r\n onLoaded() {\r\n this.state = LOAD_STATE.LOADED;\r\n\r\n if (this.slide) {\r\n this.instance.dispatch('loadComplete', { slide: this.slide, content: this });\r\n\r\n // if content is reloaded\r\n if (this.slide.isActive\r\n && this.slide.heavyAppended\r\n && !this.element.parentNode) {\r\n this.slide.container.innerHTML = '';\r\n this.append();\r\n this.slide.updateContentSize(true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Content load error handler\r\n */\r\n onError() {\r\n this.state = LOAD_STATE.ERROR;\r\n\r\n if (this.slide) {\r\n this.displayError();\r\n this.instance.dispatch('loadComplete', { slide: this.slide, isError: true, content: this });\r\n this.instance.dispatch('loadError', { slide: this.slide, content: this });\r\n }\r\n }\r\n\r\n /**\r\n * @returns {Boolean} If the content is currently loading\r\n */\r\n isLoading() {\r\n return this.instance.applyFilters(\r\n 'isContentLoading',\r\n this.state === LOAD_STATE.LOADING,\r\n this\r\n );\r\n }\r\n\r\n isError() {\r\n return this.state === LOAD_STATE.ERROR;\r\n }\r\n\r\n /**\r\n * @returns {boolean} If the content is image\r\n */\r\n isImageContent() {\r\n return this.type === 'image';\r\n }\r\n\r\n /**\r\n * Update content size\r\n *\r\n * @param {Number} width\r\n * @param {Number} height\r\n */\r\n setDisplayedSize(width, height) {\r\n if (!this.element) {\r\n return;\r\n }\r\n\r\n if (this.placeholder) {\r\n this.placeholder.setDisplayedSize(width, height);\r\n }\r\n\r\n // eslint-disable-next-line max-len\r\n if (this.instance.dispatch('contentResize', { content: this, width, height }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n setWidthHeight(this.element, width, height);\r\n\r\n if (this.isImageContent() && !this.isError()) {\r\n const image = /** @type HTMLImageElement */ (this.element);\r\n\r\n // Handle srcset sizes attribute.\r\n //\r\n // Never lower quality, if it was increased previously.\r\n // Chrome does this automatically, Firefox and Safari do not,\r\n // so we store largest used size in dataset.\r\n if (image.srcset\r\n // eslint-disable-next-line max-len\r\n && (!image.dataset.largestUsedSize || width > parseInt(image.dataset.largestUsedSize, 10))) {\r\n image.sizes = width + 'px';\r\n image.dataset.largestUsedSize = String(width);\r\n }\r\n\r\n if (this.slide) {\r\n // eslint-disable-next-line max-len\r\n this.instance.dispatch('imageSizeChange', { slide: this.slide, width, height, content: this });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @returns {boolean} If the content can be zoomed\r\n */\r\n isZoomable() {\r\n return this.instance.applyFilters(\r\n 'isContentZoomable',\r\n this.isImageContent() && (this.state !== LOAD_STATE.ERROR),\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * @returns {boolean} If content should use a placeholder (from msrc by default)\r\n */\r\n usePlaceholder() {\r\n return this.instance.applyFilters(\r\n 'useContentPlaceholder',\r\n this.isImageContent(),\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * Preload content with lazy-loading param\r\n */\r\n lazyLoad() {\r\n if (this.instance.dispatch('contentLazyLoad', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n this.load(true);\r\n }\r\n\r\n /**\r\n * @returns {boolean} If placeholder should be kept after content is loaded\r\n */\r\n keepPlaceholder() {\r\n return this.instance.applyFilters(\r\n 'isKeepingPlaceholder',\r\n this.isLoading(),\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * Destroy the content\r\n */\r\n destroy() {\r\n this.hasSlide = false;\r\n this.slide = null;\r\n\r\n if (this.instance.dispatch('contentDestroy', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n this.remove();\r\n\r\n if (this.isImageContent() && this.element) {\r\n this.element.onload = null;\r\n this.element.onerror = null;\r\n this.element = null;\r\n }\r\n }\r\n\r\n /**\r\n * Display error message\r\n */\r\n displayError() {\r\n if (this.slide) {\r\n /** @type {HTMLElement} */\r\n let errorMsgEl = createElement('pswp__error-msg');\r\n errorMsgEl.innerText = this.instance.options.errorMsg;\r\n errorMsgEl = this.instance.applyFilters(\r\n 'contentErrorElement',\r\n errorMsgEl,\r\n this\r\n );\r\n this.element = createElement('pswp__content pswp__error-msg-container');\r\n this.element.appendChild(errorMsgEl);\r\n this.slide.container.innerHTML = '';\r\n this.slide.container.appendChild(this.element);\r\n this.slide.updateContentSize(true);\r\n this.removePlaceholder();\r\n }\r\n }\r\n\r\n /**\r\n * Append the content\r\n */\r\n append() {\r\n this.isAttached = true;\r\n\r\n if (this.state === LOAD_STATE.ERROR) {\r\n this.displayError();\r\n return;\r\n }\r\n\r\n if (this.instance.dispatch('contentAppend', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.isImageContent()) {\r\n // Use decode() on nearby slides\r\n //\r\n // Nearby slide images are in DOM and not hidden via display:none.\r\n // However, they are placed offscreen (to the left and right side).\r\n //\r\n // Some browsers do not composite the image until it's actually visible,\r\n // using decode() helps.\r\n //\r\n // You might ask \"why dont you just decode() and then append all images\",\r\n // that's because I want to show image before it's fully loaded,\r\n // as browser can render parts of image while it is loading.\r\n if (this.slide\r\n && !this.slide.isActive\r\n && ('decode' in this.element)) {\r\n this.isDecoding = true;\r\n // Make sure that we start decoding on the next frame\r\n requestAnimationFrame(() => {\r\n // element might change\r\n if (this.element && this.element.tagName === 'IMG') {\r\n /** @type {HTMLImageElement} */\r\n (this.element).decode().then(() => {\r\n this.isDecoding = false;\r\n requestAnimationFrame(() => {\r\n this.appendImage();\r\n });\r\n }).catch(() => {\r\n this.isDecoding = false;\r\n });\r\n }\r\n });\r\n } else {\r\n if (this.placeholder\r\n // eslint-disable-next-line max-len\r\n && (this.state === LOAD_STATE.LOADED || /** @type {LoadState} */ (this.state) === LOAD_STATE.ERROR)\r\n ) {\r\n this.removePlaceholder();\r\n }\r\n this.appendImage();\r\n }\r\n } else if (this.element && !this.element.parentNode) {\r\n this.slide.container.appendChild(this.element);\r\n }\r\n }\r\n\r\n /**\r\n * Activate the slide,\r\n * active slide is generally the current one,\r\n * meaning the user can see it.\r\n */\r\n activate() {\r\n if (this.instance.dispatch('contentActivate', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.slide) {\r\n if (this.isImageContent() && this.isDecoding) {\r\n // add image to slide when it becomes active,\r\n // even if it's not finished decoding\r\n this.appendImage();\r\n } else if (this.isError()) {\r\n this.load(false, true); // try to reload\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Deactivate the content\r\n */\r\n deactivate() {\r\n this.instance.dispatch('contentDeactivate', { content: this });\r\n }\r\n\r\n\r\n /**\r\n * Remove the content from DOM\r\n */\r\n remove() {\r\n this.isAttached = false;\r\n\r\n if (this.instance.dispatch('contentRemove', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.element && this.element.parentNode) {\r\n this.element.remove();\r\n }\r\n }\r\n\r\n /**\r\n * Append the image content to slide container\r\n */\r\n appendImage() {\r\n if (!this.isAttached) {\r\n return;\r\n }\r\n\r\n if (this.instance.dispatch('contentAppendImage', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n // ensure that element exists and is not already appended\r\n if (this.slide && this.element && !this.element.parentNode) {\r\n this.slide.container.appendChild(this.element);\r\n\r\n if (this.placeholder\r\n && (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR)) {\r\n this.removePlaceholder();\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default Content;\r\n", "import Eventable from './eventable.js';\r\nimport {\r\n getElementsFromOption\r\n} from '../util/util.js';\r\nimport Content from '../slide/content.js';\r\n\r\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\r\n/** @typedef {import(\"../photoswipe.js\").PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\r\n\r\n/**\r\n * PhotoSwipe base class that can retrieve data about every slide.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\r\n */\r\nclass PhotoSwipeBase extends Eventable {\r\n /**\r\n * Get total number of slides\r\n *\r\n * @returns {number}\r\n */\r\n getNumItems() {\r\n let numItems;\r\n const { dataSource } = this.options;\r\n if (!dataSource) {\r\n numItems = 0;\r\n } else if ('length' in dataSource) {\r\n // may be an array or just object with length property\r\n numItems = dataSource.length;\r\n } else if ('gallery' in dataSource) {\r\n // query DOM elements\r\n if (!dataSource.items) {\r\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n }\r\n\r\n if (dataSource.items) {\r\n numItems = dataSource.items.length;\r\n }\r\n }\r\n\r\n // legacy event, before filters were introduced\r\n const event = this.dispatch('numItems', {\r\n dataSource,\r\n numItems\r\n });\r\n return this.applyFilters('numItems', event.numItems, dataSource);\r\n }\r\n\r\n /**\r\n * @param {SlideData} slideData\r\n * @param {number} index\r\n */\r\n createContentFromData(slideData, index) {\r\n // @ts-expect-error\r\n return new Content(slideData, this, index);\r\n }\r\n\r\n /**\r\n * Get item data by index.\r\n *\r\n * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\r\n * For example, it may contain properties like\r\n * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\r\n *\r\n * @param {number} index\r\n */\r\n getItemData(index) {\r\n const { dataSource } = this.options;\r\n let dataSourceItem;\r\n if (Array.isArray(dataSource)) {\r\n // Datasource is an array of elements\r\n dataSourceItem = dataSource[index];\r\n } else if (dataSource && dataSource.gallery) {\r\n // dataSource has gallery property,\r\n // thus it was created by Lightbox, based on\r\n // gallery and children options\r\n\r\n // query DOM elements\r\n if (!dataSource.items) {\r\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n }\r\n\r\n dataSourceItem = dataSource.items[index];\r\n }\r\n\r\n let itemData = dataSourceItem;\r\n\r\n if (itemData instanceof Element) {\r\n itemData = this._domElementToItemData(itemData);\r\n }\r\n\r\n // Dispatching the itemData event,\r\n // it's a legacy verion before filters were introduced\r\n const event = this.dispatch('itemData', {\r\n itemData: itemData || {},\r\n index\r\n });\r\n\r\n return this.applyFilters('itemData', event.itemData, index);\r\n }\r\n\r\n /**\r\n * Get array of gallery DOM elements,\r\n * based on childSelector and gallery element.\r\n *\r\n * @param {HTMLElement} galleryElement\r\n */\r\n _getGalleryDOMElements(galleryElement) {\r\n if (this.options.children || this.options.childSelector) {\r\n return getElementsFromOption(\r\n this.options.children,\r\n this.options.childSelector,\r\n galleryElement\r\n ) || [];\r\n }\r\n\r\n return [galleryElement];\r\n }\r\n\r\n /**\r\n * Converts DOM element to item data object.\r\n *\r\n * @param {HTMLElement} element DOM element\r\n */\r\n // eslint-disable-next-line class-methods-use-this\r\n _domElementToItemData(element) {\r\n /** @type {SlideData} */\r\n const itemData = {\r\n element\r\n };\r\n\r\n // eslint-disable-next-line max-len\r\n const linkEl = /** @type {HTMLAnchorElement} */ (element.tagName === 'A' ? element : element.querySelector('a'));\r\n\r\n if (linkEl) {\r\n // src comes from data-pswp-src attribute,\r\n // if it's empty link href is used\r\n itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\r\n\r\n if (linkEl.dataset.pswpSrcset) {\r\n itemData.srcset = linkEl.dataset.pswpSrcset;\r\n }\r\n\r\n itemData.width = parseInt(linkEl.dataset.pswpWidth, 10);\r\n itemData.height = parseInt(linkEl.dataset.pswpHeight, 10);\r\n\r\n // support legacy w & h properties\r\n itemData.w = itemData.width;\r\n itemData.h = itemData.height;\r\n\r\n if (linkEl.dataset.pswpType) {\r\n itemData.type = linkEl.dataset.pswpType;\r\n }\r\n\r\n const thumbnailEl = element.querySelector('img');\r\n\r\n if (thumbnailEl) {\r\n // msrc is URL to placeholder image that's displayed before large image is loaded\r\n // by default it's displayed only for the first slide\r\n itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\r\n itemData.alt = thumbnailEl.getAttribute('alt');\r\n }\r\n\r\n if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\r\n itemData.thumbCropped = true;\r\n }\r\n }\r\n\r\n return this.applyFilters('domItemData', itemData, element, linkEl);\r\n }\r\n}\r\n\r\nexport default PhotoSwipeBase;\r\n", "import {\r\n setTransform,\r\n equalizePoints,\r\n decodeImage,\r\n toTransformString\r\n} from './util/util.js';\r\n\r\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('./slide/get-thumb-bounds.js').Bounds} Bounds */\r\n/** @typedef {import('./util/animations.js').AnimationProps} AnimationProps */\r\n\r\n// some browsers do not paint\r\n// elements which opacity is set to 0,\r\n// since we need to pre-render elements for the animation -\r\n// we set it to the minimum amount\r\nconst MIN_OPACITY = 0.003;\r\n\r\n/**\r\n * Manages opening and closing transitions of the PhotoSwipe.\r\n *\r\n * It can perform zoom, fade or no transition.\r\n */\r\nclass Opener {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n this.isClosed = true;\r\n this._prepareOpen = this._prepareOpen.bind(this);\r\n\r\n /** @type {false | Bounds} */\r\n this._thumbBounds = undefined;\r\n\r\n // Override initial zoom and pan position\r\n pswp.on('firstZoomPan', this._prepareOpen);\r\n }\r\n\r\n open() {\r\n this._prepareOpen();\r\n this._start();\r\n }\r\n\r\n close() {\r\n if (this.isClosed || this.isClosing || this.isOpening) {\r\n // if we close during opening animation\r\n // for now do nothing,\r\n // browsers aren't good at changing the direction of the CSS transition\r\n return false;\r\n }\r\n\r\n const slide = this.pswp.currSlide;\r\n\r\n this.isOpen = false;\r\n this.isOpening = false;\r\n this.isClosing = true;\r\n this._duration = this.pswp.options.hideAnimationDuration;\r\n\r\n if (slide && slide.currZoomLevel * slide.width >= this.pswp.options.maxWidthToAnimate) {\r\n this._duration = 0;\r\n }\r\n\r\n this._applyStartProps();\r\n setTimeout(() => {\r\n this._start();\r\n }, this._croppedZoom ? 30 : 0);\r\n\r\n return true;\r\n }\r\n\r\n _prepareOpen() {\r\n this.pswp.off('firstZoomPan', this._prepareOpen);\r\n if (!this.isOpening) {\r\n const slide = this.pswp.currSlide;\r\n this.isOpening = true;\r\n this.isClosing = false;\r\n this._duration = this.pswp.options.showAnimationDuration;\r\n if (slide && slide.zoomLevels.initial * slide.width >= this.pswp.options.maxWidthToAnimate) {\r\n this._duration = 0;\r\n }\r\n this._applyStartProps();\r\n }\r\n }\r\n\r\n _applyStartProps() {\r\n const { pswp } = this;\r\n const slide = this.pswp.currSlide;\r\n const { options } = pswp;\r\n\r\n if (options.showHideAnimationType === 'fade') {\r\n options.showHideOpacity = true;\r\n this._thumbBounds = false;\r\n } else if (options.showHideAnimationType === 'none') {\r\n options.showHideOpacity = false;\r\n this._duration = 0;\r\n this._thumbBounds = false;\r\n } else if (this.isOpening && pswp._initialThumbBounds) {\r\n // Use initial bounds if defined\r\n this._thumbBounds = pswp._initialThumbBounds;\r\n } else {\r\n this._thumbBounds = this.pswp.getThumbBounds();\r\n }\r\n\r\n this._placeholder = slide.getPlaceholderElement();\r\n\r\n pswp.animations.stopAll();\r\n\r\n // Discard animations when duration is less than 50ms\r\n this._useAnimation = (this._duration > 50);\r\n this._animateZoom = Boolean(this._thumbBounds)\r\n && (slide.content && slide.content.usePlaceholder())\r\n && (!this.isClosing || !pswp.mainScroll.isShifted());\r\n if (!this._animateZoom) {\r\n this._animateRootOpacity = true;\r\n\r\n if (this.isOpening) {\r\n slide.zoomAndPanToInitial();\r\n slide.applyCurrentZoomPan();\r\n }\r\n } else {\r\n this._animateRootOpacity = options.showHideOpacity;\r\n }\r\n this._animateBgOpacity = !this._animateRootOpacity && this.pswp.options.bgOpacity > MIN_OPACITY;\r\n this._opacityElement = this._animateRootOpacity ? pswp.element : pswp.bg;\r\n\r\n if (!this._useAnimation) {\r\n this._duration = 0;\r\n this._animateZoom = false;\r\n this._animateBgOpacity = false;\r\n this._animateRootOpacity = true;\r\n if (this.isOpening) {\r\n pswp.element.style.opacity = String(MIN_OPACITY);\r\n pswp.applyBgOpacity(1);\r\n }\r\n return;\r\n }\r\n\r\n if (this._animateZoom && this._thumbBounds && this._thumbBounds.innerRect) {\r\n // Properties are used when animation from cropped thumbnail\r\n this._croppedZoom = true;\r\n this._cropContainer1 = this.pswp.container;\r\n this._cropContainer2 = this.pswp.currSlide.holderElement;\r\n\r\n pswp.container.style.overflow = 'hidden';\r\n pswp.container.style.width = pswp.viewportSize.x + 'px';\r\n } else {\r\n this._croppedZoom = false;\r\n }\r\n\r\n if (this.isOpening) {\r\n // Apply styles before opening transition\r\n if (this._animateRootOpacity) {\r\n pswp.element.style.opacity = String(MIN_OPACITY);\r\n pswp.applyBgOpacity(1);\r\n } else {\r\n if (this._animateBgOpacity) {\r\n pswp.bg.style.opacity = String(MIN_OPACITY);\r\n }\r\n pswp.element.style.opacity = '1';\r\n }\r\n\r\n if (this._animateZoom) {\r\n this._setClosedStateZoomPan();\r\n if (this._placeholder) {\r\n // tell browser that we plan to animate the placeholder\r\n this._placeholder.style.willChange = 'transform';\r\n\r\n // hide placeholder to allow hiding of\r\n // elements that overlap it (such as icons over the thumbnail)\r\n this._placeholder.style.opacity = String(MIN_OPACITY);\r\n }\r\n }\r\n } else if (this.isClosing) {\r\n // hide nearby slides to make sure that\r\n // they are not painted during the transition\r\n pswp.mainScroll.itemHolders[0].el.style.display = 'none';\r\n pswp.mainScroll.itemHolders[2].el.style.display = 'none';\r\n\r\n if (this._croppedZoom) {\r\n if (pswp.mainScroll.x !== 0) {\r\n // shift the main scroller to zero position\r\n pswp.mainScroll.resetPosition();\r\n pswp.mainScroll.resize();\r\n }\r\n }\r\n }\r\n }\r\n\r\n _start() {\r\n if (this.isOpening\r\n && this._useAnimation\r\n && this._placeholder\r\n && this._placeholder.tagName === 'IMG') {\r\n // To ensure smooth animation\r\n // we wait till the current slide image placeholder is decoded,\r\n // but no longer than 250ms,\r\n // and no shorter than 50ms\r\n // (just using requestanimationframe is not enough in Firefox,\r\n // for some reason)\r\n new Promise((resolve) => {\r\n let decoded = false;\r\n let isDelaying = true;\r\n decodeImage(/** @type {HTMLImageElement} */ (this._placeholder)).finally(() => {\r\n decoded = true;\r\n if (!isDelaying) {\r\n resolve();\r\n }\r\n });\r\n setTimeout(() => {\r\n isDelaying = false;\r\n if (decoded) {\r\n resolve();\r\n }\r\n }, 50);\r\n setTimeout(resolve, 250);\r\n }).finally(() => this._initiate());\r\n } else {\r\n this._initiate();\r\n }\r\n }\r\n\r\n _initiate() {\r\n this.pswp.element.style.setProperty('--pswp-transition-duration', this._duration + 'ms');\r\n\r\n this.pswp.dispatch(\r\n this.isOpening ? 'openingAnimationStart' : 'closingAnimationStart'\r\n );\r\n\r\n // legacy event\r\n this.pswp.dispatch(\r\n /** @type {'initialZoomIn' | 'initialZoomOut'} */\r\n ('initialZoom' + (this.isOpening ? 'In' : 'Out'))\r\n );\r\n\r\n this.pswp.element.classList[this.isOpening ? 'add' : 'remove']('pswp--ui-visible');\r\n\r\n if (this.isOpening) {\r\n if (this._placeholder) {\r\n // unhide the placeholder\r\n this._placeholder.style.opacity = '1';\r\n }\r\n this._animateToOpenState();\r\n } else if (this.isClosing) {\r\n this._animateToClosedState();\r\n }\r\n\r\n if (!this._useAnimation) {\r\n this._onAnimationComplete();\r\n }\r\n }\r\n\r\n _onAnimationComplete() {\r\n const { pswp } = this;\r\n this.isOpen = this.isOpening;\r\n this.isClosed = this.isClosing;\r\n this.isOpening = false;\r\n this.isClosing = false;\r\n\r\n pswp.dispatch(\r\n this.isOpen ? 'openingAnimationEnd' : 'closingAnimationEnd'\r\n );\r\n\r\n // legacy event\r\n pswp.dispatch(\r\n /** @type {'initialZoomInEnd' | 'initialZoomOutEnd'} */\r\n ('initialZoom' + (this.isOpen ? 'InEnd' : 'OutEnd'))\r\n );\r\n\r\n if (this.isClosed) {\r\n pswp.destroy();\r\n } else if (this.isOpen) {\r\n if (this._animateZoom) {\r\n pswp.container.style.overflow = 'visible';\r\n pswp.container.style.width = '100%';\r\n }\r\n pswp.currSlide.applyCurrentZoomPan();\r\n }\r\n }\r\n\r\n _animateToOpenState() {\r\n const { pswp } = this;\r\n if (this._animateZoom) {\r\n if (this._croppedZoom) {\r\n this._animateTo(this._cropContainer1, 'transform', 'translate3d(0,0,0)');\r\n this._animateTo(this._cropContainer2, 'transform', 'none');\r\n }\r\n\r\n pswp.currSlide.zoomAndPanToInitial();\r\n this._animateTo(\r\n pswp.currSlide.container,\r\n 'transform',\r\n pswp.currSlide.getCurrentTransform()\r\n );\r\n }\r\n\r\n if (this._animateBgOpacity) {\r\n this._animateTo(pswp.bg, 'opacity', String(pswp.options.bgOpacity));\r\n }\r\n\r\n if (this._animateRootOpacity) {\r\n this._animateTo(pswp.element, 'opacity', '1');\r\n }\r\n }\r\n\r\n _animateToClosedState() {\r\n const { pswp } = this;\r\n\r\n if (this._animateZoom) {\r\n this._setClosedStateZoomPan(true);\r\n }\r\n\r\n if (this._animateBgOpacity\r\n && pswp.bgOpacity > 0.01) { // do not animate opacity if it's already at 0\r\n this._animateTo(pswp.bg, 'opacity', '0');\r\n }\r\n\r\n if (this._animateRootOpacity) {\r\n this._animateTo(pswp.element, 'opacity', '0');\r\n }\r\n }\r\n\r\n /**\r\n * @param {boolean=} animate\r\n */\r\n _setClosedStateZoomPan(animate) {\r\n if (!this._thumbBounds) return;\r\n\r\n const { pswp } = this;\r\n const { innerRect } = this._thumbBounds;\r\n const { currSlide, viewportSize } = pswp;\r\n\r\n if (this._croppedZoom) {\r\n const containerOnePanX = -viewportSize.x + (this._thumbBounds.x - innerRect.x) + innerRect.w;\r\n const containerOnePanY = -viewportSize.y + (this._thumbBounds.y - innerRect.y) + innerRect.h;\r\n const containerTwoPanX = viewportSize.x - innerRect.w;\r\n const containerTwoPanY = viewportSize.y - innerRect.h;\r\n\r\n\r\n if (animate) {\r\n this._animateTo(\r\n this._cropContainer1,\r\n 'transform',\r\n toTransformString(containerOnePanX, containerOnePanY)\r\n );\r\n\r\n this._animateTo(\r\n this._cropContainer2,\r\n 'transform',\r\n toTransformString(containerTwoPanX, containerTwoPanY)\r\n );\r\n } else {\r\n setTransform(this._cropContainer1, containerOnePanX, containerOnePanY);\r\n setTransform(this._cropContainer2, containerTwoPanX, containerTwoPanY);\r\n }\r\n }\r\n\r\n equalizePoints(currSlide.pan, innerRect || this._thumbBounds);\r\n currSlide.currZoomLevel = this._thumbBounds.w / currSlide.width;\r\n\r\n if (animate) {\r\n this._animateTo(currSlide.container, 'transform', currSlide.getCurrentTransform());\r\n } else {\r\n currSlide.applyCurrentZoomPan();\r\n }\r\n }\r\n\r\n /**\r\n * @param {HTMLElement} target\r\n * @param {'transform' | 'opacity'} prop\r\n * @param {string} propValue\r\n */\r\n _animateTo(target, prop, propValue) {\r\n if (!this._duration) {\r\n target.style[prop] = propValue;\r\n return;\r\n }\r\n\r\n const { animations } = this.pswp;\r\n /** @type {AnimationProps} */\r\n const animProps = {\r\n duration: this._duration,\r\n easing: this.pswp.options.easing,\r\n onComplete: () => {\r\n if (!animations.activeAnimations.length) {\r\n this._onAnimationComplete();\r\n }\r\n },\r\n target,\r\n };\r\n animProps[prop] = propValue;\r\n animations.startTransition(animProps);\r\n }\r\n}\r\n\r\nexport default Opener;\r\n", "import { getViewportSize, getPanAreaSize } from '../util/viewport-size.js';\r\nimport ZoomLevel from './zoom-level.js';\r\n\r\n/** @typedef {import('./content.js').default} Content */\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n\r\nconst MIN_SLIDES_TO_CACHE = 5;\r\n\r\n/**\r\n * Lazy-load an image\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {PhotoSwipe | PhotoSwipeLightbox} instance PhotoSwipe or PhotoSwipeLightbox\r\n * @param {number} index\r\n * @returns Image that is being decoded or false.\r\n */\r\nexport function lazyLoadData(itemData, instance, index) {\r\n // src/slide/content/content.js\r\n const content = instance.createContentFromData(itemData, index);\r\n\r\n if (!content || !content.lazyLoad) {\r\n return;\r\n }\r\n\r\n const { options } = instance;\r\n\r\n // We need to know dimensions of the image to preload it,\r\n // as it might use srcset and we need to define sizes\r\n // @ts-expect-error should provide pswp instance?\r\n const viewportSize = instance.viewportSize || getViewportSize(options, instance);\r\n const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\r\n\r\n const zoomLevel = new ZoomLevel(options, itemData, -1);\r\n zoomLevel.update(content.width, content.height, panAreaSize);\r\n\r\n content.lazyLoad();\r\n content.setDisplayedSize(\r\n Math.ceil(content.width * zoomLevel.initial),\r\n Math.ceil(content.height * zoomLevel.initial)\r\n );\r\n\r\n return content;\r\n}\r\n\r\n\r\n/**\r\n * Lazy-loads specific slide.\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * By default it loads image based on viewport size and initial zoom level.\r\n *\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe | PhotoSwipeLightbox} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n */\r\nexport function lazyLoadSlide(index, instance) {\r\n const itemData = instance.getItemData(index);\r\n\r\n if (instance.dispatch('lazyLoadSlide', { index, itemData }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n return lazyLoadData(itemData, instance, index);\r\n}\r\n\r\n\r\nclass ContentLoader {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n // Total amount of cached images\r\n this.limit = Math.max(\r\n pswp.options.preload[0] + pswp.options.preload[1] + 1,\r\n MIN_SLIDES_TO_CACHE\r\n );\r\n /** @type {Content[]} */\r\n this._cachedItems = [];\r\n }\r\n\r\n /**\r\n * Lazy load nearby slides based on `preload` option.\r\n *\r\n * @param {number=} diff Difference between slide indexes that was changed recently, or 0.\r\n */\r\n updateLazy(diff) {\r\n const { pswp } = this;\r\n\r\n if (pswp.dispatch('lazyLoad').defaultPrevented) {\r\n return;\r\n }\r\n\r\n const { preload } = pswp.options;\r\n const isForward = diff === undefined ? true : (diff >= 0);\r\n let i;\r\n\r\n // preload[1] - num items to preload in forward direction\r\n for (i = 0; i <= preload[1]; i++) {\r\n this.loadSlideByIndex(pswp.currIndex + (isForward ? i : (-i)));\r\n }\r\n\r\n // preload[0] - num items to preload in backward direction\r\n for (i = 1; i <= preload[0]; i++) {\r\n this.loadSlideByIndex(pswp.currIndex + (isForward ? (-i) : i));\r\n }\r\n }\r\n\r\n /**\r\n * @param {number} index\r\n */\r\n loadSlideByIndex(index) {\r\n index = this.pswp.getLoopedIndex(index);\r\n // try to get cached content\r\n let content = this.getContentByIndex(index);\r\n if (!content) {\r\n // no cached content, so try to load from scratch:\r\n content = lazyLoadSlide(index, this.pswp);\r\n // if content can be loaded, add it to cache:\r\n if (content) {\r\n this.addToCache(content);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @param {Slide} slide\r\n */\r\n getContentBySlide(slide) {\r\n let content = this.getContentByIndex(slide.index);\r\n if (!content) {\r\n // create content if not found in cache\r\n content = this.pswp.createContentFromData(slide.data, slide.index);\r\n if (content) {\r\n this.addToCache(content);\r\n }\r\n }\r\n\r\n if (content) {\r\n // assign slide to content\r\n content.setSlide(slide);\r\n }\r\n return content;\r\n }\r\n\r\n /**\r\n * @param {Content} content\r\n */\r\n addToCache(content) {\r\n // move to the end of array\r\n this.removeByIndex(content.index);\r\n this._cachedItems.push(content);\r\n\r\n if (this._cachedItems.length > this.limit) {\r\n // Destroy the first content that's not attached\r\n const indexToRemove = this._cachedItems.findIndex((item) => {\r\n return !item.isAttached && !item.hasSlide;\r\n });\r\n if (indexToRemove !== -1) {\r\n const removedItem = this._cachedItems.splice(indexToRemove, 1)[0];\r\n removedItem.destroy();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Removes an image from cache, does not destroy() it, just removes.\r\n *\r\n * @param {number} index\r\n */\r\n removeByIndex(index) {\r\n const indexToRemove = this._cachedItems.findIndex(item => item.index === index);\r\n if (indexToRemove !== -1) {\r\n this._cachedItems.splice(indexToRemove, 1);\r\n }\r\n }\r\n\r\n /**\r\n * @param {number} index\r\n */\r\n getContentByIndex(index) {\r\n return this._cachedItems.find(content => content.index === index);\r\n }\r\n\r\n destroy() {\r\n this._cachedItems.forEach(content => content.destroy());\r\n this._cachedItems = null;\r\n }\r\n}\r\n\r\nexport default ContentLoader;\r\n", "import {\r\n createElement,\r\n equalizePoints,\r\n pointsEqual,\r\n clamp,\r\n} from './util/util.js';\r\n\r\nimport DOMEvents from './util/dom-events.js';\r\nimport Slide from './slide/slide.js';\r\nimport Gestures from './gestures/gestures.js';\r\nimport MainScroll from './main-scroll.js';\r\n\r\nimport Keyboard from './keyboard.js';\r\nimport Animations from './util/animations.js';\r\nimport ScrollWheel from './scroll-wheel.js';\r\nimport UI from './ui/ui.js';\r\nimport { getViewportSize } from './util/viewport-size.js';\r\nimport { getThumbBounds } from './slide/get-thumb-bounds.js';\r\nimport PhotoSwipeBase from './core/base.js';\r\nimport Opener from './opener.js';\r\nimport ContentLoader from './slide/loader.js';\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Type} Type\r\n */\r\n\r\n/** @typedef {import('./slide/slide.js').SlideData} SlideData */\r\n/** @typedef {import('./slide/zoom-level.js').ZoomLevelOption} ZoomLevelOption */\r\n/** @typedef {import('./ui/ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('./main-scroll.js').ItemHolder} ItemHolder */\r\n/** @typedef {import('./core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\r\n/** @typedef {import('./core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\r\n/**\r\n * @template T\r\n * @typedef {import('./core/eventable.js').EventCallback} EventCallback\r\n */\r\n/**\r\n * @template T\r\n * @typedef {import('./core/eventable.js').AugmentedEvent} AugmentedEvent\r\n */\r\n\r\n/** @typedef {{ x?: number; y?: number; id?: string | number }} Point */\r\n/** @typedef {{ x?: number; y?: number }} Size */\r\n/** @typedef {{ top: number; bottom: number; left: number; right: number }} Padding */\r\n/** @typedef {SlideData[]} DataSourceArray */\r\n/** @typedef {{ gallery: HTMLElement; items?: HTMLElement[] }} DataSourceObject */\r\n/** @typedef {DataSourceArray | DataSourceObject} DataSource */\r\n/** @typedef {(point: Point, originalEvent: PointerEvent) => void} ActionFn */\r\n/** @typedef {'close' | 'next' | 'zoom' | 'zoom-or-close' | 'toggle-controls'} ActionType */\r\n/** @typedef {Type | { default: Type }} PhotoSwipeModule */\r\n/** @typedef {PhotoSwipeModule | Promise | (() => Promise)} PhotoSwipeModuleOption */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeOptions https://photoswipe.com/options/\r\n *\r\n * @prop {DataSource=} dataSource\r\n * Pass an array of any items via dataSource option. Its length will determine amount of slides\r\n * (which may be modified further from numItems event).\r\n *\r\n * Each item should contain data that you need to generate slide\r\n * (for image slide it would be src (image URL), width (image width), height, srcset, alt).\r\n *\r\n * If these properties are not present in your initial array, you may \"pre-parse\" each item from itemData filter.\r\n *\r\n * @prop {number=} bgOpacity\r\n * Background backdrop opacity, always define it via this option and not via CSS rgba color.\r\n *\r\n * @prop {number=} spacing\r\n * Spacing between slides. Defined as ratio relative to the viewport width (0.1 = 10% of viewport).\r\n *\r\n * @prop {boolean=} allowPanToNext\r\n * Allow swipe navigation to the next slide when the current slide is zoomed. Does not apply to mouse events.\r\n *\r\n * @prop {boolean=} loop\r\n * If set to true you'll be able to swipe from the last to the first image.\r\n * Option is always false when there are less than 3 slides.\r\n *\r\n * @prop {boolean=} wheelToZoom\r\n * By default PhotoSwipe zooms image with ctrl-wheel, if you enable this option - image will zoom just via wheel.\r\n *\r\n * @prop {boolean=} pinchToClose\r\n * Pinch touch gesture to close the gallery.\r\n *\r\n * @prop {boolean=} closeOnVerticalDrag\r\n * Vertical drag gesture to close the PhotoSwipe.\r\n *\r\n * @prop {Padding=} padding\r\n * Slide area padding (in pixels).\r\n *\r\n * @prop {(viewportSize: Size, itemData: SlideData, index: number) => Padding} [paddingFn]\r\n * The option is checked frequently, so make sure it's performant. Overrides padding option if defined. For example:\r\n *\r\n * @prop {number | false} [hideAnimationDuration]\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {number | false} [showAnimationDuration]\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {number | false} [zoomAnimationDuration]\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {string=} easing\r\n * String, 'cubic-bezier(.4,0,.22,1)'. CSS easing function for open/close/zoom transitions.\r\n *\r\n * @prop {boolean=} escKey\r\n * Esc key to close.\r\n *\r\n * @prop {boolean=} arrowKeys\r\n * Left/right arrow keys for navigation.\r\n *\r\n * @prop {boolean=} returnFocus\r\n * Restore focus the last active element after PhotoSwipe is closed.\r\n *\r\n * @prop {boolean=} clickToCloseNonZoomable\r\n * If image is not zoomable (for example, smaller than viewport) it can be closed by clicking on it.\r\n *\r\n * @prop {ActionType | ActionFn | false} [imageClickAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} [bgClickAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} [tapAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} [doubleTapAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {number=} preloaderDelay\r\n * Delay before the loading indicator will be displayed,\r\n * if image is loaded during it - the indicator will not be displayed at all. Can be zero.\r\n *\r\n * @prop {string=} indexIndicatorSep\r\n * Used for slide count indicator (\"1 of 10 \").\r\n *\r\n * @prop {(options: PhotoSwipeOptions, pswp: PhotoSwipe) => { x: number; y: number }} [getViewportSizeFn]\r\n * A function that should return slide viewport width and height, in format {x: 100, y: 100}.\r\n *\r\n * @prop {string=} errorMsg\r\n * Message to display when the image wasn't able to load. If you need to display HTML - use contentErrorElement filter.\r\n *\r\n * @prop {[number, number]=} preload\r\n * Lazy loading of nearby slides based on direction of movement. Should be an array with two integers,\r\n * first one - number of items to preload before the current image, second one - after the current image.\r\n * Two nearby images are always loaded.\r\n *\r\n * @prop {string=} mainClass\r\n * Class that will be added to the root element of PhotoSwipe, may contain multiple separated by space.\r\n * Example on Styling page.\r\n *\r\n * @prop {HTMLElement=} appendToEl\r\n * Element to which PhotoSwipe dialog will be appended when it opens.\r\n *\r\n * @prop {number=} maxWidthToAnimate\r\n * Maximum width of image to animate, if initial rendered image width\r\n * is larger than this value - the opening/closing transition will be automatically disabled.\r\n *\r\n * @prop {string=} closeTitle\r\n * Translating\r\n *\r\n * @prop {string=} zoomTitle\r\n * Translating\r\n *\r\n * @prop {string=} arrowPrevTitle\r\n * Translating\r\n *\r\n * @prop {string=} arrowNextTitle\r\n * Translating\r\n *\r\n * @prop {'zoom' | 'fade' | 'none'} [showHideAnimationType]\r\n * To adjust opening or closing transition type use lightbox option `showHideAnimationType` (`String`).\r\n * It supports three values - `zoom` (default), `fade` (default if there is no thumbnail) and `none`.\r\n *\r\n * Animations are automatically disabled if user `(prefers-reduced-motion: reduce)`.\r\n *\r\n * @prop {number=} index\r\n * Defines start slide index.\r\n *\r\n * @prop {(e: MouseEvent) => number} [getClickedIndexFn]\r\n *\r\n * @prop {boolean=} arrowPrev\r\n * @prop {boolean=} arrowNext\r\n * @prop {boolean=} zoom\r\n * @prop {boolean=} close\r\n * @prop {boolean=} counter\r\n *\r\n * @prop {string=} arrowPrevSVG\r\n * @prop {string=} arrowNextSVG\r\n * @prop {string=} zoomSVG\r\n * @prop {string=} closeSVG\r\n * @prop {string=} counterSVG\r\n *\r\n * @prop {string=} arrowPrevTitle\r\n * @prop {string=} arrowNextTitle\r\n * @prop {string=} zoomTitle\r\n * @prop {string=} closeTitle\r\n * @prop {string=} counterTitle\r\n *\r\n * @prop {ZoomLevelOption=} initialZoomLevel\r\n * @prop {ZoomLevelOption=} secondaryZoomLevel\r\n * @prop {ZoomLevelOption=} maxZoomLevel\r\n *\r\n * @prop {boolean=} mouseMovePan\r\n * @prop {Point | null} [initialPointerPos]\r\n * @prop {boolean=} showHideOpacity\r\n *\r\n * @prop {PhotoSwipeModuleOption} [pswpModule]\r\n * @prop {() => Promise} [openPromise]\r\n * @prop {boolean=} preloadFirstSlide\r\n * @prop {string=} gallery\r\n * @prop {string=} gallerySelector\r\n * @prop {string=} children\r\n * @prop {string=} childSelector\r\n * @prop {string | false} [thumbSelector]\r\n */\r\n\r\n/** @type {PhotoSwipeOptions} */\r\nconst defaultOptions = {\r\n allowPanToNext: true,\r\n spacing: 0.1,\r\n loop: true,\r\n pinchToClose: true,\r\n closeOnVerticalDrag: true,\r\n hideAnimationDuration: 333,\r\n showAnimationDuration: 333,\r\n zoomAnimationDuration: 333,\r\n escKey: true,\r\n arrowKeys: true,\r\n returnFocus: true,\r\n maxWidthToAnimate: 4000,\r\n clickToCloseNonZoomable: true,\r\n imageClickAction: 'zoom-or-close',\r\n bgClickAction: 'close',\r\n tapAction: 'toggle-controls',\r\n doubleTapAction: 'zoom',\r\n indexIndicatorSep: ' / ',\r\n preloaderDelay: 2000,\r\n bgOpacity: 0.8,\r\n\r\n index: 0,\r\n errorMsg: 'The image cannot be loaded',\r\n preload: [1, 2],\r\n easing: 'cubic-bezier(.4,0,.22,1)'\r\n};\r\n\r\n/**\r\n * PhotoSwipe Core\r\n */\r\nclass PhotoSwipe extends PhotoSwipeBase {\r\n /**\r\n * @param {PhotoSwipeOptions} options\r\n */\r\n constructor(options) {\r\n super();\r\n\r\n this._prepareOptions(options);\r\n\r\n /**\r\n * offset of viewport relative to document\r\n *\r\n * @type {{ x?: number; y?: number }}\r\n */\r\n this.offset = {};\r\n\r\n /**\r\n * @type {{ x?: number; y?: number }}\r\n * @private\r\n */\r\n this._prevViewportSize = {};\r\n\r\n /**\r\n * Size of scrollable PhotoSwipe viewport\r\n *\r\n * @type {{ x?: number; y?: number }}\r\n */\r\n this.viewportSize = {};\r\n\r\n /**\r\n * background (backdrop) opacity\r\n *\r\n * @type {number}\r\n */\r\n this.bgOpacity = 1;\r\n\r\n /** @type {HTMLDivElement} */\r\n this.topBar = undefined;\r\n\r\n this.events = new DOMEvents();\r\n\r\n /** @type {Animations} */\r\n this.animations = new Animations();\r\n\r\n this.mainScroll = new MainScroll(this);\r\n this.gestures = new Gestures(this);\r\n this.opener = new Opener(this);\r\n this.keyboard = new Keyboard(this);\r\n this.contentLoader = new ContentLoader(this);\r\n }\r\n\r\n init() {\r\n if (this.isOpen || this.isDestroying) {\r\n return;\r\n }\r\n\r\n this.isOpen = true;\r\n this.dispatch('init'); // legacy\r\n this.dispatch('beforeOpen');\r\n\r\n this._createMainStructure();\r\n\r\n // add classes to the root element of PhotoSwipe\r\n let rootClasses = 'pswp--open';\r\n if (this.gestures.supportsTouch) {\r\n rootClasses += ' pswp--touch';\r\n }\r\n if (this.options.mainClass) {\r\n rootClasses += ' ' + this.options.mainClass;\r\n }\r\n this.element.className += ' ' + rootClasses;\r\n\r\n this.currIndex = this.options.index || 0;\r\n this.potentialIndex = this.currIndex;\r\n this.dispatch('firstUpdate'); // starting index can be modified here\r\n\r\n // initialize scroll wheel handler to block the scroll\r\n this.scrollWheel = new ScrollWheel(this);\r\n\r\n // sanitize index\r\n if (Number.isNaN(this.currIndex)\r\n || this.currIndex < 0\r\n || this.currIndex >= this.getNumItems()) {\r\n this.currIndex = 0;\r\n }\r\n\r\n if (!this.gestures.supportsTouch) {\r\n // enable mouse features if no touch support detected\r\n this.mouseDetected();\r\n }\r\n\r\n // causes forced synchronous layout\r\n this.updateSize();\r\n\r\n this.offset.y = window.pageYOffset;\r\n\r\n this._initialItemData = this.getItemData(this.currIndex);\r\n this.dispatch('gettingData', {\r\n index: this.currIndex,\r\n data: this._initialItemData,\r\n slide: undefined\r\n });\r\n\r\n // *Layout* - calculate size and position of elements here\r\n this._initialThumbBounds = this.getThumbBounds();\r\n this.dispatch('initialLayout');\r\n\r\n this.on('openingAnimationEnd', () => {\r\n // Add content to the previous and next slide\r\n this.setContent(this.mainScroll.itemHolders[0], this.currIndex - 1);\r\n this.setContent(this.mainScroll.itemHolders[2], this.currIndex + 1);\r\n\r\n this.mainScroll.itemHolders[0].el.style.display = 'block';\r\n this.mainScroll.itemHolders[2].el.style.display = 'block';\r\n\r\n this.appendHeavy();\r\n\r\n this.contentLoader.updateLazy();\r\n\r\n this.events.add(window, 'resize', this._handlePageResize.bind(this));\r\n this.events.add(window, 'scroll', this._updatePageScrollOffset.bind(this));\r\n this.dispatch('bindEvents');\r\n });\r\n\r\n // set content for center slide (first time)\r\n this.setContent(this.mainScroll.itemHolders[1], this.currIndex);\r\n this.dispatch('change');\r\n\r\n this.opener.open();\r\n\r\n this.dispatch('afterInit');\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Get looped slide index\r\n * (for example, -1 will return the last slide)\r\n *\r\n * @param {number} index\r\n */\r\n getLoopedIndex(index) {\r\n const numSlides = this.getNumItems();\r\n\r\n if (this.options.loop) {\r\n if (index > numSlides - 1) {\r\n index -= numSlides;\r\n }\r\n\r\n if (index < 0) {\r\n index += numSlides;\r\n }\r\n }\r\n\r\n index = clamp(index, 0, numSlides - 1);\r\n\r\n return index;\r\n }\r\n\r\n appendHeavy() {\r\n this.mainScroll.itemHolders.forEach((itemHolder) => {\r\n if (itemHolder.slide) {\r\n itemHolder.slide.appendHeavy();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Change the slide\r\n * @param {number} index New index\r\n */\r\n goTo(index) {\r\n this.mainScroll.moveIndexBy(\r\n this.getLoopedIndex(index) - this.potentialIndex\r\n );\r\n }\r\n\r\n /**\r\n * Go to the next slide.\r\n */\r\n next() {\r\n this.goTo(this.potentialIndex + 1);\r\n }\r\n\r\n /**\r\n * Go to the previous slide.\r\n */\r\n prev() {\r\n this.goTo(this.potentialIndex - 1);\r\n }\r\n\r\n /**\r\n * @see slide/slide.js zoomTo\r\n *\r\n * @param {Parameters} args\r\n */\r\n zoomTo(...args) {\r\n this.currSlide.zoomTo(...args);\r\n }\r\n\r\n /**\r\n * @see slide/slide.js toggleZoom\r\n */\r\n toggleZoom() {\r\n this.currSlide.toggleZoom();\r\n }\r\n\r\n /**\r\n * Close the gallery.\r\n * After closing transition ends - destroy it\r\n */\r\n close() {\r\n if (!this.opener.isOpen || this.isDestroying) {\r\n return;\r\n }\r\n\r\n this.isDestroying = true;\r\n\r\n this.dispatch('close');\r\n\r\n this.events.removeAll();\r\n this.opener.close();\r\n }\r\n\r\n /**\r\n * Destroys the gallery:\r\n * - instantly closes the gallery\r\n * - unbinds events,\r\n * - cleans intervals and timeouts\r\n * - removes elements from DOM\r\n */\r\n destroy() {\r\n if (!this.isDestroying) {\r\n this.options.showHideAnimationType = 'none';\r\n this.close();\r\n return;\r\n }\r\n\r\n this.dispatch('destroy');\r\n\r\n this.listeners = null;\r\n\r\n this.scrollWrap.ontouchmove = null;\r\n this.scrollWrap.ontouchend = null;\r\n\r\n this.element.remove();\r\n\r\n this.mainScroll.itemHolders.forEach((itemHolder) => {\r\n if (itemHolder.slide) {\r\n itemHolder.slide.destroy();\r\n }\r\n });\r\n\r\n this.contentLoader.destroy();\r\n this.events.removeAll();\r\n }\r\n\r\n /**\r\n * Refresh/reload content of a slide by its index\r\n *\r\n * @param {number} slideIndex\r\n */\r\n refreshSlideContent(slideIndex) {\r\n this.contentLoader.removeByIndex(slideIndex);\r\n this.mainScroll.itemHolders.forEach((itemHolder, i) => {\r\n let potentialHolderIndex = this.currSlide.index - 1 + i;\r\n if (this.canLoop()) {\r\n potentialHolderIndex = this.getLoopedIndex(potentialHolderIndex);\r\n }\r\n if (potentialHolderIndex === slideIndex) {\r\n // set the new slide content\r\n this.setContent(itemHolder, slideIndex, true);\r\n\r\n // activate the new slide if it's current\r\n if (i === 1) {\r\n /** @type {Slide} */\r\n this.currSlide = itemHolder.slide;\r\n itemHolder.slide.setIsActive(true);\r\n }\r\n }\r\n });\r\n\r\n this.dispatch('change');\r\n }\r\n\r\n\r\n /**\r\n * Set slide content\r\n *\r\n * @param {ItemHolder} holder mainScroll.itemHolders array item\r\n * @param {number} index Slide index\r\n * @param {boolean=} force If content should be set even if index wasn't changed\r\n */\r\n setContent(holder, index, force) {\r\n if (this.canLoop()) {\r\n index = this.getLoopedIndex(index);\r\n }\r\n\r\n if (holder.slide) {\r\n if (holder.slide.index === index && !force) {\r\n // exit if holder already contains this slide\r\n // this could be common when just three slides are used\r\n return;\r\n }\r\n\r\n // destroy previous slide\r\n holder.slide.destroy();\r\n holder.slide = null;\r\n }\r\n\r\n // exit if no loop and index is out of bounds\r\n if (!this.canLoop() && (index < 0 || index >= this.getNumItems())) {\r\n return;\r\n }\r\n\r\n const itemData = this.getItemData(index);\r\n holder.slide = new Slide(itemData, index, this);\r\n\r\n // set current slide\r\n if (index === this.currIndex) {\r\n this.currSlide = holder.slide;\r\n }\r\n\r\n holder.slide.append(holder.el);\r\n }\r\n\r\n getViewportCenterPoint() {\r\n return {\r\n x: this.viewportSize.x / 2,\r\n y: this.viewportSize.y / 2\r\n };\r\n }\r\n\r\n /**\r\n * Update size of all elements.\r\n * Executed on init and on page resize.\r\n *\r\n * @param {boolean=} force Update size even if size of viewport was not changed.\r\n */\r\n updateSize(force) {\r\n // let item;\r\n // let itemIndex;\r\n\r\n if (this.isDestroying) {\r\n // exit if PhotoSwipe is closed or closing\r\n // (to avoid errors, as resize event might be delayed)\r\n return;\r\n }\r\n\r\n //const newWidth = this.scrollWrap.clientWidth;\r\n //const newHeight = this.scrollWrap.clientHeight;\r\n\r\n const newViewportSize = getViewportSize(this.options, this);\r\n\r\n if (!force && pointsEqual(newViewportSize, this._prevViewportSize)) {\r\n // Exit if dimensions were not changed\r\n return;\r\n }\r\n\r\n //this._prevViewportSize.x = newWidth;\r\n //this._prevViewportSize.y = newHeight;\r\n equalizePoints(this._prevViewportSize, newViewportSize);\r\n\r\n this.dispatch('beforeResize');\r\n\r\n equalizePoints(this.viewportSize, this._prevViewportSize);\r\n\r\n this._updatePageScrollOffset();\r\n\r\n this.dispatch('viewportSize');\r\n\r\n // Resize slides only after opener animation is finished\r\n // and don't re-calculate size on inital size update\r\n this.mainScroll.resize(this.opener.isOpen);\r\n\r\n if (!this.hasMouse && window.matchMedia('(any-hover: hover)').matches) {\r\n this.mouseDetected();\r\n }\r\n\r\n this.dispatch('resize');\r\n }\r\n\r\n /**\r\n * @param {number} opacity\r\n */\r\n applyBgOpacity(opacity) {\r\n this.bgOpacity = Math.max(opacity, 0);\r\n this.bg.style.opacity = String(this.bgOpacity * this.options.bgOpacity);\r\n }\r\n\r\n /**\r\n * Whether mouse is detected\r\n */\r\n mouseDetected() {\r\n if (!this.hasMouse) {\r\n this.hasMouse = true;\r\n this.element.classList.add('pswp--has_mouse');\r\n }\r\n }\r\n\r\n /**\r\n * Page resize event handler\r\n *\r\n * @private\r\n */\r\n _handlePageResize() {\r\n this.updateSize();\r\n\r\n // In iOS webview, if element size depends on document size,\r\n // it'll be measured incorrectly in resize event\r\n //\r\n // https://bugs.webkit.org/show_bug.cgi?id=170595\r\n // https://hackernoon.com/onresize-event-broken-in-mobile-safari-d8469027bf4d\r\n if (/iPhone|iPad|iPod/i.test(window.navigator.userAgent)) {\r\n setTimeout(() => {\r\n this.updateSize();\r\n }, 500);\r\n }\r\n }\r\n\r\n /**\r\n * Page scroll offset is used\r\n * to get correct coordinates\r\n * relative to PhotoSwipe viewport.\r\n *\r\n * @private\r\n */\r\n _updatePageScrollOffset() {\r\n this.setScrollOffset(0, window.pageYOffset);\r\n }\r\n\r\n /**\r\n * @param {number} x\r\n * @param {number} y\r\n */\r\n setScrollOffset(x, y) {\r\n this.offset.x = x;\r\n this.offset.y = y;\r\n this.dispatch('updateScrollOffset');\r\n }\r\n\r\n /**\r\n * Create main HTML structure of PhotoSwipe,\r\n * and add it to DOM\r\n *\r\n * @private\r\n */\r\n _createMainStructure() {\r\n // root DOM element of PhotoSwipe (.pswp)\r\n this.element = createElement('pswp');\r\n this.element.setAttribute('tabindex', '-1');\r\n this.element.setAttribute('role', 'dialog');\r\n\r\n // template is legacy prop\r\n this.template = this.element;\r\n\r\n // Background is added as a separate element,\r\n // as animating opacity is faster than animating rgba()\r\n this.bg = createElement('pswp__bg', false, this.element);\r\n this.scrollWrap = createElement('pswp__scroll-wrap', false, this.element);\r\n this.container = createElement('pswp__container', false, this.scrollWrap);\r\n\r\n this.mainScroll.appendHolders();\r\n\r\n this.ui = new UI(this);\r\n this.ui.init();\r\n\r\n // append to DOM\r\n (this.options.appendToEl || document.body).appendChild(this.element);\r\n }\r\n\r\n\r\n /**\r\n * Get position and dimensions of small thumbnail\r\n * {x:,y:,w:}\r\n *\r\n * Height is optional (calculated based on the large image)\r\n */\r\n getThumbBounds() {\r\n return getThumbBounds(\r\n this.currIndex,\r\n this.currSlide ? this.currSlide.data : this._initialItemData,\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * If the PhotoSwipe can have continious loop\r\n * @returns Boolean\r\n */\r\n canLoop() {\r\n return (this.options.loop && this.getNumItems() > 2);\r\n }\r\n\r\n /**\r\n * @param {PhotoSwipeOptions} options\r\n * @private\r\n */\r\n _prepareOptions(options) {\r\n if (window.matchMedia('(prefers-reduced-motion), (update: slow)').matches) {\r\n options.showHideAnimationType = 'none';\r\n options.zoomAnimationDuration = 0;\r\n }\r\n\r\n /** @type {PhotoSwipeOptions}*/\r\n this.options = {\r\n ...defaultOptions,\r\n ...options\r\n };\r\n }\r\n}\r\n\r\nexport default PhotoSwipe;\r\n", "// Only prepares data on the element for use by a surrounding [lightbox-gallery]\nup.compiler('[lightbox-image]', { priority: 1 }, (element, { width, height, thumbUrl, copyrightText, descriptionText, titleText }) => {\n\n element.getItemData = () => {\n const { src, currentSrc } = element\n const thumbUrl = (currentSrc.indexOf('data:image/svg+xml') === 0) ? src : currentSrc\n\n return {\n element,\n copyrightText,\n descriptionText,\n titleText,\n w: width,\n h: height,\n src,\n msrc: thumbUrl, // shown while when lightbox was just opened, before loading higher-resolution file from srcset\n srcset: element.getAttribute('data-srcset'),\n }\n }\n\n})\n", "up.compiler('[search-form]', (element) => {\n\n function onSubmit(event) {\n // query element at runtime because [search-form] is placed in the global layout\n // and the query field itself might have been replaced, e.g. through [up-hungry]\n const queryField = element.querySelector('[name*=\"query\"]')\n\n if (queryField.value === '') {\n queryField.focus()\n up.event.halt(event)\n }\n }\n\n element.addEventListener('submit', onSubmit)\n\n})\n", "up.compiler('[track-page-view]', () => {\n const url = location.href\n const safeUrl = url.replace(/(\\w+?_token)=\\w+/, '$1=_HIDDEN_')\n\n window._paq.push(['setCustomUrl', safeUrl])\n window._paq.push(['trackPageView'])\n})\n", "/******/ (() => { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ([\n/* 0 */,\n/* 1 */\n/***/ (() => {\n\nwindow.up = {\n version: '2.7.2'\n};\n\n\n/***/ }),\n/* 2 */\n/***/ (() => {\n\nup.mockable = function (originalFn) {\n let spy;\n const mockableFn = function () {\n return (spy || originalFn).apply(null, arguments);\n };\n mockableFn.mock = () => spy = jasmine.createSpy('mockable', originalFn);\n document.addEventListener('up:framework:reset', () => spy = null);\n return mockableFn;\n};\n\n\n/***/ }),\n/* 3 */\n/***/ (() => {\n\nup.util = (function () {\n function noop() {\n }\n function asyncNoop() {\n return Promise.resolve();\n }\n function memoize(func) {\n let cachedValue, cached;\n return function (...args) {\n if (cached) {\n return cachedValue;\n }\n else {\n cached = true;\n return cachedValue = func.apply(this, args);\n }\n };\n }\n function isStandardPort(protocol, port) {\n port = port.toString();\n return (((port === \"\") || (port === \"80\")) && (protocol === 'http:')) || ((port === \"443\") && (protocol === 'https:'));\n }\n const NORMALIZE_URL_DEFAULTS = {\n host: 'cross-domain',\n };\n function normalizeURL(urlOrAnchor, options) {\n options = newOptions(options, NORMALIZE_URL_DEFAULTS);\n const parts = parseURL(urlOrAnchor);\n let normalized = '';\n if (options.host === 'cross-domain') {\n options.host = isCrossOrigin(parts);\n }\n if (options.host) {\n normalized += parts.protocol + \"//\" + parts.hostname;\n if (!isStandardPort(parts.protocol, parts.port)) {\n normalized += `:${parts.port}`;\n }\n }\n let { pathname } = parts;\n if (options.trailingSlash === false && pathname !== '/') {\n pathname = pathname.replace(/\\/$/, '');\n }\n normalized += pathname;\n if (options.search !== false) {\n normalized += parts.search;\n }\n if (options.hash !== false) {\n normalized += parts.hash;\n }\n return normalized;\n }\n function matchURLs(leftURL, rightURL) {\n return normalizeURL(leftURL) === normalizeURL(rightURL);\n }\n const APP_PROTOCOL = location.protocol;\n const APP_HOSTNAME = location.hostname;\n function isCrossOrigin(urlOrAnchor) {\n if (isString(urlOrAnchor) && (urlOrAnchor.indexOf('//') === -1)) {\n return false;\n }\n const parts = parseURL(urlOrAnchor);\n return (APP_HOSTNAME !== parts.hostname) || (APP_PROTOCOL !== parts.protocol);\n }\n function parseURL(urlOrLink) {\n let link;\n if (isJQuery(urlOrLink)) {\n link = up.element.get(urlOrLink);\n }\n else if (urlOrLink.pathname) {\n link = urlOrLink;\n }\n else {\n link = document.createElement('a');\n link.href = urlOrLink;\n }\n if (!link.hostname) {\n link.href = link.href;\n }\n if (link.pathname[0] !== '/') {\n link = pick(link, ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash']);\n link.pathname = '/' + link.pathname;\n }\n return link;\n }\n function normalizeMethod(method) {\n return method ? method.toUpperCase() : 'GET';\n }\n function methodAllowsPayload(method) {\n return (method !== 'GET') && (method !== 'HEAD');\n }\n function assignPolyfill(target, ...sources) {\n for (let source of sources) {\n for (let key in source) {\n target[key] = source[key];\n }\n }\n return target;\n }\n const assign = Object.assign || assignPolyfill;\n function valuesPolyfill(object) {\n return Object.keys(object).map((key) => object[key]);\n }\n const objectValues = Object.values || valuesPolyfill;\n function iteratee(block) {\n if (isString(block)) {\n return item => item[block];\n }\n else {\n return block;\n }\n }\n function map(array, block) {\n if (array.length === 0) {\n return [];\n }\n block = iteratee(block);\n let mapped = [];\n for (let i = 0; i < array.length; i++) {\n let element = array[i];\n mapped.push(block(element, i));\n }\n return mapped;\n }\n function mapObject(array, pairer) {\n const merger = function (object, pair) {\n object[pair[0]] = pair[1];\n return object;\n };\n return map(array, pairer).reduce(merger, {});\n }\n function each(array, block) {\n for (let i = 0; i < array.length; i++) {\n block(array[i], i);\n }\n }\n function eachIterator(iterator, callback) {\n let entry;\n while ((entry = iterator.next()) && !entry.done) {\n callback(entry.value);\n }\n }\n function isNull(object) {\n return object === null;\n }\n function isUndefined(object) {\n return object === undefined;\n }\n const isDefined = negate(isUndefined);\n function isMissing(object) {\n return isUndefined(object) || isNull(object);\n }\n const isGiven = negate(isMissing);\n function isBlank(value) {\n if (isMissing(value)) {\n return true;\n }\n if (isObject(value) && value[isBlank.key]) {\n return value[isBlank.key]();\n }\n if (isString(value) || isList(value)) {\n return value.length === 0;\n }\n if (isOptions(value)) {\n return Object.keys(value).length === 0;\n }\n return false;\n }\n isBlank.key = 'up.util.isBlank';\n function presence(value, tester = isPresent) {\n if (tester(value)) {\n return value;\n }\n }\n const isPresent = negate(isBlank);\n function isFunction(object) {\n return typeof (object) === 'function';\n }\n function isString(object) {\n return (typeof (object) === 'string') || object instanceof String;\n }\n function isBoolean(object) {\n return (typeof (object) === 'boolean') || object instanceof Boolean;\n }\n function isNumber(object) {\n return (typeof (object) === 'number') || object instanceof Number;\n }\n function isOptions(object) {\n return (typeof (object) === 'object') && !isNull(object) && (isUndefined(object.constructor) || (object.constructor === Object));\n }\n function isObject(object) {\n const typeOfResult = typeof (object);\n return ((typeOfResult === 'object') && !isNull(object)) || (typeOfResult === 'function');\n }\n function isElement(object) {\n return object instanceof Element;\n }\n function isRegExp(object) {\n return object instanceof RegExp;\n }\n function isJQuery(object) {\n return up.browser.canJQuery() && object instanceof jQuery;\n }\n function isElementish(object) {\n return !!(object && (object.addEventListener || object[0]?.addEventListener));\n }\n function isPromise(object) {\n return isObject(object) && isFunction(object.then);\n }\n const { isArray } = Array;\n function isFormData(object) {\n return object instanceof FormData;\n }\n function toArray(value) {\n return isArray(value) ? value : copyArrayLike(value);\n }\n function isList(value) {\n return isArray(value) ||\n isNodeList(value) ||\n isArguments(value) ||\n isJQuery(value) ||\n isHTMLCollection(value);\n }\n function isNodeList(value) {\n return value instanceof NodeList;\n }\n function isHTMLCollection(value) {\n return value instanceof HTMLCollection;\n }\n function isArguments(value) {\n return Object.prototype.toString.call(value) === '[object Arguments]';\n }\n function nullToUndefined(value) {\n if (!isNull(value)) {\n return value;\n }\n }\n function wrapList(value) {\n if (isList(value)) {\n return value;\n }\n else if (isMissing(value)) {\n return [];\n }\n else {\n return [value];\n }\n }\n function copy(value) {\n if (isObject(value) && value[copy.key]) {\n value = value[copy.key]();\n }\n else if (isList(value)) {\n value = copyArrayLike(value);\n }\n else if (isOptions(value)) {\n value = assign({}, value);\n }\n return value;\n }\n function copyArrayLike(arrayLike) {\n return Array.prototype.slice.call(arrayLike);\n }\n copy.key = 'up.util.copy';\n Date.prototype[copy.key] = function () { return new Date(+this); };\n function merge(...sources) {\n return assign({}, ...sources);\n }\n function mergeDefined(...sources) {\n const result = {};\n for (let source of sources) {\n if (source) {\n for (let key in source) {\n const value = source[key];\n if (isDefined(value)) {\n result[key] = value;\n }\n }\n }\n }\n return result;\n }\n function newOptions(object, defaults) {\n if (defaults) {\n return merge(defaults, object);\n }\n else if (object) {\n return copy(object);\n }\n else {\n return {};\n }\n }\n function parseArgIntoOptions(args, argKey) {\n let options = extractOptions(args);\n if (isDefined(args[0])) {\n options = copy(options);\n options[argKey] = args[0];\n }\n return options;\n }\n function findInList(list, tester) {\n tester = iteratee(tester);\n let match;\n for (let element of list) {\n if (tester(element)) {\n match = element;\n break;\n }\n }\n return match;\n }\n function some(list, tester) {\n return !!findResult(list, tester);\n }\n function findResult(array, tester) {\n tester = iteratee(tester);\n for (let i = 0; i < array.length; i++) {\n const result = tester(array[i], i);\n if (result) {\n return result;\n }\n }\n }\n function every(list, tester) {\n tester = iteratee(tester);\n let match = true;\n for (let i = 0; i < list.length; i++) {\n if (!tester(list[i], i)) {\n match = false;\n break;\n }\n }\n return match;\n }\n function compact(array) {\n return filterList(array, isGiven);\n }\n function compactObject(object) {\n return pickBy(object, isGiven);\n }\n function uniq(array) {\n if (array.length < 2) {\n return array;\n }\n return setToArray(arrayToSet(array));\n }\n function uniqBy(array, mapper) {\n if (array.length < 2) {\n return array;\n }\n mapper = iteratee(mapper);\n const seenElements = new Set();\n return filterList(array, function (elem, index) {\n const mapped = mapper(elem, index);\n if (seenElements.has(mapped)) {\n return false;\n }\n else {\n seenElements.add(mapped);\n return true;\n }\n });\n }\n function setToArray(set) {\n const array = [];\n set.forEach(elem => array.push(elem));\n return array;\n }\n function arrayToSet(array) {\n const set = new Set();\n array.forEach(elem => set.add(elem));\n return set;\n }\n function filterList(list, tester) {\n tester = iteratee(tester);\n const matches = [];\n each(list, function (element, index) {\n if (tester(element, index)) {\n return matches.push(element);\n }\n });\n return matches;\n }\n function reject(list, tester) {\n tester = negate(iteratee(tester));\n return filterList(list, tester);\n }\n function intersect(array1, array2) {\n return filterList(array1, element => contains(array2, element));\n }\n function scheduleTimer(millis, callback) {\n return setTimeout(callback, millis);\n }\n function queueTask(task) {\n return setTimeout(task);\n }\n function queueMicrotask(task) {\n return Promise.resolve().then(task);\n }\n function abortableMicrotask(task) {\n let aborted = false;\n queueMicrotask(function () { if (!aborted) {\n return task();\n } });\n return () => aborted = true;\n }\n function last(array) {\n return array[array.length - 1];\n }\n function contains(value, subValue) {\n return value.indexOf(subValue) >= 0;\n }\n function objectContains(object, subObject) {\n const reducedValue = pick(object, Object.keys(subObject));\n return isEqual(subObject, reducedValue);\n }\n function pick(object, keys) {\n const filtered = {};\n for (let key of keys) {\n if (key in object) {\n filtered[key] = object[key];\n }\n }\n return filtered;\n }\n function pickBy(object, tester) {\n tester = iteratee(tester);\n const filtered = {};\n for (let key in object) {\n const value = object[key];\n if (tester(value, key, object)) {\n filtered[key] = object[key];\n }\n }\n return filtered;\n }\n function omit(object, keys) {\n return pickBy(object, (_value, key) => !contains(keys, key));\n }\n function unresolvablePromise() {\n return new Promise(noop);\n }\n function remove(array, element) {\n const index = array.indexOf(element);\n if (index >= 0) {\n array.splice(index, 1);\n return element;\n }\n }\n function evalOption(value, ...args) {\n return isFunction(value) ? value(...args) : value;\n }\n const ESCAPE_HTML_ENTITY_MAP = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': '"',\n \"'\": '''\n };\n function escapeHTML(string) {\n return string.replace(/[&<>\"']/g, char => ESCAPE_HTML_ENTITY_MAP[char]);\n }\n function escapeRegExp(string) {\n return string.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n }\n function pluckKey(object, key) {\n const value = object[key];\n delete object[key];\n return value;\n }\n function renameKey(object, oldKey, newKey) {\n return object[newKey] = pluckKey(object, oldKey);\n }\n function extractLastArg(args, tester) {\n if (tester(last(args))) {\n return args.pop();\n }\n }\n function extractCallback(args) {\n return extractLastArg(args, isFunction);\n }\n function extractOptions(args) {\n return extractLastArg(args, isOptions) || {};\n }\n function identity(arg) {\n return arg;\n }\n function sequence(functions) {\n if (functions.length === 1) {\n return functions[0];\n }\n return () => map(functions, fn => fn());\n }\n function flatten(array) {\n const flattened = [];\n for (let object of array) {\n if (isList(object)) {\n flattened.push(...object);\n }\n else {\n flattened.push(object);\n }\n }\n return flattened;\n }\n function flatMap(array, block) {\n return flatten(map(array, block));\n }\n function isTruthy(object) {\n return !!object;\n }\n function always(promise, callback) {\n return promise.then(callback, callback);\n }\n function muteRejection(promise) {\n return promise?.catch(noop);\n }\n function newDeferred() {\n let resolveFn;\n let rejectFn;\n const nativePromise = new Promise(function (givenResolve, givenReject) {\n resolveFn = givenResolve;\n rejectFn = givenReject;\n });\n nativePromise.resolve = resolveFn;\n nativePromise.reject = rejectFn;\n nativePromise.promise = () => nativePromise;\n return nativePromise;\n }\n function asyncify(block) {\n try {\n return Promise.resolve(block());\n }\n catch (error) {\n return Promise.reject(error);\n }\n }\n function isBasicObjectProperty(k) {\n return Object.prototype.hasOwnProperty(k);\n }\n function isEqual(a, b) {\n if (a?.valueOf) {\n a = a.valueOf();\n }\n if (b?.valueOf) {\n b = b.valueOf();\n }\n if (typeof (a) !== typeof (b)) {\n return false;\n }\n else if (isList(a) && isList(b)) {\n return isEqualList(a, b);\n }\n else if (isObject(a) && a[isEqual.key]) {\n return a[isEqual.key](b);\n }\n else if (isOptions(a) && isOptions(b)) {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (isEqualList(aKeys, bKeys)) {\n return every(aKeys, aKey => isEqual(a[aKey], b[aKey]));\n }\n else {\n return false;\n }\n }\n else {\n return a === b;\n }\n }\n isEqual.key = 'up.util.isEqual';\n function isEqualList(a, b) {\n return (a.length === b.length) && every(a, (elem, index) => isEqual(elem, b[index]));\n }\n function splitValues(value, separator = ' ') {\n if (isString(value)) {\n value = value.split(separator);\n value = map(value, v => v.trim());\n value = filterList(value, isPresent);\n return value;\n }\n else {\n return wrapList(value);\n }\n }\n function endsWith(string, search) {\n return string.substring(string.length - search.length) === search;\n }\n function simpleEase(x) {\n return x < 0.5 ? 2 * x * x : (x * (4 - (x * 2))) - 1;\n }\n function wrapValue(constructor, ...args) {\n return (args[0] instanceof constructor) ? args[0] : new constructor(...args);\n }\n let nextUid = 0;\n function uid() {\n return nextUid++;\n }\n function reverse(list) {\n return copy(list).reverse();\n }\n function renameKeys(object, renameKeyFn) {\n const renamed = {};\n for (let key in object) {\n renamed[renameKeyFn(key)] = object[key];\n }\n return renamed;\n }\n function camelToKebabCase(str) {\n return str.replace(/[A-Z]/g, char => '-' + char.toLowerCase());\n }\n function prefixCamelCase(str, prefix) {\n return prefix + upperCaseFirst(str);\n }\n function unprefixCamelCase(str, prefix) {\n const pattern = new RegExp('^' + prefix + '(.+)$');\n let match = str.match(pattern);\n if (match) {\n return lowerCaseFirst(match[1]);\n }\n }\n function lowerCaseFirst(str) {\n return str[0].toLowerCase() + str.slice(1);\n }\n function upperCaseFirst(str) {\n return str[0].toUpperCase() + str.slice(1);\n }\n function defineGetter(object, prop, get) {\n Object.defineProperty(object, prop, { get });\n }\n function defineDelegates(object, props, targetProvider) {\n wrapList(props).forEach(function (prop) {\n Object.defineProperty(object, prop, {\n get() {\n const target = targetProvider.call(this);\n let value = target[prop];\n if (isFunction(value)) {\n value = value.bind(target);\n }\n return value;\n },\n set(newValue) {\n const target = targetProvider.call(this);\n target[prop] = newValue;\n }\n });\n });\n }\n function stringifyArg(arg) {\n let string;\n const maxLength = 200;\n let closer = '';\n if (isString(arg)) {\n string = arg.replace(/[\\n\\r\\t ]+/g, ' ');\n string = string.replace(/^[\\n\\r\\t ]+/, '');\n string = string.replace(/[\\n\\r\\t ]$/, '');\n }\n else if (isUndefined(arg)) {\n string = 'undefined';\n }\n else if (isNumber(arg) || isFunction(arg)) {\n string = arg.toString();\n }\n else if (isArray(arg)) {\n string = `[${map(arg, stringifyArg).join(', ')}]`;\n closer = ']';\n }\n else if (isJQuery(arg)) {\n string = `$(${map(arg, stringifyArg).join(', ')})`;\n closer = ')';\n }\n else if (isElement(arg)) {\n string = `<${arg.tagName.toLowerCase()}`;\n for (let attr of ['id', 'name', 'class']) {\n let value = arg.getAttribute(attr);\n if (value) {\n string += ` ${attr}=\"${value}\"`;\n }\n }\n string += \">\";\n closer = '>';\n }\n else if (isRegExp(arg)) {\n string = arg.toString();\n }\n else {\n try {\n string = JSON.stringify(arg);\n }\n catch (error) {\n if (error.name === 'TypeError') {\n string = '(circular structure)';\n }\n else {\n throw error;\n }\n }\n }\n if (string.length > maxLength) {\n string = `${string.substr(0, maxLength)} \u2026`;\n string += closer;\n }\n return string;\n }\n const SPRINTF_PLACEHOLDERS = /%[oOdisf]/g;\n function secondsSinceEpoch() {\n return Math.floor(Date.now() * 0.001);\n }\n function sprintf(message, ...args) {\n return sprintfWithFormattedArgs(identity, message, ...args);\n }\n function sprintfWithFormattedArgs(formatter, message, ...args) {\n if (!message) {\n return '';\n }\n let i = 0;\n return message.replace(SPRINTF_PLACEHOLDERS, function () {\n let arg = args[i];\n arg = formatter(stringifyArg(arg));\n i += 1;\n return arg;\n });\n }\n function allSettled(promises) {\n return Promise.all(map(promises, muteRejection));\n }\n function negate(fn) {\n return function (...args) {\n return !fn(...args);\n };\n }\n return {\n parseURL,\n normalizeURL,\n matchURLs,\n normalizeMethod,\n methodAllowsPayload,\n assign,\n assignPolyfill,\n copy,\n copyArrayLike,\n merge,\n mergeDefined,\n options: newOptions,\n parseArgIntoOptions,\n each,\n eachIterator,\n map,\n flatMap,\n mapObject,\n findResult,\n some,\n every,\n find: findInList,\n filter: filterList,\n reject,\n intersect,\n compact,\n compactObject,\n uniq,\n uniqBy,\n last,\n isNull,\n isDefined,\n isUndefined,\n isGiven,\n isMissing,\n isPresent,\n isBlank,\n presence,\n isObject,\n isFunction,\n isString,\n isBoolean,\n isNumber,\n isElement,\n isJQuery,\n isElementish,\n isPromise,\n isOptions,\n isArray,\n isFormData,\n isNodeList,\n isArguments,\n isList,\n isRegExp,\n timer: scheduleTimer,\n contains,\n objectContains,\n toArray,\n pick,\n pickBy,\n omit,\n unresolvablePromise,\n remove,\n memoize,\n pluckKey,\n renameKey,\n extractOptions,\n extractCallback,\n noop,\n asyncNoop,\n identity,\n escapeHTML,\n escapeRegExp,\n sequence,\n evalOption,\n flatten,\n isTruthy,\n newDeferred,\n always,\n muteRejection,\n asyncify,\n isBasicObjectProperty,\n isCrossOrigin,\n task: queueTask,\n microtask: queueMicrotask,\n abortableMicrotask,\n isEqual,\n splitValues,\n endsWith,\n wrapList,\n wrapValue,\n simpleEase,\n values: objectValues,\n arrayToSet,\n setToArray,\n uid,\n upperCaseFirst,\n lowerCaseFirst,\n getter: defineGetter,\n delegate: defineDelegates,\n reverse,\n prefixCamelCase,\n unprefixCamelCase,\n camelToKebabCase,\n nullToUndefined,\n sprintf,\n sprintfWithFormattedArgs,\n renameKeys,\n timestamp: secondsSinceEpoch,\n allSettled,\n negate,\n };\n})();\n\n\n/***/ }),\n/* 4 */\n/***/ (() => {\n\nup.error = (function () {\n const u = up.util;\n function build(message, props = {}) {\n if (u.isArray(message)) {\n message = u.sprintf(...message);\n }\n const error = new Error(message);\n u.assign(error, props);\n return error;\n }\n function errorInterface(name, init = build) {\n const fn = function (...args) {\n const error = init(...args);\n error.name = name;\n return error;\n };\n fn.is = error => error.name === name;\n fn.async = (...args) => Promise.reject(fn(...args));\n return fn;\n }\n const failed = errorInterface('up.Failed');\n const aborted = errorInterface('AbortError', (message) => {\n return build(message || 'Aborted');\n });\n const notImplemented = errorInterface('up.NotImplemented');\n const notApplicable = errorInterface('up.NotApplicable', (change, reason) => {\n return build(`Cannot apply change: ${change} (${reason})`);\n });\n const invalidSelector = errorInterface('up.InvalidSelector', (selector) => {\n return build(`Cannot parse selector: ${selector}`);\n });\n function emitGlobal(error) {\n const { message } = error;\n up.emit(window, 'error', { message, error, log: false });\n }\n function fail(...args) {\n throw up.error.failed(args);\n }\n return {\n fail,\n failed,\n aborted,\n invalidSelector,\n notApplicable,\n notImplemented,\n emitGlobal\n };\n})();\nup.fail = up.error.fail;\n\n\n/***/ }),\n/* 5 */\n/***/ (() => {\n\nup.migrate = { config: {} };\n\n\n/***/ }),\n/* 6 */\n/***/ (() => {\n\nup.browser = (function () {\n const u = up.util;\n function submitForm(form) {\n form.submit();\n }\n function isIE11() {\n return 'ActiveXObject' in window;\n }\n function isEdge18() {\n return u.contains(navigator.userAgent, ' Edge/');\n }\n function canPushState() {\n return history.pushState && up.protocol.initialRequestMethod() === 'GET';\n }\n function canPromise() {\n return !!window.Promise;\n }\n const canFormatLog = u.negate(isIE11);\n const canPassiveEventListener = u.negate(isIE11);\n function canJQuery() {\n return !!window.jQuery;\n }\n const canEval = u.memoize(function () {\n try {\n return new Function('return true')();\n }\n catch {\n return false;\n }\n });\n function popCookie(name) {\n let value = document.cookie.match(new RegExp(name + \"=(\\\\w+)\"))?.[1];\n if (value) {\n document.cookie = name + '=;Max-Age=0;Path=/';\n return value;\n }\n }\n const getJQuery = function () {\n if (!canJQuery()) {\n up.fail('jQuery must be published as window.jQuery');\n }\n return jQuery;\n };\n function assertConfirmed(options) {\n const confirmed = !options.confirm || window.confirm(options.confirm);\n if (!confirmed) {\n throw up.error.aborted('User canceled action');\n }\n return true;\n }\n return {\n submitForm,\n canPushState,\n canFormatLog,\n canPassiveEventListener,\n canJQuery,\n canPromise,\n canEval,\n assertConfirmed,\n popCookie,\n get jQuery() { return getJQuery(); },\n isIE11,\n isEdge18,\n };\n})();\n\n\n/***/ }),\n/* 7 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n__webpack_require__(8);\nup.element = (function () {\n const u = up.util;\n const MATCH_FN_NAME = up.browser.isIE11() ? 'msMatchesSelector' : 'matches';\n function first(...args) {\n const selector = args.pop();\n const root = args[0] || document;\n return root.querySelector(selector);\n }\n function all(...args) {\n const selector = args.pop();\n const root = args[0] || document;\n return root.querySelectorAll(selector);\n }\n function subtree(root, selector) {\n const results = [];\n if (matches(root, selector)) {\n results.push(root);\n }\n results.push(...all(root, selector));\n return results;\n }\n function isInSubtree(root, selectorOrElement) {\n const element = getOne(selectorOrElement);\n return root.contains(element);\n }\n function closest(element, selector) {\n if (element.closest) {\n return element.closest(selector);\n }\n else if (matches(element, selector)) {\n return element;\n }\n else {\n return ancestor(element, selector);\n }\n }\n function matches(element, selector) {\n return element[MATCH_FN_NAME]?.(selector);\n }\n function ancestor(element, selector) {\n let parentElement = element.parentElement;\n if (parentElement) {\n if (matches(parentElement, selector)) {\n return parentElement;\n }\n else {\n return ancestor(parentElement, selector);\n }\n }\n }\n function around(element, selector) {\n return getList(closest(element, selector), subtree(element, selector));\n }\n function getOne(...args) {\n const value = args.pop();\n if (u.isElement(value)) {\n return value;\n }\n else if (u.isString(value)) {\n return first(...args, value);\n }\n else if (u.isList(value)) {\n if (value.length > 1) {\n up.fail('up.element.get(): Cannot cast multiple elements (%o) to a single element', value);\n }\n return value[0];\n }\n else {\n return value;\n }\n }\n function getList(...args) {\n return u.flatMap(args, valueToList);\n }\n function valueToList(value) {\n if (u.isString(value)) {\n return all(value);\n }\n else {\n return u.wrapList(value);\n }\n }\n function remove(element) {\n let parent = element.parentNode;\n if (parent) {\n parent.removeChild(element);\n }\n }\n function hide(element) {\n element.setAttribute('hidden', '');\n }\n function show(element) {\n element.removeAttribute('hidden');\n if (element.style.display === 'none') {\n element.style.display = '';\n }\n }\n function toggle(element, newVisible) {\n if (newVisible == null) {\n newVisible = !isVisible(element);\n }\n (newVisible ? show : hide)(element);\n }\n function toggleClass(element, klass, newPresent) {\n const list = element.classList;\n if (newPresent == null) {\n newPresent = !list.contains(klass);\n }\n if (newPresent) {\n return list.add(klass);\n }\n else {\n return list.remove(klass);\n }\n }\n function toggleAttr(element, attr, value, newPresent) {\n if (newPresent == null) {\n newPresent = !element.hasAttribute(attr);\n }\n if (newPresent) {\n return element.setAttribute(attr, value);\n }\n else {\n return element.removeAttribute(attr);\n }\n }\n function setAttrs(element, attrs) {\n for (let key in attrs) {\n const value = attrs[key];\n if (u.isGiven(value)) {\n element.setAttribute(key, value);\n }\n else {\n element.removeAttribute(key);\n }\n }\n }\n function setTemporaryAttrs(element, attrs) {\n const oldAttrs = {};\n for (let key of Object.keys(attrs)) {\n oldAttrs[key] = element.getAttribute(key);\n }\n setAttrs(element, attrs);\n return () => setAttrs(element, oldAttrs);\n }\n function metaContent(name) {\n const selector = \"meta\" + attributeSelector('name', name);\n return first(selector)?.getAttribute('content');\n }\n function insertBefore(existingElement, newElement) {\n existingElement.insertAdjacentElement('beforebegin', newElement);\n }\n function replace(oldElement, newElement) {\n oldElement.parentElement.replaceChild(newElement, oldElement);\n }\n function createFromSelector(selector, attrs) {\n const attrValues = [];\n const selectorWithoutAttrValues = selector.replace(/\\[([\\w-]+)(?:[~|^$*]?=([\"'])?([^\\2\\]]*?)\\2)?\\]/g, function (_match, attrName, _quote, attrValue) {\n attrValues.push(attrValue || '');\n return `[${attrName}]`;\n });\n const depths = selectorWithoutAttrValues.split(/[ >]+/);\n let rootElement;\n let depthElement;\n let previousElement;\n for (let depthSelector of depths) {\n let tagName;\n depthSelector = depthSelector.replace(/^[\\w-]+/, function (match) {\n tagName = match;\n return '';\n });\n depthElement = document.createElement(tagName || 'div');\n if (!rootElement) {\n rootElement = depthElement;\n }\n depthSelector = depthSelector.replace(/#([\\w-]+)/, function (_match, id) {\n depthElement.id = id;\n return '';\n });\n depthSelector = depthSelector.replace(/\\.([\\w-]+)/g, function (_match, className) {\n depthElement.classList.add(className);\n return '';\n });\n if (attrValues.length) {\n depthSelector = depthSelector.replace(/\\[([\\w-]+)\\]/g, function (_match, attrName) {\n depthElement.setAttribute(attrName, attrValues.shift());\n return '';\n });\n }\n if (depthSelector !== '') {\n throw up.error.invalidSelector(selector);\n }\n previousElement?.appendChild(depthElement);\n previousElement = depthElement;\n }\n if (attrs) {\n let value;\n if (value = u.pluckKey(attrs, 'class')) {\n for (let klass of u.wrapList(value)) {\n rootElement.classList.add(klass);\n }\n }\n if (value = u.pluckKey(attrs, 'style')) {\n setInlineStyle(rootElement, value);\n }\n if (value = u.pluckKey(attrs, 'text')) {\n rootElement.textContent = value;\n }\n if (value = u.pluckKey(attrs, 'content')) {\n rootElement.innerHTML = value;\n }\n setAttrs(rootElement, attrs);\n }\n return rootElement;\n }\n function affix(parent, ...args) {\n let position, selector;\n const attributes = u.extractOptions(args);\n if (args.length === 2) {\n [position, selector] = args;\n }\n else {\n position = 'beforeend';\n selector = args[0];\n }\n const element = createFromSelector(selector, attributes);\n parent.insertAdjacentElement(position, element);\n return element;\n }\n function toSelector(...args) {\n return up.fragment.toTarget(...args);\n }\n const SINGLETON_TAG_NAMES = ['HTML', 'BODY', 'HEAD', 'TITLE'];\n const SINGLETON_PATTERN = new RegExp('\\\\b(' + SINGLETON_TAG_NAMES.join('|') + ')\\\\b', 'i');\n const isSingleton = up.mockable(element => matches(element, SINGLETON_TAG_NAMES.join(',')));\n function isSingletonSelector(selector) {\n return SINGLETON_PATTERN.test(selector);\n }\n function elementTagName(element) {\n return element.tagName.toLowerCase();\n }\n function attributeSelector(attribute, value) {\n value = value.replace(/\"/g, '\\\\\"');\n return `[${attribute}=\"${value}\"]`;\n }\n function trueAttributeSelector(attribute) {\n return `[${attribute}]:not([${attribute}=false])`;\n }\n function idSelector(id) {\n if (id.match(/^[a-z0-9\\-_]+$/i)) {\n return `#${id}`;\n }\n else {\n return attributeSelector('id', id);\n }\n }\n function classSelector(klass) {\n klass = klass.replace(/:/g, '\\\\:');\n return `.${klass}`;\n }\n function createDocumentFromHTML(html) {\n return new DOMParser().parseFromString(html, 'text/html');\n }\n function createFromHTML(html) {\n const range = document.createRange();\n range.setStart(document.body, 0);\n const fragment = range.createContextualFragment(html.trim());\n let elements = fragment.childNodes;\n if (elements.length !== 1) {\n throw new Error('HTML must have a single root element');\n }\n return elements[0];\n }\n function getRoot() {\n return document.documentElement;\n }\n function paint(element) {\n element.offsetHeight;\n }\n function concludeCSSTransition(element) {\n const undo = setTemporaryStyle(element, { transition: 'none' });\n paint(element);\n return undo;\n }\n function hasCSSTransition(elementOrStyleHash) {\n let styleHash;\n if (u.isOptions(elementOrStyleHash)) {\n styleHash = elementOrStyleHash;\n }\n else {\n styleHash = computedStyle(elementOrStyleHash);\n }\n const prop = styleHash.transitionProperty;\n const duration = styleHash.transitionDuration;\n const noTransition = ((prop === 'none') || ((prop === 'all') && (duration === 0)));\n return !noTransition;\n }\n function fixedToAbsolute(element) {\n const elementRectAsFixed = element.getBoundingClientRect();\n element.style.position = 'absolute';\n const offsetParentRect = element.offsetParent.getBoundingClientRect();\n setInlineStyle(element, {\n left: elementRectAsFixed.left - computedStyleNumber(element, 'margin-left') - offsetParentRect.left,\n top: elementRectAsFixed.top - computedStyleNumber(element, 'margin-top') - offsetParentRect.top,\n right: '',\n bottom: ''\n });\n }\n function setMissingAttrs(element, attrs) {\n for (let key in attrs) {\n setMissingAttr(element, key, attrs[key]);\n }\n }\n function setMissingAttr(element, key, value) {\n if (u.isMissing(element.getAttribute(key))) {\n element.setAttribute(key, value);\n }\n }\n function unwrap(wrapper) {\n const parent = wrapper.parentNode;\n const wrappedNodes = u.toArray(wrapper.childNodes);\n u.each(wrappedNodes, wrappedNode => parent.insertBefore(wrappedNode, wrapper));\n parent.removeChild(wrapper);\n }\n function wrapChildren(element, wrapperSelector = 'up-wrapper') {\n let childNode;\n const wrapper = createFromSelector(wrapperSelector);\n while ((childNode = element.firstChild)) {\n wrapper.appendChild(childNode);\n }\n element.appendChild(wrapper);\n return wrapper;\n }\n function stringAttr(element, attribute) {\n return u.nullToUndefined(element.getAttribute(attribute));\n }\n function booleanAttr(element, attribute, pass) {\n const value = stringAttr(element, attribute);\n switch (value) {\n case 'false': {\n return false;\n }\n case 'true':\n case '':\n case attribute: {\n return true;\n }\n default: {\n if (pass) {\n return value;\n }\n }\n }\n }\n function booleanOrStringAttr(element, attribute) {\n return booleanAttr(element, attribute, true);\n }\n function numberAttr(element, attribute) {\n let value = element.getAttribute(attribute);\n if (value) {\n value = value.replace(/_/g, '');\n if (value.match(/^[\\d.]+$/)) {\n return parseFloat(value);\n }\n }\n }\n function jsonAttr(element, attribute) {\n let json = element.getAttribute?.(attribute)?.trim();\n if (json) {\n return JSON.parse(json);\n }\n }\n function callbackAttr(link, attr, exposedKeys = []) {\n let code = link.getAttribute(attr);\n if (code) {\n const callback = up.NonceableCallback.fromString(code).toFunction('event', ...exposedKeys);\n return function (event) {\n const exposedValues = u.values(u.pick(event, exposedKeys));\n return callback.call(link, event, ...exposedValues);\n };\n }\n }\n function closestAttr(element, attr) {\n return closest(element, '[' + attr + ']')?.getAttribute(attr);\n }\n function setTemporaryStyle(element, newStyles) {\n const oldStyles = inlineStyle(element, Object.keys(newStyles));\n setInlineStyle(element, newStyles);\n return () => setInlineStyle(element, oldStyles);\n }\n function computedStyle(element, props) {\n const style = window.getComputedStyle(element);\n return extractFromStyleObject(style, props);\n }\n function computedStyleNumber(element, prop) {\n const rawValue = computedStyle(element, prop);\n if (u.isGiven(rawValue)) {\n return parseFloat(rawValue);\n }\n }\n function inlineStyle(element, props) {\n const { style } = element;\n return extractFromStyleObject(style, props);\n }\n function extractFromStyleObject(style, keyOrKeys) {\n if (u.isString(keyOrKeys)) {\n return style[keyOrKeys];\n }\n else {\n return u.pick(style, keyOrKeys);\n }\n }\n function setInlineStyle(element, props) {\n if (u.isString(props)) {\n element.setAttribute('style', props);\n }\n else {\n const { style } = element;\n for (let key in props) {\n let value = props[key];\n value = normalizeStyleValueForWrite(key, value);\n style[key] = value;\n }\n }\n }\n function normalizeStyleValueForWrite(key, value) {\n if (u.isMissing(value)) {\n value = '';\n }\n else if (CSS_LENGTH_PROPS.has(key.toLowerCase().replace(/-/, ''))) {\n value = cssLength(value);\n }\n return value;\n }\n const CSS_LENGTH_PROPS = u.arrayToSet([\n 'top', 'right', 'bottom', 'left',\n 'padding', 'paddingtop', 'paddingright', 'paddingbottom', 'paddingleft',\n 'margin', 'margintop', 'marginright', 'marginbottom', 'marginleft',\n 'borderwidth', 'bordertopwidth', 'borderrightwidth', 'borderbottomwidth', 'borderleftwidth',\n 'width', 'height',\n 'maxwidth', 'maxheight',\n 'minwidth', 'minheight',\n ]);\n function cssLength(obj) {\n if (u.isNumber(obj) || (u.isString(obj) && /^\\d+$/.test(obj))) {\n return obj.toString() + \"px\";\n }\n else {\n return obj;\n }\n }\n function isVisible(element) {\n return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length);\n }\n function upAttrs(element) {\n const upAttributePattern = /^up-/;\n const attrs = {};\n for (let attribute of element.attributes) {\n const { name } = attribute;\n if (name.match(upAttributePattern)) {\n attrs[name] = attribute.value;\n }\n }\n return attrs;\n }\n function isDetached(element) {\n return (element !== document) && !getRoot().contains(element);\n }\n return {\n all,\n subtree,\n isInSubtree,\n closest,\n closestAttr,\n matches,\n ancestor,\n around,\n get: getOne,\n list: getList,\n remove,\n toggle,\n toggleClass,\n hide,\n show,\n metaContent,\n replace,\n insertBefore,\n createFromSelector,\n setAttrs,\n setTemporaryAttrs,\n affix,\n toSelector,\n idSelector,\n classSelector,\n isSingleton,\n isSingletonSelector,\n attributeSelector,\n trueAttributeSelector,\n tagName: elementTagName,\n createDocumentFromHTML,\n createFromHTML,\n get root() { return getRoot(); },\n paint,\n concludeCSSTransition,\n hasCSSTransition,\n fixedToAbsolute,\n setMissingAttrs,\n setMissingAttr,\n unwrap,\n wrapChildren,\n attr: stringAttr,\n booleanAttr,\n numberAttr,\n jsonAttr,\n callbackAttr,\n booleanOrStringAttr,\n setTemporaryStyle,\n style: computedStyle,\n styleNumber: computedStyleNumber,\n inlineStyle,\n setStyle: setInlineStyle,\n isVisible,\n upAttrs,\n toggleAttr,\n isDetached\n };\n})();\n\n\n/***/ }),\n/* 8 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n/***/ }),\n/* 9 */\n/***/ (() => {\n\nconst u = up.util;\nup.Record = class Record {\n keys() {\n throw 'Return an array of keys';\n }\n defaults(_options) {\n return {};\n }\n constructor(options) {\n u.assign(this, this.defaults(options), this.attributes(options));\n }\n attributes(source = this) {\n return u.pick(source, this.keys());\n }\n [u.copy.key]() {\n return this.variant();\n }\n variant(changes = {}) {\n return new this.constructor(u.merge(this.attributes(), changes));\n }\n [u.isEqual.key](other) {\n return (this.constructor === other.constructor) && u.isEqual(this.attributes(), other.attributes());\n }\n};\n\n\n/***/ }),\n/* 10 */\n/***/ (() => {\n\nconst u = up.util;\nup.Config = class Config {\n constructor(blueprintFn = (() => ({}))) {\n this.blueprintFn = blueprintFn;\n this.reset();\n }\n reset() {\n u.assign(this, this.blueprintFn());\n }\n};\n\n\n/***/ }),\n/* 11 */\n/***/ (() => {\n\nconst u = up.util;\nup.Cache = class Cache {\n constructor(config = {}) {\n this.config = config;\n this.store = this.config.store || new up.store.Memory();\n }\n size() {\n return this.store.size();\n }\n maxSize() {\n return u.evalOption(this.config.size);\n }\n expiryMillis() {\n return u.evalOption(this.config.expiry);\n }\n normalizeStoreKey(key) {\n if (this.config.key) {\n return this.config.key(key);\n }\n else {\n return key.toString();\n }\n }\n isEnabled() {\n return (this.maxSize() !== 0) && (this.expiryMillis() !== 0);\n }\n clear() {\n this.store.clear();\n }\n keys() {\n return this.store.keys();\n }\n each(fn) {\n u.each(this.keys(), key => {\n const entry = this.store.get(key);\n fn(key, entry.value, entry.timestamp);\n });\n }\n makeRoomForAnotherEntry() {\n if (this.hasRoomForAnotherEntry()) {\n return;\n }\n let oldestKey;\n let oldestTimestamp;\n this.each(function (key, request, timestamp) {\n if (!oldestTimestamp || (oldestTimestamp > timestamp)) {\n oldestKey = key;\n oldestTimestamp = timestamp;\n }\n });\n if (oldestKey) {\n this.store.remove(oldestKey);\n }\n }\n hasRoomForAnotherEntry() {\n const maxSize = this.maxSize();\n return !maxSize || (this.size() < maxSize);\n }\n alias(oldKey, newKey) {\n const value = this.get(oldKey, { silent: true });\n if (u.isDefined(value)) {\n this.set(newKey, value);\n }\n }\n timestamp() {\n return (new Date()).valueOf();\n }\n set(key, value) {\n if (this.isEnabled()) {\n this.makeRoomForAnotherEntry();\n const storeKey = this.normalizeStoreKey(key);\n const entry = {\n timestamp: this.timestamp(),\n value\n };\n this.store.set(storeKey, entry);\n }\n }\n remove(key) {\n const storeKey = this.normalizeStoreKey(key);\n this.store.remove(storeKey);\n }\n isFresh(entry) {\n const millis = this.expiryMillis();\n if (millis) {\n const timeSinceTouch = this.timestamp() - entry.timestamp;\n return timeSinceTouch < millis;\n }\n else {\n return true;\n }\n }\n get(key) {\n const storeKey = this.normalizeStoreKey(key);\n let entry = this.store.get(storeKey);\n if (entry) {\n if (this.isFresh(entry)) {\n return entry.value;\n }\n else {\n this.remove(key);\n }\n }\n }\n};\n\n\n/***/ }),\n/* 12 */\n/***/ (() => {\n\nup.Rect = class Rect extends up.Record {\n keys() {\n return [\n 'left',\n 'top',\n 'width',\n 'height'\n ];\n }\n get bottom() {\n return this.top + this.height;\n }\n get right() {\n return this.left + this.width;\n }\n static fromElement(element) {\n return new (this)(element.getBoundingClientRect());\n }\n};\n\n\n/***/ }),\n/* 13 */\n/***/ (() => {\n\nconst e = up.element;\nup.BodyShifter = class BodyShifter {\n constructor() {\n this.unshiftFns = [];\n this.reset();\n }\n reset() {\n this.unshiftNow();\n this.shiftCount = 0;\n }\n shift() {\n this.shiftCount++;\n if (this.shiftCount > 1) {\n return;\n }\n const scrollbarTookSpace = up.viewport.rootHasReducedWidthFromScrollbar();\n const overflowElement = up.viewport.rootOverflowElement();\n this.changeStyle(overflowElement, { overflowY: 'hidden' });\n if (!scrollbarTookSpace) {\n return;\n }\n const { body } = document;\n const scrollbarWidth = up.viewport.scrollbarWidth();\n const bodyRightPadding = e.styleNumber(body, 'paddingRight');\n const bodyRightShift = scrollbarWidth + bodyRightPadding;\n this.changeStyle(body, { paddingRight: bodyRightShift });\n for (let anchor of up.viewport.anchoredRight()) {\n const elementRight = e.styleNumber(anchor, 'right');\n const elementRightShift = scrollbarWidth + elementRight;\n this.changeStyle(anchor, { right: elementRightShift });\n }\n }\n changeStyle(element, styles) {\n this.unshiftFns.push(e.setTemporaryStyle(element, styles));\n }\n unshift() {\n this.shiftCount--;\n if (this.shiftCount == 0) {\n this.unshiftNow();\n }\n }\n unshiftNow() {\n let unshiftFn;\n while (unshiftFn = this.unshiftFns.pop()) {\n unshiftFn();\n }\n }\n};\n\n\n/***/ }),\n/* 14 */\n/***/ (() => {\n\nconst u = up.util;\nup.Change = class Change {\n constructor(options) {\n this.options = options;\n }\n notApplicable(reason) {\n return up.error.notApplicable(this, reason);\n }\n execute() {\n throw up.error.notImplemented();\n }\n onFinished() {\n return this.options.onFinished?.();\n }\n improveHistoryValue(existingValue, newValue) {\n if ((existingValue === false) || u.isString(existingValue)) {\n return existingValue;\n }\n else {\n return newValue;\n }\n }\n};\n\n\n/***/ }),\n/* 15 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.Change.Addition = class Addition extends up.Change {\n constructor(options) {\n super(options);\n this.responseDoc = options.responseDoc;\n this.acceptLayer = options.acceptLayer;\n this.dismissLayer = options.dismissLayer;\n this.eventPlans = options.eventPlans || [];\n }\n handleLayerChangeRequests() {\n if (this.layer.isOverlay()) {\n this.tryAcceptLayerFromServer();\n this.abortWhenLayerClosed();\n this.layer.tryAcceptForLocation();\n this.abortWhenLayerClosed();\n this.tryDismissLayerFromServer();\n this.abortWhenLayerClosed();\n this.layer.tryDismissForLocation();\n this.abortWhenLayerClosed();\n }\n this.layer.asCurrent(() => {\n for (let eventPlan of this.eventPlans) {\n up.emit(eventPlan);\n this.abortWhenLayerClosed();\n }\n });\n }\n tryAcceptLayerFromServer() {\n if (u.isDefined(this.acceptLayer) && this.layer.isOverlay()) {\n this.layer.accept(this.acceptLayer);\n }\n }\n tryDismissLayerFromServer() {\n if (u.isDefined(this.dismissLayer) && this.layer.isOverlay()) {\n this.layer.dismiss(this.dismissLayer);\n }\n }\n abortWhenLayerClosed() {\n if (this.layer.isClosed()) {\n throw up.error.aborted('Layer was closed');\n }\n }\n setSource({ oldElement, newElement, source }) {\n if (source === 'keep') {\n source = (oldElement && up.fragment.source(oldElement));\n }\n if (source) {\n e.setMissingAttr(newElement, 'up-source', u.normalizeURL(source, { hash: false }));\n }\n }\n};\n\n\n/***/ }),\n/* 16 */\n/***/ (() => {\n\nup.Change.Removal = class Removal extends up.Change {\n};\n\n\n/***/ }),\n/* 17 */\n/***/ (() => {\n\nconst e = up.element;\nup.Change.DestroyFragment = class DestroyFragment extends up.Change.Removal {\n constructor(options) {\n super(options);\n this.layer = up.layer.get(options) || up.layer.current;\n this.element = this.options.element;\n this.animation = this.options.animation;\n this.log = this.options.log;\n }\n async execute() {\n this.parent = this.element.parentNode;\n up.fragment.markAsDestroying(this.element);\n if (up.motion.willAnimate(this.element, this.animation, this.options)) {\n this.emitDestroyed();\n await this.animate();\n this.wipe();\n this.onFinished();\n }\n else {\n this.wipe();\n this.emitDestroyed();\n this.onFinished();\n }\n }\n animate() {\n return up.motion.animate(this.element, this.animation, this.options);\n }\n wipe() {\n this.layer.asCurrent(() => {\n up.syntax.clean(this.element, { layer: this.layer });\n if (up.browser.canJQuery()) {\n jQuery(this.element).remove();\n }\n else {\n e.remove(this.element);\n }\n });\n }\n emitDestroyed() {\n up.fragment.emitDestroyed(this.element, { parent: this.parent, log: this.log });\n }\n};\n\n\n/***/ }),\n/* 18 */\n/***/ (() => {\n\nup.Change.OpenLayer = class OpenLayer extends up.Change.Addition {\n constructor(options) {\n super(options);\n this.target = options.target;\n this.origin = options.origin;\n this.baseLayer = options.baseLayer;\n }\n preflightProps() {\n return {\n layer: this.baseLayer,\n mode: this.options.mode,\n context: this.buildLayer().context,\n target: this.target\n };\n }\n bestPreflightSelector() {\n return this.target;\n }\n execute(responseDoc, onApplicable) {\n if (this.target === ':none') {\n this.content = document.createElement('up-none');\n }\n else {\n this.content = responseDoc.select(this.target);\n }\n if (!this.content || this.baseLayer.isClosed()) {\n throw this.notApplicable();\n }\n onApplicable();\n up.puts('up.render()', `Opening element \"${this.target}\" in new overlay`);\n this.options.title = this.improveHistoryValue(this.options.title, responseDoc.getTitle());\n if (this.emitOpenEvent().defaultPrevented) {\n throw up.error.aborted('Open event was prevented');\n }\n this.baseLayer.peel();\n this.layer = this.buildLayer();\n up.layer.stack.push(this.layer);\n this.layer.createElements(this.content);\n this.layer.setupHandlers();\n this.handleHistory();\n this.setSource({ newElement: this.content, source: this.options.source });\n responseDoc.finalizeElement(this.content);\n up.hello(this.layer.element, { layer: this.layer, origin: this.origin });\n this.handleLayerChangeRequests();\n this.handleScroll();\n this.layer.startOpenAnimation().then(() => {\n if (this.layer.isOpen()) {\n this.handleFocus();\n }\n this.onFinished();\n });\n this.layer.opening = false;\n this.emitOpenedEvent();\n this.abortWhenLayerClosed();\n return new up.RenderResult({\n layer: this.layer,\n fragments: [this.content]\n });\n }\n buildLayer() {\n const buildOptions = { ...this.options, opening: true };\n const beforeNew = optionsWithLayerDefaults => {\n return this.options = up.RenderOptions.finalize(optionsWithLayerDefaults);\n };\n return up.layer.build(buildOptions, beforeNew);\n }\n handleHistory() {\n if (this.layer.history === 'auto') {\n this.layer.history = up.fragment.hasAutoHistory(this.content);\n }\n this.layer.parent.saveHistory();\n this.layer.updateHistory(this.options);\n }\n handleFocus() {\n this.baseLayer.overlayFocus?.moveToBack();\n this.layer.overlayFocus.moveToFront();\n const fragmentFocus = new up.FragmentFocus({\n fragment: this.content,\n layer: this.layer,\n autoMeans: ['autofocus', 'layer']\n });\n fragmentFocus.process(this.options.focus);\n }\n handleScroll() {\n const scrollingOptions = {\n ...this.options,\n fragment: this.content,\n layer: this.layer,\n autoMeans: ['hash', 'layer']\n };\n const scrolling = new up.FragmentScrolling(scrollingOptions);\n scrolling.process(this.options.scroll);\n }\n emitOpenEvent() {\n return up.emit('up:layer:open', {\n origin: this.origin,\n baseLayer: this.baseLayer,\n layerOptions: this.options,\n log: \"Opening new overlay\"\n });\n }\n emitOpenedEvent() {\n return this.layer.emit('up:layer:opened', {\n origin: this.origin,\n callback: this.layer.callback('onOpened'),\n log: `Opened new ${this.layer}`\n });\n }\n};\n\n\n/***/ }),\n/* 19 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.Change.UpdateLayer = class UpdateLayer extends up.Change.Addition {\n constructor(options) {\n options = up.RenderOptions.finalize(options);\n super(options);\n this.layer = options.layer;\n this.target = options.target;\n this.placement = options.placement;\n this.context = options.context;\n this.parseSteps();\n }\n preflightProps() {\n this.matchPreflight();\n return {\n layer: this.layer,\n mode: this.layer.mode,\n context: u.merge(this.layer.context, this.context),\n target: this.bestPreflightSelector(),\n };\n }\n bestPreflightSelector() {\n this.matchPreflight();\n return u.map(this.steps, 'selector').join(', ') || ':none';\n }\n execute(responseDoc, onApplicable) {\n this.responseDoc = responseDoc;\n this.matchPostflight();\n onApplicable();\n up.puts('up.render()', `Updating \"${this.bestPreflightSelector()}\" in ${this.layer}`);\n this.options.title = this.improveHistoryValue(this.options.title, this.responseDoc.getTitle());\n this.setScrollAndFocusOptions();\n if (this.options.saveScroll) {\n up.viewport.saveScroll({ layer: this.layer });\n }\n if (this.options.peel) {\n this.layer.peel();\n }\n u.assign(this.layer.context, this.context);\n if (this.options.history === 'auto') {\n this.options.history = this.hasAutoHistory();\n }\n if (this.options.history) {\n this.layer.updateHistory(this.options);\n }\n this.handleLayerChangeRequests();\n const swapPromises = this.steps.map(step => this.executeStep(step));\n Promise.all(swapPromises).then(() => {\n this.abortWhenLayerClosed();\n return this.onFinished();\n });\n return new up.RenderResult({\n layer: this.layer,\n fragments: u.map(this.steps, 'newElement')\n });\n }\n async executeStep(step) {\n this.setSource(step);\n switch (step.placement) {\n case 'swap': {\n let keepPlan = this.findKeepPlan(step);\n if (keepPlan) {\n up.fragment.emitKept(keepPlan);\n this.handleFocus(step.oldElement, step);\n await this.handleScroll(step.oldElement, step);\n }\n else {\n this.transferKeepableElements(step);\n const parent = step.oldElement.parentNode;\n const morphOptions = {\n ...step,\n beforeStart() {\n up.fragment.markAsDestroying(step.oldElement);\n },\n afterInsert: () => {\n this.responseDoc.finalizeElement(step.newElement);\n step.keepPlans.forEach(this.reviveKeepable);\n up.hello(step.newElement, step);\n },\n beforeDetach: () => {\n up.syntax.clean(step.oldElement, { layer: this.layer });\n },\n afterDetach() {\n e.remove(step.oldElement);\n up.fragment.emitDestroyed(step.oldElement, { parent, log: false });\n },\n scrollNew: () => {\n this.handleFocus(step.newElement, step);\n return this.handleScroll(step.newElement, step);\n }\n };\n await up.morph(step.oldElement, step.newElement, step.transition, morphOptions);\n }\n break;\n }\n case 'content': {\n let oldWrapper = e.wrapChildren(step.oldElement);\n let newWrapper = e.wrapChildren(step.newElement);\n let wrapperStep = {\n ...step,\n placement: 'swap',\n oldElement: oldWrapper,\n newElement: newWrapper,\n focus: false\n };\n await this.executeStep(wrapperStep);\n e.unwrap(newWrapper);\n await this.handleFocus(step.oldElement, step);\n break;\n }\n case 'before':\n case 'after': {\n let wrapper = e.wrapChildren(step.newElement);\n let position = step.placement === 'before' ? 'afterbegin' : 'beforeend';\n step.oldElement.insertAdjacentElement(position, wrapper);\n this.responseDoc.finalizeElement(wrapper);\n up.hello(wrapper, step);\n this.handleFocus(wrapper, step);\n await this.handleScroll(wrapper, step);\n await up.animate(wrapper, step.transition, step);\n await e.unwrap(wrapper);\n break;\n }\n default: {\n up.fail('Unknown placement: %o', step.placement);\n }\n }\n }\n findKeepPlan(options) {\n if (!options.keep) {\n return;\n }\n const { oldElement, newElement } = options;\n let partnerSelector = e.booleanOrStringAttr(oldElement, 'up-keep');\n if (partnerSelector) {\n if (partnerSelector === true) {\n partnerSelector = '&';\n }\n const lookupOpts = { layer: this.layer, origin: oldElement };\n let partner;\n if (options.descendantsOnly) {\n partner = up.fragment.get(newElement, partnerSelector, lookupOpts);\n }\n else {\n partner = up.fragment.subtree(newElement, partnerSelector, lookupOpts)[0];\n }\n if (partner && e.matches(partner, '[up-keep]')) {\n const plan = {\n oldElement,\n newElement: partner,\n newData: up.syntax.data(partner)\n };\n if (!up.fragment.emitKeep(plan).defaultPrevented) {\n return plan;\n }\n }\n }\n }\n transferKeepableElements(step) {\n const keepPlans = [];\n if (step.keep) {\n for (let keepable of step.oldElement.querySelectorAll('[up-keep]')) {\n let keepPlan = this.findKeepPlan({ ...step, oldElement: keepable, descendantsOnly: true });\n if (keepPlan) {\n this.hibernateKeepable(keepPlan);\n const keepableClone = keepable.cloneNode(true);\n e.replace(keepable, keepableClone);\n e.replace(keepPlan.newElement, keepable);\n keepPlans.push(keepPlan);\n }\n }\n }\n step.keepPlans = keepPlans;\n }\n parseSteps() {\n this.steps = [];\n for (let simpleTarget of u.splitValues(this.target, ',')) {\n if (simpleTarget !== ':none') {\n const expressionParts = simpleTarget.match(/^(.+?)(?::(before|after))?$/);\n if (!expressionParts) {\n throw up.error.invalidSelector(simpleTarget);\n }\n const step = {\n ...this.options,\n selector: expressionParts[1],\n placement: expressionParts[2] || this.placement || 'swap'\n };\n this.steps.push(step);\n }\n }\n }\n hibernateKeepable(keepPlan) {\n let viewports = up.viewport.subtree(keepPlan.oldElement);\n keepPlan.revivers = viewports.map(function (viewport) {\n let { scrollTop, scrollLeft } = viewport;\n return () => u.assign(viewport, { scrollTop, scrollLeft });\n });\n }\n reviveKeepable(keepPlan) {\n for (let reviver of keepPlan.revivers) {\n reviver();\n }\n }\n matchPreflight() {\n if (this.matchedPreflight) {\n return;\n }\n for (let step of this.steps) {\n const finder = new up.FragmentFinder(step);\n step.oldElement || (step.oldElement = finder.find());\n if (!step.oldElement) {\n throw this.notApplicable(`Could not find element \"${this.target}\" in current page`);\n }\n }\n this.resolveOldNesting();\n this.matchedPreflight = true;\n }\n matchPostflight() {\n if (this.matchedPostflight) {\n return;\n }\n this.matchPreflight();\n for (let step of this.steps) {\n let newElement = this.responseDoc.select(step.selector);\n if (newElement) {\n step.newElement = newElement;\n }\n else {\n throw this.notApplicable(`Could not find element \"${this.target}\" in server response`);\n }\n }\n if (this.options.hungry) {\n this.addHungrySteps();\n }\n this.resolveOldNesting();\n this.matchedPostflight = true;\n }\n addHungrySteps() {\n const hungries = up.fragment.all(up.radio.hungrySelector(), this.options);\n for (let oldElement of hungries) {\n const selector = up.fragment.toTarget(oldElement);\n const newElement = this.responseDoc.select(selector);\n if (newElement) {\n const transition = e.booleanOrStringAttr(oldElement, 'transition');\n const step = { selector, oldElement, newElement, transition, placement: 'swap' };\n this.steps.push(step);\n }\n }\n }\n containedByRivalStep(steps, candidateStep) {\n return u.some(steps, function (rivalStep) {\n return (rivalStep !== candidateStep) &&\n ((rivalStep.placement === 'swap') || (rivalStep.placement === 'content')) &&\n rivalStep.oldElement.contains(candidateStep.oldElement);\n });\n }\n resolveOldNesting() {\n let compressed = u.uniqBy(this.steps, 'oldElement');\n compressed = u.reject(compressed, step => this.containedByRivalStep(compressed, step));\n this.steps = compressed;\n }\n setScrollAndFocusOptions() {\n this.steps.forEach((step, i) => {\n if (i > 0) {\n step.scroll = false;\n step.focus = false;\n }\n if ((step.placement === 'swap') || (step.placement === 'content')) {\n step.scrollBehavior = 'auto';\n this.focusCapsule || (this.focusCapsule = up.FocusCapsule.preserveWithin(step.oldElement));\n }\n });\n }\n handleFocus(fragment, step) {\n const fragmentFocus = new up.FragmentFocus({\n ...step,\n fragment,\n layer: this.layer,\n focusCapsule: this.focusCapsule,\n autoMeans: up.fragment.config.autoFocus,\n });\n return fragmentFocus.process(step.focus);\n }\n handleScroll(fragment, step) {\n const scrolling = new up.FragmentScrolling({\n ...step,\n fragment,\n layer: this.layer,\n autoMeans: up.fragment.config.autoScroll\n });\n return scrolling.process(step.scroll);\n }\n hasAutoHistory() {\n const oldFragments = u.map(this.steps, 'oldElement');\n return u.some(oldFragments, oldFragment => up.fragment.hasAutoHistory(oldFragment));\n }\n};\n\n\n/***/ }),\n/* 20 */\n/***/ (() => {\n\nconst u = up.util;\nup.Change.CloseLayer = class CloseLayer extends up.Change.Removal {\n constructor(options) {\n super(options);\n this.verb = options.verb;\n this.layer = up.layer.get(options);\n this.origin = options.origin;\n this.value = options.value;\n this.preventable = options.preventable ?? true;\n }\n execute() {\n if (!this.layer.isOpen()) {\n return Promise.resolve();\n }\n up.browser.assertConfirmed(this.options);\n up.network.abort(request => request.layer === this.layer);\n if (this.emitCloseEvent().defaultPrevented && this.preventable) {\n throw up.error.aborted('Close event was prevented');\n }\n const { parent } = this.layer;\n this.layer.peel();\n this.layer.stack.remove(this.layer);\n parent.restoreHistory();\n this.handleFocus(parent);\n this.layer.teardownHandlers();\n this.layer.destroyElements(this.options);\n this.emitClosedEvent(parent);\n }\n emitCloseEvent() {\n let event = this.layer.emit(this.buildEvent(`up:layer:${this.verb}`), {\n callback: this.layer.callback(`on${u.upperCaseFirst(this.verb)}`),\n log: [`Will ${this.verb} ${this.layer} with value %o`, this.value]\n });\n this.value = event.value;\n return event;\n }\n emitClosedEvent(formerParent) {\n const verbPast = `${this.verb}ed`;\n const verbPastUpperCaseFirst = u.upperCaseFirst(verbPast);\n return this.layer.emit(this.buildEvent(`up:layer:${verbPast}`), {\n baseLayer: formerParent,\n callback: this.layer.callback(`on${verbPastUpperCaseFirst}`),\n ensureBubbles: true,\n log: [`${verbPastUpperCaseFirst} ${this.layer} with value %o`, this.value]\n });\n }\n buildEvent(name) {\n return up.event.build(name, {\n layer: this.layer,\n value: this.value,\n origin: this.origin\n });\n }\n handleFocus(formerParent) {\n this.layer.overlayFocus.teardown();\n formerParent.overlayFocus?.moveToFront();\n let newFocusElement = this.layer.origin || formerParent.element;\n newFocusElement.focus({ preventScroll: true });\n }\n};\n\n\n/***/ }),\n/* 21 */\n/***/ (() => {\n\nconst u = up.util;\nup.Change.FromContent = class FromContent extends up.Change {\n constructor(options) {\n super(options);\n this.layers = u.filter(up.layer.getAll(this.options), this.isRenderableLayer);\n this.origin = this.options.origin;\n this.preview = this.options.preview;\n this.mode = this.options.mode;\n if (this.origin) {\n this.originLayer = up.layer.get(this.origin);\n }\n }\n isRenderableLayer(layer) {\n return (layer === 'new') || layer.isOpen();\n }\n getPlans() {\n if (!this.plans) {\n this.plans = [];\n if (this.options.fragment) {\n this.options.target = this.getResponseDoc().rootSelector();\n }\n this.expandIntoPlans(this.layers, this.options.target);\n this.expandIntoPlans(this.layers, this.options.fallback);\n }\n return this.plans;\n }\n expandIntoPlans(layers, targets) {\n for (let layer of layers) {\n for (let target of this.expandTargets(targets, layer)) {\n const props = { ...this.options, target, layer, placement: this.defaultPlacement() };\n const change = layer === 'new' ? new up.Change.OpenLayer(props) : new up.Change.UpdateLayer(props);\n this.plans.push(change);\n }\n }\n }\n expandTargets(targets, layer) {\n return up.fragment.expandTargets(targets, { layer, mode: this.mode, origin: this.origin });\n }\n execute() {\n if (this.options.preload) {\n return Promise.resolve();\n }\n return this.seekPlan(this.executePlan.bind(this)) || this.postflightTargetNotApplicable();\n }\n executePlan(matchedPlan) {\n return matchedPlan.execute(this.getResponseDoc(), this.onPlanApplicable.bind(this, matchedPlan));\n }\n onPlanApplicable(plan) {\n let primaryPlan = this.getPlans()[0];\n if (plan !== primaryPlan) {\n up.puts('up.render()', 'Could not match primary target (%s). Updating a fallback target (%s).', primaryPlan.target, plan.target);\n }\n }\n getResponseDoc() {\n if (!this.preview && !this.responseDoc) {\n const docOptions = u.pick(this.options, ['target', 'content', 'fragment', 'document', 'html', 'cspNonces']);\n up.migrate.handleResponseDocOptions?.(docOptions);\n if (this.defaultPlacement() === 'content') {\n docOptions.target = this.firstExpandedTarget(docOptions.target);\n }\n this.responseDoc = new up.ResponseDoc(docOptions);\n }\n return this.responseDoc;\n }\n defaultPlacement() {\n if (!this.options.document && !this.options.fragment) {\n return 'content';\n }\n }\n firstExpandedTarget(target) {\n return this.expandTargets(target || ':main', this.layers[0])[0];\n }\n preflightProps(opts = {}) {\n const getPlanProps = plan => plan.preflightProps();\n return this.seekPlan(getPlanProps) || opts.optional || this.preflightTargetNotApplicable();\n }\n preflightTargetNotApplicable() {\n this.targetNotApplicable('Could not find target in current page');\n }\n postflightTargetNotApplicable() {\n this.targetNotApplicable('Could not find common target in current page and response');\n }\n targetNotApplicable(reason) {\n if (this.getPlans().length) {\n const planTargets = u.uniq(u.map(this.getPlans(), 'target'));\n const humanizedLayerOption = up.layer.optionToString(this.options.layer);\n up.fail(reason + \" (tried selectors %o in %s)\", planTargets, humanizedLayerOption);\n }\n else if (this.layers.length) {\n up.fail('No target selector given');\n }\n else {\n up.fail('Layer %o does not exist', this.options.layer);\n }\n }\n seekPlan(fn) {\n for (let plan of this.getPlans()) {\n try {\n return fn(plan);\n }\n catch (error) {\n if (!up.error.notApplicable.is(error)) {\n throw error;\n }\n }\n }\n }\n};\n\n\n/***/ }),\n/* 22 */\n/***/ (() => {\n\nconst u = up.util;\nup.Change.FromURL = class FromURL extends up.Change {\n constructor(options) {\n super(options);\n this.options.layer = up.layer.getAll(this.options);\n this.options.normalizeLayerOptions = false;\n this.successOptions = this.options;\n this.failOptions = up.RenderOptions.deriveFailOptions(this.successOptions);\n }\n execute() {\n let newPageReason = this.newPageReason();\n if (newPageReason) {\n up.puts('up.render()', newPageReason);\n up.network.loadPage(this.options);\n return u.unresolvablePromise();\n }\n const promise = this.makeRequest();\n if (this.options.preload) {\n return promise;\n }\n return u.always(promise, responseOrError => this.onRequestSettled(responseOrError));\n }\n newPageReason() {\n if (u.isCrossOrigin(this.options.url)) {\n return 'Loading cross-origin content in new page';\n }\n if (!up.browser.canPushState()) {\n return 'Loading content in new page to restore history support';\n }\n }\n makeRequest() {\n const successAttrs = this.preflightPropsForRenderOptions(this.successOptions);\n const failAttrs = this.preflightPropsForRenderOptions(this.failOptions, { optional: true });\n const requestAttrs = u.merge(this.successOptions, successAttrs, u.renameKeys(failAttrs, up.fragment.failKey));\n this.request = up.request(requestAttrs);\n return this.request;\n }\n preflightPropsForRenderOptions(renderOptions, requestAttributesOptions) {\n const preview = new up.Change.FromContent({ ...renderOptions, preview: true });\n return preview.preflightProps(requestAttributesOptions);\n }\n onRequestSettled(response) {\n this.response = response;\n if (!(response instanceof up.Response)) {\n throw response;\n }\n else if (this.isSuccessfulResponse()) {\n return this.updateContentFromResponse(['Loaded fragment from successful response to %s', this.request.description], this.successOptions);\n }\n else {\n const log = ['Loaded fragment from failed response to %s (HTTP %d)', this.request.description, this.response.status];\n throw this.updateContentFromResponse(log, this.failOptions);\n }\n }\n isSuccessfulResponse() {\n return (this.successOptions.fail === false) || this.response.ok;\n }\n updateContentFromResponse(log, renderOptions) {\n this.request.assertEmitted('up:fragment:loaded', {\n callback: this.options.onLoaded,\n response: this.response,\n log,\n renderOptions,\n });\n this.augmentOptionsFromResponse(renderOptions);\n return new up.Change.FromContent(renderOptions).execute();\n }\n augmentOptionsFromResponse(renderOptions) {\n const responseURL = this.response.url;\n let serverLocation = responseURL;\n let hash = this.request.hash;\n if (hash) {\n renderOptions.hash = hash;\n serverLocation += hash;\n }\n const isReloadable = (this.response.method === 'GET');\n if (isReloadable) {\n renderOptions.source = this.improveHistoryValue(renderOptions.source, responseURL);\n }\n else {\n renderOptions.source = this.improveHistoryValue(renderOptions.source, 'keep');\n renderOptions.history = !!renderOptions.location;\n }\n renderOptions.location = this.improveHistoryValue(renderOptions.location, serverLocation);\n renderOptions.title = this.improveHistoryValue(renderOptions.title, this.response.title);\n renderOptions.eventPlans = this.response.eventPlans;\n let serverTarget = this.response.target;\n if (serverTarget) {\n renderOptions.target = serverTarget;\n }\n renderOptions.document = this.response.text;\n renderOptions.acceptLayer = this.response.acceptLayer;\n renderOptions.dismissLayer = this.response.dismissLayer;\n if (!renderOptions.document && (u.isDefined(renderOptions.acceptLayer) || u.isDefined(renderOptions.dismissLayer))) {\n renderOptions.target = ':none';\n }\n renderOptions.context = u.merge(renderOptions.context, this.response.context);\n renderOptions.cspNonces = this.response.cspNonces;\n }\n};\n\n\n/***/ }),\n/* 23 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.CompilerPass = class CompilerPass {\n constructor(root, compilers, options = {}) {\n this.root = root;\n this.compilers = compilers;\n this.skipSubtrees = options.skip;\n if (!this.skipSubtrees.length || !this.root.querySelector('[up-keep]')) {\n this.skipSubtrees = undefined;\n }\n this.layer = options.layer || up.layer.get(this.root) || up.layer.current;\n this.errors = [];\n }\n run() {\n up.puts('up.hello()', \"Compiling fragment %o\", this.root);\n this.layer.asCurrent(() => {\n for (let compiler of this.compilers) {\n this.runCompiler(compiler);\n }\n });\n if (this.errors.length) {\n throw up.error.failed('Errors while compiling', { errors: this.errors });\n }\n }\n runCompiler(compiler) {\n const matches = this.select(compiler.selector);\n if (!matches.length) {\n return;\n }\n if (!compiler.isDefault) {\n up.puts('up.hello()', 'Compiling \"%s\" on %d element(s)', compiler.selector, matches.length);\n }\n if (compiler.batch) {\n this.compileBatch(compiler, matches);\n }\n else {\n for (let match of matches) {\n this.compileOneElement(compiler, match);\n }\n }\n return up.migrate.postCompile?.(matches, compiler);\n }\n compileOneElement(compiler, element) {\n const elementArg = compiler.jQuery ? up.browser.jQuery(element) : element;\n const compileArgs = [elementArg];\n if (compiler.length !== 1) {\n const data = up.syntax.data(element);\n compileArgs.push(data);\n }\n const result = this.applyCompilerFunction(compiler, element, compileArgs);\n let destructorOrDestructors = this.destructorPresence(result);\n if (destructorOrDestructors) {\n up.destructor(element, destructorOrDestructors);\n }\n }\n compileBatch(compiler, elements) {\n const elementsArgs = compiler.jQuery ? up.browser.jQuery(elements) : elements;\n const compileArgs = [elementsArgs];\n if (compiler.length !== 1) {\n const dataList = u.map(elements, up.syntax.data);\n compileArgs.push(dataList);\n }\n const result = this.applyCompilerFunction(compiler, elements, compileArgs);\n if (this.destructorPresence(result)) {\n up.fail('Compilers with { batch: true } cannot return destructors');\n }\n }\n applyCompilerFunction(compiler, elementOrElements, compileArgs) {\n try {\n return compiler.apply(elementOrElements, compileArgs);\n }\n catch (error) {\n this.errors.push(error);\n up.log.error('up.hello()', 'While compiling %o: %o', elementOrElements, error);\n up.error.emitGlobal(error);\n }\n }\n destructorPresence(result) {\n if (u.isFunction(result) || (u.isArray(result) && (u.every(result, u.isFunction)))) {\n return result;\n }\n }\n select(selector) {\n let matches = e.subtree(this.root, u.evalOption(selector));\n if (this.skipSubtrees) {\n matches = u.reject(matches, (match) => this.isInSkippedSubtree(match));\n }\n return matches;\n }\n isInSkippedSubtree(element) {\n let parent;\n if (u.contains(this.skipSubtrees, element)) {\n return true;\n }\n else if ((parent = element.parentElement)) {\n return this.isInSkippedSubtree(parent);\n }\n else {\n return false;\n }\n }\n};\n\n\n/***/ }),\n/* 24 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.CSSTransition = class CSSTransition {\n constructor(element, lastFrameKebab, options) {\n this.element = element;\n this.lastFrameKebab = lastFrameKebab;\n this.lastFrameKeysKebab = Object.keys(this.lastFrameKebab);\n if (u.some(this.lastFrameKeysKebab, key => key.match(/A-Z/))) {\n up.fail('Animation keys must be kebab-case');\n }\n this.finishEvent = options.finishEvent;\n this.duration = options.duration;\n this.easing = options.easing;\n this.finished = false;\n }\n start() {\n if (this.lastFrameKeysKebab.length === 0) {\n this.finished = true;\n return Promise.resolve();\n }\n this.deferred = u.newDeferred();\n this.pauseOldTransition();\n this.startTime = new Date();\n this.startFallbackTimer();\n this.listenToFinishEvent();\n this.listenToTransitionEnd();\n this.startMotion();\n return this.deferred.promise();\n }\n listenToFinishEvent() {\n if (this.finishEvent) {\n this.stopListenToFinishEvent = up.on(this.element, this.finishEvent, this.onFinishEvent.bind(this));\n }\n }\n onFinishEvent(event) {\n event.stopPropagation();\n this.finish();\n }\n startFallbackTimer() {\n const timingTolerance = 100;\n this.fallbackTimer = u.timer((this.duration + timingTolerance), () => {\n this.finish();\n });\n }\n stopFallbackTimer() {\n clearTimeout(this.fallbackTimer);\n }\n listenToTransitionEnd() {\n this.stopListenToTransitionEnd = up.on(this.element, 'transitionend', this.onTransitionEnd.bind(this));\n }\n onTransitionEnd(event) {\n if (event.target !== this.element) {\n return;\n }\n const elapsed = new Date() - this.startTime;\n if (elapsed <= (0.25 * this.duration)) {\n return;\n }\n const completedPropertyKebab = event.propertyName;\n if (!u.contains(this.lastFrameKeysKebab, completedPropertyKebab)) {\n return;\n }\n this.finish();\n }\n finish() {\n if (this.finished) {\n return;\n }\n this.finished = true;\n this.stopFallbackTimer();\n this.stopListenToFinishEvent?.();\n this.stopListenToTransitionEnd?.();\n e.concludeCSSTransition(this.element);\n this.resumeOldTransition();\n this.deferred.resolve();\n }\n pauseOldTransition() {\n const oldTransition = e.style(this.element, [\n 'transitionProperty',\n 'transitionDuration',\n 'transitionDelay',\n 'transitionTimingFunction'\n ]);\n if (e.hasCSSTransition(oldTransition)) {\n if (oldTransition.transitionProperty !== 'all') {\n const oldTransitionProperties = oldTransition.transitionProperty.split(/\\s*,\\s*/);\n const oldTransitionFrameKebab = e.style(this.element, oldTransitionProperties);\n this.setOldTransitionTargetFrame = e.setTemporaryStyle(this.element, oldTransitionFrameKebab);\n }\n this.setOldTransition = e.concludeCSSTransition(this.element);\n }\n }\n resumeOldTransition() {\n this.setOldTransitionTargetFrame?.();\n this.setOldTransition?.();\n }\n startMotion() {\n e.setStyle(this.element, {\n transitionProperty: Object.keys(this.lastFrameKebab).join(', '),\n transitionDuration: `${this.duration}ms`,\n transitionTimingFunction: this.easing\n });\n e.setStyle(this.element, this.lastFrameKebab);\n }\n};\n\n\n/***/ }),\n/* 25 */\n/***/ (() => {\n\nconst u = up.util;\nup.DestructorPass = class DestructorPass {\n constructor(fragment, options) {\n this.fragment = fragment;\n this.options = options;\n this.errors = [];\n }\n run() {\n for (let cleanable of this.selectCleanables()) {\n let destructors = u.pluckKey(cleanable, 'upDestructors');\n if (destructors) {\n for (let destructor of destructors) {\n this.applyDestructorFunction(destructor, cleanable);\n }\n }\n cleanable.classList.remove('up-can-clean');\n }\n if (this.errors.length) {\n throw up.error.failed('Errors while destroying', { errors: this.errors });\n }\n }\n selectCleanables() {\n const selectOptions = { ...this.options, destroying: true };\n return up.fragment.subtree(this.fragment, '.up-can-clean', selectOptions);\n }\n applyDestructorFunction(destructor, element) {\n try {\n destructor();\n }\n catch (error) {\n this.errors.push(error);\n up.log.error('up.destroy()', 'While destroying %o: %o', element, error);\n up.error.emitGlobal(error);\n }\n }\n};\n\n\n/***/ }),\n/* 26 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.EventEmitter = class EventEmitter extends up.Record {\n keys() {\n return [\n 'target',\n 'event',\n 'baseLayer',\n 'callback',\n 'log',\n 'ensureBubbles'\n ];\n }\n emit() {\n this.logEmission();\n if (this.baseLayer) {\n this.baseLayer.asCurrent(() => this.dispatchEvent());\n }\n else {\n this.dispatchEvent();\n }\n return this.event;\n }\n dispatchEvent() {\n this.target.dispatchEvent(this.event);\n if (this.ensureBubbles && e.isDetached(this.target)) {\n document.dispatchEvent(this.event);\n }\n this.callback?.(this.event);\n }\n assertEmitted() {\n const event = this.emit();\n if (event.defaultPrevented) {\n throw up.error.aborted(`Event ${event.type} was prevented`);\n }\n }\n logEmission() {\n if (!up.log.isEnabled()) {\n return;\n }\n let message = this.log;\n let messageArgs;\n if (u.isArray(message)) {\n [message, ...messageArgs] = message;\n }\n else {\n messageArgs = [];\n }\n const { type } = this.event;\n if (u.isString(message)) {\n up.puts(type, message, ...messageArgs);\n }\n else if (message !== false) {\n up.puts(type, `Event ${type}`);\n }\n }\n static fromEmitArgs(args, defaults = {}) {\n let options = u.extractOptions(args);\n options = u.merge(defaults, options);\n if (u.isElementish(args[0])) {\n options.target = e.get(args.shift());\n }\n else if (args[0] instanceof up.Layer) {\n options.layer = args.shift();\n }\n let layer;\n if (options.layer) {\n layer = up.layer.get(options.layer);\n if (options.target == null) {\n options.target = layer.element;\n }\n if (options.baseLayer == null) {\n options.baseLayer = layer;\n }\n }\n if (options.baseLayer) {\n options.baseLayer = up.layer.get(options.baseLayer);\n }\n if (u.isString(options.target)) {\n options.target = up.fragment.get(options.target, { layer: options.layer });\n }\n else if (!options.target) {\n options.target = document;\n }\n if (args[0]?.preventDefault) {\n options.event = args[0];\n if (options.log == null) {\n options.log = args[0].log;\n }\n }\n else if (u.isString(args[0])) {\n options.event = up.event.build(args[0], options);\n }\n else {\n options.event = up.event.build(options);\n }\n return new (this)(options);\n }\n};\n\n\n/***/ }),\n/* 27 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.EventListener = class EventListener extends up.Record {\n keys() {\n return [\n 'element',\n 'eventType',\n 'selector',\n 'callback',\n 'jQuery',\n 'guard',\n 'baseLayer',\n 'passive',\n 'once',\n 'beforeBoot',\n ];\n }\n constructor(attributes) {\n super(attributes);\n this.key = this.constructor.buildKey(attributes);\n this.isDefault = up.framework.evaling;\n this.beforeBoot ?? (this.beforeBoot = this.eventType.indexOf('up:framework:') === 0);\n this.nativeCallback = this.nativeCallback.bind(this);\n }\n bind() {\n var _a;\n const map = ((_a = this.element).upEventListeners || (_a.upEventListeners = {}));\n if (map[this.key]) {\n up.fail('up.on(): The %o callback %o cannot be registered more than once', this.eventType, this.callback);\n }\n map[this.key] = this;\n this.element.addEventListener(...this.addListenerArgs());\n }\n addListenerArgs() {\n const args = [this.eventType, this.nativeCallback];\n if (this.passive && up.browser.canPassiveEventListener()) {\n args.push({ passive: true });\n }\n return args;\n }\n unbind() {\n let map = this.element.upEventListeners;\n if (map) {\n delete map[this.key];\n }\n this.element.removeEventListener(...this.addListenerArgs());\n }\n nativeCallback(event) {\n if (up.framework.beforeBoot && !this.beforeBoot) {\n return;\n }\n if (this.once) {\n this.unbind();\n }\n let element = event.target;\n if (this.selector) {\n element = e.closest(element, u.evalOption(this.selector));\n }\n if (this.guard && !this.guard(event)) {\n return;\n }\n if (element) {\n const elementArg = this.jQuery ? up.browser.jQuery(element) : element;\n const args = [event, elementArg];\n const expectedArgCount = this.callback.length;\n if (expectedArgCount !== 1 && expectedArgCount !== 2) {\n const data = up.syntax.data(element);\n args.push(data);\n }\n const applyCallback = this.callback.bind(element, ...args);\n if (this.baseLayer) {\n this.baseLayer.asCurrent(applyCallback);\n }\n else {\n applyCallback();\n }\n }\n }\n static fromElement(attributes) {\n let map = attributes.element.upEventListeners;\n if (map) {\n const key = this.buildKey(attributes);\n return map[key];\n }\n }\n static buildKey(attributes) {\n var _a;\n (_a = attributes.callback).upUid || (_a.upUid = u.uid());\n return [\n attributes.eventType,\n attributes.selector,\n attributes.callback.upUid\n ].join('|');\n }\n static allNonDefault(element) {\n let map = element.upEventListeners;\n if (map) {\n const listeners = u.values(map);\n return u.reject(listeners, 'isDefault');\n }\n else {\n return [];\n }\n }\n};\n\n\n/***/ }),\n/* 28 */\n/***/ (() => {\n\nconst u = up.util;\nup.EventListenerGroup = class EventListenerGroup extends up.Record {\n keys() {\n return [\n 'elements',\n 'eventTypes',\n 'selector',\n 'callback',\n 'jQuery',\n 'guard',\n 'baseLayer',\n 'passive',\n 'once',\n 'beforeBoot',\n ];\n }\n bind() {\n const unbindFns = [];\n this.eachListenerAttributes(function (attrs) {\n const listener = new up.EventListener(attrs);\n listener.bind();\n return unbindFns.push(listener.unbind.bind(listener));\n });\n return u.sequence(unbindFns);\n }\n eachListenerAttributes(fn) {\n for (let element of this.elements) {\n for (let eventType of this.eventTypes) {\n fn(this.listenerAttributes(element, eventType));\n }\n }\n }\n listenerAttributes(element, eventType) {\n return { ...this.attributes(), element, eventType };\n }\n unbind() {\n this.eachListenerAttributes(function (attrs) {\n let listener = up.EventListener.fromElement(attrs);\n if (listener) {\n listener.unbind();\n }\n });\n }\n static fromBindArgs(args, defaults) {\n args = u.copy(args);\n const callback = args.pop();\n let elements;\n if (args[0].addEventListener) {\n elements = [args.shift()];\n }\n else if (u.isJQuery(args[0]) || (u.isList(args[0]) && args[0][0].addEventListener)) {\n elements = args.shift();\n }\n else {\n elements = [document];\n }\n let eventTypes = u.splitValues(args.shift());\n let fixTypes = up.migrate.fixEventTypes;\n if (fixTypes) {\n eventTypes = fixTypes(eventTypes);\n }\n const options = u.extractOptions(args);\n const selector = args[0];\n const attributes = { elements, eventTypes, selector, callback, ...options, ...defaults };\n return new (this)(attributes);\n }\n};\n\n\n/***/ }),\n/* 29 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.FieldObserver = class FieldObserver {\n constructor(fieldOrFields, options, callback) {\n this.scheduleValues = this.scheduleValues.bind(this);\n this.isNewValues = this.isNewValues.bind(this);\n this.callback = callback;\n this.fields = e.list(fieldOrFields);\n this.delay = options.delay;\n this.batch = options.batch;\n }\n start() {\n this.scheduledValues = null;\n this.processedValues = this.readFieldValues();\n this.currentTimer = undefined;\n this.callbackRunning = false;\n this.unbind = up.on(this.fields, 'input change', () => this.check());\n }\n stop() {\n this.unbind();\n this.cancelTimer();\n }\n cancelTimer() {\n clearTimeout(this.currentTimer);\n this.currentTimer = undefined;\n }\n scheduleTimer() {\n this.cancelTimer();\n this.currentTimer = u.timer(this.delay, () => {\n this.currentTimer = undefined;\n this.requestCallback();\n });\n }\n scheduleValues(values) {\n this.scheduledValues = values;\n this.scheduleTimer();\n }\n isNewValues(values) {\n return !u.isEqual(values, this.processedValues) && !u.isEqual(this.scheduledValues, values);\n }\n async requestCallback() {\n if ((this.scheduledValues !== null) && !this.currentTimer && !this.callbackRunning) {\n const diff = this.changedValues(this.processedValues, this.scheduledValues);\n this.processedValues = this.scheduledValues;\n this.scheduledValues = null;\n this.callbackRunning = true;\n const callbackReturnValues = [];\n if (this.batch) {\n callbackReturnValues.push(this.callback(diff));\n }\n else {\n for (let name in diff) {\n const value = diff[name];\n callbackReturnValues.push(this.callback(value, name));\n }\n }\n await u.allSettled(callbackReturnValues);\n this.callbackRunning = false;\n this.requestCallback();\n }\n }\n changedValues(previous, next) {\n const changes = {};\n let keys = Object.keys(previous);\n keys = keys.concat(Object.keys(next));\n keys = u.uniq(keys);\n for (let key of keys) {\n const previousValue = previous[key];\n const nextValue = next[key];\n if (!u.isEqual(previousValue, nextValue)) {\n changes[key] = nextValue;\n }\n }\n return changes;\n }\n readFieldValues() {\n return up.Params.fromFields(this.fields).toObject();\n }\n check() {\n const values = this.readFieldValues();\n if (this.isNewValues(values)) {\n this.scheduleValues(values);\n }\n }\n};\n\n\n/***/ }),\n/* 30 */\n/***/ (() => {\n\nconst e = up.element;\nconst PRESERVE_KEYS = ['selectionStart', 'selectionEnd', 'scrollLeft', 'scrollTop'];\nfunction transferProps(from, to) {\n for (let key of PRESERVE_KEYS) {\n try {\n to[key] = from[key];\n }\n catch (error) {\n }\n }\n}\nfunction focusedElementWithin(scopeElement) {\n const focusedElement = document.activeElement;\n if (e.isInSubtree(scopeElement, focusedElement)) {\n return focusedElement;\n }\n}\nup.FocusCapsule = class FocusCapsule extends up.Record {\n keys() {\n return ['selector', 'oldElement'].concat(PRESERVE_KEYS);\n }\n restore(scope, options) {\n if (!this.wasLost()) {\n return;\n }\n let rediscoveredElement = e.get(scope, this.selector);\n if (rediscoveredElement) {\n transferProps(this, rediscoveredElement);\n up.focus(rediscoveredElement, options);\n return true;\n }\n }\n static preserveWithin(oldElement) {\n let focusedElement = focusedElementWithin(oldElement);\n if (focusedElement) {\n const plan = { oldElement, selector: up.fragment.toTarget(focusedElement) };\n transferProps(focusedElement, plan);\n return new (this)(plan);\n }\n }\n wasLost() {\n return !focusedElementWithin(this.oldElement);\n }\n};\n\n\n/***/ }),\n/* 31 */\n/***/ (() => {\n\nconst u = up.util;\nup.FragmentProcessor = class FragmentProcessor extends up.Record {\n keys() {\n return [\n 'fragment',\n 'autoMeans',\n 'origin',\n 'layer'\n ];\n }\n process(opt) {\n return this.tryProcess(opt);\n }\n tryProcess(opt) {\n if (u.isArray(opt)) {\n return u.find(opt, opt => this.tryProcess(opt));\n }\n if (u.isFunction(opt)) {\n return this.tryProcess(opt(this.fragment, this.attributes()));\n }\n if (u.isElement(opt)) {\n return this.processElement();\n }\n if (u.isString(opt)) {\n if (opt === 'auto') {\n return this.tryProcess(this.autoMeans);\n }\n let match = opt.match(/^(.+?)-if-(.+?)$/);\n if (match) {\n return this.resolveCondition(match[2]) && this.process(match[1]);\n }\n }\n return this.processPrimitive(opt);\n }\n resolveCondition(condition) {\n if (condition === 'main') {\n return up.fragment.contains(this.fragment, ':main');\n }\n }\n findSelector(selector) {\n const lookupOpts = { layer: this.layer, origin: this.origin };\n let match = up.fragment.get(this.fragment, selector, lookupOpts) || up.fragment.get(selector, lookupOpts);\n if (match) {\n return match;\n }\n else {\n up.warn('up.render()', 'Could not find an element matching \"%s\"', selector);\n }\n }\n};\n\n\n/***/ }),\n/* 32 */\n/***/ (() => {\n\nconst DESCENDANT_SELECTOR = /^([^ >+(]+) (.+)$/;\nup.FragmentFinder = class FragmentFinder {\n constructor(options) {\n this.options = options;\n this.origin = this.options.origin;\n this.selector = this.options.selector;\n this.layer = this.options.layer;\n }\n find() {\n return this.findAroundOrigin() || this.findInLayer();\n }\n findAroundOrigin() {\n if (this.origin && up.fragment.config.matchAroundOrigin && !up.element.isDetached(this.origin)) {\n return this.findClosest() || this.findInVicinity();\n }\n }\n findClosest() {\n return up.fragment.closest(this.origin, this.selector, this.options);\n }\n findInVicinity() {\n let parts = this.selector.match(DESCENDANT_SELECTOR);\n if (parts) {\n let parent = up.fragment.closest(this.origin, parts[1], this.options);\n if (parent) {\n return up.fragment.getDumb(parent, parts[2]);\n }\n }\n }\n findInLayer() {\n return up.fragment.getDumb(this.selector, this.options);\n }\n};\n\n\n/***/ }),\n/* 33 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nconst PREVENT_SCROLL_OPTIONS = { preventScroll: true };\nup.FragmentFocus = class FragmentFocus extends up.FragmentProcessor {\n keys() {\n return super.keys().concat([\n 'hash',\n 'focusCapsule'\n ]);\n }\n processPrimitive(opt) {\n switch (opt) {\n case 'keep':\n return this.restoreFocus();\n case 'target':\n case true:\n return this.focusElement(this.fragment);\n case 'layer':\n return this.focusElement(this.layer.getFocusElement());\n case 'main':\n return this.focusSelector(':main');\n case 'hash':\n return this.focusHash();\n case 'autofocus':\n return this.autofocus();\n default:\n if (u.isString(opt)) {\n return this.focusSelector(opt);\n }\n }\n }\n processElement(element) {\n return this.focusElement(element);\n }\n resolveCondition(condition) {\n if (condition === 'lost') {\n return this.wasFocusLost();\n }\n else {\n return super.resolveCondition(condition);\n }\n }\n focusSelector(selector) {\n let match = this.findSelector(selector);\n if (match) {\n return this.focusElement(match);\n }\n }\n restoreFocus() {\n return this.focusCapsule?.restore(this.fragment, PREVENT_SCROLL_OPTIONS);\n }\n autofocus() {\n let autofocusElement = e.subtree(this.fragment, '[autofocus]')[0];\n if (autofocusElement) {\n up.focus(autofocusElement, PREVENT_SCROLL_OPTIONS);\n return true;\n }\n }\n focusElement(element) {\n up.viewport.makeFocusable(element);\n up.focus(element, PREVENT_SCROLL_OPTIONS);\n return true;\n }\n focusHash() {\n let hashTarget = up.viewport.firstHashTarget(this.hash, { layer: this.layer });\n if (hashTarget) {\n return this.focusElement(hashTarget);\n }\n }\n wasFocusLost() {\n return this.focusCapsule?.wasLost();\n }\n};\n\n\n/***/ }),\n/* 34 */\n/***/ (() => {\n\nconst e = up.element;\nconst u = up.util;\nup.FragmentPolling = class FragmentPolling {\n constructor(fragment) {\n this.options = {};\n this.state = 'initialized';\n this.setFragment(fragment);\n }\n static forFragment(fragment) {\n return fragment.upPolling || (fragment.upPolling = new this(fragment));\n }\n onPollAttributeObserved() {\n this.start();\n }\n onFragmentDestroyed() {\n this.stop();\n }\n start() {\n if (this.state !== 'started') {\n this.state = 'started';\n this.scheduleReload();\n }\n }\n stop() {\n if (this.state === 'started') {\n clearTimeout(this.reloadTimer);\n this.state = 'stopped';\n }\n }\n forceStart(options) {\n u.assign(this.options, options);\n this.forceStarted = true;\n this.start();\n }\n forceStop() {\n this.stop();\n this.forceStarted = false;\n }\n scheduleReload(delay = this.getInterval()) {\n this.reloadTimer = setTimeout(() => this.reload(), delay);\n }\n reload() {\n if (this.state !== 'started') {\n return;\n }\n if (up.radio.shouldPoll(this.fragment)) {\n let reloadOptions = {\n url: this.options.url,\n guardEvent: up.event.build('up:fragment:poll', { log: 'Polling fragment' })\n };\n u.always(up.reload(this.fragment, reloadOptions), (result) => this.onReloaded(result));\n }\n else {\n up.puts('[up-poll]', 'Polling is disabled');\n let reconsiderDisabledDelay = Math.min(10 * 1000, this.getInterval());\n this.scheduleReload(reconsiderDisabledDelay);\n }\n }\n onReloaded(result) {\n let newFragment = result?.fragments?.[0];\n if (newFragment) {\n this.onFragmentSwapped(newFragment);\n }\n else {\n this.scheduleReload();\n }\n }\n onFragmentSwapped(newFragment) {\n newFragment.upPolling = this;\n delete this.fragment.upPolling;\n this.setFragment(newFragment);\n if (this.state === 'stopped' && this.forceStarted) {\n this.start();\n }\n }\n setFragment(newFragment) {\n this.fragment = newFragment;\n up.destructor(newFragment, () => this.onFragmentDestroyed());\n }\n getInterval() {\n return this.options.interval ?? e.numberAttr(this.fragment, 'up-interval') ?? up.radio.config.pollInterval;\n }\n};\n\n\n/***/ }),\n/* 35 */\n/***/ (() => {\n\nconst u = up.util;\nup.FragmentScrolling = class FragmentScrolling extends up.FragmentProcessor {\n keys() {\n return super.keys().concat([\n 'hash',\n 'mode',\n 'revealTop',\n 'revealMax',\n 'revealSnap',\n 'scrollBehavior',\n 'scrollSpeed'\n ]);\n }\n constructor(options) {\n up.migrate.handleScrollOptions?.(options);\n super(options);\n }\n process(opt) {\n return super.process(opt) || Promise.resolve();\n }\n processPrimitive(opt) {\n switch (opt) {\n case 'reset':\n return this.reset();\n case 'layer':\n return this.revealLayer();\n case 'main':\n return this.revealSelector(':main');\n case 'restore':\n return this.restore();\n case 'hash':\n return this.hash && up.viewport.revealHash(this.hash, this.attributes());\n case 'target':\n case 'reveal':\n case true:\n return this.revealElement(this.fragment);\n default:\n if (u.isString(opt)) {\n return this.revealSelector(opt);\n }\n }\n }\n processElement(element) {\n return this.revealElement(element);\n }\n revealElement(element) {\n return up.reveal(element, this.attributes());\n }\n revealSelector(selector) {\n let match = this.findSelector(selector);\n if (match) {\n return this.revealElement(match);\n }\n }\n revealLayer() {\n return this.revealElement(this.layer.getBoxElement());\n }\n reset() {\n return up.viewport.resetScroll({ ...this.attributes(), around: this.fragment });\n }\n restore() {\n return up.viewport.restoreScroll({ ...this.attributes(), around: this.fragment });\n }\n};\n\n\n/***/ }),\n/* 36 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.HTMLWrapper = class HTMLWrapper {\n constructor(tagName) {\n this.tagName = tagName;\n const openTag = `<${this.tagName}[^>]*>`;\n const closeTag = ``;\n const innerHTML = \"(.|\\\\s)*?\";\n this.pattern = new RegExp(openTag + innerHTML + closeTag, 'ig');\n this.attrName = `up-wrapped-${this.tagName}`;\n }\n strip(html) {\n return html.replace(this.pattern, '');\n }\n wrap(html) {\n return html.replace(this.pattern, this.wrapMatch.bind(this));\n }\n wrapMatch(match) {\n this.didWrap = true;\n return '';\n }\n unwrap(element) {\n if (!this.didWrap) {\n return;\n }\n for (let wrappedChild of element.querySelectorAll(`meta[name='${this.attrName}']`)) {\n const originalHTML = wrappedChild.getAttribute('value');\n const restoredElement = e.createFromHTML(originalHTML);\n e.replace(wrappedChild, restoredElement);\n }\n }\n};\n\n\n/***/ }),\n/* 37 */\n/***/ (() => {\n\nconst e = up.element;\nconst u = up.util;\nup.Layer = class Layer extends up.Record {\n keys() {\n return [\n 'element',\n 'stack',\n 'history',\n 'mode',\n 'context',\n 'lastScrollTops'\n ];\n }\n defaults() {\n return {\n context: {},\n lastScrollTops: new up.Cache({ size: 30, key: up.history.normalizeURL })\n };\n }\n constructor(options = {}) {\n super(options);\n if (!this.mode) {\n throw \"missing { mode } option\";\n }\n }\n setupHandlers() {\n up.link.convertClicks(this);\n }\n teardownHandlers() { }\n mainTargets() {\n return up.layer.mainTargets(this.mode);\n }\n sync() {\n }\n accept() {\n throw up.error.notImplemented();\n }\n dismiss() {\n throw up.error.notImplemented();\n }\n peel(options) {\n this.stack.peel(this, options);\n }\n evalOption(option) {\n return u.evalOption(option, this);\n }\n isCurrent() {\n return this.stack.isCurrent(this);\n }\n isFront() {\n return this.stack.isFront(this);\n }\n isRoot() {\n return this.stack.isRoot(this);\n }\n isOverlay() {\n return this.stack.isOverlay(this);\n }\n isOpen() {\n return this.stack.isOpen(this);\n }\n isClosed() {\n return this.stack.isClosed(this);\n }\n get parent() {\n return this.stack.parentOf(this);\n }\n get child() {\n return this.stack.childOf(this);\n }\n get ancestors() {\n return this.stack.ancestorsOf(this);\n }\n get descendants() {\n return this.stack.descendantsOf(this);\n }\n get index() {\n return this.stack.indexOf(this);\n }\n getContentElement() {\n return this.contentElement || this.element;\n }\n getBoxElement() {\n return this.boxElement || this.element;\n }\n getFocusElement() {\n return this.getBoxElement();\n }\n getFirstSwappableElement() {\n throw up.error.notImplemented();\n }\n contains(element) {\n return e.closest(element, up.layer.anySelector()) === this.element;\n }\n on(...args) {\n return this.buildEventListenerGroup(args).bind();\n }\n off(...args) {\n return this.buildEventListenerGroup(args).unbind();\n }\n buildEventListenerGroup(args) {\n return up.EventListenerGroup.fromBindArgs(args, {\n guard: (event) => this.containsEventTarget(event),\n elements: [this.element],\n baseLayer: this\n });\n }\n containsEventTarget(event) {\n return this.contains(event.target);\n }\n wasHitByMouseEvent(event) {\n const hittableElement = document.elementFromPoint(event.clientX, event.clientY);\n return !hittableElement || this.contains(hittableElement);\n }\n buildEventEmitter(args) {\n return up.EventEmitter.fromEmitArgs(args, { layer: this });\n }\n emit(...args) {\n return this.buildEventEmitter(args).emit();\n }\n isDetached() {\n return e.isDetached(this.element);\n }\n saveHistory() {\n if (this.isHistoryVisible()) {\n this.savedTitle = document.title;\n this.savedLocation = up.history.location;\n }\n }\n restoreHistory() {\n if (!this.showsLiveHistory()) {\n return;\n }\n if (this.savedLocation) {\n up.history.push(this.savedLocation);\n }\n if (this.savedTitle) {\n document.title = this.savedTitle;\n }\n }\n asCurrent(fn) {\n return this.stack.asCurrent(this, fn);\n }\n updateHistory(options) {\n if (u.isString(options.location)) {\n this.location = options.location;\n }\n if (u.isString(options.title)) {\n this.title = options.title;\n }\n }\n isHistoryVisible() {\n return this.history && (this.isRoot() || this.parent.isHistoryVisible());\n }\n showsLiveHistory() {\n return this.isHistoryVisible() && this.isFront() && (up.history.config.enabled || this.isRoot());\n }\n get title() {\n if (this.showsLiveHistory()) {\n return document.title;\n }\n else {\n return this.savedTitle;\n }\n }\n set title(title) {\n this.savedTitle = title;\n if (this.showsLiveHistory()) {\n document.title = title;\n }\n }\n get location() {\n if (this.showsLiveHistory()) {\n return up.history.location;\n }\n else {\n return this.savedLocation;\n }\n }\n set location(location) {\n const previousLocation = this.location;\n location = up.history.normalizeURL(location);\n if (previousLocation !== location) {\n this.savedLocation = location;\n this.emit('up:layer:location:changed', { location, log: false });\n if (this.showsLiveHistory()) {\n up.history.push(location);\n }\n }\n }\n selector(part) {\n return this.constructor.selector(part);\n }\n static selector(_part) {\n throw up.error.notImplemented();\n }\n toString() {\n throw up.error.notImplemented();\n }\n affix(...args) {\n return e.affix(this.getFirstSwappableElement(), ...args);\n }\n [u.isEqual.key](other) {\n return (this.constructor === other.constructor) && (this.element === other.element);\n }\n};\n\n\n/***/ }),\n/* 38 */\n/***/ (() => {\n\nconst e = up.element;\nconst u = up.util;\nup.Layer.Overlay = class Overlay extends up.Layer {\n keys() {\n return super.keys().concat([\n 'position',\n 'align',\n 'size',\n 'origin',\n 'class',\n 'backdrop',\n 'openAnimation',\n 'closeAnimation',\n 'openDuration',\n 'closeDuration',\n 'openEasing',\n 'closeEasing',\n 'backdropOpenAnimation',\n 'backdropCloseAnimation',\n 'dismissable',\n 'dismissLabel',\n 'dismissAriaLabel',\n 'onOpened',\n 'onAccept',\n 'onAccepted',\n 'onDismiss',\n 'onDismissed',\n 'acceptEvent',\n 'dismissEvent',\n 'acceptLocation',\n 'dismissLocation',\n 'opening'\n ]);\n }\n constructor(options) {\n super(options);\n if (this.dismissable === true) {\n this.dismissable = ['button', 'key', 'outside'];\n }\n else if (this.dismissable === false) {\n this.dismissable = [];\n }\n else {\n this.dismissable = u.splitValues(this.dismissable);\n }\n if (this.acceptLocation) {\n this.acceptLocation = new up.URLPattern(this.acceptLocation);\n }\n if (this.dismissLocation) {\n this.dismissLocation = new up.URLPattern(this.dismissLocation);\n }\n }\n callback(name) {\n let fn = this[name];\n if (fn) {\n return fn.bind(this);\n }\n }\n createElement(parentElement) {\n this.nesting || (this.nesting = this.suggestVisualNesting());\n const elementAttrs = u.compactObject(u.pick(this, ['align', 'position', 'size', 'class', 'nesting']));\n this.element = this.affixPart(parentElement, null, elementAttrs);\n }\n createBackdropElement(parentElement) {\n this.backdropElement = this.affixPart(parentElement, 'backdrop');\n }\n createViewportElement(parentElement) {\n this.viewportElement = this.affixPart(parentElement, 'viewport', { 'up-viewport': '' });\n }\n createBoxElement(parentElement) {\n this.boxElement = this.affixPart(parentElement, 'box');\n }\n createContentElement(parentElement, content) {\n this.contentElement = this.affixPart(parentElement, 'content');\n this.contentElement.appendChild(content);\n }\n createDismissElement(parentElement) {\n this.dismissElement = this.affixPart(parentElement, 'dismiss', {\n 'up-dismiss': '\":button\"',\n 'aria-label': this.dismissAriaLabel\n });\n return e.affix(this.dismissElement, 'span[aria-hidden=\"true\"]', { text: this.dismissLabel });\n }\n affixPart(parentElement, part, options = {}) {\n return e.affix(parentElement, this.selector(part), options);\n }\n static selector(part) {\n return u.compact(['up', this.mode, part]).join('-');\n }\n suggestVisualNesting() {\n const { parent } = this;\n if (this.mode === parent.mode) {\n return 1 + parent.suggestVisualNesting();\n }\n else {\n return 0;\n }\n }\n setupHandlers() {\n super.setupHandlers();\n this.overlayFocus = new up.OverlayFocus(this);\n if (this.supportsDismissMethod('button')) {\n this.createDismissElement(this.getBoxElement());\n }\n if (this.supportsDismissMethod('outside')) {\n if (this.viewportElement) {\n up.on(this.viewportElement, 'up:click', event => {\n if (event.target === this.viewportElement) {\n this.onOutsideClicked(event, true);\n }\n });\n }\n else {\n this.unbindParentClicked = this.parent.on('up:click', (event, element) => {\n const originClicked = this.origin && this.origin.contains(element);\n this.onOutsideClicked(event, originClicked);\n });\n }\n }\n if (this.supportsDismissMethod('key')) {\n this.unbindEscapePressed = up.event.onEscape(event => this.onEscapePressed(event));\n }\n this.registerClickCloser('up-accept', (value, closeOptions) => {\n this.accept(value, closeOptions);\n });\n this.registerClickCloser('up-dismiss', (value, closeOptions) => {\n this.dismiss(value, closeOptions);\n });\n up.migrate.registerLayerCloser?.(this);\n this.registerEventCloser(this.acceptEvent, this.accept);\n this.registerEventCloser(this.dismissEvent, this.dismiss);\n }\n onOutsideClicked(event, halt) {\n if (halt) {\n up.event.halt(event);\n }\n this.dismiss(':outside', { origin: event.target });\n }\n onEscapePressed(event) {\n if (this.isFront()) {\n let field = up.form.focusedField();\n if (field) {\n field.blur();\n }\n else if (this.supportsDismissMethod('key')) {\n up.event.halt(event);\n this.dismiss(':key');\n }\n }\n }\n registerClickCloser(attribute, closeFn) {\n let selector = `[${attribute}]`;\n this.on('up:click', selector, function (event) {\n up.event.halt(event);\n const origin = e.closest(event.target, selector);\n const value = e.jsonAttr(origin, attribute);\n const closeOptions = { origin };\n const parser = new up.OptionsParser(closeOptions, origin);\n parser.booleanOrString('animation');\n parser.string('easing');\n parser.number('duration');\n parser.string('confirm');\n closeFn(value, closeOptions);\n });\n }\n registerEventCloser(eventTypes, closeFn) {\n if (!eventTypes) {\n return;\n }\n return this.on(eventTypes, event => {\n event.preventDefault();\n closeFn.call(this, event);\n });\n }\n tryAcceptForLocation() {\n this.tryCloseForLocation(this.acceptLocation, this.accept);\n }\n tryDismissForLocation() {\n this.tryCloseForLocation(this.dismissLocation, this.dismiss);\n }\n tryCloseForLocation(urlPattern, closeFn) {\n let location, resolution;\n if (urlPattern && (location = this.location) && (resolution = urlPattern.recognize(location))) {\n const closeValue = { ...resolution, location };\n closeFn.call(this, closeValue);\n }\n }\n teardownHandlers() {\n super.teardownHandlers();\n this.unbindParentClicked?.();\n this.unbindEscapePressed?.();\n this.overlayFocus.teardown();\n }\n destroyElements(options) {\n const animation = () => {\n return this.startCloseAnimation(options);\n };\n const onFinished = () => {\n this.onElementsRemoved();\n options.onFinished?.();\n };\n const destroyOptions = { ...options, animation, onFinished, log: false };\n up.destroy(this.element, destroyOptions);\n }\n onElementsRemoved() { }\n startAnimation(options = {}) {\n const boxDone = up.animate(this.getBoxElement(), options.boxAnimation, options);\n let backdropDone;\n if (this.backdrop && !up.motion.isNone(options.boxAnimation)) {\n backdropDone = up.animate(this.backdropElement, options.backdropAnimation, options);\n }\n return Promise.all([boxDone, backdropDone]);\n }\n startOpenAnimation(options = {}) {\n return this.startAnimation({\n boxAnimation: options.animation ?? this.evalOption(this.openAnimation),\n backdropAnimation: 'fade-in',\n easing: options.easing || this.openEasing,\n duration: options.duration || this.openDuration\n }).then(() => {\n return this.wasEverVisible = true;\n });\n }\n startCloseAnimation(options = {}) {\n const boxAnimation = this.wasEverVisible && (options.animation ?? this.evalOption(this.closeAnimation));\n return this.startAnimation({\n boxAnimation,\n backdropAnimation: 'fade-out',\n easing: options.easing || this.closeEasing,\n duration: options.duration || this.closeDuration\n });\n }\n accept(value = null, options = {}) {\n return this.executeCloseChange('accept', value, options);\n }\n dismiss(value = null, options = {}) {\n return this.executeCloseChange('dismiss', value, options);\n }\n supportsDismissMethod(method) {\n return u.contains(this.dismissable, method);\n }\n executeCloseChange(verb, value, options) {\n options = { ...options, verb, value, layer: this };\n return new up.Change.CloseLayer(options).execute();\n }\n getFirstSwappableElement() {\n return this.getContentElement().children[0];\n }\n toString() {\n return `${this.mode} overlay`;\n }\n};\n\n\n/***/ }),\n/* 39 */\n/***/ (() => {\n\nup.Layer.OverlayWithTether = class OverlayWithTether extends up.Layer.Overlay {\n createElements(content) {\n if (!this.origin) {\n up.fail('Missing { origin } option');\n }\n this.tether = new up.Tether({\n anchor: this.origin,\n align: this.align,\n position: this.position\n });\n this.createElement(this.tether.parent);\n this.createContentElement(this.element, content);\n this.tether.start(this.element);\n }\n onElementsRemoved() {\n this.tether.stop();\n }\n sync() {\n if (this.isOpen()) {\n if (this.isDetached() || this.tether.isDetached()) {\n this.dismiss(':detached', {\n animation: false,\n preventable: false\n });\n }\n else {\n this.tether.sync();\n }\n }\n }\n};\n\n\n/***/ }),\n/* 40 */\n/***/ (() => {\n\nvar _a;\nup.Layer.OverlayWithViewport = (_a = class OverlayWithViewport extends up.Layer.Overlay {\n static getParentElement() {\n return document.body;\n }\n createElements(content) {\n this.shiftBody();\n this.createElement(this.constructor.getParentElement());\n if (this.backdrop) {\n this.createBackdropElement(this.element);\n }\n this.createViewportElement(this.element);\n this.createBoxElement(this.viewportElement);\n this.createContentElement(this.boxElement, content);\n }\n onElementsRemoved() {\n this.unshiftBody();\n }\n shiftBody() {\n this.constructor.bodyShifter.shift();\n }\n unshiftBody() {\n this.constructor.bodyShifter.unshift();\n }\n sync() {\n if (this.isDetached() && this.isOpen()) {\n this.constructor.getParentElement().appendChild(this.element);\n }\n }\n },\n _a.bodyShifter = new up.BodyShifter(),\n _a);\n\n\n/***/ }),\n/* 41 */\n/***/ (() => {\n\nvar _a;\nconst u = up.util;\nconst e = up.element;\nup.Layer.Root = (_a = class Root extends up.Layer {\n constructor(options) {\n super(options);\n this.setupHandlers();\n }\n get element() {\n return e.root;\n }\n getFirstSwappableElement() {\n return document.body;\n }\n static selector() {\n return 'html';\n }\n setupHandlers() {\n if (!this.element.upHandlersApplied) {\n this.element.upHandlersApplied = true;\n super.setupHandlers();\n }\n }\n sync() {\n this.setupHandlers();\n }\n accept() {\n this.cannotCloseRoot();\n }\n dismiss() {\n this.cannotCloseRoot();\n }\n cannotCloseRoot() {\n throw up.error.failed('Cannot close the root layer');\n }\n reset() {\n u.assign(this, this.defaults());\n }\n toString() {\n return \"root layer\";\n }\n },\n _a.mode = 'root',\n _a);\n\n\n/***/ }),\n/* 42 */\n/***/ (() => {\n\nvar _a;\nup.Layer.Modal = (_a = class Modal extends up.Layer.OverlayWithViewport {\n },\n _a.mode = 'modal',\n _a);\n\n\n/***/ }),\n/* 43 */\n/***/ (() => {\n\nvar _a;\nup.Layer.Popup = (_a = class Popup extends up.Layer.OverlayWithTether {\n },\n _a.mode = 'popup',\n _a);\n\n\n/***/ }),\n/* 44 */\n/***/ (() => {\n\nvar _a;\nup.Layer.Drawer = (_a = class Drawer extends up.Layer.OverlayWithViewport {\n },\n _a.mode = 'drawer',\n _a);\n\n\n/***/ }),\n/* 45 */\n/***/ (() => {\n\nvar _a;\nup.Layer.Cover = (_a = class Cover extends up.Layer.OverlayWithViewport {\n },\n _a.mode = 'cover',\n _a);\n\n\n/***/ }),\n/* 46 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.LayerLookup = class LayerLookup {\n constructor(stack, ...args) {\n this.stack = stack;\n const options = u.parseArgIntoOptions(args, 'layer');\n if (options.normalizeLayerOptions !== false) {\n up.layer.normalizeOptions(options);\n }\n this.values = u.splitValues(options.layer);\n this.origin = options.origin;\n this.baseLayer = options.baseLayer || this.originLayer() || this.stack.current;\n if (u.isString(this.baseLayer)) {\n const recursiveOptions = { ...options, baseLayer: this.stack.current, normalizeLayerOptions: false };\n this.baseLayer = new this.constructor(this.stack, this.baseLayer, recursiveOptions).first();\n }\n }\n originLayer() {\n if (this.origin) {\n return this.forElement(this.origin);\n }\n }\n first() {\n return this.all()[0];\n }\n all() {\n let results = u.flatMap(this.values, value => this.resolveValue(value));\n results = u.compact(results);\n results = u.uniq(results);\n return results;\n }\n forElement(element) {\n element = e.get(element);\n return u.find(this.stack.reversed(), layer => layer.contains(element));\n }\n forIndex(value) {\n return this.stack[value];\n }\n resolveValue(value) {\n if (value instanceof up.Layer) {\n return value;\n }\n if (u.isNumber(value)) {\n return this.forIndex(value);\n }\n if (/^\\d+$/.test(value)) {\n return this.forIndex(Number(value));\n }\n if (u.isElementish(value)) {\n return this.forElement(value);\n }\n switch (value) {\n case 'any':\n return [this.baseLayer, ...this.stack.reversed()];\n case 'current':\n return this.baseLayer;\n case 'closest':\n return this.stack.selfAndAncestorsOf(this.baseLayer);\n case 'parent':\n return this.baseLayer.parent;\n case 'ancestor':\n case 'ancestors':\n return this.baseLayer.ancestors;\n case 'child':\n return this.baseLayer.child;\n case 'descendant':\n case 'descendants':\n return this.baseLayer.descendants;\n case 'new':\n return 'new';\n case 'root':\n return this.stack.root;\n case 'overlay':\n case 'overlays':\n return u.reverse(this.stack.overlays);\n case 'front':\n return this.stack.front;\n case 'origin':\n return this.originLayer();\n default:\n return up.fail(\"Unknown { layer } option: %o\", value);\n }\n }\n};\n\n\n/***/ }),\n/* 47 */\n/***/ (() => {\n\nconst u = up.util;\nup.LayerStack = class LayerStack extends Array {\n constructor() {\n super();\n Object.setPrototypeOf(this, up.LayerStack.prototype);\n this.currentOverrides = [];\n this.push(this.buildRoot());\n }\n buildRoot() {\n return up.layer.build({ mode: 'root', stack: this });\n }\n remove(layer) {\n u.remove(this, layer);\n }\n peel(layer, options) {\n const descendants = u.reverse(layer.descendants);\n const dismissOptions = { ...options, preventable: false };\n for (let descendant of descendants) {\n descendant.dismiss(':peel', dismissOptions);\n }\n }\n reset() {\n this.peel(this.root, { animation: false });\n this.currentOverrides = [];\n this.root.reset();\n }\n isOpen(layer) {\n return layer.index >= 0;\n }\n isClosed(layer) {\n return !this.isOpen(layer);\n }\n parentOf(layer) {\n return this[layer.index - 1];\n }\n childOf(layer) {\n return this[layer.index + 1];\n }\n ancestorsOf(layer) {\n return u.reverse(this.slice(0, layer.index));\n }\n selfAndAncestorsOf(layer) {\n return [layer, ...layer.ancestors];\n }\n descendantsOf(layer) {\n return this.slice(layer.index + 1);\n }\n isRoot(layer) {\n return this[0] === layer;\n }\n isOverlay(layer) {\n return !this.isRoot(layer);\n }\n isCurrent(layer) {\n return this.current === layer;\n }\n isFront(layer) {\n return this.front === layer;\n }\n get(...args) {\n return this.getAll(...args)[0];\n }\n getAll(...args) {\n return new up.LayerLookup(this, ...args).all();\n }\n sync() {\n for (let layer of this) {\n layer.sync();\n }\n }\n asCurrent(layer, fn) {\n try {\n this.currentOverrides.push(layer);\n return fn();\n }\n finally {\n this.currentOverrides.pop();\n }\n }\n reversed() {\n return u.reverse(this);\n }\n dismissOverlays(value = null, options = {}) {\n options.dismissable = false;\n for (let overlay of u.reverse(this.overlays)) {\n overlay.dismiss(value, options);\n }\n }\n [u.copy.key]() {\n return u.copyArrayLike(this);\n }\n get count() {\n return this.length;\n }\n get root() {\n return this[0];\n }\n get overlays() {\n return this.root.descendants;\n }\n get current() {\n return u.last(this.currentOverrides) || this.front;\n }\n get front() {\n return u.last(this);\n }\n};\n\n\n/***/ }),\n/* 48 */\n/***/ (() => {\n\nup.LinkFeedbackURLs = class LinkFeedbackURLs {\n constructor(link) {\n const normalize = up.feedback.normalizeURL;\n this.isSafe = up.link.isSafe(link);\n if (this.isSafe) {\n const href = link.getAttribute('href');\n if (href && (href !== '#')) {\n this.href = normalize(href);\n }\n const upHREF = link.getAttribute('up-href');\n if (upHREF) {\n this.upHREF = normalize(upHREF);\n }\n const alias = link.getAttribute('up-alias');\n if (alias) {\n this.aliasPattern = new up.URLPattern(alias, normalize);\n }\n }\n }\n isCurrent(normalizedLocation) {\n return this.isSafe && !!((this.href && (this.href === normalizedLocation)) ||\n (this.upHREF && (this.upHREF === normalizedLocation)) ||\n (this.aliasPattern && this.aliasPattern.test(normalizedLocation, false)));\n }\n};\n\n\n/***/ }),\n/* 49 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.LinkPreloader = class LinkPreloader {\n constructor() {\n this.considerPreload = this.considerPreload.bind(this);\n }\n observeLink(link) {\n if (up.link.isSafe(link)) {\n this.on(link, 'mouseenter', event => this.considerPreload(event, true));\n this.on(link, 'mousedown touchstart', event => this.considerPreload(event));\n this.on(link, 'mouseleave', event => this.stopPreload(event));\n }\n }\n on(link, eventTypes, callback) {\n up.on(link, eventTypes, { passive: true }, callback);\n }\n considerPreload(event, applyDelay) {\n const link = event.target;\n if (link !== this.currentLink) {\n this.reset();\n this.currentLink = link;\n if (up.link.shouldFollowEvent(event, link)) {\n if (applyDelay) {\n this.preloadAfterDelay(link);\n }\n else {\n this.preloadNow(link);\n }\n }\n }\n }\n stopPreload(event) {\n if (event.target === this.currentLink) {\n return this.reset();\n }\n }\n reset() {\n if (!this.currentLink) {\n return;\n }\n clearTimeout(this.timer);\n if (this.currentRequest?.preload) {\n this.currentRequest.abort();\n }\n this.currentLink = undefined;\n this.currentRequest = undefined;\n }\n preloadAfterDelay(link) {\n const delay = e.numberAttr(link, 'up-delay') ?? up.link.config.preloadDelay;\n this.timer = u.timer(delay, () => this.preloadNow(link));\n }\n preloadNow(link) {\n if (e.isDetached(link)) {\n this.reset();\n return;\n }\n const onQueued = request => { return this.currentRequest = request; };\n up.log.muteUncriticalRejection(up.link.preload(link, { onQueued }));\n this.queued = true;\n }\n};\n\n\n/***/ }),\n/* 50 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.MotionController = class MotionController {\n constructor(name) {\n this.activeClass = `up-${name}`;\n this.dataKey = `up-${name}-finished`;\n this.selector = `.${this.activeClass}`;\n this.finishEvent = `up:${name}:finish`;\n this.finishCount = 0;\n this.clusterCount = 0;\n }\n async startFunction(cluster, startMotion, memory = {}) {\n cluster = e.list(cluster);\n const mutedAnimator = () => up.log.muteUncriticalRejection(startMotion());\n memory.trackMotion = memory.trackMotion ?? up.motion.isEnabled();\n if (memory.trackMotion === false) {\n await u.microtask(mutedAnimator);\n }\n else {\n memory.trackMotion = false;\n await this.finish(cluster);\n let promise = this.whileForwardingFinishEvent(cluster, mutedAnimator);\n this.markCluster(cluster, promise);\n promise = promise.then(() => this.unmarkCluster(cluster));\n return await promise;\n }\n }\n startMotion(cluster, motion, memory = {}) {\n const start = () => motion.start();\n const finish = () => motion.finish();\n const unbindFinish = up.on(cluster, this.finishEvent, finish);\n let promise = this.startFunction(cluster, start, memory);\n promise = promise.then(unbindFinish);\n return promise;\n }\n finish(elements) {\n this.finishCount++;\n if ((this.clusterCount === 0) || !up.motion.isEnabled()) {\n return Promise.resolve();\n }\n elements = this.expandFinishRequest(elements);\n const allFinished = u.map(elements, this.finishOneElement.bind(this));\n return Promise.all(allFinished);\n }\n expandFinishRequest(elements) {\n if (elements) {\n return u.flatMap(elements, el => e.list(e.closest(el, this.selector), e.all(el, this.selector)));\n }\n else {\n return e.all(this.selector);\n }\n }\n isActive(element) {\n return element.classList.contains(this.activeClass);\n }\n finishOneElement(element) {\n this.emitFinishEvent(element);\n return this.whenElementFinished(element);\n }\n emitFinishEvent(element, eventAttrs = {}) {\n eventAttrs = { target: element, log: false, ...eventAttrs };\n return up.emit(this.finishEvent, eventAttrs);\n }\n whenElementFinished(element) {\n return element[this.dataKey] || Promise.resolve();\n }\n markCluster(cluster, promise) {\n this.clusterCount++;\n for (let element of cluster) {\n element.classList.add(this.activeClass);\n element[this.dataKey] = promise;\n }\n }\n unmarkCluster(cluster) {\n this.clusterCount--;\n for (let element of cluster) {\n element.classList.remove(this.activeClass);\n delete element[this.dataKey];\n }\n }\n whileForwardingFinishEvent(cluster, fn) {\n if (cluster.length < 2) {\n return fn();\n }\n const doForward = (event) => {\n if (!event.forwarded) {\n for (let element of cluster) {\n if (element !== event.target && this.isActive(element)) {\n this.emitFinishEvent(element, { forwarded: true });\n }\n }\n }\n };\n const unbindFinish = up.on(cluster, this.finishEvent, doForward);\n return fn().then(unbindFinish);\n }\n async reset() {\n await this.finish();\n this.finishCount = 0;\n this.clusterCount = 0;\n }\n};\n\n\n/***/ }),\n/* 51 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.NonceableCallback = class NonceableCallback {\n constructor(script, nonce) {\n this.script = script;\n this.nonce = nonce;\n }\n static fromString(string) {\n let match = string.match(/^(nonce-([^\\s]+)\\s)?(.*)$/);\n return new this(match[3], match[2]);\n }\n toFunction(...argNames) {\n if (up.browser.canEval()) {\n return new Function(...argNames, this.script);\n }\n else if (this.nonce) {\n let callbackThis = this;\n return function (...args) {\n return callbackThis.runAsNoncedFunction(this, argNames, args);\n };\n }\n else {\n return this.cannotRun.bind(this);\n }\n }\n toString() {\n return `nonce-${this.nonce} ${this.script}`;\n }\n cannotRun() {\n throw new Error(`Your Content Security Policy disallows inline JavaScript (${this.script}). See https://unpoly.com/csp for solutions.`);\n }\n runAsNoncedFunction(thisArg, argNames, args) {\n let wrappedScript = `\n try {\n up.noncedEval.value = (function(${argNames.join(',')}) {\n ${this.script}\n }).apply(up.noncedEval.thisArg, up.noncedEval.args)\n } catch (error) {\n up.noncedEval.error = error\n }\n `;\n let script;\n try {\n up.noncedEval = { args, thisArg: thisArg };\n script = up.element.affix(document.body, 'script', { nonce: this.nonce, text: wrappedScript });\n if (up.noncedEval.error) {\n throw up.noncedEval.error;\n }\n else {\n return up.noncedEval.value;\n }\n }\n finally {\n up.noncedEval = undefined;\n if (script) {\n up.element.remove(script);\n }\n }\n }\n allowedBy(allowedNonces) {\n return this.nonce && u.contains(allowedNonces, this.nonce);\n }\n static adoptNonces(element, allowedNonces) {\n if (!allowedNonces?.length) {\n return;\n }\n const getPageNonce = u.memoize(up.protocol.cspNonce);\n u.each(up.protocol.config.nonceableAttributes, (attribute) => {\n let matches = e.subtree(element, `[${attribute}^=\"nonce-\"]`);\n u.each(matches, (match) => {\n let attributeValue = match.getAttribute(attribute);\n let callback = this.fromString(attributeValue);\n let warn = (message, ...args) => up.log.warn('up.render()', `Cannot use callback [${attribute}=\"${attributeValue}\"]: ${message}`, ...args);\n if (!callback.allowedBy(allowedNonces)) {\n return warn(\"Callback's CSP nonce (%o) does not match response header (%o)\", callback.nonce, allowedNonces);\n }\n let pageNonce = getPageNonce();\n if (!pageNonce) {\n return warn(\"Current page's CSP nonce is unknown\");\n }\n callback.nonce = pageNonce;\n match.setAttribute(attribute, callback.toString());\n });\n });\n }\n};\n\n\n/***/ }),\n/* 52 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.OptionsParser = class OptionsParser {\n constructor(options, element, parserOptions) {\n this.options = options;\n this.element = element;\n this.fail = parserOptions?.fail;\n }\n string(key, keyOptions) {\n this.parse(e.attr, key, keyOptions);\n }\n boolean(key, keyOptions) {\n this.parse(e.booleanAttr, key, keyOptions);\n }\n number(key, keyOptions) {\n this.parse(e.numberAttr, key, keyOptions);\n }\n booleanOrString(key, keyOptions) {\n this.parse(e.booleanOrStringAttr, key, keyOptions);\n }\n json(key, keyOptions) {\n this.parse(e.jsonAttr, key, keyOptions);\n }\n parse(attrValueFn, key, keyOptions = {}) {\n const attrNames = u.wrapList(keyOptions.attr ?? this.attrNameForKey(key));\n let value = this.options[key];\n if (this.element) {\n for (let attrName of attrNames) {\n value ?? (value = attrValueFn(this.element, attrName));\n }\n }\n value ?? (value = keyOptions.default);\n let normalizeFn = keyOptions.normalize;\n if (normalizeFn) {\n value = normalizeFn(value);\n }\n if (u.isDefined(value)) {\n this.options[key] = value;\n }\n let failKey;\n if ((keyOptions.fail || this.fail) && (failKey = up.fragment.failKey(key))) {\n const failAttrNames = u.compact(u.map(attrNames, this.deriveFailAttrName));\n const failKeyOptions = {\n ...keyOptions,\n attr: failAttrNames,\n fail: false\n };\n this.parse(attrValueFn, failKey, failKeyOptions);\n }\n }\n deriveFailAttrName(attr) {\n if (attr.indexOf('up-') === 0) {\n return `up-fail-${attr.slice(3)}`;\n }\n }\n attrNameForKey(option) {\n return `up-${u.camelToKebabCase(option)}`;\n }\n};\n\n\n/***/ }),\n/* 53 */\n/***/ (() => {\n\nconst e = up.element;\nconst u = up.util;\nup.OverlayFocus = class OverlayFocus {\n constructor(layer) {\n this.layer = layer;\n this.focusElement = this.layer.getFocusElement();\n }\n moveToFront() {\n if (this.enabled) {\n return;\n }\n this.enabled = true;\n this.untrapFocus = up.on('focusin', event => this.onFocus(event));\n this.unsetAttrs = e.setTemporaryAttrs(this.focusElement, {\n 'tabindex': '0',\n 'role': 'dialog',\n 'aria-modal': 'true'\n });\n this.focusTrapBefore = e.affix(this.focusElement, 'beforebegin', 'up-focus-trap[tabindex=0]');\n this.focusTrapAfter = e.affix(this.focusElement, 'afterend', 'up-focus-trap[tabindex=0]');\n }\n moveToBack() {\n this.teardown();\n }\n teardown() {\n if (!this.enabled) {\n return;\n }\n this.enabled = false;\n this.untrapFocus();\n this.unsetAttrs();\n e.remove(this.focusTrapBefore);\n e.remove(this.focusTrapAfter);\n }\n onFocus(event) {\n const { target } = event;\n if (this.processingFocusEvent) {\n return;\n }\n this.processingFocusEvent = true;\n if (target === this.focusTrapBefore) {\n this.focusEnd();\n }\n else if ((target === this.focusTrapAfter) || !this.layer.contains(target)) {\n this.focusStart();\n }\n this.processingFocusEvent = false;\n }\n focusStart(focusOptions) {\n up.focus(this.focusElement, focusOptions);\n }\n focusEnd() {\n this.focusLastDescendant(this.layer.getBoxElement()) || this.focusStart();\n }\n focusLastDescendant(element) {\n for (let child of u.reverse(element.children)) {\n if (up.viewport.tryFocus(child) || this.focusLastDescendant(child)) {\n return true;\n }\n }\n }\n};\n\n\n/***/ }),\n/* 54 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.Params = class Params {\n constructor(raw) {\n this.clear();\n this.addAll(raw);\n }\n clear() {\n this.entries = [];\n }\n [u.copy.key]() {\n return new up.Params(this);\n }\n toObject() {\n const obj = {};\n for (let entry of this.entries) {\n const { name, value } = entry;\n if (!u.isBasicObjectProperty(name)) {\n if (this.isArrayKey(name)) {\n obj[name] || (obj[name] = []);\n obj[name].push(value);\n }\n else {\n obj[name] = value;\n }\n }\n }\n return obj;\n }\n toArray() {\n return this.entries;\n }\n toFormData() {\n const formData = new FormData();\n for (let entry of this.entries) {\n formData.append(entry.name, entry.value);\n }\n if (!formData.entries) {\n formData.originalArray = this.entries;\n }\n return formData;\n }\n toQuery() {\n let parts = u.map(this.entries, this.arrayEntryToQuery.bind(this));\n parts = u.compact(parts);\n return parts.join('&');\n }\n arrayEntryToQuery(entry) {\n const { value } = entry;\n if (this.isBinaryValue(value)) {\n return;\n }\n let query = encodeURIComponent(entry.name);\n if (u.isGiven(value)) {\n query += \"=\";\n query += encodeURIComponent(value);\n }\n return query;\n }\n isBinaryValue(value) {\n return value instanceof Blob;\n }\n hasBinaryValues() {\n const values = u.map(this.entries, 'value');\n return u.some(values, this.isBinaryValue);\n }\n toURL(base) {\n let parts = [base, this.toQuery()];\n parts = u.filter(parts, u.isPresent);\n const separator = u.contains(base, '?') ? '&' : '?';\n return parts.join(separator);\n }\n add(name, value) {\n this.entries.push({ name, value });\n }\n addAll(raw) {\n if (u.isMissing(raw)) {\n }\n else if (raw instanceof this.constructor) {\n this.entries.push(...raw.entries);\n }\n else if (u.isArray(raw)) {\n this.entries.push(...raw);\n }\n else if (u.isString(raw)) {\n this.addAllFromQuery(raw);\n }\n else if (u.isFormData(raw)) {\n this.addAllFromFormData(raw);\n }\n else if (u.isObject(raw)) {\n this.addAllFromObject(raw);\n }\n else {\n up.fail(\"Unsupport params type: %o\", raw);\n }\n }\n addAllFromObject(object) {\n for (let key in object) {\n const value = object[key];\n const valueElements = u.isArray(value) ? value : [value];\n for (let valueElement of valueElements) {\n this.add(key, valueElement);\n }\n }\n }\n addAllFromQuery(query) {\n for (let part of query.split('&')) {\n if (part) {\n let [name, value] = part.split('=');\n name = decodeURIComponent(name);\n if (u.isGiven(value)) {\n value = decodeURIComponent(value);\n }\n else {\n value = null;\n }\n this.add(name, value);\n }\n }\n }\n addAllFromFormData(formData) {\n u.eachIterator(formData.entries(), value => {\n this.add(...value);\n });\n }\n set(name, value) {\n this.delete(name);\n this.add(name, value);\n }\n delete(name) {\n this.entries = u.reject(this.entries, this.matchEntryFn(name));\n }\n matchEntryFn(name) {\n return entry => entry.name === name;\n }\n get(name) {\n if (this.isArrayKey(name)) {\n return this.getAll(name);\n }\n else {\n return this.getFirst(name);\n }\n }\n getFirst(name) {\n const entry = u.find(this.entries, this.matchEntryFn(name));\n return entry?.value;\n }\n getAll(name) {\n if (this.isArrayKey(name)) {\n return this.getAll(name);\n }\n else {\n const entries = u.map(this.entries, this.matchEntryFn(name));\n return u.map(entries, 'value');\n }\n }\n isArrayKey(key) {\n return u.endsWith(key, '[]');\n }\n [u.isBlank.key]() {\n return this.entries.length === 0;\n }\n static fromForm(form) {\n form = up.fragment.get(form);\n return this.fromFields(up.form.fields(form));\n }\n static fromFields(fields) {\n const params = new (this)();\n for (let field of u.wrapList(fields)) {\n params.addField(field);\n }\n return params;\n }\n addField(field) {\n field = e.get(field);\n let name = field.name;\n if (name && !field.disabled) {\n const { tagName } = field;\n const { type } = field;\n if (tagName === 'SELECT') {\n for (let option of field.querySelectorAll('option')) {\n if (option.selected) {\n this.add(name, option.value);\n }\n }\n }\n else if ((type === 'checkbox') || (type === 'radio')) {\n if (field.checked) {\n this.add(name, field.value);\n }\n }\n else if (type === 'file') {\n for (let file of field.files) {\n this.add(name, file);\n }\n }\n else {\n return this.add(name, field.value);\n }\n }\n }\n [u.isEqual.key](other) {\n return (this.constructor === other.constructor) && u.isEqual(this.entries, other.entries);\n }\n static fromURL(url) {\n const params = new (this)();\n const urlParts = u.parseURL(url);\n let query = urlParts.search;\n if (query) {\n query = query.replace(/^\\?/, '');\n params.addAll(query);\n }\n return params;\n }\n static stripURL(url) {\n return u.normalizeURL(url, { search: false });\n }\n};\n\n\n/***/ }),\n/* 55 */\n/***/ (() => {\n\nconst e = up.element;\nconst TRANSITION_DELAY = 300;\nup.ProgressBar = class ProgressBar {\n constructor() {\n this.step = 0;\n this.element = e.affix(document.body, 'up-progress-bar');\n this.element.style.transition = `width ${TRANSITION_DELAY}ms ease-out`;\n this.moveTo(0);\n up.element.paint(this.element);\n this.width = 31;\n this.nextStep();\n }\n nextStep() {\n let diff;\n if (this.width < 80) {\n if (Math.random() < 0.15) {\n diff = 7 + (5 * Math.random());\n }\n else {\n diff = 1.5 + (0.5 * Math.random());\n }\n }\n else {\n diff = 0.13 * (100 - this.width) * Math.random();\n }\n this.moveTo(this.width + diff);\n this.step++;\n const nextStepDelay = TRANSITION_DELAY + (this.step * 40);\n this.timeout = setTimeout(this.nextStep.bind(this), nextStepDelay);\n }\n moveTo(width) {\n this.width = width;\n this.element.style.width = `${width}vw`;\n }\n destroy() {\n clearTimeout(this.timeout);\n e.remove(this.element);\n }\n conclude() {\n clearTimeout(this.timeout);\n this.moveTo(100);\n setTimeout(this.destroy.bind(this), TRANSITION_DELAY);\n }\n};\n\n\n/***/ }),\n/* 56 */\n/***/ (() => {\n\nconst u = up.util;\nup.RenderOptions = (function () {\n const GLOBAL_DEFAULTS = {\n hungry: true,\n keep: true,\n source: true,\n saveScroll: true,\n fail: 'auto'\n };\n const PRELOAD_OVERRIDES = {\n solo: false,\n confirm: false,\n feedback: false\n };\n const PREFLIGHT_KEYS = [\n 'url',\n 'method',\n 'origin',\n 'headers',\n 'params',\n 'cache',\n 'clearCache',\n 'fallback',\n 'solo',\n 'confirm',\n 'feedback',\n 'origin',\n 'baseLayer',\n 'fail',\n ];\n const SHARED_KEYS = PREFLIGHT_KEYS.concat([\n 'keep',\n 'hungry',\n 'history',\n 'source',\n 'saveScroll',\n 'navigate'\n ]);\n const CONTENT_KEYS = [\n 'url',\n 'content',\n 'fragment',\n 'document'\n ];\n const LATE_KEYS = [\n 'history',\n 'focus',\n 'scroll'\n ];\n function navigateDefaults(options) {\n if (options.navigate) {\n return up.fragment.config.navigateOptions;\n }\n }\n function preloadOverrides(options) {\n if (options.preload) {\n return PRELOAD_OVERRIDES;\n }\n }\n function preprocess(options) {\n up.migrate.preprocessRenderOptions?.(options);\n const defaults = u.merge(GLOBAL_DEFAULTS, navigateDefaults(options));\n return u.merge(u.omit(defaults, LATE_KEYS), { defaults }, options, preloadOverrides(options));\n }\n function finalize(preprocessedOptions, lateDefaults) {\n return u.merge(preprocessedOptions.defaults, lateDefaults, preprocessedOptions);\n }\n function assertContentGiven(options) {\n if (!u.some(CONTENT_KEYS, contentKey => u.isGiven(options[contentKey]))) {\n if (options.defaultToEmptyContent) {\n options.content = '';\n }\n else {\n up.fail('up.render() needs either { ' + CONTENT_KEYS.join(', ') + ' } option');\n }\n }\n }\n function failOverrides(options) {\n const overrides = {};\n for (let key in options) {\n const value = options[key];\n let unprefixed = up.fragment.successKey(key);\n if (unprefixed) {\n overrides[unprefixed] = value;\n }\n }\n return overrides;\n }\n function deriveFailOptions(preprocessedOptions) {\n return u.merge(preprocessedOptions.defaults, u.pick(preprocessedOptions, SHARED_KEYS), failOverrides(preprocessedOptions));\n }\n return {\n preprocess,\n finalize,\n assertContentGiven,\n deriveFailOptions,\n };\n})();\n\n\n/***/ }),\n/* 57 */\n/***/ (() => {\n\nup.RenderResult = class RenderResult extends up.Record {\n keys() {\n return [\n 'fragments',\n 'layer',\n ];\n }\n};\n\n\n/***/ }),\n/* 58 */\n/***/ (() => {\n\nconst u = up.util;\nup.Request = class Request extends up.Record {\n keys() {\n return [\n 'method',\n 'url',\n 'hash',\n 'params',\n 'target',\n 'failTarget',\n 'headers',\n 'timeout',\n 'preload',\n 'cache',\n 'clearCache',\n 'layer',\n 'mode',\n 'context',\n 'failLayer',\n 'failMode',\n 'failContext',\n 'origin',\n 'solo',\n 'queueTime',\n 'wrapMethod',\n 'contentType',\n 'payload',\n 'onQueued'\n ];\n }\n constructor(options) {\n super(options);\n this.params = new up.Params(this.params);\n this.headers || (this.headers = {});\n if (this.preload) {\n this.cache = true;\n }\n if (this.wrapMethod == null) {\n this.wrapMethod = up.network.config.wrapMethod;\n }\n this.normalizeForCaching();\n if (!options.basic) {\n const layerLookupOptions = { origin: this.origin };\n this.layer = up.layer.get(this.layer, layerLookupOptions);\n this.failLayer = up.layer.get(this.failLayer || this.layer, layerLookupOptions);\n this.context || (this.context = this.layer.context || {});\n this.failContext || (this.failContext = this.failLayer.context || {});\n this.mode || (this.mode = this.layer.mode);\n this.failMode || (this.failMode = this.failLayer.mode);\n this.deferred = u.newDeferred();\n this.state = 'new';\n }\n }\n get xhr() {\n return this._xhr ?? (this._xhr = new XMLHttpRequest());\n }\n followState(sourceRequest) {\n u.delegate(this, ['deferred', 'state', 'preload'], () => sourceRequest);\n }\n normalizeForCaching() {\n this.method = u.normalizeMethod(this.method);\n this.extractHashFromURL();\n this.transferParamsToURL();\n this.url = u.normalizeURL(this.url);\n }\n evictExpensiveAttrs() {\n u.task(() => {\n this.layer = undefined;\n this.failLayer = undefined;\n return this.origin = undefined;\n });\n }\n extractHashFromURL() {\n let match = this.url?.match(/^([^#]*)(#.+)$/);\n if (match) {\n this.url = match[1];\n return this.hash = match[2];\n }\n }\n transferParamsToURL() {\n if (!this.url || this.allowsPayload() || u.isBlank(this.params)) {\n return;\n }\n this.url = this.params.toURL(this.url);\n this.params.clear();\n }\n isSafe() {\n return up.network.isSafeMethod(this.method);\n }\n allowsPayload() {\n return u.methodAllowsPayload(this.method);\n }\n will302RedirectWithGET() {\n return this.isSafe() || (this.method === 'POST');\n }\n willCache() {\n if (this.cache === 'auto') {\n return up.network.config.autoCache(this);\n }\n else {\n return this.cache;\n }\n }\n runQueuedCallbacks() {\n u.always(this, () => this.evictExpensiveAttrs());\n this.onQueued?.(this);\n }\n load() {\n if (this.state !== 'new') {\n return;\n }\n this.state = 'loading';\n new up.Request.XHRRenderer(this).buildAndSend({\n onload: () => this.onXHRLoad(),\n onerror: () => this.onXHRError(),\n ontimeout: () => this.onXHRTimeout(),\n onabort: () => this.onXHRAbort()\n });\n }\n loadPage() {\n up.network.abort();\n new up.Request.FormRenderer(this).buildAndSubmit();\n }\n onXHRLoad() {\n const response = this.extractResponseFromXHR();\n const log = ['Server responded HTTP %d to %s %s (%d characters)', response.status, this.method, this.url, response.text.length];\n this.emit('up:request:loaded', { request: response.request, response, log });\n this.respondWith(response);\n }\n onXHRError() {\n const log = 'Fatal error during request';\n this.deferred.reject(up.error.failed(log));\n this.emit('up:request:fatal', { log });\n }\n onXHRTimeout() {\n this.setAbortedState('Requested timed out');\n }\n onXHRAbort() {\n this.setAbortedState();\n }\n abort() {\n if (this.setAbortedState() && this._xhr) {\n this._xhr.abort();\n }\n }\n setAbortedState(reason = [\"Request to %s %s was aborted\", this.method, this.url]) {\n if ((this.state !== 'new') && (this.state !== 'loading')) {\n return;\n }\n this.state = 'aborted';\n this.emit('up:request:aborted', { log: reason });\n this.deferred.reject(up.error.aborted(reason));\n return true;\n }\n respondWith(response) {\n if (this.state !== 'loading') {\n return;\n }\n this.state = 'loaded';\n if (response.ok) {\n return this.deferred.resolve(response);\n }\n else {\n return this.deferred.reject(response);\n }\n }\n csrfHeader() {\n return up.protocol.csrfHeader();\n }\n csrfParam() {\n return up.protocol.csrfParam();\n }\n csrfToken() {\n if (!this.isSafe() && !this.isCrossOrigin()) {\n return up.protocol.csrfToken();\n }\n }\n isCrossOrigin() {\n return u.isCrossOrigin(this.url);\n }\n extractResponseFromXHR() {\n const responseAttrs = {\n method: this.method,\n url: this.url,\n request: this,\n xhr: this.xhr,\n text: this.xhr.responseText,\n status: this.xhr.status,\n title: up.protocol.titleFromXHR(this.xhr),\n target: up.protocol.targetFromXHR(this.xhr),\n acceptLayer: up.protocol.acceptLayerFromXHR(this.xhr),\n dismissLayer: up.protocol.dismissLayerFromXHR(this.xhr),\n eventPlans: up.protocol.eventPlansFromXHR(this.xhr),\n context: up.protocol.contextFromXHR(this.xhr),\n clearCache: up.protocol.clearCacheFromXHR(this.xhr)\n };\n let methodFromResponse = up.protocol.methodFromXHR(this.xhr);\n let urlFromResponse = up.protocol.locationFromXHR(this.xhr);\n if (urlFromResponse) {\n if (!methodFromResponse && !u.matchURLs(responseAttrs.url, urlFromResponse)) {\n methodFromResponse = 'GET';\n }\n responseAttrs.url = urlFromResponse;\n }\n if (methodFromResponse) {\n responseAttrs.method = methodFromResponse;\n }\n return new up.Response(responseAttrs);\n }\n cacheKey() {\n return JSON.stringify([\n this.method,\n this.url,\n this.params.toQuery(),\n this.metaProps()\n ]);\n }\n metaProps() {\n const props = {};\n for (let key of u.evalOption(up.network.config.requestMetaKeys, this)) {\n const value = this[key];\n if (u.isGiven(value)) {\n props[key] = value;\n }\n }\n return props;\n }\n buildEventEmitter(args) {\n return up.EventEmitter.fromEmitArgs(args, {\n layer: this.layer,\n request: this,\n origin: this.origin\n });\n }\n emit(...args) {\n return this.buildEventEmitter(args).emit();\n }\n assertEmitted(...args) {\n this.buildEventEmitter(args).assertEmitted();\n }\n get description() {\n return this.method + ' ' + this.url;\n }\n};\nu.delegate(up.Request.prototype, ['then', 'catch', 'finally'], function () { return this.deferred; });\nup.Request.tester = function (condition) {\n if (u.isFunction(condition)) {\n return condition;\n }\n else if (condition instanceof this) {\n return (request) => condition === request;\n }\n else if (u.isString(condition)) {\n let pattern = new up.URLPattern(condition);\n return (request) => pattern.test(request.url);\n }\n else {\n return (_request) => condition;\n }\n};\n\n\n/***/ }),\n/* 59 */\n/***/ (() => {\n\nlet u = up.util;\nup.Request.Cache = class Cache extends up.Cache {\n maxSize() {\n return up.network.config.cacheSize;\n }\n expiryMillis() {\n return up.network.config.cacheExpiry;\n }\n normalizeStoreKey(request) {\n return u.wrapValue(up.Request, request).cacheKey();\n }\n clear(condition = true) {\n let tester = up.Request.tester(condition);\n this.each((key, request) => {\n if (tester(request)) {\n this.store.remove(key);\n }\n });\n }\n};\n\n\n/***/ }),\n/* 60 */\n/***/ (() => {\n\nconst u = up.util;\nup.Request.Queue = class Queue {\n constructor(options = {}) {\n this.concurrency = options.concurrency ?? (() => up.network.config.concurrency);\n this.badResponseTime = options.badResponseTime ?? (() => up.network.config.badResponseTime);\n this.reset();\n }\n reset() {\n this.queuedRequests = [];\n this.currentRequests = [];\n clearTimeout(this.checkSlowTimout);\n this.emittedSlow = false;\n }\n get allRequests() {\n return this.currentRequests.concat(this.queuedRequests);\n }\n asap(request) {\n request.runQueuedCallbacks();\n u.always(request, responseOrError => this.onRequestSettled(request, responseOrError));\n request.queueTime = new Date();\n this.setSlowTimer();\n if (this.hasConcurrencyLeft()) {\n this.sendRequestNow(request);\n }\n else {\n this.queueRequest(request);\n }\n }\n promoteToForeground(request) {\n if (request.preload) {\n request.preload = false;\n return this.setSlowTimer();\n }\n }\n setSlowTimer() {\n const badResponseTime = u.evalOption(this.badResponseTime);\n this.checkSlowTimout = u.timer(badResponseTime, () => this.checkSlow());\n }\n hasConcurrencyLeft() {\n const maxConcurrency = u.evalOption(this.concurrency);\n return (maxConcurrency === -1) || (this.currentRequests.length < maxConcurrency);\n }\n isBusy() {\n return this.currentRequests.length > 0;\n }\n queueRequest(request) {\n this.queuedRequests.push(request);\n }\n pluckNextRequest() {\n let request = u.find(this.queuedRequests, request => !request.preload);\n request || (request = this.queuedRequests[0]);\n return u.remove(this.queuedRequests, request);\n }\n sendRequestNow(request) {\n if (request.emit('up:request:load', { log: ['Loading %s %s', request.method, request.url] }).defaultPrevented) {\n request.abort('Prevented by event listener');\n }\n else {\n request.normalizeForCaching();\n this.currentRequests.push(request);\n request.load();\n }\n }\n onRequestSettled(request, responseOrError) {\n u.remove(this.currentRequests, request);\n if ((responseOrError instanceof up.Response) && responseOrError.ok) {\n up.network.registerAliasForRedirect(request, responseOrError);\n }\n this.checkSlow();\n u.microtask(() => this.poke());\n }\n poke() {\n let request;\n if (this.hasConcurrencyLeft() && (request = this.pluckNextRequest())) {\n return this.sendRequestNow(request);\n }\n }\n abort(conditions = true) {\n let tester = up.Request.tester(conditions);\n for (let list of [this.currentRequests, this.queuedRequests]) {\n const abortableRequests = u.filter(list, tester);\n abortableRequests.forEach(function (abortableRequest) {\n abortableRequest.abort();\n u.remove(list, abortableRequest);\n });\n }\n }\n abortExcept(excusedRequest, additionalConditions = true) {\n const excusedCacheKey = excusedRequest.cacheKey();\n this.abort(queuedRequest => (queuedRequest.cacheKey() !== excusedCacheKey) && u.evalOption(additionalConditions, queuedRequest));\n }\n checkSlow() {\n const currentSlow = this.isSlow();\n if (this.emittedSlow !== currentSlow) {\n this.emittedSlow = currentSlow;\n if (currentSlow) {\n up.emit('up:request:late', { log: 'Server is slow to respond' });\n }\n else {\n up.emit('up:request:recover', { log: 'Slow requests were loaded' });\n }\n }\n }\n isSlow() {\n const now = new Date();\n const delay = u.evalOption(this.badResponseTime);\n const allForegroundRequests = u.reject(this.allRequests, 'preload');\n const timerTolerance = 1;\n return u.some(allForegroundRequests, request => (now - request.queueTime) >= (delay - timerTolerance));\n }\n};\n\n\n/***/ }),\n/* 61 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nconst HTML_FORM_METHODS = ['GET', 'POST'];\nup.Request.FormRenderer = class FormRenderer {\n constructor(request) {\n this.request = request;\n }\n buildAndSubmit() {\n this.params = u.copy(this.request.params);\n let action = this.request.url;\n let { method } = this.request;\n const paramsFromQuery = up.Params.fromURL(action);\n this.params.addAll(paramsFromQuery);\n action = up.Params.stripURL(action);\n if (!u.contains(HTML_FORM_METHODS, method)) {\n method = up.protocol.wrapMethod(method, this.params);\n }\n this.form = e.affix(document.body, 'form.up-request-loader', { method, action });\n let contentType = this.request.contentType;\n if (contentType) {\n this.form.setAttribute('enctype', contentType);\n }\n let csrfParam, csrfToken;\n if ((csrfParam = this.request.csrfParam()) && (csrfToken = this.request.csrfToken())) {\n this.params.add(csrfParam, csrfToken);\n }\n u.each(this.params.toArray(), this.addField.bind(this));\n up.browser.submitForm(this.form);\n }\n addField(attrs) {\n e.affix(this.form, 'input[type=hidden]', attrs);\n }\n};\n\n\n/***/ }),\n/* 62 */\n/***/ (() => {\n\nconst CONTENT_TYPE_URL_ENCODED = 'application/x-www-form-urlencoded';\nconst CONTENT_TYPE_FORM_DATA = 'multipart/form-data';\nconst u = up.util;\nup.Request.XHRRenderer = class XHRRenderer {\n constructor(request) {\n this.request = request;\n }\n buildAndSend(handlers) {\n const xhr = this.request.xhr;\n this.params = u.copy(this.request.params);\n if (this.request.timeout) {\n xhr.timeout = this.request.timeout;\n }\n xhr.open(this.getMethod(), this.request.url);\n const metaProps = this.request.metaProps();\n for (let key in metaProps) {\n this.addHeader(xhr, up.protocol.headerize(key), metaProps[key]);\n }\n for (let header in this.request.headers) {\n this.addHeader(xhr, header, this.request.headers[header]);\n }\n let csrfHeader, csrfToken;\n if ((csrfHeader = this.request.csrfHeader()) && (csrfToken = this.request.csrfToken())) {\n this.addHeader(xhr, csrfHeader, csrfToken);\n }\n this.addHeader(xhr, up.protocol.headerize('version'), up.version);\n let contentType = this.getContentType();\n if (contentType) {\n this.addHeader(xhr, 'Content-Type', contentType);\n }\n u.assign(xhr, handlers);\n xhr.send(this.getPayload());\n }\n getMethod() {\n if (!this.method) {\n this.method = this.request.method;\n if (this.request.wrapMethod && !this.request.will302RedirectWithGET()) {\n this.method = up.protocol.wrapMethod(this.method, this.params);\n }\n }\n return this.method;\n }\n getContentType() {\n this.finalizePayload();\n return this.contentType;\n }\n getPayload() {\n this.finalizePayload();\n return this.payload;\n }\n addHeader(xhr, header, value) {\n if (u.isOptions(value) || u.isArray(value)) {\n value = JSON.stringify(value);\n }\n xhr.setRequestHeader(header, value);\n }\n finalizePayload() {\n if (this.payloadFinalized) {\n return;\n }\n this.payloadFinalized = true;\n this.payload = this.request.payload;\n this.contentType = this.request.contentType;\n if (!this.payload && this.request.allowsPayload()) {\n if (!this.contentType) {\n this.contentType = this.params.hasBinaryValues() ? CONTENT_TYPE_FORM_DATA : CONTENT_TYPE_URL_ENCODED;\n }\n if (this.contentType === CONTENT_TYPE_FORM_DATA) {\n this.contentType = null;\n this.payload = this.params.toFormData();\n }\n else {\n this.payload = this.params.toQuery().replace(/%20/g, '+');\n }\n }\n }\n};\n\n\n/***/ }),\n/* 63 */\n/***/ (() => {\n\nup.Response = class Response extends up.Record {\n keys() {\n return [\n 'method',\n 'url',\n 'text',\n 'status',\n 'request',\n 'xhr',\n 'target',\n 'title',\n 'acceptLayer',\n 'dismissLayer',\n 'eventPlans',\n 'context',\n 'clearCache',\n 'headers'\n ];\n }\n defaults() {\n return { headers: {} };\n }\n get ok() {\n return this.status && ((this.status >= 200) && (this.status <= 299));\n }\n getHeader(name) {\n return this.headers[name] || this.xhr?.getResponseHeader(name);\n }\n get contentType() {\n return this.getHeader('Content-Type');\n }\n get cspNonces() {\n return up.protocol.cspNoncesFromHeader(this.getHeader('Content-Security-Policy'));\n }\n get json() {\n return this.parsedJSON || (this.parsedJSON = JSON.parse(this.text));\n }\n};\n\n\n/***/ }),\n/* 64 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.ResponseDoc = class ResponseDoc {\n constructor(options) {\n this.noscriptWrapper = new up.HTMLWrapper('noscript');\n this.scriptWrapper = new up.HTMLWrapper('script');\n this.root =\n this.parseDocument(options) ||\n this.parseFragment(options) ||\n this.parseContent(options);\n this.cspNonces = options.cspNonces;\n }\n parseDocument(options) {\n return this.parse(options.document, e.createDocumentFromHTML);\n }\n parseContent(options) {\n let content = options.content || '';\n const target = options.target || up.fail(\"must pass a { target } when passing { content }\");\n const matchingElement = e.createFromSelector(target);\n if (u.isString(content)) {\n content = this.wrapHTML(content);\n matchingElement.innerHTML = content;\n }\n else {\n matchingElement.appendChild(content);\n }\n return matchingElement;\n }\n parseFragment(options) {\n return this.parse(options.fragment);\n }\n parse(value, parseFn = e.createFromHTML) {\n if (u.isString(value)) {\n value = this.wrapHTML(value);\n value = parseFn(value);\n }\n return value;\n }\n rootSelector() {\n return up.fragment.toTarget(this.root);\n }\n wrapHTML(html) {\n html = this.noscriptWrapper.wrap(html);\n if (up.fragment.config.runScripts) {\n html = this.scriptWrapper.wrap(html);\n }\n else {\n html = this.scriptWrapper.strip(html);\n }\n return html;\n }\n getTitle() {\n if (!this.titleParsed) {\n this.title = this.root.querySelector(\"head title\")?.textContent;\n this.titleParsed = true;\n }\n return this.title;\n }\n select(selector) {\n return up.fragment.subtree(this.root, selector, { layer: 'any' })[0];\n }\n finalizeElement(element) {\n this.noscriptWrapper.unwrap(element);\n up.NonceableCallback.adoptNonces(element, this.cspNonces);\n this.scriptWrapper.unwrap(element);\n }\n};\n\n\n/***/ }),\n/* 65 */\n/***/ (() => {\n\nconst e = up.element;\nconst u = up.util;\nup.RevealMotion = class RevealMotion {\n constructor(element, options = {}) {\n this.element = element;\n this.options = options;\n const viewportConfig = up.viewport.config;\n this.viewport = e.get(this.options.viewport) || up.viewport.get(this.element);\n this.obstructionsLayer = up.layer.get(this.viewport);\n this.snap = this.options.snap ?? this.options.revealSnap ?? viewportConfig.revealSnap;\n this.padding = this.options.padding ?? this.options.revealPadding ?? viewportConfig.revealPadding;\n this.top = this.options.top ?? this.options.revealTop ?? viewportConfig.revealTop;\n this.max = this.options.max ?? this.options.revealMax ?? viewportConfig.revealMax;\n this.topObstructions = viewportConfig.fixedTop;\n this.bottomObstructions = viewportConfig.fixedBottom;\n }\n start() {\n const viewportRect = this.getViewportRect(this.viewport);\n const elementRect = up.Rect.fromElement(this.element);\n if (this.max) {\n const maxPixels = u.evalOption(this.max, this.element);\n elementRect.height = Math.min(elementRect.height, maxPixels);\n }\n this.addPadding(elementRect);\n this.substractObstructions(viewportRect);\n if (viewportRect.height < 0) {\n return up.error.failed.async('Viewport has no visible area');\n }\n const originalScrollTop = this.viewport.scrollTop;\n let newScrollTop = originalScrollTop;\n if (this.top || (elementRect.height > viewportRect.height)) {\n const diff = elementRect.top - viewportRect.top;\n newScrollTop += diff;\n }\n else if (elementRect.top < viewportRect.top) {\n newScrollTop -= (viewportRect.top - elementRect.top);\n }\n else if (elementRect.bottom > viewportRect.bottom) {\n newScrollTop += (elementRect.bottom - viewportRect.bottom);\n }\n else {\n }\n if (u.isNumber(this.snap) && (newScrollTop < this.snap) && (elementRect.top < (0.5 * viewportRect.height))) {\n newScrollTop = 0;\n }\n if (newScrollTop !== originalScrollTop) {\n return this.scrollTo(newScrollTop);\n }\n else {\n return Promise.resolve();\n }\n }\n scrollTo(newScrollTop) {\n this.scrollMotion = new up.ScrollMotion(this.viewport, newScrollTop, this.options);\n return this.scrollMotion.start();\n }\n getViewportRect() {\n if (up.viewport.isRoot(this.viewport)) {\n return new up.Rect({\n left: 0,\n top: 0,\n width: up.viewport.rootWidth(),\n height: up.viewport.rootHeight()\n });\n }\n else {\n return up.Rect.fromElement(this.viewport);\n }\n }\n addPadding(elementRect) {\n elementRect.top -= this.padding;\n elementRect.height += 2 * this.padding;\n }\n selectObstructions(selectors) {\n let elements = up.fragment.all(selectors.join(','), { layer: this.obstructionsLayer });\n return u.filter(elements, e.isVisible);\n }\n substractObstructions(viewportRect) {\n for (let obstruction of this.selectObstructions(this.topObstructions)) {\n let obstructionRect = up.Rect.fromElement(obstruction);\n let diff = obstructionRect.bottom - viewportRect.top;\n if (diff > 0) {\n viewportRect.top += diff;\n viewportRect.height -= diff;\n }\n }\n for (let obstruction of this.selectObstructions(this.bottomObstructions)) {\n let obstructionRect = up.Rect.fromElement(obstruction);\n let diff = viewportRect.bottom - obstructionRect.top;\n if (diff > 0) {\n viewportRect.height -= diff;\n }\n }\n }\n finish() {\n this.scrollMotion?.finish();\n }\n};\n\n\n/***/ }),\n/* 66 */\n/***/ (() => {\n\nconst u = up.util;\nconst SPEED_CALIBRATION = 0.065;\nup.ScrollMotion = class ScrollMotion {\n constructor(scrollable, targetTop, options = {}) {\n this.scrollable = scrollable;\n this.targetTop = targetTop;\n this.behavior = options.behavior ?? options.scrollBehavior ?? 'auto';\n this.speed = (options.speed ?? options.scrollSpeed ?? up.viewport.config.scrollSpeed) * SPEED_CALIBRATION;\n }\n start() {\n return new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n if ((this.behavior === 'smooth') && up.motion.isEnabled()) {\n this.startAnimation();\n }\n else {\n this.finish();\n }\n });\n }\n startAnimation() {\n this.startTime = Date.now();\n this.startTop = this.scrollable.scrollTop;\n this.topDiff = this.targetTop - this.startTop;\n this.duration = Math.sqrt(Math.abs(this.topDiff)) / this.speed;\n requestAnimationFrame(() => this.animationFrame());\n }\n animationFrame() {\n if (this.settled) {\n return;\n }\n const currentTime = Date.now();\n const timeElapsed = currentTime - this.startTime;\n const timeFraction = Math.min(timeElapsed / this.duration, 1);\n this.frameTop = this.startTop + (u.simpleEase(timeFraction) * this.topDiff);\n if (Math.abs(this.targetTop - this.frameTop) < 0.3) {\n this.finish();\n }\n else {\n this.scrollable.scrollTop = this.frameTop;\n requestAnimationFrame(() => this.animationFrame());\n }\n }\n abort(reason) {\n this.settled = true;\n this.reject(up.error.aborted(reason));\n }\n finish() {\n this.settled = true;\n this.scrollable.scrollTop = this.targetTop;\n this.resolve();\n }\n};\n\n\n/***/ }),\n/* 67 */\n/***/ (() => {\n\nconst e = up.element;\nconst u = up.util;\nup.Selector = class Selector {\n constructor(selectors, filters = []) {\n this.selectors = selectors;\n this.filters = filters;\n this.unionSelector = this.selectors.join(',') || 'match-none';\n }\n matches(element) {\n return e.matches(element, this.unionSelector) && this.passesFilter(element);\n }\n closest(element) {\n let parentElement;\n if (this.matches(element)) {\n return element;\n }\n else if (parentElement = element.parentElement) {\n return this.closest(parentElement);\n }\n }\n passesFilter(element) {\n return u.every(this.filters, filter => filter(element));\n }\n descendants(root) {\n const results = u.flatMap(this.selectors, selector => e.all(root, selector));\n return u.filter(results, element => this.passesFilter(element));\n }\n subtree(root) {\n const results = [];\n if (this.matches(root)) {\n results.push(root);\n }\n results.push(...this.descendants(root));\n return results;\n }\n};\n\n\n/***/ }),\n/* 68 */\n/***/ (() => {\n\nconst u = up.util;\nup.store || (up.store = {});\nup.store.Memory = class Memory {\n constructor() {\n this.data = {};\n }\n clear() {\n this.data = {};\n }\n get(key) {\n return this.data[key];\n }\n set(key, value) {\n this.data[key] = value;\n }\n remove(key) {\n delete this.data[key];\n }\n keys() {\n return Object.keys(this.data);\n }\n size() {\n return this.keys().length;\n }\n values() {\n return u.values(this.data);\n }\n};\n\n\n/***/ }),\n/* 69 */\n/***/ (() => {\n\nup.store.Session = class Session extends up.store.Memory {\n constructor(rootKey) {\n super();\n this.rootKey = rootKey;\n this.loadFromSessionStorage();\n }\n clear() {\n super.clear();\n this.saveToSessionStorage();\n }\n set(key, value) {\n super.set(key, value);\n this.saveToSessionStorage();\n }\n remove(key) {\n super.remove(key);\n this.saveToSessionStorage();\n }\n loadFromSessionStorage() {\n try {\n let raw = sessionStorage?.getItem(this.rootKey);\n if (raw) {\n this.data = JSON.parse(raw);\n }\n }\n catch (error) {\n }\n }\n saveToSessionStorage() {\n const json = JSON.stringify(this.data);\n try {\n return sessionStorage?.setItem(this.rootKey, json);\n }\n catch (error) {\n }\n }\n};\n\n\n/***/ }),\n/* 70 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.Tether = class Tether {\n constructor(options) {\n up.migrate.handleTetherOptions?.(options);\n this.anchor = options.anchor;\n this.align = options.align;\n this.position = options.position;\n this.alignAxis = (this.position === 'top') || (this.position === 'bottom') ? 'horizontal' : 'vertical';\n this.viewport = up.viewport.get(this.anchor);\n this.parent = this.viewport === e.root ? document.body : this.viewport;\n this.syncOnScroll = !this.viewport.contains(this.anchor.offsetParent);\n }\n start(element) {\n this.element = element;\n this.element.style.position = 'absolute';\n this.setOffset(0, 0);\n this.sync();\n this.changeEventSubscription('on');\n }\n stop() {\n this.changeEventSubscription('off');\n }\n changeEventSubscription(fn) {\n let doScheduleSync = this.scheduleSync.bind(this);\n up[fn](window, 'resize', doScheduleSync);\n if (this.syncOnScroll) {\n up[fn](this.viewport, 'scroll', doScheduleSync);\n }\n }\n scheduleSync() {\n clearTimeout(this.syncTimer);\n return this.syncTimer = u.task(this.sync.bind(this));\n }\n isDetached() {\n return e.isDetached(this.parent) || e.isDetached(this.anchor);\n }\n sync() {\n const elementBox = this.element.getBoundingClientRect();\n const elementMargin = {\n top: e.styleNumber(this.element, 'marginTop'),\n right: e.styleNumber(this.element, 'marginRight'),\n bottom: e.styleNumber(this.element, 'marginBottom'),\n left: e.styleNumber(this.element, 'marginLeft')\n };\n const anchorBox = this.anchor.getBoundingClientRect();\n let left;\n let top;\n switch (this.alignAxis) {\n case 'horizontal': {\n switch (this.position) {\n case 'top':\n top = anchorBox.top - elementMargin.bottom - elementBox.height;\n break;\n case 'bottom':\n top = anchorBox.top + anchorBox.height + elementMargin.top;\n break;\n }\n switch (this.align) {\n case 'left':\n left = anchorBox.left + elementMargin.left;\n break;\n case 'center':\n left = anchorBox.left + (0.5 * (anchorBox.width - elementBox.width));\n break;\n case 'right':\n left = (anchorBox.left + anchorBox.width) - elementBox.width - elementMargin.right;\n break;\n }\n break;\n }\n case 'vertical': {\n switch (this.align) {\n case 'top':\n top = anchorBox.top + elementMargin.top;\n break;\n case 'center':\n top = anchorBox.top + (0.5 * (anchorBox.height - elementBox.height));\n break;\n case 'bottom':\n top = (anchorBox.top + anchorBox.height) - elementBox.height - elementMargin.bottom;\n break;\n }\n switch (this.position) {\n case 'left':\n left = anchorBox.left - elementMargin.right - elementBox.width;\n break;\n case 'right':\n left = anchorBox.left + anchorBox.width + elementMargin.left;\n break;\n }\n break;\n }\n }\n if (u.isDefined(left) || u.isDefined(top)) {\n this.moveTo(left, top);\n }\n else {\n up.fail('Invalid tether constraints: %o', this.describeConstraints());\n }\n }\n describeConstraints() {\n return { position: this.position, align: this.align };\n }\n moveTo(targetLeft, targetTop) {\n const elementBox = this.element.getBoundingClientRect();\n this.setOffset((targetLeft - elementBox.left) + this.offsetLeft, (targetTop - elementBox.top) + this.offsetTop);\n }\n setOffset(left, top) {\n this.offsetLeft = left;\n this.offsetTop = top;\n e.setStyle(this.element, { left, top });\n }\n};\n\n\n/***/ }),\n/* 71 */\n/***/ (() => {\n\nconst u = up.util;\nup.URLPattern = class URLPattern {\n constructor(fullPattern, normalizeURL = u.normalizeURL) {\n this.normalizeURL = normalizeURL;\n this.groups = [];\n const positiveList = [];\n const negativeList = [];\n for (let pattern of u.splitValues(fullPattern)) {\n if (pattern[0] === '-') {\n negativeList.push(pattern.substring(1));\n }\n else {\n positiveList.push(pattern);\n }\n }\n this.positiveRegexp = this.buildRegexp(positiveList, true);\n this.negativeRegexp = this.buildRegexp(negativeList, false);\n }\n buildRegexp(list, capture) {\n if (!list.length) {\n return;\n }\n list = list.map((url) => {\n if (url[0] === '*') {\n url = '/' + url;\n }\n url = this.normalizeURL(url);\n url = u.escapeRegExp(url);\n return url;\n });\n let reCode = list.join('|');\n reCode = reCode.replace(/\\\\\\*/g, '.*?');\n reCode = reCode.replace(/(:|\\\\\\$)([a-z][\\w-]*)/ig, (match, type, name) => {\n if (type === '\\\\$') {\n if (capture) {\n this.groups.push({ name, cast: Number });\n }\n return '(\\\\d+)';\n }\n else {\n if (capture) {\n this.groups.push({ name, cast: String });\n }\n return '([^/?#]+)';\n }\n });\n return new RegExp('^(?:' + reCode + ')$');\n }\n test(url, doNormalize = true) {\n if (doNormalize) {\n url = this.normalizeURL(url);\n }\n return this.positiveRegexp.test(url) && !this.isExcluded(url);\n }\n recognize(url, doNormalize = true) {\n if (doNormalize) {\n url = this.normalizeURL(url);\n }\n let match = this.positiveRegexp.exec(url);\n if (match && !this.isExcluded(url)) {\n const resolution = {};\n this.groups.forEach((group, groupIndex) => {\n let value = match[groupIndex + 1];\n if (value) {\n return resolution[group.name] = group.cast(value);\n }\n });\n return resolution;\n }\n }\n isExcluded(url) {\n return this.negativeRegexp?.test(url);\n }\n};\n\n\n/***/ }),\n/* 72 */\n/***/ (() => {\n\nup.framework = (function () {\n let readyState = 'evaling';\n function emitReset() {\n up.emit('up:framework:reset', { log: false });\n }\n function boot() {\n if (readyState !== 'configuring') {\n console.error('Unpoly has already booted');\n return;\n }\n let supportIssue = up.framework.supportIssue();\n if (!supportIssue) {\n readyState = 'booting';\n up.emit('up:framework:boot', { log: false });\n readyState = 'booted';\n }\n else {\n console.error(\"Unpoly cannot boot: %s\", supportIssue);\n }\n }\n function mustBootManually() {\n let unpolyScript = document.currentScript;\n if (unpolyScript?.async) {\n return true;\n }\n if (unpolyScript?.getAttribute('up-boot') === 'manual') {\n return true;\n }\n if (document.readyState === 'complete') {\n return true;\n }\n }\n function onEvaled() {\n up.emit('up:framework:evaled', { log: false });\n if (mustBootManually()) {\n console.debug('Call up.boot() after you have configured Unpoly');\n }\n else {\n document.addEventListener('DOMContentLoaded', boot);\n }\n readyState = 'configuring';\n }\n function startExtension() {\n if (readyState !== 'configuring') {\n throw new Error('Unpoly extensions must be loaded before booting');\n }\n readyState = 'evaling';\n }\n function stopExtension() {\n readyState = 'configuring';\n }\n function isSupported() {\n return !supportIssue();\n }\n function supportIssue() {\n if (!up.browser.canPromise()) {\n return \"Browser doesn't support promises\";\n }\n if (document.compatMode === 'BackCompat') {\n return 'Browser is in quirks mode (missing DOCTYPE?)';\n }\n if (up.browser.isEdge18()) {\n return 'Edge 18 or lower is unsupported';\n }\n }\n return {\n onEvaled,\n boot,\n startExtension,\n stopExtension,\n reset: emitReset,\n get evaling() { return readyState === 'evaling'; },\n get booted() { return readyState === 'booted'; },\n get beforeBoot() { return readyState !== 'booting' && readyState !== 'booted'; },\n isSupported,\n supportIssue,\n };\n})();\nup.boot = up.framework.boot;\n\n\n/***/ }),\n/* 73 */\n/***/ (() => {\n\nup.event = (function () {\n const u = up.util;\n const e = up.element;\n function reset() {\n for (let globalElement of [window, document, e.root, document.body]) {\n for (let listener of up.EventListener.allNonDefault(globalElement)) {\n listener.unbind();\n }\n }\n }\n function on(...args) {\n return buildListenerGroup(args).bind();\n }\n function $on(...args) {\n return buildListenerGroup(args, { jQuery: true }).bind();\n }\n function off(...args) {\n return buildListenerGroup(args).unbind();\n }\n function buildListenerGroup(args, options) {\n return up.EventListenerGroup.fromBindArgs(args, options);\n }\n function buildEmitter(args) {\n return up.EventEmitter.fromEmitArgs(args);\n }\n function emit(...args) {\n return buildEmitter(args).emit();\n }\n function build(...args) {\n const props = u.extractOptions(args);\n const type = args[0] || props.type || up.fail('Expected event type to be passed as string argument or { type } property');\n const event = document.createEvent('Event');\n event.initEvent(type, true, true);\n u.assign(event, u.omit(props, ['type', 'target']));\n if (up.browser.isIE11()) {\n const originalPreventDefault = event.preventDefault;\n event.preventDefault = function () {\n originalPreventDefault.call(event);\n return u.getter(event, 'defaultPrevented', () => true);\n };\n }\n return event;\n }\n function assertEmitted(...args) {\n return buildEmitter(args).assertEmitted();\n }\n function onEscape(listener) {\n return on('keydown', function (event) {\n if (wasEscapePressed(event)) {\n return listener(event);\n }\n });\n }\n function wasEscapePressed(event) {\n const { key } = event;\n return (key === 'Escape') || (key === 'Esc');\n }\n function halt(event) {\n event.stopImmediatePropagation();\n event.preventDefault();\n }\n const keyModifiers = ['metaKey', 'shiftKey', 'ctrlKey', 'altKey'];\n function isUnmodified(event) {\n return (u.isUndefined(event.button) || (event.button === 0)) &&\n !u.some(keyModifiers, modifier => event[modifier]);\n }\n function fork(originalEvent, newType, copyKeys = []) {\n const newEvent = up.event.build(newType, u.pick(originalEvent, copyKeys));\n newEvent.originalEvent = originalEvent;\n ['stopPropagation', 'stopImmediatePropagation', 'preventDefault'].forEach(function (key) {\n const originalMethod = newEvent[key];\n return newEvent[key] = function () {\n originalEvent[key]();\n return originalMethod.call(newEvent);\n };\n });\n if (originalEvent.defaultPrevented) {\n newEvent.preventDefault();\n }\n return newEvent;\n }\n function executeEmitAttr(event, element) {\n if (!isUnmodified(event)) {\n return;\n }\n const eventType = e.attr(element, 'up-emit');\n const eventProps = e.jsonAttr(element, 'up-emit-props');\n const forkedEvent = fork(event, eventType);\n u.assign(forkedEvent, eventProps);\n up.emit(element, forkedEvent);\n }\n on('up:click', 'a[up-emit]', executeEmitAttr);\n on('up:framework:reset', reset);\n return {\n on,\n $on,\n off,\n build,\n emit,\n assertEmitted,\n onEscape,\n halt,\n isUnmodified,\n fork,\n keyModifiers\n };\n})();\nup.on = up.event.on;\nup.$on = up.event.$on;\nup.off = up.event.off;\nup.$off = up.event.off;\nup.emit = up.event.emit;\n\n\n/***/ }),\n/* 74 */\n/***/ (() => {\n\nup.protocol = (function () {\n const u = up.util;\n const e = up.element;\n const headerize = function (camel) {\n const header = camel.replace(/(^.|[A-Z])/g, char => '-' + char.toUpperCase());\n return 'X-Up' + header;\n };\n const extractHeader = function (xhr, shortHeader, parseFn = u.identity) {\n let value = xhr.getResponseHeader(headerize(shortHeader));\n if (value) {\n return parseFn(value);\n }\n };\n function parseClearCacheValue(value) {\n switch (value) {\n case 'true':\n return true;\n case 'false':\n return false;\n default:\n return value;\n }\n }\n function clearCacheFromXHR(xhr) {\n return extractHeader(xhr, 'clearCache', parseClearCacheValue);\n }\n function contextFromXHR(xhr) {\n return extractHeader(xhr, 'context', JSON.parse);\n }\n function methodFromXHR(xhr) {\n return extractHeader(xhr, 'method', u.normalizeMethod);\n }\n function eventPlansFromXHR(xhr) {\n return extractHeader(xhr, 'events', JSON.parse);\n }\n function acceptLayerFromXHR(xhr) {\n return extractHeader(xhr, 'acceptLayer', JSON.parse);\n }\n function dismissLayerFromXHR(xhr) {\n return extractHeader(xhr, 'dismissLayer', JSON.parse);\n }\n const initialRequestMethod = u.memoize(function () {\n return u.normalizeMethod(up.browser.popCookie('_up_method'));\n });\n function locationFromXHR(xhr) {\n return extractHeader(xhr, 'location') || xhr.responseURL;\n }\n function titleFromXHR(xhr) {\n return extractHeader(xhr, 'title');\n }\n function targetFromXHR(xhr) {\n return extractHeader(xhr, 'target');\n }\n const config = new up.Config(() => ({\n methodParam: '_method',\n csrfParam() { return e.metaContent('csrf-param'); },\n csrfToken() { return e.metaContent('csrf-token'); },\n cspNonce() { return e.metaContent('csp-nonce'); },\n csrfHeader: 'X-CSRF-Token',\n nonceableAttributes: ['up-observe', 'up-on-accepted', 'up-on-dismissed', 'up-on-loaded', 'up-on-finished', 'up-observe'],\n }));\n function csrfHeader() {\n return u.evalOption(config.csrfHeader);\n }\n function csrfParam() {\n return u.evalOption(config.csrfParam);\n }\n function csrfToken() {\n return u.evalOption(config.csrfToken);\n }\n function cspNonce() {\n return u.evalOption(config.cspNonce);\n }\n function cspNoncesFromHeader(cspHeader) {\n let nonces = [];\n if (cspHeader) {\n let parts = cspHeader.split(/\\s*;\\s*/);\n for (let part of parts) {\n if (part.indexOf('script-src') === 0) {\n let noncePattern = /'nonce-([^']+)'/g;\n let match;\n while (match = noncePattern.exec(part)) {\n nonces.push(match[1]);\n }\n }\n }\n }\n return nonces;\n }\n function wrapMethod(method, params) {\n params.add(config.methodParam, method);\n return 'POST';\n }\n function reset() {\n config.reset();\n }\n up.on('up:framework:reset', reset);\n return {\n config,\n reset,\n locationFromXHR,\n titleFromXHR,\n targetFromXHR,\n methodFromXHR,\n acceptLayerFromXHR,\n contextFromXHR,\n dismissLayerFromXHR,\n eventPlansFromXHR,\n clearCacheFromXHR,\n csrfHeader,\n csrfParam,\n csrfToken,\n cspNonce,\n initialRequestMethod,\n headerize,\n wrapMethod,\n cspNoncesFromHeader,\n };\n})();\n\n\n/***/ }),\n/* 75 */\n/***/ (() => {\n\nup.log = (function () {\n const sessionStore = new up.store.Session('up.log');\n const config = new up.Config(() => ({\n enabled: sessionStore.get('enabled'),\n banner: true,\n format: up.browser.canFormatLog()\n }));\n function reset() {\n config.reset();\n }\n function printToStandard(...args) {\n if (config.enabled) {\n printToStream('log', ...args);\n }\n }\n const printToWarn = (...args) => printToStream('warn', ...args);\n const printToError = (...args) => printToStream('error', ...args);\n function printToStream(stream, trace, message, ...args) {\n if (message) {\n if (config.format) {\n args.unshift('');\n args.unshift('color: #666666; padding: 1px 3px; border: 1px solid #bbbbbb; border-radius: 2px; font-size: 90%; display: inline-block');\n message = `%c${trace}%c ${message}`;\n }\n else {\n message = `[${trace}] ${message}`;\n }\n console[stream](message, ...args);\n }\n }\n function printBanner() {\n if (!config.banner) {\n return;\n }\n const logo = \" __ _____ ___ ___ / /_ __\\n\" +\n `/ // / _ \\\\/ _ \\\\/ _ \\\\/ / // / ${up.version}\\n` +\n \"\\\\___/_//_/ .__/\\\\___/_/\\\\_. / \\n\" +\n \" / / / /\\n\\n\";\n let text = \"\";\n if (!up.migrate.loaded) {\n text += \"Load unpoly-migrate.js to enable deprecated APIs.\\n\\n\";\n }\n if (config.enabled) {\n text += \"Call `up.log.disable()` to disable logging for this session.\";\n }\n else {\n text += \"Call `up.log.enable()` to enable logging for this session.\";\n }\n const color = 'color: #777777';\n if (config.format) {\n console.log('%c' + logo + '%c' + text, 'font-family: monospace;' + color, color);\n }\n else {\n console.log(logo + text);\n }\n }\n up.on('up:framework:boot', printBanner);\n up.on('up:framework:reset', reset);\n function setEnabled(value) {\n sessionStore.set('enabled', value);\n config.enabled = value;\n }\n function enable() {\n setEnabled(true);\n }\n function disable() {\n setEnabled(false);\n }\n function muteUncriticalRejection(promise) {\n return promise.catch(function (error) {\n if ((typeof error !== 'object') || ((error.name !== 'AbortError') && !(error instanceof up.RenderResult) && !(error instanceof up.Response))) {\n throw error;\n }\n });\n }\n return {\n puts: printToStandard,\n error: printToError,\n warn: printToWarn,\n config,\n enable,\n disable,\n muteUncriticalRejection,\n isEnabled() { return config.enabled; },\n };\n})();\nup.puts = up.log.puts;\nup.warn = up.log.warn;\n\n\n/***/ }),\n/* 76 */\n/***/ (() => {\n\nup.syntax = (function () {\n const u = up.util;\n const e = up.element;\n const SYSTEM_MACRO_PRIORITIES = {\n '[up-back]': -100,\n '[up-content]': -200,\n '[up-drawer]': -200,\n '[up-modal]': -200,\n '[up-cover]': -200,\n '[up-popup]': -200,\n '[up-tooltip]': -200,\n '[up-dash]': -200,\n '[up-expand]': -300,\n '[data-method]': -400,\n '[data-confirm]': -400,\n };\n let compilers = [];\n let macros = [];\n function registerCompiler(...args) {\n const compiler = buildCompiler(args);\n return insertCompiler(compilers, compiler);\n }\n function registerJQueryCompiler(...args) {\n const compiler = registerCompiler(...args);\n compiler.jQuery = true;\n }\n function registerMacro(...args) {\n const macro = buildCompiler(args);\n if (up.framework.evaling) {\n macro.priority = detectSystemMacroPriority(macro.selector) ||\n up.fail('Unregistered priority for system macro %o', macro.selector);\n }\n return insertCompiler(macros, macro);\n }\n function registerJQueryMacro(...args) {\n const macro = registerMacro(...args);\n macro.jQuery = true;\n return macro;\n }\n function detectSystemMacroPriority(macroSelector) {\n macroSelector = u.evalOption(macroSelector);\n for (let substr in SYSTEM_MACRO_PRIORITIES) {\n const priority = SYSTEM_MACRO_PRIORITIES[substr];\n if (macroSelector.indexOf(substr) >= 0) {\n return priority;\n }\n }\n }\n const parseCompilerArgs = function (args) {\n const selector = args.shift();\n const callback = args.pop();\n const options = u.extractOptions(args);\n return [selector, options, callback];\n };\n function buildCompiler(args) {\n let [selector, options, callback] = parseCompilerArgs(args);\n options = u.options(options, {\n selector,\n isDefault: up.framework.evaling,\n priority: 0,\n batch: false,\n jQuery: false\n });\n return u.assign(callback, options);\n }\n function insertCompiler(queue, newCompiler) {\n if (up.framework.booted) {\n up.puts('up.compiler()', 'Compiler %s was registered after booting Unpoly. Compiler will run for future fragments.', newCompiler.selector);\n }\n let existingCompiler;\n let index = 0;\n while ((existingCompiler = queue[index]) && (existingCompiler.priority >= newCompiler.priority)) {\n index += 1;\n }\n queue.splice(index, 0, newCompiler);\n return newCompiler;\n }\n function compile(fragment, options) {\n const orderedCompilers = macros.concat(compilers);\n const pass = new up.CompilerPass(fragment, orderedCompilers, options);\n pass.run();\n }\n function registerDestructor(element, destructor) {\n let destructors = element.upDestructors;\n if (!destructors) {\n destructors = [];\n element.upDestructors = destructors;\n element.classList.add('up-can-clean');\n }\n if (u.isArray(destructor)) {\n destructors.push(...destructor);\n }\n else {\n destructors.push(destructor);\n }\n }\n function clean(fragment, options = {}) {\n new up.DestructorPass(fragment, options).run();\n }\n function readData(element) {\n element = up.fragment.get(element);\n return e.jsonAttr(element, 'up-data') || {};\n }\n function reset() {\n compilers = u.filter(compilers, 'isDefault');\n macros = u.filter(macros, 'isDefault');\n }\n up.on('up:framework:reset', reset);\n return {\n compiler: registerCompiler,\n macro: registerMacro,\n $compiler: registerJQueryCompiler,\n $macro: registerJQueryMacro,\n destructor: registerDestructor,\n compile,\n clean,\n data: readData\n };\n})();\nup.compiler = up.syntax.compiler;\nup.$compiler = up.syntax.$compiler;\nup.destructor = up.syntax.destructor;\nup.macro = up.syntax.macro;\nup.$macro = up.syntax.$macro;\nup.data = up.syntax.data;\n\n\n/***/ }),\n/* 77 */\n/***/ (() => {\n\nup.history = (function () {\n const u = up.util;\n const e = up.element;\n const config = new up.Config(() => ({\n enabled: true,\n restoreTargets: ['body']\n }));\n let previousLocation;\n let nextPreviousLocation;\n function reset() {\n config.reset();\n previousLocation = undefined;\n nextPreviousLocation = undefined;\n trackCurrentLocation();\n }\n const DEFAULT_NORMALIZE_OPTIONS = { hash: true };\n function normalizeURL(url, options) {\n options = u.merge(DEFAULT_NORMALIZE_OPTIONS, options);\n return u.normalizeURL(url, options);\n }\n function currentLocation(normalizeOptions) {\n return normalizeURL(location.href, normalizeOptions);\n }\n function trackCurrentLocation() {\n const url = currentLocation();\n if (nextPreviousLocation !== url) {\n previousLocation = nextPreviousLocation;\n nextPreviousLocation = url;\n }\n }\n trackCurrentLocation();\n const ADDITIONAL_NORMALIZE_OPTIONS_FOR_COMPARISON = { trailingSlash: false };\n function isLocation(url, options) {\n options = u.merge(ADDITIONAL_NORMALIZE_OPTIONS_FOR_COMPARISON, options);\n return normalizeURL(url, options) === currentLocation(options);\n }\n function replace(url, options = {}) {\n url = normalizeURL(url);\n if (manipulate('replaceState', url) && (options.event !== false)) {\n emit('up:location:changed', { url, reason: 'replace', log: `Replaced state for ${url}` });\n }\n }\n function push(url) {\n url = normalizeURL(url);\n if (!isLocation(url) && manipulate('pushState', url)) {\n up.emit('up:location:changed', { url, reason: 'push', log: `Advanced to location ${url}` });\n }\n }\n function manipulate(method, url) {\n if (config.enabled) {\n const state = buildState();\n window.history[method](state, '', url);\n trackCurrentLocation();\n return true;\n }\n }\n function buildState() {\n return { up: {} };\n }\n async function restoreStateOnPop(state) {\n if (state?.up) {\n let url = currentLocation();\n await up.render({\n url,\n history: true,\n location: url,\n peel: true,\n layer: 'root',\n target: config.restoreTargets,\n cache: true,\n scroll: 'restore',\n saveScroll: false\n });\n url = currentLocation();\n emit('up:location:changed', { url, reason: 'pop', log: `Restored location ${url}` });\n }\n else {\n up.puts('pop', 'Ignoring a state not pushed by Unpoly (%o)', state);\n }\n }\n function onPop(event) {\n trackCurrentLocation();\n up.viewport.saveScroll({ location: previousLocation });\n const { state } = event;\n restoreStateOnPop(state);\n }\n function emit(...args) {\n const historyLayer = u.find(up.layer.stack.reversed(), 'history');\n return historyLayer.emit(...args);\n }\n function register() {\n window.addEventListener('popstate', onPop);\n if (up.protocol.initialRequestMethod() === 'GET') {\n replace(currentLocation(), { event: false });\n }\n }\n up.on('up:framework:boot', function () {\n if ('jasmine' in window) {\n register();\n }\n else {\n setTimeout(register, 100);\n }\n });\n up.macro('a[up-back], [up-href][up-back]', function (link) {\n if (previousLocation) {\n e.setMissingAttrs(link, {\n 'up-href': previousLocation,\n 'up-scroll': 'restore'\n });\n link.removeAttribute('up-back');\n up.link.makeFollowable(link);\n }\n });\n up.on('up:framework:reset', reset);\n return {\n config,\n push,\n replace,\n get location() { return currentLocation(); },\n get previousLocation() { return previousLocation; },\n normalizeURL,\n isLocation\n };\n})();\n\n\n/***/ }),\n/* 78 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n__webpack_require__(79);\nconst u = up.util;\nconst e = up.element;\nup.fragment = (function () {\n const config = new up.Config(() => ({\n badTargetClasses: [/^up-/],\n navigateOptions: {\n solo: true,\n feedback: true,\n cache: 'auto',\n fallback: true,\n focus: 'auto',\n scroll: 'auto',\n history: 'auto',\n peel: true\n },\n matchAroundOrigin: true,\n runScripts: false,\n autoHistoryTargets: [':main'],\n autoFocus: ['hash', 'autofocus', 'main-if-main', 'target-if-lost'],\n autoScroll: ['hash', 'layer-if-main']\n }));\n u.delegate(config, 'mainTargets', () => up.layer.config.any);\n function reset() {\n config.reset();\n }\n function sourceOf(element, options = {}) {\n element = getSmart(element, options);\n return e.closestAttr(element, 'up-source');\n }\n function timeOf(element) {\n return e.closestAttr(element, 'up-time') || '0';\n }\n const render = up.mockable((...args) => {\n return u.asyncify(function () {\n let options = parseTargetAndOptions(args);\n options = up.RenderOptions.preprocess(options);\n up.browser.assertConfirmed(options);\n let guardEvent = u.pluckKey(options, 'guardEvent');\n if (guardEvent) {\n guardEvent.renderOptions = options;\n up.event.assertEmitted(guardEvent, { target: options.origin });\n }\n up.RenderOptions.assertContentGiven(options);\n return (options.url ? renderRemoteContent : renderLocalContent)(options);\n });\n });\n function renderRemoteContent(options) {\n let execute = () => new up.Change.FromURL(options).execute();\n return up.feedback.aroundForOptions(options, execute);\n }\n function renderLocalContent(options) {\n up.network.mimicLocalRequest(options);\n return new up.Change.FromContent(options).execute();\n }\n const navigate = up.mockable((...args) => {\n const options = parseTargetAndOptions(args);\n return render({ ...options, navigate: true });\n });\n function hello(element, options = {}) {\n element = getSmart(element);\n const keepPlans = options.keepPlans || [];\n const skip = keepPlans.map(function (plan) {\n emitFragmentKept(plan);\n return plan.oldElement;\n });\n up.syntax.compile(element, { skip, layer: options.layer });\n emitFragmentInserted(element, options);\n return element;\n }\n function emitFragmentInserted(element, options) {\n return up.emit(element, 'up:fragment:inserted', {\n log: ['Inserted fragment %o', element],\n origin: options.origin\n });\n }\n function emitFragmentKeep(keepPlan) {\n const log = ['Keeping fragment %o', keepPlan.oldElement];\n const callback = e.callbackAttr(keepPlan.oldElement, 'up-on-keep', ['newFragment', 'newData']);\n return emitFromKeepPlan(keepPlan, 'up:fragment:keep', { log, callback });\n }\n function emitFragmentKept(keepPlan) {\n const log = ['Kept fragment %o', keepPlan.oldElement];\n return emitFromKeepPlan(keepPlan, 'up:fragment:kept', { log });\n }\n function emitFromKeepPlan(keepPlan, eventType, emitDetails) {\n const keepable = keepPlan.oldElement;\n const event = up.event.build(eventType, {\n newFragment: keepPlan.newElement,\n newData: keepPlan.newData\n });\n return up.emit(keepable, event, emitDetails);\n }\n function emitFragmentDestroyed(fragment, options) {\n const log = options.log ?? ['Destroyed fragment %o', fragment];\n const parent = options.parent || document;\n return up.emit(parent, 'up:fragment:destroyed', { fragment, parent, log });\n }\n function isDestroying(element) {\n return !!e.closest(element, '.up-destroying');\n }\n const isNotDestroying = u.negate(isDestroying);\n function getSmart(...args) {\n const options = u.extractOptions(args);\n const selector = args.pop();\n const root = args[0];\n if (u.isElementish(selector)) {\n return e.get(selector);\n }\n if (root) {\n return getDumb(root, selector, options);\n }\n return new up.FragmentFinder({\n selector,\n origin: options.origin,\n layer: options.layer\n }).find();\n }\n function getDumb(...args) {\n return getAll(...args)[0];\n }\n const CSS_HAS_SUFFIX_PATTERN = /:has\\(([^)]+)\\)$/;\n function getAll(...args) {\n const options = u.extractOptions(args);\n let selector = args.pop();\n const root = args[0];\n selector = parseSelector(selector, root, options);\n return selector.descendants(root || document);\n }\n function getSubtree(element, selector, options = {}) {\n selector = parseSelector(selector, element, options);\n return selector.subtree(element);\n }\n function contains(element, selector) {\n return getSubtree(element, selector).length > 0;\n }\n function closest(element, selector, options) {\n element = e.get(element);\n selector = parseSelector(selector, element, options);\n return selector.closest(element);\n }\n function destroy(...args) {\n const options = parseTargetAndOptions(args);\n if (options.element = getSmart(options.target, options)) {\n new up.Change.DestroyFragment(options).execute();\n }\n return up.migrate.formerlyAsync?.('up.destroy()');\n }\n function parseTargetAndOptions(args) {\n const options = u.parseArgIntoOptions(args, 'target');\n if (u.isElement(options.target)) {\n options.origin || (options.origin = options.target);\n }\n return options;\n }\n function markFragmentAsDestroying(element) {\n element.classList.add('up-destroying');\n element.setAttribute('aria-hidden', 'true');\n }\n function reload(...args) {\n const options = parseTargetAndOptions(args);\n options.target || (options.target = ':main');\n const element = getSmart(options.target, options);\n options.url || (options.url = sourceOf(element));\n options.headers || (options.headers = {});\n options.headers[up.protocol.headerize('reloadFromTime')] = timeOf(element);\n return render(options);\n }\n function visit(url, options) {\n return navigate({ ...options, url });\n }\n function successKey(key) {\n return u.unprefixCamelCase(key, 'fail');\n }\n function failKey(key) {\n if (!key.match(/^fail[A-Z]/)) {\n return u.prefixCamelCase(key, 'fail');\n }\n }\n function toTarget(element) {\n if (u.isString(element)) {\n return element;\n }\n element = e.get(element);\n let value;\n if (e.isSingleton(element)) {\n return e.tagName(element);\n }\n else if (value = element.getAttribute(\"up-id\")) {\n return e.attributeSelector('up-id', value);\n }\n else if (value = element.getAttribute(\"id\")) {\n return e.idSelector(value);\n }\n else if (value = element.getAttribute(\"name\")) {\n return e.tagName(element) + e.attributeSelector('name', value);\n }\n else if (value = u.presence(u.filter(element.classList, isGoodClassForTarget))) {\n let selector = '';\n for (let goodClass of value) {\n selector += e.classSelector(goodClass);\n }\n return selector;\n }\n else {\n return e.tagName(element);\n }\n }\n function isGoodClassForTarget(klass) {\n function matchesPattern(pattern) {\n if (u.isRegExp(pattern)) {\n return pattern.test(klass);\n }\n else {\n return pattern === klass;\n }\n }\n return !u.some(config.badTargetClasses, matchesPattern);\n }\n function resolveOriginReference(target, options = {}) {\n const { origin } = options;\n return target.replace(/&|:origin\\b/, function (match) {\n if (origin) {\n return toTarget(origin);\n }\n else {\n up.fail('Missing { origin } element to resolve \"%s\" reference (found in %s)', match, target);\n }\n });\n }\n function expandTargets(targets, options = {}) {\n const { layer } = options;\n if (layer !== 'new' && !(layer instanceof up.Layer)) {\n up.fail('Must pass an up.Layer as { layer } option, but got %o', layer);\n }\n targets = u.copy(u.wrapList(targets));\n const expanded = [];\n while (targets.length) {\n const target = targets.shift();\n if (target === ':main' || target === true) {\n const mode = layer === 'new' ? options.mode : layer.mode;\n targets.unshift(...up.layer.mainTargets(mode));\n }\n else if (target === ':layer') {\n if (layer !== 'new' && !layer.opening) {\n targets.unshift(layer.getFirstSwappableElement());\n }\n }\n else if (u.isElementish(target)) {\n expanded.push(toTarget(target));\n }\n else if (u.isString(target)) {\n expanded.push(resolveOriginReference(target, options));\n }\n else {\n }\n }\n return u.uniq(expanded);\n }\n function parseSelector(selector, element, options = {}) {\n const filters = [];\n if (!options.destroying) {\n filters.push(isNotDestroying);\n }\n options.layer || (options.layer = element);\n const layers = up.layer.getAll(options);\n if (options.layer !== 'any' && !(element && e.isDetached(element))) {\n filters.push(match => u.some(layers, layer => layer.contains(match)));\n }\n let expandedTargets = up.fragment.expandTargets(selector, { ...options, layer: layers[0] });\n expandedTargets = expandedTargets.map(function (target) {\n target = target.replace(CSS_HAS_SUFFIX_PATTERN, function (match, descendantSelector) {\n filters.push(element => element.querySelector(descendantSelector));\n return '';\n });\n return target || '*';\n });\n return new up.Selector(expandedTargets, filters);\n }\n function hasAutoHistory(fragment) {\n if (contains(fragment, config.autoHistoryTargets)) {\n return true;\n }\n else {\n up.puts('up.render()', \"Will not auto-update history because fragment doesn't contain a selector from up.fragment.config.autoHistoryTargets\");\n return false;\n }\n }\n function matches(element, selector, options = {}) {\n element = e.get(element);\n selector = parseSelector(selector, element, options);\n return selector.matches(element);\n }\n up.on('up:framework:boot', function () {\n const { body } = document;\n body.setAttribute('up-source', u.normalizeURL(location.href, { hash: false }));\n hello(body);\n if (!up.browser.canPushState()) {\n return up.warn('Cannot push history changes. Next fragment update will load in a new page.');\n }\n });\n up.on('up:framework:reset', reset);\n return {\n config,\n reload,\n destroy,\n render,\n navigate,\n get: getSmart,\n getDumb,\n all: getAll,\n subtree: getSubtree,\n contains,\n closest,\n source: sourceOf,\n hello,\n visit,\n markAsDestroying: markFragmentAsDestroying,\n emitInserted: emitFragmentInserted,\n emitDestroyed: emitFragmentDestroyed,\n emitKeep: emitFragmentKeep,\n emitKept: emitFragmentKept,\n successKey,\n failKey,\n expandTargets,\n toTarget,\n matches,\n hasAutoHistory\n };\n})();\nup.reload = up.fragment.reload;\nup.destroy = up.fragment.destroy;\nup.render = up.fragment.render;\nup.navigate = up.fragment.navigate;\nup.hello = up.fragment.hello;\nup.visit = up.fragment.visit;\nu.delegate(up, 'context', () => up.layer.current);\n\n\n/***/ }),\n/* 79 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n/***/ }),\n/* 80 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n__webpack_require__(81);\nup.viewport = (function () {\n const u = up.util;\n const e = up.element;\n const f = up.fragment;\n const config = new up.Config(() => ({\n viewportSelectors: ['[up-viewport]', '[up-fixed]'],\n fixedTop: ['[up-fixed~=top]'],\n fixedBottom: ['[up-fixed~=bottom]'],\n anchoredRight: ['[up-anchored~=right]', '[up-fixed~=top]', '[up-fixed~=bottom]', '[up-fixed~=right]'],\n revealSnap: 200,\n revealPadding: 0,\n revealTop: false,\n revealMax() { return 0.5 * window.innerHeight; },\n scrollSpeed: 1\n }));\n const scrollingController = new up.MotionController('scrolling');\n function reset() {\n config.reset();\n scrollingController.reset();\n }\n function scroll(viewport, scrollTop, options = {}) {\n viewport = f.get(viewport, options);\n const motion = new up.ScrollMotion(viewport, scrollTop, options);\n scrollingController.startMotion(viewport, motion, options);\n }\n function anchoredRight() {\n const selector = config.anchoredRight.join(',');\n return f.all(selector, { layer: 'root' });\n }\n function reveal(element, options) {\n options = u.options(options);\n element = f.get(element, options);\n if (!(options.layer = up.layer.get(element))) {\n return up.error.failed.async('Cannot reveal a detached element');\n }\n if (options.peel) {\n options.layer.peel();\n }\n const motion = new up.RevealMotion(element, options);\n return scrollingController.startMotion(element, motion, options);\n }\n function doFocus(element, options = {}) {\n if (up.browser.isIE11()) {\n const viewport = closest(element);\n const oldScrollTop = viewport.scrollTop;\n element.focus();\n viewport.scrollTop = oldScrollTop;\n }\n else {\n element.focus({ preventScroll: true });\n }\n if (!options.preventScroll) {\n return reveal(element);\n }\n }\n function tryFocus(element, options) {\n doFocus(element, options);\n return element === document.activeElement;\n }\n function isNativelyFocusable(element) {\n return e.matches(element, 'a[href], button, textarea, input, select');\n }\n function makeFocusable(element) {\n if (!element.hasAttribute('tabindex') && !isNativelyFocusable(element)) {\n element.setAttribute('tabindex', '-1');\n element.classList.add('up-focusable-content');\n }\n }\n function revealHash(hash = location.hash, options) {\n let match = firstHashTarget(hash, options);\n if (match) {\n return up.reveal(match, { top: true });\n }\n }\n function allSelector() {\n return [rootSelector(), ...config.viewportSelectors].join(',');\n }\n function closest(target, options = {}) {\n const element = f.get(target, options);\n return e.closest(element, allSelector());\n }\n function getSubtree(element, options = {}) {\n element = f.get(element, options);\n return e.subtree(element, allSelector());\n }\n function getAround(element, options = {}) {\n element = f.get(element, options);\n return e.around(element, allSelector());\n }\n function getAll(options = {}) {\n return f.all(allSelector(), options);\n }\n function rootSelector() {\n let element;\n if ((element = document.scrollingElement)) {\n return element.tagName;\n }\n else {\n return 'html';\n }\n }\n function getRoot() {\n return document.querySelector(rootSelector());\n }\n function rootWidth() {\n return e.root.clientWidth;\n }\n function rootHeight() {\n return e.root.clientHeight;\n }\n function isRoot(element) {\n return e.matches(element, rootSelector());\n }\n function rootHasReducedWidthFromScrollbar() {\n return window.innerWidth > document.documentElement.offsetWidth;\n }\n function rootOverflowElement() {\n const { body } = document;\n const html = document.documentElement;\n const element = u.find([html, body], wasChosenAsOverflowingElement);\n return element || getRoot();\n }\n function wasChosenAsOverflowingElement(element) {\n const overflowY = e.style(element, 'overflow-y');\n return overflowY === 'auto' || overflowY === 'scroll';\n }\n const scrollbarWidth = u.memoize(function () {\n const outerStyle = {\n position: 'absolute',\n top: '0',\n left: '0',\n width: '100px',\n height: '100px',\n overflowY: 'scroll'\n };\n const outer = up.element.affix(document.body, '[up-viewport]', { style: outerStyle });\n const width = outer.offsetWidth - outer.clientWidth;\n up.element.remove(outer);\n return width;\n });\n function scrollTopKey(viewport) {\n return up.fragment.toTarget(viewport);\n }\n function fixedElements(root = document) {\n const queryParts = ['[up-fixed]'].concat(config.fixedTop).concat(config.fixedBottom);\n return root.querySelectorAll(queryParts.join(','));\n }\n function saveScroll(...args) {\n const [viewports, options] = parseOptions(args);\n const url = options.location || options.layer.location;\n if (url) {\n const tops = options.tops ?? getScrollTops(viewports);\n options.layer.lastScrollTops.set(url, tops);\n }\n }\n function getScrollTops(viewports) {\n return u.mapObject(viewports, viewport => [scrollTopKey(viewport), viewport.scrollTop]);\n }\n function restoreScroll(...args) {\n const [viewports, options] = parseOptions(args);\n const url = options.layer.location;\n const scrollTopsForURL = options.layer.lastScrollTops.get(url) || {};\n up.puts('up.viewport.restoreScroll()', 'Restoring scroll positions for URL %s to %o', url, scrollTopsForURL);\n return setScrollTops(viewports, scrollTopsForURL);\n }\n function parseOptions(args) {\n const options = u.copy(u.extractOptions(args));\n options.layer = up.layer.get(options);\n let viewports;\n if (args[0]) {\n viewports = [closest(args[0], options)];\n }\n else if (options.around) {\n viewports = getAround(options.around, options);\n }\n else {\n viewports = getAll(options);\n }\n return [viewports, options];\n }\n function resetScroll(...args) {\n const [viewports, _options] = parseOptions(args);\n return setScrollTops(viewports, {});\n }\n function setScrollTops(viewports, tops) {\n const allScrollPromises = u.map(viewports, function (viewport) {\n const key = scrollTopKey(viewport);\n const scrollTop = tops[key] || 0;\n return scroll(viewport, scrollTop, { duration: 0 });\n });\n return Promise.all(allScrollPromises);\n }\n function absolutize(element, options = {}) {\n const viewport = closest(element);\n const viewportRect = viewport.getBoundingClientRect();\n const originalRect = element.getBoundingClientRect();\n const boundsRect = new up.Rect({\n left: originalRect.left - viewportRect.left,\n top: originalRect.top - viewportRect.top,\n width: originalRect.width,\n height: originalRect.height\n });\n options.afterMeasure?.();\n e.setStyle(element, {\n position: element.style.position === 'static' ? 'static' : 'relative',\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto',\n width: '100%',\n height: '100%'\n });\n const bounds = e.createFromSelector('up-bounds');\n e.insertBefore(element, bounds);\n bounds.appendChild(element);\n const moveBounds = function (diffX, diffY) {\n boundsRect.left += diffX;\n boundsRect.top += diffY;\n return e.setStyle(bounds, boundsRect);\n };\n moveBounds(0, 0);\n const newElementRect = element.getBoundingClientRect();\n moveBounds(originalRect.left - newElementRect.left, originalRect.top - newElementRect.top);\n u.each(fixedElements(element), e.fixedToAbsolute);\n return {\n bounds,\n moveBounds\n };\n }\n function firstHashTarget(hash, options = {}) {\n if (hash = pureHash(hash)) {\n const selector = [\n e.attributeSelector('id', hash),\n 'a' + e.attributeSelector('name', hash)\n ].join(',');\n return f.get(selector, options);\n }\n }\n function pureHash(value) {\n return value?.replace(/^#/, '');\n }\n let userScrolled = false;\n up.on('scroll', { once: true, beforeBoot: true }, () => userScrolled = true);\n up.on('up:framework:boot', function () {\n u.task(function () {\n if (!userScrolled) {\n return revealHash();\n }\n });\n });\n up.on(window, 'hashchange', () => revealHash());\n up.on('up:framework:reset', reset);\n return {\n reveal,\n revealHash,\n firstHashTarget,\n scroll,\n config,\n get: closest,\n subtree: getSubtree,\n around: getAround,\n all: getAll,\n rootSelector,\n get root() { return getRoot(); },\n rootWidth,\n rootHeight,\n rootHasReducedWidthFromScrollbar,\n rootOverflowElement,\n isRoot,\n scrollbarWidth,\n saveScroll,\n restoreScroll,\n resetScroll,\n anchoredRight,\n absolutize,\n focus: doFocus,\n tryFocus,\n makeFocusable,\n };\n})();\nup.focus = up.viewport.focus;\nup.scroll = up.viewport.scroll;\nup.reveal = up.viewport.reveal;\n\n\n/***/ }),\n/* 81 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n/***/ }),\n/* 82 */\n/***/ (() => {\n\nup.motion = (function () {\n const u = up.util;\n const e = up.element;\n let namedAnimations = {};\n let namedTransitions = {};\n const motionController = new up.MotionController('motion');\n const config = new up.Config(() => ({\n duration: 175,\n easing: 'ease',\n enabled: !matchMedia('(prefers-reduced-motion: reduce)').matches\n }));\n function pickDefault(registry) {\n return u.pickBy(registry, value => value.isDefault);\n }\n function reset() {\n motionController.reset();\n namedAnimations = pickDefault(namedAnimations);\n namedTransitions = pickDefault(namedTransitions);\n config.reset();\n }\n function isEnabled() {\n return config.enabled;\n }\n function animate(element, animation, options) {\n element = up.fragment.get(element);\n options = u.options(options);\n const animationFn = findAnimationFn(animation);\n const willRun = willAnimate(element, animation, options);\n if (willRun) {\n const runNow = () => animationFn(element, options);\n return motionController.startFunction(element, runNow, options);\n }\n else {\n return skipAnimate(element, animation);\n }\n }\n function willAnimate(element, animationOrTransition, options) {\n applyConfig(options);\n return isEnabled() && !isNone(animationOrTransition) && (options.duration > 0) && !e.isSingleton(element);\n }\n function skipAnimate(element, animation) {\n if (u.isOptions(animation)) {\n e.setStyle(element, animation);\n }\n return Promise.resolve();\n }\n function animateNow(element, lastFrame, options) {\n options = { ...options, finishEvent: motionController.finishEvent };\n const cssTransition = new up.CSSTransition(element, lastFrame, options);\n return cssTransition.start();\n }\n function applyConfig(options) {\n options.easing || (options.easing = config.easing);\n options.duration || (options.duration = config.duration);\n }\n function findNamedAnimation(name) {\n return namedAnimations[name] || up.fail(\"Unknown animation %o\", name);\n }\n function finish(element) {\n return motionController.finish(element);\n }\n function morph(oldElement, newElement, transitionObject, options) {\n options = u.options(options);\n applyConfig(options);\n oldElement = up.fragment.get(oldElement);\n newElement = up.fragment.get(newElement);\n const transitionFn = findTransitionFn(transitionObject);\n const willMorph = willAnimate(oldElement, transitionFn, options);\n const beforeStart = u.pluckKey(options, 'beforeStart') || u.noop;\n const afterInsert = u.pluckKey(options, 'afterInsert') || u.noop;\n const beforeDetach = u.pluckKey(options, 'beforeDetach') || u.noop;\n const afterDetach = u.pluckKey(options, 'afterDetach') || u.noop;\n const scrollNew = u.pluckKey(options, 'scrollNew') || u.asyncNoop;\n beforeStart();\n if (willMorph) {\n if (motionController.isActive(oldElement) && (options.trackMotion === false)) {\n return transitionFn(oldElement, newElement, options);\n }\n up.puts('up.morph()', 'Morphing %o to %o with transition %O', oldElement, newElement, transitionObject);\n const viewport = up.viewport.get(oldElement);\n const scrollTopBeforeReveal = viewport.scrollTop;\n const oldRemote = up.viewport.absolutize(oldElement, {\n afterMeasure() {\n e.insertBefore(oldElement, newElement);\n afterInsert();\n }\n });\n const trackable = async function () {\n await scrollNew();\n const scrollTopAfterReveal = viewport.scrollTop;\n oldRemote.moveBounds(0, scrollTopAfterReveal - scrollTopBeforeReveal);\n await transitionFn(oldElement, newElement, options);\n beforeDetach();\n e.remove(oldRemote.bounds);\n afterDetach();\n };\n return motionController.startFunction([oldElement, newElement], trackable, options);\n }\n else {\n beforeDetach();\n swapElementsDirectly(oldElement, newElement);\n afterInsert();\n afterDetach();\n return scrollNew();\n }\n }\n function findTransitionFn(object) {\n if (isNone(object)) {\n return undefined;\n }\n else if (u.isFunction(object)) {\n return object;\n }\n else if (u.isArray(object)) {\n return composeTransitionFn(...object);\n }\n else if (u.isString(object)) {\n let namedTransition;\n if (object.indexOf('/') >= 0) {\n return composeTransitionFn(...object.split('/'));\n }\n else if (namedTransition = namedTransitions[object]) {\n return findTransitionFn(namedTransition);\n }\n }\n else {\n return up.fail(\"Unknown transition %o\", object);\n }\n }\n function composeTransitionFn(oldAnimation, newAnimation) {\n if (!isNone(oldAnimation) && !isNone(newAnimation)) {\n const oldAnimationFn = findAnimationFn(oldAnimation) || u.asyncNoop;\n const newAnimationFn = findAnimationFn(newAnimation) || u.asyncNoop;\n return (oldElement, newElement, options) => Promise.all([\n oldAnimationFn(oldElement, options),\n newAnimationFn(newElement, options)\n ]);\n }\n }\n function findAnimationFn(object) {\n if (isNone(object)) {\n return undefined;\n }\n else if (u.isFunction(object)) {\n return object;\n }\n else if (u.isString(object)) {\n return findNamedAnimation(object);\n }\n else if (u.isOptions(object)) {\n return (element, options) => animateNow(element, object, options);\n }\n else {\n return up.fail('Unknown animation %o', object);\n }\n }\n const swapElementsDirectly = up.mockable(function (oldElement, newElement) {\n e.replace(oldElement, newElement);\n });\n function registerTransition(name, transition) {\n const fn = findTransitionFn(transition);\n fn.isDefault = up.framework.evaling;\n namedTransitions[name] = fn;\n }\n function registerAnimation(name, animation) {\n const fn = findAnimationFn(animation);\n fn.isDefault = up.framework.evaling;\n namedAnimations[name] = fn;\n }\n up.on('up:framework:boot', function () {\n if (!isEnabled()) {\n up.puts('up.motion', 'Animations are disabled');\n }\n });\n function isNone(animationOrTransition) {\n return !animationOrTransition || animationOrTransition === 'none';\n }\n function registerOpacityAnimation(name, from, to) {\n registerAnimation(name, function (element, options) {\n element.style.opacity = 0;\n e.setStyle(element, { opacity: from });\n return animateNow(element, { opacity: to }, options);\n });\n }\n registerOpacityAnimation('fade-in', 0, 1);\n registerOpacityAnimation('fade-out', 1, 0);\n function translateCSS(dx, dy) {\n return { transform: `translate(${dx}px, ${dy}px)` };\n }\n function untranslatedBox(element) {\n e.setStyle(element, translateCSS(0, 0));\n return element.getBoundingClientRect();\n }\n function registerMoveAnimations(direction, boxToTransform) {\n const animationToName = `move-to-${direction}`;\n const animationFromName = `move-from-${direction}`;\n registerAnimation(animationToName, function (element, options) {\n const box = untranslatedBox(element);\n const transform = boxToTransform(box);\n return animateNow(element, transform, options);\n });\n registerAnimation(animationFromName, function (element, options) {\n const box = untranslatedBox(element);\n const transform = boxToTransform(box);\n e.setStyle(element, transform);\n return animateNow(element, translateCSS(0, 0), options);\n });\n }\n registerMoveAnimations('top', function (box) {\n const travelDistance = box.top + box.height;\n return translateCSS(0, -travelDistance);\n });\n registerMoveAnimations('bottom', function (box) {\n const travelDistance = up.viewport.rootHeight() - box.top;\n return translateCSS(0, travelDistance);\n });\n registerMoveAnimations('left', function (box) {\n const travelDistance = box.left + box.width;\n return translateCSS(-travelDistance, 0);\n });\n registerMoveAnimations('right', function (box) {\n const travelDistance = up.viewport.rootWidth() - box.left;\n return translateCSS(travelDistance, 0);\n });\n registerTransition('cross-fade', ['fade-out', 'fade-in']);\n registerTransition('move-left', ['move-to-left', 'move-from-right']);\n registerTransition('move-right', ['move-to-right', 'move-from-left']);\n registerTransition('move-up', ['move-to-top', 'move-from-bottom']);\n registerTransition('move-down', ['move-to-bottom', 'move-from-top']);\n up.on('up:framework:reset', reset);\n return {\n morph,\n animate,\n finish,\n finishCount() { return motionController.finishCount; },\n transition: registerTransition,\n animation: registerAnimation,\n config,\n isEnabled,\n isNone,\n willAnimate,\n swapElementsDirectly\n };\n})();\nup.transition = up.motion.transition;\nup.animation = up.motion.animation;\nup.morph = up.motion.morph;\nup.animate = up.motion.animate;\n\n\n/***/ }),\n/* 83 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n__webpack_require__(84);\nconst u = up.util;\nup.network = (function () {\n const config = new up.Config(() => ({\n concurrency: 4,\n wrapMethod: true,\n cacheSize: 70,\n cacheExpiry: 1000 * 60 * 5,\n badDownlink: 0.6,\n badRTT: 750,\n badResponseTime: 400,\n autoCache(request) { return request.isSafe(); },\n clearCache(request, _response) { return !request.isSafe(); },\n requestMetaKeys: ['target', 'failTarget', 'mode', 'failMode', 'context', 'failContext'],\n progressBar: true\n }));\n const queue = new up.Request.Queue();\n const cache = new up.Request.Cache();\n let progressBar = null;\n function reset() {\n abortRequests();\n queue.reset();\n config.reset();\n cache.clear();\n progressBar?.destroy();\n progressBar = null;\n }\n function makeRequest(...args) {\n const request = new up.Request(parseRequestOptions(args));\n useCachedRequest(request) || queueRequest(request);\n handleSolo(request);\n return request;\n }\n function mimicLocalRequest(options) {\n handleSolo(options);\n let clearCache = options.clearCache;\n if (clearCache) {\n cache.clear(clearCache);\n }\n }\n function handleSolo(requestOrOptions) {\n let solo = requestOrOptions.solo;\n if (solo && isBusy()) {\n up.puts('up.request()', 'Change with { solo } option will abort other requests');\n if (requestOrOptions instanceof up.Request) {\n queue.abortExcept(requestOrOptions, solo);\n }\n else {\n abortRequests(solo);\n }\n }\n }\n function parseRequestOptions(args) {\n const options = u.extractOptions(args);\n if (!options.url) {\n options.url = args[0];\n }\n up.migrate.handleRequestOptions?.(options);\n return options;\n }\n function useCachedRequest(request) {\n let cachedRequest;\n if (request.willCache() && (cachedRequest = cache.get(request))) {\n up.puts('up.request()', 'Re-using previous request to %s %s', request.method, request.url);\n if (!request.preload) {\n queue.promoteToForeground(cachedRequest);\n }\n request.followState(cachedRequest);\n return true;\n }\n }\n function queueRequest(request) {\n if (request.preload && !request.isSafe()) {\n up.fail('Will not preload request to %s', request.description);\n }\n handleCaching(request);\n queue.asap(request);\n return true;\n }\n function handleCaching(request) {\n if (request.willCache()) {\n cache.set(request, request);\n }\n return u.always(request, function (response) {\n let clearCache = response.clearCache ?? request.clearCache ?? config.clearCache(request, response);\n if (clearCache) {\n cache.clear(clearCache);\n }\n if (request.willCache() || cache.get(request)) {\n cache.set(request, request);\n }\n if (!response.ok) {\n cache.remove(request);\n }\n });\n }\n function isBusy() {\n return queue.isBusy();\n }\n const isIdle = u.negate(isBusy);\n function loadPage(requestsAttrs) {\n new up.Request(requestsAttrs).loadPage();\n }\n function shouldReduceRequests() {\n let netInfo = navigator.connection;\n if (netInfo) {\n return netInfo.saveData ||\n (netInfo.rtt && (netInfo.rtt > config.badRTT)) ||\n (netInfo.downlink && (netInfo.downlink < config.badDownlink));\n }\n }\n function abortRequests(...args) {\n queue.abort(...args);\n }\n function registerAliasForRedirect(request, response) {\n if (request.cache && response.url && request.url !== response.url) {\n const newRequest = request.variant({\n method: response.method,\n url: response.url\n });\n cache.alias(request, newRequest);\n }\n }\n function isSafeMethod(method) {\n return u.contains(['GET', 'OPTIONS', 'HEAD'], u.normalizeMethod(method));\n }\n function onLate() {\n if (u.evalOption(config.progressBar)) {\n progressBar = new up.ProgressBar();\n }\n }\n function onRecover() {\n progressBar?.conclude();\n }\n up.on('up:request:late', onLate);\n up.on('up:request:recover', onRecover);\n up.on('up:framework:reset', reset);\n return {\n request: makeRequest,\n cache,\n isIdle,\n isBusy,\n isSafeMethod,\n config,\n abort: abortRequests,\n registerAliasForRedirect,\n queue,\n shouldReduceRequests,\n mimicLocalRequest,\n loadPage,\n };\n})();\nup.request = up.network.request;\nup.cache = up.network.cache;\n\n\n/***/ }),\n/* 84 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n/***/ }),\n/* 85 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n__webpack_require__(86);\nconst u = up.util;\nconst e = up.element;\nup.layer = (function () {\n const LAYER_CLASSES = [\n up.Layer.Root,\n up.Layer.Modal,\n up.Layer.Popup,\n up.Layer.Drawer,\n up.Layer.Cover\n ];\n const config = new up.Config(function () {\n const newConfig = {\n mode: 'modal',\n any: {\n mainTargets: [\n \"[up-main='']\",\n 'main',\n ':layer'\n ]\n },\n root: {\n mainTargets: ['[up-main~=root]'],\n history: true\n },\n overlay: {\n mainTargets: ['[up-main~=overlay]'],\n openAnimation: 'fade-in',\n closeAnimation: 'fade-out',\n dismissLabel: '\u00D7',\n dismissAriaLabel: 'Dismiss dialog',\n dismissable: true,\n history: 'auto'\n },\n cover: {\n mainTargets: ['[up-main~=cover]']\n },\n drawer: {\n mainTargets: ['[up-main~=drawer]'],\n backdrop: true,\n position: 'left',\n size: 'medium',\n openAnimation(layer) {\n switch (layer.position) {\n case 'left': return 'move-from-left';\n case 'right': return 'move-from-right';\n }\n },\n closeAnimation(layer) {\n switch (layer.position) {\n case 'left': return 'move-to-left';\n case 'right': return 'move-to-right';\n }\n }\n },\n modal: {\n mainTargets: ['[up-main~=modal]'],\n backdrop: true,\n size: 'medium'\n },\n popup: {\n mainTargets: ['[up-main~=popup]'],\n position: 'bottom',\n size: 'medium',\n align: 'left',\n dismissable: 'outside key'\n }\n };\n for (let Class of LAYER_CLASSES) {\n newConfig[Class.mode].Class = Class;\n }\n return newConfig;\n });\n let stack = null;\n let handlers = [];\n function mainTargets(mode) {\n return u.flatMap(modeConfigs(mode), 'mainTargets');\n }\n function modeConfigs(mode) {\n if (mode === 'root') {\n return [config.root, config.any];\n }\n else {\n return [config[mode], config.overlay, config.any];\n }\n }\n function normalizeOptions(options) {\n up.migrate.handleLayerOptions?.(options);\n if (u.isGiven(options.layer)) {\n let match = String(options.layer).match(/^(new|shatter|swap)( (\\w+))?/);\n if (match) {\n options.layer = 'new';\n const openMethod = match[1];\n const shorthandMode = match[3];\n options.mode || (options.mode = shorthandMode || config.mode);\n if (openMethod === 'swap') {\n if (up.layer.isOverlay()) {\n options.baseLayer = 'parent';\n }\n }\n else if (openMethod === 'shatter') {\n options.baseLayer = 'root';\n }\n }\n }\n else {\n if (options.mode) {\n options.layer = 'new';\n }\n else if (u.isElementish(options.target)) {\n options.layer = stack.get(options.target, { normalizeLayerOptions: false });\n }\n else if (options.origin) {\n options.layer = 'origin';\n }\n else {\n options.layer = 'current';\n }\n }\n if (!options.context) {\n options.context = {};\n }\n options.baseLayer = stack.get('current', { ...options, normalizeLayerOptions: false });\n }\n function build(options, beforeNew) {\n const { mode } = options;\n const { Class } = config[mode];\n const configs = u.reverse(modeConfigs(mode));\n let handleDeprecatedConfig = up.migrate.handleLayerConfig;\n if (handleDeprecatedConfig) {\n configs.forEach(handleDeprecatedConfig);\n }\n options.openAnimation ?? (options.openAnimation = u.pluckKey(options, 'animation'));\n options = u.mergeDefined(...configs, { mode, stack }, options);\n if (beforeNew) {\n options = beforeNew(options);\n }\n return new Class(options);\n }\n function openCallbackAttr(link, attr) {\n return e.callbackAttr(link, attr, ['layer']);\n }\n function closeCallbackAttr(link, attr) {\n return e.callbackAttr(link, attr, ['layer', 'value']);\n }\n function reset() {\n config.reset();\n stack.reset();\n handlers = u.filter(handlers, 'isDefault');\n }\n async function open(options) {\n options = u.options(options, {\n layer: 'new',\n defaultToEmptyContent: true,\n navigate: true\n });\n let result = await up.render(options);\n return result.layer;\n }\n function ask(options) {\n return new Promise(function (resolve, reject) {\n options = {\n ...options,\n onAccepted: (event) => resolve(event.value),\n onDismissed: (event) => reject(event.value)\n };\n open(options);\n });\n }\n function anySelector() {\n return u.map(LAYER_CLASSES, Class => Class.selector()).join(',');\n }\n function optionToString(option) {\n if (u.isString(option)) {\n return `layer \"${option}\"`;\n }\n else {\n return option.toString();\n }\n }\n up.on('up:fragment:destroyed', function () {\n stack.sync();\n });\n up.on('up:framework:evaled', function () {\n stack = new up.LayerStack();\n });\n up.on('up:framework:reset', reset);\n const api = {\n config,\n mainTargets,\n open,\n build,\n ask,\n normalizeOptions,\n openCallbackAttr,\n closeCallbackAttr,\n anySelector,\n optionToString,\n get stack() { return stack; }\n };\n u.delegate(api, [\n 'get',\n 'getAll',\n 'root',\n 'overlays',\n 'current',\n 'front',\n 'sync',\n 'count',\n 'dismissOverlays'\n ], () => stack);\n u.delegate(api, [\n 'accept',\n 'dismiss',\n 'isRoot',\n 'isOverlay',\n 'isFront',\n 'on',\n 'off',\n 'emit',\n 'parent',\n 'history',\n 'location',\n 'mode',\n 'context',\n 'element',\n 'contains',\n 'size',\n 'affix'\n ], () => stack.current);\n return api;\n})();\n\n\n/***/ }),\n/* 86 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n/***/ }),\n/* 87 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n__webpack_require__(88);\nup.link = (function () {\n const u = up.util;\n const e = up.element;\n const linkPreloader = new up.LinkPreloader();\n let lastMousedownTarget = null;\n const LINKS_WITH_LOCAL_HTML = ['a[up-content]', 'a[up-fragment]', 'a[up-document]'];\n const LINKS_WITH_REMOTE_HTML = ['a[href]', '[up-href]'];\n const ATTRIBUTES_SUGGESTING_FOLLOW = ['[up-follow]', '[up-target]', '[up-layer]', '[up-transition]', '[up-preload]', '[up-instant]'];\n function combineFollowableSelectors(elementSelectors, attributeSelectors) {\n return u.flatMap(elementSelectors, elementSelector => attributeSelectors.map(attributeSelector => elementSelector + attributeSelector));\n }\n const config = new up.Config(() => ({\n followSelectors: combineFollowableSelectors(LINKS_WITH_REMOTE_HTML, ATTRIBUTES_SUGGESTING_FOLLOW).concat(LINKS_WITH_LOCAL_HTML),\n noFollowSelectors: ['[up-follow=false]', 'a[download]', 'a[target]', 'a[href^=\"#\"]:not([up-content]):not([up-fragment]):not([up-document])', 'a[href^=\"javascript:\"]'],\n instantSelectors: ['[up-instant]'],\n noInstantSelectors: ['[up-instant=false]', '[onclick]'],\n preloadSelectors: combineFollowableSelectors(LINKS_WITH_REMOTE_HTML, ['[up-preload]']),\n noPreloadSelectors: ['[up-preload=false]'],\n clickableSelectors: LINKS_WITH_LOCAL_HTML.concat(['[up-emit]', '[up-accept]', '[up-dismiss]', '[up-clickable]']),\n preloadDelay: 90,\n preloadEnabled: 'auto'\n }));\n function fullFollowSelector() {\n return config.followSelectors.join(',');\n }\n function fullPreloadSelector() {\n return config.preloadSelectors.join(',');\n }\n function fullInstantSelector() {\n return config.instantSelectors.join(',');\n }\n function fullClickableSelector() {\n return config.clickableSelectors.join(',');\n }\n function isFollowDisabled(link) {\n return e.matches(link, config.noFollowSelectors.join(',')) || u.isCrossOrigin(link);\n }\n function isPreloadDisabled(link) {\n return !up.browser.canPushState() ||\n e.matches(link, config.noPreloadSelectors.join(',')) ||\n isFollowDisabled(link) ||\n !willCache(link);\n }\n function willCache(link) {\n const options = parseRequestOptions(link);\n if (options.url) {\n if (options.cache == null) {\n options.cache = 'auto';\n }\n options.basic = true;\n const request = new up.Request(options);\n return request.willCache();\n }\n }\n function isInstantDisabled(link) {\n return e.matches(link, config.noInstantSelectors.join(',')) || isFollowDisabled(link);\n }\n function reset() {\n lastMousedownTarget = null;\n config.reset();\n linkPreloader.reset();\n }\n const follow = up.mockable(function (link, options) {\n return up.render(followOptions(link, options));\n });\n function parseRequestOptions(link, options) {\n options = u.options(options);\n const parser = new up.OptionsParser(options, link);\n options.url = followURL(link, options);\n options.method = followMethod(link, options);\n parser.json('headers');\n parser.json('params');\n parser.booleanOrString('cache');\n parser.booleanOrString('clearCache');\n parser.booleanOrString('solo');\n parser.string('contentType', { attr: ['enctype', 'up-content-type'] });\n return options;\n }\n function followOptions(link, options) {\n link = up.fragment.get(link);\n options = parseRequestOptions(link, options);\n const parser = new up.OptionsParser(options, link, { fail: true });\n parser.boolean('feedback');\n parser.boolean('fail');\n if (parser.options.origin == null) {\n parser.options.origin = link;\n }\n parser.boolean('navigate', { default: true });\n parser.string('confirm');\n parser.string('target');\n parser.booleanOrString('fallback');\n parser.parse(((link, attrName) => e.callbackAttr(link, attrName, ['request', 'response', 'renderOptions'])), 'onLoaded');\n parser.string('content');\n parser.string('fragment');\n parser.string('document');\n parser.boolean('peel');\n parser.string('layer');\n parser.string('baseLayer');\n parser.json('context');\n parser.string('mode');\n parser.string('align');\n parser.string('position');\n parser.string('class');\n parser.string('size');\n parser.booleanOrString('dismissable');\n parser.parse(up.layer.openCallbackAttr, 'onOpened');\n parser.parse(up.layer.closeCallbackAttr, 'onAccepted');\n parser.parse(up.layer.closeCallbackAttr, 'onDismissed');\n parser.string('acceptEvent');\n parser.string('dismissEvent');\n parser.string('acceptLocation');\n parser.string('dismissLocation');\n parser.booleanOrString('history');\n parser.booleanOrString('focus');\n parser.boolean('saveScroll');\n parser.booleanOrString('scroll');\n parser.boolean('revealTop');\n parser.number('revealMax');\n parser.number('revealPadding');\n parser.number('revealSnap');\n parser.string('scrollBehavior');\n parser.booleanOrString('history');\n parser.booleanOrString('location');\n parser.booleanOrString('title');\n parser.booleanOrString('animation');\n parser.booleanOrString('transition');\n parser.string('easing');\n parser.number('duration');\n up.migrate.parseFollowOptions?.(parser);\n if (!options.guardEvent) {\n options.guardEvent = up.event.build('up:link:follow', { log: 'Following link' });\n }\n return options;\n }\n function preload(link, options) {\n link = up.fragment.get(link);\n if (!shouldPreload()) {\n return up.error.failed.async('Link preloading is disabled');\n }\n const guardEvent = up.event.build('up:link:preload', { log: ['Preloading link %o', link] });\n return follow(link, { ...options, guardEvent, preload: true });\n }\n function shouldPreload() {\n const setting = config.preloadEnabled;\n if (setting === 'auto') {\n return !up.network.shouldReduceRequests();\n }\n return setting;\n }\n function followMethod(link, options = {}) {\n return u.normalizeMethod(options.method || link.getAttribute('up-method') || link.getAttribute('data-method'));\n }\n function followURL(link, options = {}) {\n const url = options.url || link.getAttribute('up-href') || link.getAttribute('href');\n if (url !== '#') {\n return url;\n }\n }\n function isFollowable(link) {\n link = up.fragment.get(link);\n return e.matches(link, fullFollowSelector()) && !isFollowDisabled(link);\n }\n function makeFollowable(link) {\n if (!isFollowable(link)) {\n link.setAttribute('up-follow', '');\n }\n }\n function makeClickable(link) {\n if (e.matches(link, 'a[href], button')) {\n return;\n }\n e.setMissingAttrs(link, {\n tabindex: '0',\n role: 'link',\n 'up-clickable': ''\n });\n link.addEventListener('keydown', function (event) {\n if ((event.key === 'Enter') || (event.key === 'Space')) {\n return forkEventAsUpClick(event);\n }\n });\n }\n up.macro(fullClickableSelector, makeClickable);\n function shouldFollowEvent(event, link) {\n if (event.defaultPrevented || isFollowDisabled(link)) {\n return false;\n }\n const betterTargetSelector = `a, [up-href], ${up.form.fieldSelector()}`;\n const betterTarget = e.closest(event.target, betterTargetSelector);\n return !betterTarget || (betterTarget === link);\n }\n function isInstant(linkOrDescendant) {\n const element = e.closest(linkOrDescendant, fullInstantSelector());\n return element && !isInstantDisabled(element);\n }\n function convertClicks(layer) {\n layer.on('click', function (event, element) {\n if (!up.event.isUnmodified(event)) {\n return;\n }\n if (isInstant(element) && lastMousedownTarget) {\n up.event.halt(event);\n }\n else if (layer.wasHitByMouseEvent(event) && !didUserDragAway(event)) {\n forkEventAsUpClick(event);\n }\n return lastMousedownTarget = null;\n });\n layer.on('mousedown', function (event, element) {\n if (!up.event.isUnmodified(event)) {\n return;\n }\n lastMousedownTarget = event.target;\n if (isInstant(element)) {\n forkEventAsUpClick(event);\n }\n });\n }\n function didUserDragAway(clickEvent) {\n return lastMousedownTarget && (lastMousedownTarget !== clickEvent.target);\n }\n function forkEventAsUpClick(originalEvent) {\n let forwardedProps = ['clientX', 'clientY', 'button', ...up.event.keyModifiers];\n const newEvent = up.event.fork(originalEvent, 'up:click', forwardedProps);\n up.emit(originalEvent.target, newEvent, { log: false });\n }\n function isSafe(link) {\n const method = followMethod(link);\n return up.network.isSafeMethod(method);\n }\n up.on('up:click', fullFollowSelector, function (event, link) {\n if (shouldFollowEvent(event, link)) {\n up.event.halt(event);\n up.log.muteUncriticalRejection(follow(link));\n }\n });\n up.macro('[up-expand]', function (area) {\n const selector = area.getAttribute('up-expand') || 'a, [up-href]';\n let childLink = e.get(area, selector);\n if (childLink) {\n const areaAttrs = e.upAttrs(childLink);\n if (!areaAttrs['up-href']) {\n areaAttrs['up-href'] = childLink.getAttribute('href');\n }\n e.setMissingAttrs(area, areaAttrs);\n makeFollowable(area);\n }\n });\n up.compiler(fullPreloadSelector, function (link) {\n if (!isPreloadDisabled(link)) {\n linkPreloader.observeLink(link);\n }\n });\n up.on('up:framework:reset', reset);\n return {\n follow,\n followOptions,\n preload,\n makeFollowable,\n makeClickable,\n isSafe,\n isFollowable,\n shouldFollowEvent,\n followMethod,\n convertClicks,\n config,\n combineFollowableSelectors\n };\n})();\nup.follow = up.link.follow;\n\n\n/***/ }),\n/* 88 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n/***/ }),\n/* 89 */\n/***/ (() => {\n\nup.form = (function () {\n const u = up.util;\n const e = up.element;\n const ATTRIBUTES_SUGGESTING_SUBMIT = ['[up-submit]', '[up-target]', '[up-layer]', '[up-transition]'];\n const config = new up.Config(() => ({\n validateTargets: ['[up-fieldset]:has(:origin)', 'fieldset:has(:origin)', 'label:has(:origin)', 'form:has(:origin)'],\n fieldSelectors: ['select', 'input:not([type=submit]):not([type=image])', 'button[type]:not([type=submit])', 'textarea'],\n submitSelectors: up.link.combineFollowableSelectors(['form'], ATTRIBUTES_SUGGESTING_SUBMIT),\n noSubmitSelectors: ['[up-submit=false]', '[target]'],\n submitButtonSelectors: ['input[type=submit]', 'input[type=image]', 'button[type=submit]', 'button:not([type])'],\n observeDelay: 0\n }));\n let abortScheduledValidate;\n function fullSubmitSelector() {\n return config.submitSelectors.join(',');\n }\n function reset() {\n config.reset();\n }\n function fieldSelector(suffix = '') {\n return config.fieldSelectors.map(field => field + suffix).join(',');\n }\n function findFields(root) {\n root = e.get(root);\n let fields = e.subtree(root, fieldSelector());\n if (e.matches(root, 'form[id]')) {\n const outsideFieldSelector = fieldSelector(e.attributeSelector('form', root.getAttribute('id')));\n const outsideFields = e.all(outsideFieldSelector);\n fields.push(...outsideFields);\n fields = u.uniq(fields);\n }\n return fields;\n }\n function submittingButton(form) {\n const selector = submitButtonSelector();\n const focusedElement = document.activeElement;\n if (focusedElement && e.matches(focusedElement, selector) && form.contains(focusedElement)) {\n return focusedElement;\n }\n else {\n return e.get(form, selector);\n }\n }\n function submitButtonSelector() {\n return config.submitButtonSelectors.join(',');\n }\n const submit = up.mockable((form, options) => {\n return up.render(submitOptions(form, options));\n });\n function submitOptions(form, options) {\n form = getForm(form);\n options = parseBasicOptions(form, options);\n let parser = new up.OptionsParser(options, form);\n parser.string('failTarget', { default: up.fragment.toTarget(form) });\n options.guardEvent || (options.guardEvent = up.event.build('up:form:submit', {\n submitButton: options.submitButton,\n params: options.params,\n log: 'Submitting form'\n }));\n u.assign(options, up.link.followOptions(form, options));\n return options;\n }\n function parseBasicOptions(form, options) {\n options = u.options(options);\n form = getForm(form);\n const parser = new up.OptionsParser(options, form);\n const params = up.Params.fromForm(form);\n options.submitButton || (options.submitButton = submittingButton(form));\n if (options.submitButton) {\n params.addField(options.submitButton);\n options.method || (options.method = options.submitButton.getAttribute('formmethod'));\n options.url || (options.url = options.submitButton.getAttribute('formaction'));\n }\n params.addAll(options.params);\n options.params = params;\n parser.string('url', { attr: 'action', default: up.fragment.source(form) });\n parser.string('method', {\n attr: ['up-method', 'data-method', 'method'],\n default: 'GET',\n normalize: u.normalizeMethod\n });\n if (options.method === 'GET') {\n options.url = up.Params.stripURL(options.url);\n }\n return options;\n }\n up.on('up:click', submitButtonSelector, function (event, button) {\n const form = getForm(button);\n if (form && isSubmittable(form)) {\n button.focus();\n }\n });\n function observe(elements, ...args) {\n elements = e.list(elements);\n const fields = u.flatMap(elements, findFields);\n const unnamedFields = u.reject(fields, 'name');\n if (unnamedFields.length) {\n up.warn('up.observe()', 'Will not observe fields without a [name]: %o', unnamedFields);\n }\n const callback = u.extractCallback(args) || observeCallbackFromElement(elements[0]) || up.fail('up.observe: No change callback given');\n const options = u.extractOptions(args);\n options.delay = options.delay ?? e.numberAttr(elements[0], 'up-delay') ?? config.observeDelay;\n const observer = new up.FieldObserver(fields, options, callback);\n observer.start();\n return () => observer.stop();\n }\n function observeCallbackFromElement(element) {\n let rawCallback = element.getAttribute('up-observe');\n if (rawCallback) {\n return up.NonceableCallback.fromString(rawCallback).toFunction('value', 'name');\n }\n }\n function autosubmit(target, options) {\n return observe(target, options, () => submit(target));\n }\n function findValidateTarget(element, options) {\n let givenTarget;\n const container = getContainer(element);\n if (u.isElementish(options.target)) {\n return up.fragment.toTarget(options.target);\n }\n else if (givenTarget = options.target || element.getAttribute('up-validate') || container.getAttribute('up-validate')) {\n return givenTarget;\n }\n else if (e.matches(element, 'form')) {\n return up.fragment.toTarget(element);\n }\n else {\n return findValidateTargetFromConfig(element, options) || up.fail('Could not find validation target for %o (tried defaults %o)', element, config.validateTargets);\n }\n }\n function findValidateTargetFromConfig(element, options) {\n const layer = up.layer.get(element);\n return u.findResult(config.validateTargets, function (defaultTarget) {\n if (up.fragment.get(defaultTarget, { ...options, layer })) {\n return defaultTarget;\n }\n });\n }\n function validate(field, options) {\n field = up.fragment.get(field);\n options = parseBasicOptions(field, options);\n options.origin = field;\n options.target = findValidateTarget(field, options);\n options.focus = 'keep';\n options.fail = false;\n options.headers || (options.headers = {});\n options.headers[up.protocol.headerize('validate')] = field.getAttribute('name') || ':unknown';\n options.guardEvent = up.event.build('up:form:validate', { field, log: 'Validating form' });\n return up.render(options);\n }\n function switcherValues(field) {\n let value;\n let meta;\n if (e.matches(field, 'input[type=checkbox]')) {\n if (field.checked) {\n value = field.value;\n meta = ':checked';\n }\n else {\n meta = ':unchecked';\n }\n }\n else if (e.matches(field, 'input[type=radio]')) {\n const form = getContainer(field);\n const groupName = field.getAttribute('name');\n const checkedButton = form.querySelector(`input[type=radio]${e.attributeSelector('name', groupName)}:checked`);\n if (checkedButton) {\n meta = ':checked';\n value = checkedButton.value;\n }\n else {\n meta = ':unchecked';\n }\n }\n else {\n value = field.value;\n }\n const values = [];\n if (u.isPresent(value)) {\n values.push(value);\n values.push(':present');\n }\n else {\n values.push(':blank');\n }\n if (u.isPresent(meta)) {\n values.push(meta);\n }\n return values;\n }\n function switchTargets(switcher, options = {}) {\n const targetSelector = options.target || options.target || switcher.getAttribute('up-switch');\n const form = getContainer(switcher);\n targetSelector || up.fail(\"No switch target given for %o\", switcher);\n const fieldValues = switcherValues(switcher);\n for (let target of e.all(form, targetSelector)) {\n switchTarget(target, fieldValues);\n }\n }\n const switchTarget = up.mockable(function (target, fieldValues) {\n let show;\n fieldValues || (fieldValues = switcherValues(findSwitcherForTarget(target)));\n let hideValues = target.getAttribute('up-hide-for');\n if (hideValues) {\n hideValues = u.splitValues(hideValues);\n show = u.intersect(fieldValues, hideValues).length === 0;\n }\n else {\n let showValues = target.getAttribute('up-show-for');\n showValues = showValues ? u.splitValues(showValues) : [':present', ':checked'];\n show = u.intersect(fieldValues, showValues).length > 0;\n }\n e.toggle(target, show);\n target.classList.add('up-switched');\n });\n function findSwitcherForTarget(target) {\n const form = getContainer(target);\n const switchers = e.all(form, '[up-switch]');\n const switcher = u.find(switchers, function (switcher) {\n const targetSelector = switcher.getAttribute('up-switch');\n return e.matches(target, targetSelector);\n });\n return switcher || up.fail('Could not find [up-switch] field for %o', target);\n }\n function getForm(elementOrTarget, fallbackSelector) {\n const element = up.fragment.get(elementOrTarget);\n return element.form || e.closest(element, 'form') || (fallbackSelector && e.closest(element, fallbackSelector));\n }\n function getContainer(element) {\n return getForm(element, up.layer.anySelector());\n }\n function isField(element) {\n return e.matches(element, fieldSelector());\n }\n function focusedField() {\n return u.presence(document.activeElement, isField);\n }\n function isSubmittable(form) {\n form = up.fragment.get(form);\n return e.matches(form, fullSubmitSelector()) && !isSubmitDisabled(form);\n }\n function isSubmitDisabled(form) {\n return e.matches(form, config.noSubmitSelectors.join(','));\n }\n up.on('submit', fullSubmitSelector, function (event, form) {\n if (event.defaultPrevented || isSubmitDisabled(form)) {\n return;\n }\n abortScheduledValidate?.();\n up.event.halt(event);\n up.log.muteUncriticalRejection(submit(form));\n });\n up.on('change', '[up-validate]', function (event) {\n const field = findFields(event.target)[0];\n abortScheduledValidate = u.abortableMicrotask(() => {\n return up.log.muteUncriticalRejection(validate(field));\n });\n });\n up.compiler('[up-switch]', (switcher) => {\n switchTargets(switcher);\n });\n up.on('change', '[up-switch]', (_event, switcher) => {\n switchTargets(switcher);\n });\n up.compiler('[up-show-for]:not(.up-switched), [up-hide-for]:not(.up-switched)', (element) => {\n switchTarget(element);\n });\n up.compiler('[up-observe]', (formOrField) => observe(formOrField));\n up.compiler('[up-autosubmit]', (formOrField) => autosubmit(formOrField));\n up.on('up:framework:reset', reset);\n return {\n config,\n submit,\n submitOptions,\n isSubmittable,\n observe,\n validate,\n autosubmit,\n fieldSelector,\n fields: findFields,\n focusedField,\n switchTarget\n };\n})();\nup.submit = up.form.submit;\nup.observe = up.form.observe;\nup.autosubmit = up.form.autosubmit;\nup.validate = up.form.validate;\n\n\n/***/ }),\n/* 90 */\n/***/ (() => {\n\nup.feedback = (function () {\n const u = up.util;\n const e = up.element;\n const config = new up.Config(() => ({\n currentClasses: ['up-current'],\n navSelectors: ['[up-nav]', 'nav'],\n }));\n function reset() {\n config.reset();\n up.layer.root.feedbackLocation = null;\n }\n const CLASS_ACTIVE = 'up-active';\n const SELECTOR_LINK = 'a, [up-href]';\n function navSelector() {\n return config.navSelectors.join(',');\n }\n function normalizeURL(url) {\n if (url) {\n return u.normalizeURL(url, { trailingSlash: false, hash: false });\n }\n }\n function linkURLs(link) {\n return link.upFeedbackURLs || (link.upFeedbackURLs = new up.LinkFeedbackURLs(link));\n }\n function updateFragment(fragment) {\n const layerOption = { layer: up.layer.get(fragment) };\n if (up.fragment.closest(fragment, navSelector(), layerOption)) {\n const links = up.fragment.subtree(fragment, SELECTOR_LINK, layerOption);\n updateLinks(links, layerOption);\n }\n else {\n updateLinksWithinNavs(fragment, layerOption);\n }\n }\n function updateLinksWithinNavs(fragment, options) {\n const navs = up.fragment.subtree(fragment, navSelector(), options);\n const links = u.flatMap(navs, nav => e.subtree(nav, SELECTOR_LINK));\n updateLinks(links, options);\n }\n function getNormalizedLayerLocation(layer) {\n return layer.feedbackLocation || normalizeURL(layer.location);\n }\n function updateLinks(links, options = {}) {\n if (!links.length) {\n return;\n }\n const layer = options.layer || up.layer.get(links[0]);\n let layerLocation = getNormalizedLayerLocation(layer);\n if (layerLocation) {\n for (let link of links) {\n const isCurrent = linkURLs(link).isCurrent(layerLocation);\n for (let currentClass of config.currentClasses) {\n e.toggleClass(link, currentClass, isCurrent);\n }\n e.toggleAttr(link, 'aria-current', 'page', isCurrent);\n }\n }\n }\n function findActivatableArea(element) {\n return e.ancestor(element, SELECTOR_LINK) || element;\n }\n function start(element) {\n findActivatableArea(element).classList.add(CLASS_ACTIVE);\n }\n function stop(element) {\n findActivatableArea(element).classList.remove(CLASS_ACTIVE);\n }\n function around(element, fn) {\n start(element);\n const result = fn();\n u.always(result, () => stop(element));\n return result;\n }\n function aroundForOptions(options, fn) {\n let element;\n let feedbackOpt = options.feedback;\n if (feedbackOpt) {\n if (u.isBoolean(feedbackOpt)) {\n element = options.origin;\n }\n else {\n element = feedbackOpt;\n }\n }\n if (element) {\n element = up.fragment.get(element);\n return around(element, fn);\n }\n else {\n return fn();\n }\n }\n function updateLayerIfLocationChanged(layer) {\n const processedLocation = layer.feedbackLocation;\n const layerLocation = getNormalizedLayerLocation(layer.location);\n if (!processedLocation || (processedLocation !== layerLocation)) {\n layer.feedbackLocation = layerLocation;\n updateLinksWithinNavs(layer.element, { layer });\n }\n }\n function onBrowserLocationChanged() {\n const frontLayer = up.layer.front;\n if (frontLayer.showsLiveHistory()) {\n updateLayerIfLocationChanged(frontLayer);\n }\n }\n up.on('up:location:changed', (_event) => {\n onBrowserLocationChanged();\n });\n up.on('up:fragment:inserted', (_event, newFragment) => {\n updateFragment(newFragment);\n });\n up.on('up:layer:location:changed', (event) => {\n updateLayerIfLocationChanged(event.layer);\n });\n up.on('up:framework:reset', reset);\n return {\n config,\n start,\n stop,\n around,\n aroundForOptions,\n normalizeURL,\n };\n})();\n\n\n/***/ }),\n/* 91 */\n/***/ (() => {\n\nup.radio = (function () {\n const u = up.util;\n const config = new up.Config(() => ({\n hungrySelectors: ['[up-hungry]'],\n pollInterval: 30000,\n pollEnabled: 'auto'\n }));\n function reset() {\n config.reset();\n }\n function hungrySelector() {\n return config.hungrySelectors.join(',');\n }\n function startPolling(fragment, options = {}) {\n up.FragmentPolling.forFragment(fragment).forceStart(options);\n }\n function stopPolling(element) {\n up.FragmentPolling.forFragment(element).forceStop();\n }\n function shouldPoll(fragment) {\n const setting = u.evalOption(config.pollEnabled, fragment);\n if (setting === 'auto') {\n return !document.hidden && !up.network.shouldReduceRequests() && up.layer.get(fragment)?.isFront?.();\n }\n return setting;\n }\n up.compiler('[up-poll]', (fragment) => {\n up.FragmentPolling.forFragment(fragment).onPollAttributeObserved();\n });\n up.on('up:framework:reset', reset);\n return {\n config,\n hungrySelector,\n startPolling,\n stopPolling,\n shouldPoll,\n };\n})();\n\n\n/***/ }),\n/* 92 */\n/***/ (() => {\n\nup.rails = (function () {\n const u = up.util;\n const e = up.element;\n function isRails() {\n return window._rails_loaded ||\n window.Rails ||\n window.jQuery?.rails;\n }\n return u.each(['method', 'confirm'], function (feature) {\n const dataAttribute = `data-${feature}`;\n const upAttribute = `up-${feature}`;\n up.macro(`a[${dataAttribute}]`, function (link) {\n if (isRails() && up.link.isFollowable(link)) {\n e.setMissingAttr(link, upAttribute, link.getAttribute(dataAttribute));\n return link.removeAttribute(dataAttribute);\n }\n });\n });\n})();\n\n\n/***/ })\n/******/ \t]);\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\n(() => {\n__webpack_require__(1);\n__webpack_require__(2);\n__webpack_require__(3);\n__webpack_require__(4);\n__webpack_require__(5);\n__webpack_require__(6);\n__webpack_require__(7);\n__webpack_require__(9);\n__webpack_require__(10);\n__webpack_require__(11);\n__webpack_require__(12);\n__webpack_require__(13);\n__webpack_require__(14);\n__webpack_require__(15);\n__webpack_require__(16);\n__webpack_require__(17);\n__webpack_require__(18);\n__webpack_require__(19);\n__webpack_require__(20);\n__webpack_require__(21);\n__webpack_require__(22);\n__webpack_require__(23);\n__webpack_require__(24);\n__webpack_require__(25);\n__webpack_require__(26);\n__webpack_require__(27);\n__webpack_require__(28);\n__webpack_require__(29);\n__webpack_require__(30);\n__webpack_require__(31);\n__webpack_require__(32);\n__webpack_require__(33);\n__webpack_require__(34);\n__webpack_require__(35);\n__webpack_require__(36);\n__webpack_require__(37);\n__webpack_require__(38);\n__webpack_require__(39);\n__webpack_require__(40);\n__webpack_require__(41);\n__webpack_require__(42);\n__webpack_require__(43);\n__webpack_require__(44);\n__webpack_require__(45);\n__webpack_require__(46);\n__webpack_require__(47);\n__webpack_require__(48);\n__webpack_require__(49);\n__webpack_require__(50);\n__webpack_require__(51);\n__webpack_require__(52);\n__webpack_require__(53);\n__webpack_require__(54);\n__webpack_require__(55);\n__webpack_require__(56);\n__webpack_require__(57);\n__webpack_require__(58);\n__webpack_require__(59);\n__webpack_require__(60);\n__webpack_require__(61);\n__webpack_require__(62);\n__webpack_require__(63);\n__webpack_require__(64);\n__webpack_require__(65);\n__webpack_require__(66);\n__webpack_require__(67);\n__webpack_require__(68);\n__webpack_require__(69);\n__webpack_require__(70);\n__webpack_require__(71);\n__webpack_require__(72);\n__webpack_require__(73);\n__webpack_require__(74);\n__webpack_require__(75);\n__webpack_require__(76);\n__webpack_require__(77);\n__webpack_require__(78);\n__webpack_require__(80);\n__webpack_require__(82);\n__webpack_require__(83);\n__webpack_require__(85);\n__webpack_require__(87);\n__webpack_require__(89);\n__webpack_require__(90);\n__webpack_require__(91);\n__webpack_require__(92);\nup.framework.onEvaled();\n\n})();\n\n/******/ })()\n;", "export default new class Environment {\n\n toString() {\n return document.body.getAttribute('data-environment')\n }\n\n get isTest() {\n return this.toString() === 'test'\n }\n\n get isDevelopment() {\n return this.toString() === 'development'\n }\n\n}()\n", "import environment from '../util/environment'\n\nup.layer.config.modal.dismissable = ['key', 'button']\n\n// Some articles link to files which need to be handled without Unpoly. Note that this can not be `[href^=\"/system/\"]` because link hrefs are sometimes \"../../../system/...\" or similar.\nup.link.config.noFollowSelectors.push('[href*=\"/system/\"]')\n\nup.feedback.config.currentClasses.push('active')\n\nup.form.config.submitSelectors.push('form')\n\nup.motion.config.enabled = !environment.isTest\n\nup.radio.config.hungrySelectors.push(\n 'meta[name=\"csrf-token\"]',\n 'meta[name=\"csrf-param\"]',\n 'head meta[name=\"description\"]',\n 'head meta[name=\"robots\"]',\n 'head meta[name=\"googlebot\"]',\n 'head meta[name=\"bingbot\"]',\n 'head meta[property=\"og:locale\"]',\n 'head meta[property=\"og:type\"]',\n 'head meta[property=\"og:title\"]',\n 'head meta[property=\"og:description\"]',\n 'head meta[property=\"og:url\"]',\n 'head meta[property=\"og:image\"]',\n 'head meta[property=\"og:site_name\"]',\n 'head meta[property=\"article:modified_time\"]',\n)\n", "up.link.config.followSelectors.push('a[href]')\nup.link.config.instantSelectors.push('a[href]')\nup.link.config.noInstantSelectors.push('.btn:not(.btn-link)')\n", "import '../../shared/config/unpoly.js'\nimport '../../shared/config/unpoly_follow_all.js'\nimport '../../shared/config/unpoly.sass'\n\nup.link.config.preloadSelectors.push('a[href]')\nup.feedback.config.navSelectors = up.feedback.config.navSelectors.filter(selector => selector !== 'nav')\n", "\n import * as module0 from './shared/components/autofocus.js';import * as module1 from './shared/components/content_loading.js';import * as module2 from './shared/components/data_confirm.js';import * as module3 from './shared/components/file_input.js';import * as module4 from './shared/components/flash_message.js';import * as module5 from './shared/components/input_type_number.js';import * as module6 from './shared/components/lazysizes.js'\n\n const modules = [module0,module1,module2,module3,module4,module5,module6];\n\n export default modules;\n export const filenames = ['./shared/components/autofocus.js','./shared/components/content_loading.js','./shared/components/data_confirm.js','./shared/components/file_input.js','./shared/components/flash_message.js','./shared/components/input_type_number.js','./shared/components/lazysizes.js']\n ", "class Application {\n\n constructor() {\n this.configurations = {}\n }\n\n configure(configKey, data) {\n const config = new Configuration(data)\n this.configurations[configKey] = config\n return config\n }\n\n getConfiguration(configKey) {\n return this.configurations[configKey]\n }\n\n}\n\nclass Configuration {\n\n constructor(data) {\n for (const [key, value] of Object.entries(data)) {\n Object.defineProperty(this, key, {\n get: () => value,\n configurable: true, // to allow Jasmine's spyOnProperty\n })\n }\n }\n\n}\n\nexport default new Application()\n", "export default class Timeout {\n constructor(callback, microseconds = 0) {\n this.callback = callback\n this.timerId = null\n this.startedAt = null\n this.initialMicroseconds = microseconds\n this.microsecondsLeft = microseconds\n this.paused = false\n this.resume()\n }\n\n get percent() {\n const percent = Math.round(100 * this.elapsed / this.initialMicroseconds)\n return Math.max(0, Math.min(100, percent))\n }\n\n get percentRemaining() {\n return 100 - this.percent\n }\n\n get elapsed() {\n return this.initialMicroseconds - this.remaining\n }\n\n get remaining() {\n return Math.max(0, this.microsecondsLeft - this._getMicrosecondsSinceLastStarted())\n }\n\n pause() {\n this.clear()\n this.microsecondsLeft -= this._getMicrosecondsSinceLastStarted()\n this.paused = true\n }\n\n resume() {\n this.clear()\n this.startedAt = new Date()\n this.timerId = window.setTimeout(this.callback, this.microsecondsLeft)\n this.paused = false\n }\n\n clear() {\n window.clearTimeout(this.timerId)\n }\n\n _getMicrosecondsSinceLastStarted() {\n return this.paused ? 0 : new Date() - this.startedAt\n }\n}\n", "import application from '../util/application'\nimport environment from '../util/environment'\nimport Timeout from '../util/timeout'\n\nconst config = application.configure('[flash-message]', {\n timeoutDelay: 5000,\n updateFrequency: 100,\n})\n\nup.compiler('[flash-message]', (element) => {\n const indicator = element.querySelector('[flash-message--timer-indicator]')\n const closeButton = element.querySelector('[flash-message--close]')\n\n function updateIndicator() {\n const percent = removeTimer ? removeTimer.percent : 0\n\n if (!environment.isTest) {\n up.element.setStyle(indicator, {\n transition: `width ${config.updateFrequency}ms linear`,\n width: `${percent}%`,\n })\n }\n }\n\n function removeAutomatically() {\n if (environment.isTest) {\n // We don't want to remove flashes automatically in feature tests because\n // - tests might not see flashes if they are slow,\n // - it could cause flickering behavior if flashes cover elements only sometimes.\n } else {\n updateIndicator()\n remove()\n }\n }\n\n function remove() {\n window.clearInterval(updateIndicatorInterval)\n removeTimer.clear()\n up.animate(element, 'move-to-top').then(() => { element.remove() })\n }\n\n const removeTimer = new Timeout(removeAutomatically, config.timeoutDelay)\n const updateIndicatorInterval = window.setInterval(updateIndicator, config.updateFrequency)\n\n updateIndicator()\n element.addEventListener('mouseenter', () => { removeTimer.pause() })\n element.addEventListener('mouseleave', () => { removeTimer.resume() })\n closeButton.addEventListener('click', remove)\n\n return remove\n})\n", "import 'lazysizes'\nimport 'lazysizes/plugins/parent-fit/ls.parent-fit'\n\nfunction revealSource(target) {\n const imageUrl = target.getAttribute('lazy-src')\n\n if (imageUrl) {\n target.src = imageUrl\n target.classList.add('lazyloaded')\n }\n}\n\nfunction revealBackground(target) {\n const backgroundImageUrl = target.getAttribute('lazy-bg')\n if (backgroundImageUrl) {\n target.style.backgroundImage = `url(\"${backgroundImageUrl}\")`\n target.classList.add('lazy-bg-loaded')\n }\n}\n\ndocument.addEventListener('lazybeforeunveil', (event) => {\n const target = event.target\n revealSource(target)\n revealBackground(target)\n})\n", "\n import * as module0 from './frontend/components/events_page.js';import * as module1 from './frontend/components/filterable_list.js';import * as module2 from './frontend/components/lightbox_gallery.js';import * as module3 from './frontend/components/lightbox_image.js';import * as module4 from './frontend/components/search_form.js';import * as module5 from './frontend/components/track_page_view.js'\n\n const modules = [module0,module1,module2,module3,module4,module5];\n\n export default modules;\n export const filenames = ['./frontend/components/events_page.js','./frontend/components/filterable_list.js','./frontend/components/lightbox_gallery.js','./frontend/components/lightbox_image.js','./frontend/components/search_form.js','./frontend/components/track_page_view.js']\n ", "/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n/** @typedef {undefined | null | false | '' | 0} Falsy */\r\n/** @typedef {keyof HTMLElementTagNameMap} HTMLElementTagName */\r\n\r\n/**\r\n * @template {HTMLElementTagName | Falsy} [T=\"div\"]\r\n * @template {Node | undefined} [NodeToAppendElementTo=undefined]\r\n * @param {string=} className\r\n * @param {T=} [tagName]\r\n * @param {NodeToAppendElementTo=} appendToEl\r\n * @returns {T extends HTMLElementTagName ? HTMLElementTagNameMap[T] : HTMLElementTagNameMap['div']}\r\n */\r\nexport function createElement(className, tagName, appendToEl) {\r\n const el = document.createElement(tagName || 'div');\r\n if (className) {\r\n el.className = className;\r\n }\r\n if (appendToEl) {\r\n appendToEl.appendChild(el);\r\n }\r\n // @ts-expect-error\r\n return el;\r\n}\r\n\r\n/**\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nexport function equalizePoints(p1, p2) {\r\n p1.x = p2.x;\r\n p1.y = p2.y;\r\n if (p2.id !== undefined) {\r\n p1.id = p2.id;\r\n }\r\n return p1;\r\n}\r\n\r\n/**\r\n * @param {Point} p\r\n */\r\nexport function roundPoint(p) {\r\n p.x = Math.round(p.x);\r\n p.y = Math.round(p.y);\r\n}\r\n\r\n/**\r\n * Returns distance between two points.\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nexport function getDistanceBetween(p1, p2) {\r\n const x = Math.abs(p1.x - p2.x);\r\n const y = Math.abs(p1.y - p2.y);\r\n return Math.sqrt((x * x) + (y * y));\r\n}\r\n\r\n/**\r\n * Whether X and Y positions of points are qual\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nexport function pointsEqual(p1, p2) {\r\n return p1.x === p2.x && p1.y === p2.y;\r\n}\r\n\r\n/**\r\n * The float result between the min and max values.\r\n *\r\n * @param {number} val\r\n * @param {number} min\r\n * @param {number} max\r\n */\r\nexport function clamp(val, min, max) {\r\n return Math.min(Math.max(val, min), max);\r\n}\r\n\r\n/**\r\n * Get transform string\r\n *\r\n * @param {number} x\r\n * @param {number=} y\r\n * @param {number=} scale\r\n */\r\nexport function toTransformString(x, y, scale) {\r\n let propValue = 'translate3d('\r\n + x + 'px,' + (y || 0) + 'px'\r\n + ',0)';\r\n\r\n if (scale !== undefined) {\r\n propValue += ' scale3d('\r\n + scale + ',' + scale\r\n + ',1)';\r\n }\r\n\r\n return propValue;\r\n}\r\n\r\n/**\r\n * Apply transform:translate(x, y) scale(scale) to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {number} x\r\n * @param {number=} y\r\n * @param {number=} scale\r\n */\r\nexport function setTransform(el, x, y, scale) {\r\n el.style.transform = toTransformString(x, y, scale);\r\n}\r\n\r\nconst defaultCSSEasing = 'cubic-bezier(.4,0,.22,1)';\r\n\r\n/**\r\n * Apply CSS transition to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string=} prop CSS property to animate\r\n * @param {number=} duration in ms\r\n * @param {string=} ease CSS easing function\r\n */\r\nexport function setTransitionStyle(el, prop, duration, ease) {\r\n // inOut: 'cubic-bezier(.4, 0, .22, 1)', // for \"toggle state\" transitions\r\n // out: 'cubic-bezier(0, 0, .22, 1)', // for \"show\" transitions\r\n // in: 'cubic-bezier(.4, 0, 1, 1)'// for \"hide\" transitions\r\n el.style.transition = prop\r\n ? (prop + ' ' + duration + 'ms ' + (ease || defaultCSSEasing))\r\n : 'none';\r\n}\r\n\r\n/**\r\n * Apply width and height CSS properties to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string | number} w\r\n * @param {string | number} h\r\n */\r\nexport function setWidthHeight(el, w, h) {\r\n el.style.width = (typeof w === 'number') ? (w + 'px') : w;\r\n el.style.height = (typeof h === 'number') ? (h + 'px') : h;\r\n}\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n */\r\nexport function removeTransitionStyle(el) {\r\n setTransitionStyle(el);\r\n}\r\n\r\n/**\r\n * @param {HTMLImageElement} img\r\n * @returns {Promise}\r\n */\r\nexport function decodeImage(img) {\r\n if ('decode' in img) {\r\n return img.decode();\r\n }\r\n\r\n if (img.complete) {\r\n return Promise.resolve(img);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n img.onload = () => resolve(img);\r\n img.onerror = reject;\r\n });\r\n}\r\n\r\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\r\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\r\nexport const LOAD_STATE = {\r\n IDLE: 'idle',\r\n LOADING: 'loading',\r\n LOADED: 'loaded',\r\n ERROR: 'error',\r\n};\r\n\r\n\r\n/**\r\n * Check if click or keydown event was dispatched\r\n * with a special key or via mouse wheel.\r\n *\r\n * @param {MouseEvent | KeyboardEvent} e\r\n */\r\nexport function specialKeyUsed(e) {\r\n if (e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Parse `gallery` or `children` options.\r\n *\r\n * @param {HTMLElement | NodeListOf | string} option\r\n * @param {string=} legacySelector\r\n * @param {HTMLElement | Document} [parent]\r\n * @returns HTMLElement[]\r\n */\r\nexport function getElementsFromOption(option, legacySelector, parent = document) {\r\n /** @type {HTMLElement[]} */\r\n let elements = [];\r\n\r\n if (option instanceof Element) {\r\n elements = [option];\r\n } else if (option instanceof NodeList || Array.isArray(option)) {\r\n elements = Array.from(option);\r\n } else {\r\n const selector = typeof option === 'string' ? option : legacySelector;\r\n if (selector) {\r\n elements = Array.from(parent.querySelectorAll(selector));\r\n }\r\n }\r\n\r\n return elements;\r\n}\r\n\r\n/**\r\n * Check if variable is PhotoSwipe class\r\n *\r\n * @param {any} fn\r\n */\r\nexport function isPswpClass(fn) {\r\n return typeof fn === 'function'\r\n && fn.prototype\r\n && fn.prototype.goTo;\r\n}\r\n", "/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\r\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('../slide/content.js').default} ContentDefault */\r\n/** @typedef {import('../slide/slide.js').default} Slide */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\r\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\r\n\r\n/**\r\n * Allow adding an arbitrary props to the Content\r\n * https://photoswipe.com/custom-content/#using-webp-image-format\r\n * @typedef {ContentDefault & Record} Content\r\n */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\r\n *\r\n *\r\n * https://photoswipe.com/adding-ui-elements/\r\n *\r\n * @prop {undefined} uiRegister\r\n * @prop {{ data: UIElementData }} uiElementCreate\r\n *\r\n *\r\n * https://photoswipe.com/events/#initialization-events\r\n *\r\n * @prop {undefined} beforeOpen\r\n * @prop {undefined} firstUpdate\r\n * @prop {undefined} initialLayout\r\n * @prop {undefined} change\r\n * @prop {undefined} afterInit\r\n * @prop {undefined} bindEvents\r\n *\r\n *\r\n * https://photoswipe.com/events/#opening-or-closing-transition-events\r\n *\r\n * @prop {undefined} openingAnimationStart\r\n * @prop {undefined} openingAnimationEnd\r\n * @prop {undefined} closingAnimationStart\r\n * @prop {undefined} closingAnimationEnd\r\n *\r\n *\r\n * https://photoswipe.com/events/#closing-events\r\n *\r\n * @prop {undefined} close\r\n * @prop {undefined} destroy\r\n *\r\n *\r\n * https://photoswipe.com/events/#pointer-and-gesture-events\r\n *\r\n * @prop {{ originalEvent: PointerEvent }} pointerDown\r\n * @prop {{ originalEvent: PointerEvent }} pointerMove\r\n * @prop {{ originalEvent: PointerEvent }} pointerUp\r\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\r\n * @prop {{ panY: number }} verticalDrag can be default prevented\r\n *\r\n *\r\n * https://photoswipe.com/events/#slide-content-events\r\n *\r\n * @prop {{ content: Content }} contentInit\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\r\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\r\n * @prop {{ content: Content; slide: Slide }} loadError\r\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\r\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\r\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\r\n * @prop {{ content: Content }} contentAppend can be default prevented\r\n * @prop {{ content: Content }} contentActivate can be default prevented\r\n * @prop {{ content: Content }} contentDeactivate can be default prevented\r\n * @prop {{ content: Content }} contentRemove can be default prevented\r\n * @prop {{ content: Content }} contentDestroy can be default prevented\r\n *\r\n *\r\n * undocumented\r\n *\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\r\n *\r\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\r\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\r\n * @prop {{ slide: Slide }} firstZoomPan\r\n * @prop {{ slide: Slide, data: SlideData, index: number }} gettingData\r\n * @prop {undefined} beforeResize\r\n * @prop {undefined} resize\r\n * @prop {undefined} viewportSize\r\n * @prop {undefined} updateScrollOffset\r\n * @prop {{ slide: Slide }} slideInit\r\n * @prop {{ slide: Slide }} afterSetContent\r\n * @prop {{ slide: Slide }} slideLoad\r\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\r\n * @prop {{ slide: Slide }} appendHeavyContent\r\n * @prop {{ slide: Slide }} slideActivate\r\n * @prop {{ slide: Slide }} slideDeactivate\r\n * @prop {{ slide: Slide }} slideDestroy\r\n * @prop {{ destZoomLevel: number, centerPoint: Point, transitionDuration: number | false }} beforeZoomTo\r\n * @prop {{ slide: Slide }} zoomPanUpdate\r\n * @prop {{ slide: Slide }} initialZoomPan\r\n * @prop {{ slide: Slide }} calcSlideSize\r\n * @prop {undefined} resolutionChanged\r\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\r\n * @prop {{ content: Content }} contentAppendImage can be default prevented\r\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\r\n * @prop {undefined} lazyLoad\r\n * @prop {{ slide: Slide }} calcBounds\r\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\r\n *\r\n *\r\n * legacy\r\n *\r\n * @prop {undefined} init\r\n * @prop {undefined} initialZoomIn\r\n * @prop {undefined} initialZoomOut\r\n * @prop {undefined} initialZoomInEnd\r\n * @prop {undefined} initialZoomOutEnd\r\n * @prop {{ dataSource: DataSource, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource) => number} numItems\r\n * Modify the total amount of slides. Example on Data sources page.\r\n * https://photoswipe.com/filters/#numitems\r\n *\r\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\r\n * Modify slide item data. Example on Data sources page.\r\n * https://photoswipe.com/filters/#itemdata\r\n *\r\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\r\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\r\n * https://photoswipe.com/filters/#domitemdata\r\n *\r\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\r\n * Modify clicked gallery item index.\r\n * https://photoswipe.com/filters/#clickedindex\r\n *\r\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\r\n * Modify placeholder image source.\r\n * https://photoswipe.com/filters/#placeholdersrc\r\n *\r\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\r\n * Modify if the content is currently loading.\r\n * https://photoswipe.com/filters/#iscontentloading\r\n *\r\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\r\n * Modify if the content can be zoomed.\r\n * https://photoswipe.com/filters/#iscontentzoomable\r\n *\r\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\r\n * Modify if the placeholder should be used for the content.\r\n * https://photoswipe.com/filters/#usecontentplaceholder\r\n *\r\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\r\n * Modify if the placeholder should be kept after the content is loaded.\r\n * https://photoswipe.com/filters/#iskeepingplaceholder\r\n *\r\n *\r\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\r\n * Modify an element when the content has error state (for example, if image cannot be loaded).\r\n * https://photoswipe.com/filters/#contenterrorelement\r\n *\r\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\r\n * Modify a UI element that's being created.\r\n * https://photoswipe.com/filters/#uielement\r\n *\r\n * @prop {(thumbnail: HTMLElement, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thubmnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the thubmnail bounds from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbbounds\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent : PhotoSwipeEvent & PhotoSwipeEventsMap[T]} AugmentedEvent\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {(event: AugmentedEvent) => void} EventCallback\r\n */\r\n\r\n/**\r\n * Base PhotoSwipe event object\r\n *\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n */\r\nclass PhotoSwipeEvent {\r\n /**\r\n * @param {T} type\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n */\r\n constructor(type, details) {\r\n this.type = type;\r\n if (details) {\r\n Object.assign(this, details);\r\n }\r\n }\r\n\r\n preventDefault() {\r\n this.defaultPrevented = true;\r\n }\r\n}\r\n\r\n/**\r\n * PhotoSwipe base class that can listen and dispatch for events.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\r\n */\r\nclass Eventable {\r\n constructor() {\r\n /**\r\n * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent) => void)[] }}\r\n */\r\n this._listeners = {};\r\n\r\n /**\r\n * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter[] }}\r\n */\r\n this._filters = {};\r\n\r\n /** @type {PhotoSwipe=} */\r\n this.pswp = undefined;\r\n\r\n /** @type {PhotoSwipeOptions} */\r\n this.options = undefined;\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n * @param {number} priority\r\n */\r\n addFilter(name, fn, priority = 100) {\r\n if (!this._filters[name]) {\r\n this._filters[name] = [];\r\n }\r\n\r\n this._filters[name].push({ fn, priority });\r\n this._filters[name].sort((f1, f2) => f1.priority - f2.priority);\r\n\r\n if (this.pswp) {\r\n this.pswp.addFilter(name, fn, priority);\r\n }\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n */\r\n removeFilter(name, fn) {\r\n if (this._filters[name]) {\r\n // @ts-expect-error\r\n this._filters[name] = this._filters[name].filter(filter => (filter.fn !== fn));\r\n }\r\n\r\n if (this.pswp) {\r\n this.pswp.removeFilter(name, fn);\r\n }\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {Parameters} args\r\n * @returns {Parameters[0]}\r\n */\r\n applyFilters(name, ...args) {\r\n if (this._filters[name]) {\r\n this._filters[name].forEach((filter) => {\r\n // @ts-expect-error\r\n args[0] = filter.fn.apply(this, args);\r\n });\r\n }\r\n return args[0];\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback} fn\r\n */\r\n on(name, fn) {\r\n if (!this._listeners[name]) {\r\n this._listeners[name] = [];\r\n }\r\n this._listeners[name].push(fn);\r\n\r\n // When binding events to lightbox,\r\n // also bind events to PhotoSwipe Core,\r\n // if it's open.\r\n if (this.pswp) {\r\n this.pswp.on(name, fn);\r\n }\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback} fn\r\n */\r\n off(name, fn) {\r\n if (this._listeners[name]) {\r\n // @ts-expect-error\r\n this._listeners[name] = this._listeners[name].filter(listener => (fn !== listener));\r\n }\r\n\r\n if (this.pswp) {\r\n this.pswp.off(name, fn);\r\n }\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n * @returns {AugmentedEvent}\r\n */\r\n dispatch(name, details) {\r\n if (this.pswp) {\r\n return this.pswp.dispatch(name, details);\r\n }\r\n\r\n const event = /** @type {AugmentedEvent} */ (new PhotoSwipeEvent(name, details));\r\n\r\n if (!this._listeners) {\r\n return event;\r\n }\r\n\r\n if (this._listeners[name]) {\r\n this._listeners[name].forEach((listener) => {\r\n listener.call(this, event);\r\n });\r\n }\r\n\r\n return event;\r\n }\r\n}\r\n\r\nexport default Eventable;\r\n", "import { createElement, setWidthHeight, toTransformString } from '../util/util.js';\r\n\r\nclass Placeholder {\r\n /**\r\n * @param {string | false} imageSrc\r\n * @param {HTMLElement} container\r\n */\r\n constructor(imageSrc, container) {\r\n // Create placeholder\r\n // (stretched thumbnail or simple div behind the main image)\r\n this.element = createElement(\r\n 'pswp__img pswp__img--placeholder',\r\n imageSrc ? 'img' : '',\r\n container\r\n );\r\n\r\n if (imageSrc) {\r\n /** @type {HTMLImageElement} */\r\n (this.element).decoding = 'async';\r\n /** @type {HTMLImageElement} */\r\n (this.element).alt = '';\r\n /** @type {HTMLImageElement} */\r\n (this.element).src = imageSrc;\r\n this.element.setAttribute('role', 'presentation');\r\n }\r\n\r\n this.element.setAttribute('aria-hiden', 'true');\r\n }\r\n\r\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n setDisplayedSize(width, height) {\r\n if (!this.element) {\r\n return;\r\n }\r\n\r\n if (this.element.tagName === 'IMG') {\r\n // Use transform scale() to modify img placeholder size\r\n // (instead of changing width/height directly).\r\n // This helps with performance, specifically in iOS15 Safari.\r\n setWidthHeight(this.element, 250, 'auto');\r\n this.element.style.transformOrigin = '0 0';\r\n this.element.style.transform = toTransformString(0, 0, width / 250);\r\n } else {\r\n setWidthHeight(this.element, width, height);\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this.element.parentNode) {\r\n this.element.remove();\r\n }\r\n this.element = null;\r\n }\r\n}\r\n\r\nexport default Placeholder;\r\n", "import { createElement, LOAD_STATE, setWidthHeight } from '../util/util.js';\r\nimport Placeholder from './placeholder.js';\r\n\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../util/util.js').LoadState} LoadState */\r\n\r\nclass Content {\r\n /**\r\n * @param {SlideData} itemData Slide data\r\n * @param {PhotoSwipe} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n */\r\n constructor(itemData, instance, index) {\r\n this.instance = instance;\r\n this.data = itemData;\r\n this.index = index;\r\n\r\n /** @type {HTMLImageElement | HTMLDivElement} */\r\n this.element = undefined;\r\n\r\n this.width = Number(this.data.w) || Number(this.data.width) || 0;\r\n this.height = Number(this.data.h) || Number(this.data.height) || 0;\r\n\r\n this.isAttached = false;\r\n this.hasSlide = false;\r\n /** @type {LoadState} */\r\n this.state = LOAD_STATE.IDLE;\r\n\r\n if (this.data.type) {\r\n this.type = this.data.type;\r\n } else if (this.data.src) {\r\n this.type = 'image';\r\n } else {\r\n this.type = 'html';\r\n }\r\n\r\n this.instance.dispatch('contentInit', { content: this });\r\n }\r\n\r\n removePlaceholder() {\r\n if (this.placeholder && !this.keepPlaceholder()) {\r\n // With delay, as image might be loaded, but not rendered\r\n setTimeout(() => {\r\n if (this.placeholder) {\r\n this.placeholder.destroy();\r\n this.placeholder = null;\r\n }\r\n }, 500);\r\n }\r\n }\r\n\r\n /**\r\n * Preload content\r\n *\r\n * @param {boolean=} isLazy\r\n * @param {boolean=} reload\r\n */\r\n load(isLazy, reload) {\r\n if (!this.placeholder && this.slide && this.usePlaceholder()) {\r\n // use -based placeholder only for the first slide,\r\n // as rendering (even small stretched thumbnail) is an expensive operation\r\n const placeholderSrc = this.instance.applyFilters(\r\n 'placeholderSrc',\r\n (this.data.msrc && this.slide.isFirstSlide) ? this.data.msrc : false,\r\n this\r\n );\r\n this.placeholder = new Placeholder(\r\n placeholderSrc,\r\n this.slide.container\r\n );\r\n }\r\n\r\n if (this.element && !reload) {\r\n return;\r\n }\r\n\r\n if (this.instance.dispatch('contentLoad', { content: this, isLazy }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.isImageContent()) {\r\n this.loadImage(isLazy);\r\n } else {\r\n this.element = createElement('pswp__content');\r\n this.element.innerHTML = this.data.html || '';\r\n }\r\n\r\n if (reload && this.slide) {\r\n this.slide.updateContentSize(true);\r\n }\r\n }\r\n\r\n /**\r\n * Preload image\r\n *\r\n * @param {boolean} isLazy\r\n */\r\n loadImage(isLazy) {\r\n const imageElement = createElement('pswp__img', 'img');\r\n this.element = imageElement;\r\n\r\n if (this.instance.dispatch('contentLoadImage', { content: this, isLazy }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.data.srcset) {\r\n imageElement.srcset = this.data.srcset;\r\n }\r\n\r\n imageElement.src = this.data.src;\r\n\r\n imageElement.alt = this.data.alt || '';\r\n\r\n this.state = LOAD_STATE.LOADING;\r\n\r\n if (imageElement.complete) {\r\n this.onLoaded();\r\n } else {\r\n imageElement.onload = () => {\r\n this.onLoaded();\r\n };\r\n\r\n imageElement.onerror = () => {\r\n this.onError();\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Assign slide to content\r\n *\r\n * @param {Slide} slide\r\n */\r\n setSlide(slide) {\r\n this.slide = slide;\r\n this.hasSlide = true;\r\n this.instance = slide.pswp;\r\n\r\n // todo: do we need to unset slide?\r\n }\r\n\r\n /**\r\n * Content load success handler\r\n */\r\n onLoaded() {\r\n this.state = LOAD_STATE.LOADED;\r\n\r\n if (this.slide) {\r\n this.instance.dispatch('loadComplete', { slide: this.slide, content: this });\r\n\r\n // if content is reloaded\r\n if (this.slide.isActive\r\n && this.slide.heavyAppended\r\n && !this.element.parentNode) {\r\n this.slide.container.innerHTML = '';\r\n this.append();\r\n this.slide.updateContentSize(true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Content load error handler\r\n */\r\n onError() {\r\n this.state = LOAD_STATE.ERROR;\r\n\r\n if (this.slide) {\r\n this.displayError();\r\n this.instance.dispatch('loadComplete', { slide: this.slide, isError: true, content: this });\r\n this.instance.dispatch('loadError', { slide: this.slide, content: this });\r\n }\r\n }\r\n\r\n /**\r\n * @returns {Boolean} If the content is currently loading\r\n */\r\n isLoading() {\r\n return this.instance.applyFilters(\r\n 'isContentLoading',\r\n this.state === LOAD_STATE.LOADING,\r\n this\r\n );\r\n }\r\n\r\n isError() {\r\n return this.state === LOAD_STATE.ERROR;\r\n }\r\n\r\n /**\r\n * @returns {boolean} If the content is image\r\n */\r\n isImageContent() {\r\n return this.type === 'image';\r\n }\r\n\r\n /**\r\n * Update content size\r\n *\r\n * @param {Number} width\r\n * @param {Number} height\r\n */\r\n setDisplayedSize(width, height) {\r\n if (!this.element) {\r\n return;\r\n }\r\n\r\n if (this.placeholder) {\r\n this.placeholder.setDisplayedSize(width, height);\r\n }\r\n\r\n // eslint-disable-next-line max-len\r\n if (this.instance.dispatch('contentResize', { content: this, width, height }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n setWidthHeight(this.element, width, height);\r\n\r\n if (this.isImageContent() && !this.isError()) {\r\n const image = /** @type HTMLImageElement */ (this.element);\r\n\r\n // Handle srcset sizes attribute.\r\n //\r\n // Never lower quality, if it was increased previously.\r\n // Chrome does this automatically, Firefox and Safari do not,\r\n // so we store largest used size in dataset.\r\n if (image.srcset\r\n // eslint-disable-next-line max-len\r\n && (!image.dataset.largestUsedSize || width > parseInt(image.dataset.largestUsedSize, 10))) {\r\n image.sizes = width + 'px';\r\n image.dataset.largestUsedSize = String(width);\r\n }\r\n\r\n if (this.slide) {\r\n // eslint-disable-next-line max-len\r\n this.instance.dispatch('imageSizeChange', { slide: this.slide, width, height, content: this });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @returns {boolean} If the content can be zoomed\r\n */\r\n isZoomable() {\r\n return this.instance.applyFilters(\r\n 'isContentZoomable',\r\n this.isImageContent() && (this.state !== LOAD_STATE.ERROR),\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * @returns {boolean} If content should use a placeholder (from msrc by default)\r\n */\r\n usePlaceholder() {\r\n return this.instance.applyFilters(\r\n 'useContentPlaceholder',\r\n this.isImageContent(),\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * Preload content with lazy-loading param\r\n */\r\n lazyLoad() {\r\n if (this.instance.dispatch('contentLazyLoad', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n this.load(true);\r\n }\r\n\r\n /**\r\n * @returns {boolean} If placeholder should be kept after content is loaded\r\n */\r\n keepPlaceholder() {\r\n return this.instance.applyFilters(\r\n 'isKeepingPlaceholder',\r\n this.isLoading(),\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * Destroy the content\r\n */\r\n destroy() {\r\n this.hasSlide = false;\r\n this.slide = null;\r\n\r\n if (this.instance.dispatch('contentDestroy', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n this.remove();\r\n\r\n if (this.isImageContent() && this.element) {\r\n this.element.onload = null;\r\n this.element.onerror = null;\r\n this.element = null;\r\n }\r\n }\r\n\r\n /**\r\n * Display error message\r\n */\r\n displayError() {\r\n if (this.slide) {\r\n /** @type {HTMLElement} */\r\n let errorMsgEl = createElement('pswp__error-msg');\r\n errorMsgEl.innerText = this.instance.options.errorMsg;\r\n errorMsgEl = this.instance.applyFilters(\r\n 'contentErrorElement',\r\n errorMsgEl,\r\n this\r\n );\r\n this.element = createElement('pswp__content pswp__error-msg-container');\r\n this.element.appendChild(errorMsgEl);\r\n this.slide.container.innerHTML = '';\r\n this.slide.container.appendChild(this.element);\r\n this.slide.updateContentSize(true);\r\n this.removePlaceholder();\r\n }\r\n }\r\n\r\n /**\r\n * Append the content\r\n */\r\n append() {\r\n this.isAttached = true;\r\n\r\n if (this.state === LOAD_STATE.ERROR) {\r\n this.displayError();\r\n return;\r\n }\r\n\r\n if (this.instance.dispatch('contentAppend', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.isImageContent()) {\r\n // Use decode() on nearby slides\r\n //\r\n // Nearby slide images are in DOM and not hidden via display:none.\r\n // However, they are placed offscreen (to the left and right side).\r\n //\r\n // Some browsers do not composite the image until it's actually visible,\r\n // using decode() helps.\r\n //\r\n // You might ask \"why dont you just decode() and then append all images\",\r\n // that's because I want to show image before it's fully loaded,\r\n // as browser can render parts of image while it is loading.\r\n if (this.slide\r\n && !this.slide.isActive\r\n && ('decode' in this.element)) {\r\n this.isDecoding = true;\r\n // Make sure that we start decoding on the next frame\r\n requestAnimationFrame(() => {\r\n // element might change\r\n if (this.element && this.element.tagName === 'IMG') {\r\n /** @type {HTMLImageElement} */\r\n (this.element).decode().then(() => {\r\n this.isDecoding = false;\r\n requestAnimationFrame(() => {\r\n this.appendImage();\r\n });\r\n }).catch(() => {\r\n this.isDecoding = false;\r\n });\r\n }\r\n });\r\n } else {\r\n if (this.placeholder\r\n // eslint-disable-next-line max-len\r\n && (this.state === LOAD_STATE.LOADED || /** @type {LoadState} */ (this.state) === LOAD_STATE.ERROR)\r\n ) {\r\n this.removePlaceholder();\r\n }\r\n this.appendImage();\r\n }\r\n } else if (this.element && !this.element.parentNode) {\r\n this.slide.container.appendChild(this.element);\r\n }\r\n }\r\n\r\n /**\r\n * Activate the slide,\r\n * active slide is generally the current one,\r\n * meaning the user can see it.\r\n */\r\n activate() {\r\n if (this.instance.dispatch('contentActivate', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.slide) {\r\n if (this.isImageContent() && this.isDecoding) {\r\n // add image to slide when it becomes active,\r\n // even if it's not finished decoding\r\n this.appendImage();\r\n } else if (this.isError()) {\r\n this.load(false, true); // try to reload\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Deactivate the content\r\n */\r\n deactivate() {\r\n this.instance.dispatch('contentDeactivate', { content: this });\r\n }\r\n\r\n\r\n /**\r\n * Remove the content from DOM\r\n */\r\n remove() {\r\n this.isAttached = false;\r\n\r\n if (this.instance.dispatch('contentRemove', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.element && this.element.parentNode) {\r\n this.element.remove();\r\n }\r\n }\r\n\r\n /**\r\n * Append the image content to slide container\r\n */\r\n appendImage() {\r\n if (!this.isAttached) {\r\n return;\r\n }\r\n\r\n if (this.instance.dispatch('contentAppendImage', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n // ensure that element exists and is not already appended\r\n if (this.slide && this.element && !this.element.parentNode) {\r\n this.slide.container.appendChild(this.element);\r\n\r\n if (this.placeholder\r\n && (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR)) {\r\n this.removePlaceholder();\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default Content;\r\n", "import Eventable from './eventable.js';\r\nimport {\r\n getElementsFromOption\r\n} from '../util/util.js';\r\nimport Content from '../slide/content.js';\r\n\r\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\r\n/** @typedef {import(\"../photoswipe.js\").PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\r\n\r\n/**\r\n * PhotoSwipe base class that can retrieve data about every slide.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\r\n */\r\nclass PhotoSwipeBase extends Eventable {\r\n /**\r\n * Get total number of slides\r\n *\r\n * @returns {number}\r\n */\r\n getNumItems() {\r\n let numItems;\r\n const { dataSource } = this.options;\r\n if (!dataSource) {\r\n numItems = 0;\r\n } else if ('length' in dataSource) {\r\n // may be an array or just object with length property\r\n numItems = dataSource.length;\r\n } else if ('gallery' in dataSource) {\r\n // query DOM elements\r\n if (!dataSource.items) {\r\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n }\r\n\r\n if (dataSource.items) {\r\n numItems = dataSource.items.length;\r\n }\r\n }\r\n\r\n // legacy event, before filters were introduced\r\n const event = this.dispatch('numItems', {\r\n dataSource,\r\n numItems\r\n });\r\n return this.applyFilters('numItems', event.numItems, dataSource);\r\n }\r\n\r\n /**\r\n * @param {SlideData} slideData\r\n * @param {number} index\r\n */\r\n createContentFromData(slideData, index) {\r\n // @ts-expect-error\r\n return new Content(slideData, this, index);\r\n }\r\n\r\n /**\r\n * Get item data by index.\r\n *\r\n * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\r\n * For example, it may contain properties like\r\n * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\r\n *\r\n * @param {number} index\r\n */\r\n getItemData(index) {\r\n const { dataSource } = this.options;\r\n let dataSourceItem;\r\n if (Array.isArray(dataSource)) {\r\n // Datasource is an array of elements\r\n dataSourceItem = dataSource[index];\r\n } else if (dataSource && dataSource.gallery) {\r\n // dataSource has gallery property,\r\n // thus it was created by Lightbox, based on\r\n // gallery and children options\r\n\r\n // query DOM elements\r\n if (!dataSource.items) {\r\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n }\r\n\r\n dataSourceItem = dataSource.items[index];\r\n }\r\n\r\n let itemData = dataSourceItem;\r\n\r\n if (itemData instanceof Element) {\r\n itemData = this._domElementToItemData(itemData);\r\n }\r\n\r\n // Dispatching the itemData event,\r\n // it's a legacy verion before filters were introduced\r\n const event = this.dispatch('itemData', {\r\n itemData: itemData || {},\r\n index\r\n });\r\n\r\n return this.applyFilters('itemData', event.itemData, index);\r\n }\r\n\r\n /**\r\n * Get array of gallery DOM elements,\r\n * based on childSelector and gallery element.\r\n *\r\n * @param {HTMLElement} galleryElement\r\n */\r\n _getGalleryDOMElements(galleryElement) {\r\n if (this.options.children || this.options.childSelector) {\r\n return getElementsFromOption(\r\n this.options.children,\r\n this.options.childSelector,\r\n galleryElement\r\n ) || [];\r\n }\r\n\r\n return [galleryElement];\r\n }\r\n\r\n /**\r\n * Converts DOM element to item data object.\r\n *\r\n * @param {HTMLElement} element DOM element\r\n */\r\n // eslint-disable-next-line class-methods-use-this\r\n _domElementToItemData(element) {\r\n /** @type {SlideData} */\r\n const itemData = {\r\n element\r\n };\r\n\r\n // eslint-disable-next-line max-len\r\n const linkEl = /** @type {HTMLAnchorElement} */ (element.tagName === 'A' ? element : element.querySelector('a'));\r\n\r\n if (linkEl) {\r\n // src comes from data-pswp-src attribute,\r\n // if it's empty link href is used\r\n itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\r\n\r\n if (linkEl.dataset.pswpSrcset) {\r\n itemData.srcset = linkEl.dataset.pswpSrcset;\r\n }\r\n\r\n itemData.width = parseInt(linkEl.dataset.pswpWidth, 10);\r\n itemData.height = parseInt(linkEl.dataset.pswpHeight, 10);\r\n\r\n // support legacy w & h properties\r\n itemData.w = itemData.width;\r\n itemData.h = itemData.height;\r\n\r\n if (linkEl.dataset.pswpType) {\r\n itemData.type = linkEl.dataset.pswpType;\r\n }\r\n\r\n const thumbnailEl = element.querySelector('img');\r\n\r\n if (thumbnailEl) {\r\n // msrc is URL to placeholder image that's displayed before large image is loaded\r\n // by default it's displayed only for the first slide\r\n itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\r\n itemData.alt = thumbnailEl.getAttribute('alt');\r\n }\r\n\r\n if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\r\n itemData.thumbCropped = true;\r\n }\r\n }\r\n\r\n return this.applyFilters('domItemData', itemData, element, linkEl);\r\n }\r\n}\r\n\r\nexport default PhotoSwipeBase;\r\n", "/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipe} pswp\r\n */\r\nexport function getViewportSize(options, pswp) {\r\n if (options.getViewportSizeFn) {\r\n const newViewportSize = options.getViewportSizeFn(options, pswp);\r\n if (newViewportSize) {\r\n return newViewportSize;\r\n }\r\n }\r\n\r\n return {\r\n x: document.documentElement.clientWidth,\r\n\r\n // TODO: height on mobile is very incosistent due to toolbar\r\n // find a way to improve this\r\n //\r\n // document.documentElement.clientHeight - doesn't seem to work well\r\n y: window.innerHeight\r\n };\r\n}\r\n\r\n/**\r\n * Parses padding option.\r\n * Supported formats:\r\n *\r\n * // Object\r\n * padding: {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * }\r\n *\r\n * // A function that returns the object\r\n * paddingFn: (viewportSize, itemData, index) => {\r\n * return {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * };\r\n * }\r\n *\r\n * // Legacy variant\r\n * paddingLeft: 0,\r\n * paddingRight: 0,\r\n * paddingTop: 0,\r\n * paddingBottom: 0,\r\n *\r\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {{ x?: number; y?: number }} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index Slide index\r\n * @returns {number}\r\n */\r\nexport function parsePaddingOption(prop, options, viewportSize, itemData, index) {\r\n /** @type {number} */\r\n let paddingValue;\r\n\r\n if (options.paddingFn) {\r\n paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\r\n } else if (options.padding) {\r\n paddingValue = options.padding[prop];\r\n } else {\r\n const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1);\r\n // @ts-expect-error\r\n if (options[legacyPropName]) {\r\n // @ts-expect-error\r\n paddingValue = options[legacyPropName];\r\n }\r\n }\r\n\r\n return paddingValue || 0;\r\n}\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {{ x?: number; y?: number }} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n */\r\nexport function getPanAreaSize(options, viewportSize, itemData, index) {\r\n return {\r\n x: viewportSize.x\r\n - parsePaddingOption('left', options, viewportSize, itemData, index)\r\n - parsePaddingOption('right', options, viewportSize, itemData, index),\r\n y: viewportSize.y\r\n - parsePaddingOption('top', options, viewportSize, itemData, index)\r\n - parsePaddingOption('bottom', options, viewportSize, itemData, index)\r\n };\r\n}\r\n", "const MAX_IMAGE_WIDTH = 4000;\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\r\n\r\n/**\r\n * Calculates zoom levels for specific slide.\r\n * Depends on viewport size and image size.\r\n */\r\nclass ZoomLevel {\r\n /**\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {SlideData} itemData Slide data\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe=} pswp PhotoSwipe instance, can be undefined if not initialized yet\r\n */\r\n constructor(options, itemData, index, pswp) {\r\n this.pswp = pswp;\r\n this.options = options;\r\n this.itemData = itemData;\r\n this.index = index;\r\n }\r\n\r\n /**\r\n * Calculate initial, secondary and maximum zoom level for the specified slide.\r\n *\r\n * It should be called when either image or viewport size changes.\r\n *\r\n * @param {number} maxWidth\r\n * @param {number} maxHeight\r\n * @param {{ x?: number; y?: number }} panAreaSize\r\n */\r\n update(maxWidth, maxHeight, panAreaSize) {\r\n this.elementSize = {\r\n x: maxWidth,\r\n y: maxHeight\r\n };\r\n\r\n this.panAreaSize = panAreaSize;\r\n\r\n const hRatio = this.panAreaSize.x / this.elementSize.x;\r\n const vRatio = this.panAreaSize.y / this.elementSize.y;\r\n\r\n this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\r\n this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio);\r\n\r\n // zoom.vFill defines zoom level of the image\r\n // when it has 100% of viewport vertical space (height)\r\n this.vFill = Math.min(1, vRatio);\r\n\r\n this.initial = this._getInitial();\r\n this.secondary = this._getSecondary();\r\n this.max = Math.max(\r\n this.initial,\r\n this.secondary,\r\n this._getMax()\r\n );\r\n\r\n this.min = Math.min(\r\n this.fit,\r\n this.initial,\r\n this.secondary\r\n );\r\n\r\n if (this.pswp) {\r\n this.pswp.dispatch('zoomLevelsUpdate', { zoomLevels: this, slideData: this.itemData });\r\n }\r\n }\r\n\r\n /**\r\n * Parses user-defined zoom option.\r\n *\r\n * @private\r\n * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\r\n */\r\n _parseZoomLevelOption(optionPrefix) {\r\n // eslint-disable-next-line max-len\r\n const optionName = /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */ (optionPrefix + 'ZoomLevel');\r\n const optionValue = this.options[optionName];\r\n\r\n if (!optionValue) {\r\n return;\r\n }\r\n\r\n if (typeof optionValue === 'function') {\r\n return optionValue(this);\r\n }\r\n\r\n if (optionValue === 'fill') {\r\n return this.fill;\r\n }\r\n\r\n if (optionValue === 'fit') {\r\n return this.fit;\r\n }\r\n\r\n return Number(optionValue);\r\n }\r\n\r\n /**\r\n * Get zoom level to which image will be zoomed after double-tap gesture,\r\n * or when user clicks on zoom icon,\r\n * or mouse-click on image itself.\r\n * If you return 1 image will be zoomed to its original size.\r\n *\r\n * @private\r\n * @return {number}\r\n */\r\n _getSecondary() {\r\n let currZoomLevel = this._parseZoomLevelOption('secondary');\r\n\r\n if (currZoomLevel) {\r\n return currZoomLevel;\r\n }\r\n\r\n // 3x of \"fit\" state, but not larger than original\r\n currZoomLevel = Math.min(1, this.fit * 3);\r\n\r\n if (currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\r\n currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\r\n }\r\n\r\n return currZoomLevel;\r\n }\r\n\r\n /**\r\n * Get initial image zoom level.\r\n *\r\n * @private\r\n * @return {number}\r\n */\r\n _getInitial() {\r\n return this._parseZoomLevelOption('initial') || this.fit;\r\n }\r\n\r\n /**\r\n * Maximum zoom level when user zooms\r\n * via zoom/pinch gesture,\r\n * via cmd/ctrl-wheel or via trackpad.\r\n *\r\n * @private\r\n * @return {number}\r\n */\r\n _getMax() {\r\n const currZoomLevel = this._parseZoomLevelOption('max');\r\n\r\n if (currZoomLevel) {\r\n return currZoomLevel;\r\n }\r\n\r\n // max zoom level is x4 from \"fit state\",\r\n // used for zoom gesture and ctrl/trackpad zoom\r\n return Math.max(1, this.fit * 4);\r\n }\r\n}\r\n\r\nexport default ZoomLevel;\r\n", "import { getViewportSize, getPanAreaSize } from '../util/viewport-size.js';\r\nimport ZoomLevel from './zoom-level.js';\r\n\r\n/** @typedef {import('./content.js').default} Content */\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n\r\nconst MIN_SLIDES_TO_CACHE = 5;\r\n\r\n/**\r\n * Lazy-load an image\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {PhotoSwipe | PhotoSwipeLightbox} instance PhotoSwipe or PhotoSwipeLightbox\r\n * @param {number} index\r\n * @returns Image that is being decoded or false.\r\n */\r\nexport function lazyLoadData(itemData, instance, index) {\r\n // src/slide/content/content.js\r\n const content = instance.createContentFromData(itemData, index);\r\n\r\n if (!content || !content.lazyLoad) {\r\n return;\r\n }\r\n\r\n const { options } = instance;\r\n\r\n // We need to know dimensions of the image to preload it,\r\n // as it might use srcset and we need to define sizes\r\n // @ts-expect-error should provide pswp instance?\r\n const viewportSize = instance.viewportSize || getViewportSize(options, instance);\r\n const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\r\n\r\n const zoomLevel = new ZoomLevel(options, itemData, -1);\r\n zoomLevel.update(content.width, content.height, panAreaSize);\r\n\r\n content.lazyLoad();\r\n content.setDisplayedSize(\r\n Math.ceil(content.width * zoomLevel.initial),\r\n Math.ceil(content.height * zoomLevel.initial)\r\n );\r\n\r\n return content;\r\n}\r\n\r\n\r\n/**\r\n * Lazy-loads specific slide.\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * By default it loads image based on viewport size and initial zoom level.\r\n *\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe | PhotoSwipeLightbox} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n */\r\nexport function lazyLoadSlide(index, instance) {\r\n const itemData = instance.getItemData(index);\r\n\r\n if (instance.dispatch('lazyLoadSlide', { index, itemData }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n return lazyLoadData(itemData, instance, index);\r\n}\r\n\r\n\r\nclass ContentLoader {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n // Total amount of cached images\r\n this.limit = Math.max(\r\n pswp.options.preload[0] + pswp.options.preload[1] + 1,\r\n MIN_SLIDES_TO_CACHE\r\n );\r\n /** @type {Content[]} */\r\n this._cachedItems = [];\r\n }\r\n\r\n /**\r\n * Lazy load nearby slides based on `preload` option.\r\n *\r\n * @param {number=} diff Difference between slide indexes that was changed recently, or 0.\r\n */\r\n updateLazy(diff) {\r\n const { pswp } = this;\r\n\r\n if (pswp.dispatch('lazyLoad').defaultPrevented) {\r\n return;\r\n }\r\n\r\n const { preload } = pswp.options;\r\n const isForward = diff === undefined ? true : (diff >= 0);\r\n let i;\r\n\r\n // preload[1] - num items to preload in forward direction\r\n for (i = 0; i <= preload[1]; i++) {\r\n this.loadSlideByIndex(pswp.currIndex + (isForward ? i : (-i)));\r\n }\r\n\r\n // preload[0] - num items to preload in backward direction\r\n for (i = 1; i <= preload[0]; i++) {\r\n this.loadSlideByIndex(pswp.currIndex + (isForward ? (-i) : i));\r\n }\r\n }\r\n\r\n /**\r\n * @param {number} index\r\n */\r\n loadSlideByIndex(index) {\r\n index = this.pswp.getLoopedIndex(index);\r\n // try to get cached content\r\n let content = this.getContentByIndex(index);\r\n if (!content) {\r\n // no cached content, so try to load from scratch:\r\n content = lazyLoadSlide(index, this.pswp);\r\n // if content can be loaded, add it to cache:\r\n if (content) {\r\n this.addToCache(content);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @param {Slide} slide\r\n */\r\n getContentBySlide(slide) {\r\n let content = this.getContentByIndex(slide.index);\r\n if (!content) {\r\n // create content if not found in cache\r\n content = this.pswp.createContentFromData(slide.data, slide.index);\r\n if (content) {\r\n this.addToCache(content);\r\n }\r\n }\r\n\r\n if (content) {\r\n // assign slide to content\r\n content.setSlide(slide);\r\n }\r\n return content;\r\n }\r\n\r\n /**\r\n * @param {Content} content\r\n */\r\n addToCache(content) {\r\n // move to the end of array\r\n this.removeByIndex(content.index);\r\n this._cachedItems.push(content);\r\n\r\n if (this._cachedItems.length > this.limit) {\r\n // Destroy the first content that's not attached\r\n const indexToRemove = this._cachedItems.findIndex((item) => {\r\n return !item.isAttached && !item.hasSlide;\r\n });\r\n if (indexToRemove !== -1) {\r\n const removedItem = this._cachedItems.splice(indexToRemove, 1)[0];\r\n removedItem.destroy();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Removes an image from cache, does not destroy() it, just removes.\r\n *\r\n * @param {number} index\r\n */\r\n removeByIndex(index) {\r\n const indexToRemove = this._cachedItems.findIndex(item => item.index === index);\r\n if (indexToRemove !== -1) {\r\n this._cachedItems.splice(indexToRemove, 1);\r\n }\r\n }\r\n\r\n /**\r\n * @param {number} index\r\n */\r\n getContentByIndex(index) {\r\n return this._cachedItems.find(content => content.index === index);\r\n }\r\n\r\n destroy() {\r\n this._cachedItems.forEach(content => content.destroy());\r\n this._cachedItems = null;\r\n }\r\n}\r\n\r\nexport default ContentLoader;\r\n", "import {\r\n specialKeyUsed,\r\n getElementsFromOption,\r\n isPswpClass\r\n} from '../util/util.js';\r\n\r\nimport PhotoSwipeBase from '../core/base.js';\r\nimport { lazyLoadSlide } from '../slide/loader.js';\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Type} Type\r\n */\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\r\n/** @typedef {import('../slide/content.js').default} Content */\r\n/** @typedef {import('../core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\r\n/** @typedef {import('../core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('../core/eventable.js').EventCallback} EventCallback\r\n */\r\n\r\n/**\r\n * PhotoSwipe Lightbox\r\n *\r\n * - If user has unsupported browser it falls back to default browser action (just opens URL)\r\n * - Binds click event to links that should open PhotoSwipe\r\n * - parses DOM strcture for PhotoSwipe (retrieves large image URLs and sizes)\r\n * - Initializes PhotoSwipe\r\n *\r\n *\r\n * Loader options use the same object as PhotoSwipe, and supports such options:\r\n *\r\n * gallery - Element | Element[] | NodeList | string selector for the gallery element\r\n * children - Element | Element[] | NodeList | string selector for the gallery children\r\n *\r\n */\r\nclass PhotoSwipeLightbox extends PhotoSwipeBase {\r\n /**\r\n * @param {PhotoSwipeOptions} options\r\n */\r\n constructor(options) {\r\n super();\r\n /** @type {PhotoSwipeOptions} */\r\n this.options = options || {};\r\n this._uid = 0;\r\n }\r\n\r\n /**\r\n * Initialize lightbox, should be called only once.\r\n * It's not included in the main constructor, so you may bind events before it.\r\n */\r\n init() {\r\n this.onThumbnailsClick = this.onThumbnailsClick.bind(this);\r\n\r\n // Bind click events to each gallery\r\n getElementsFromOption(this.options.gallery, this.options.gallerySelector)\r\n .forEach((galleryElement) => {\r\n galleryElement.addEventListener('click', this.onThumbnailsClick, false);\r\n });\r\n }\r\n\r\n /**\r\n * @param {MouseEvent} e\r\n */\r\n onThumbnailsClick(e) {\r\n // Exit and allow default browser action if:\r\n if (specialKeyUsed(e) // ... if clicked with a special key (ctrl/cmd...)\r\n || window.pswp // ... if PhotoSwipe is already open\r\n || window.navigator.onLine === false) { // ... if offline\r\n return;\r\n }\r\n\r\n // If both clientX and clientY are 0 or not defined,\r\n // the event is likely triggered by keyboard,\r\n // so we do not pass the initialPoint\r\n //\r\n // Note that some screen readers emulate the mouse position,\r\n // so it's not ideal way to detect them.\r\n //\r\n let initialPoint = { x: e.clientX, y: e.clientY };\r\n\r\n if (!initialPoint.x && !initialPoint.y) {\r\n initialPoint = null;\r\n }\r\n\r\n let clickedIndex = this.getClickedIndex(e);\r\n clickedIndex = this.applyFilters('clickedIndex', clickedIndex, e, this);\r\n const dataSource = {\r\n gallery: /** @type {HTMLElement} */ (e.currentTarget)\r\n };\r\n\r\n if (clickedIndex >= 0) {\r\n e.preventDefault();\r\n this.loadAndOpen(clickedIndex, dataSource, initialPoint);\r\n }\r\n }\r\n\r\n /**\r\n * Get index of gallery item that was clicked.\r\n *\r\n * @param {MouseEvent} e click event\r\n */\r\n getClickedIndex(e) {\r\n // legacy option\r\n if (this.options.getClickedIndexFn) {\r\n return this.options.getClickedIndexFn.call(this, e);\r\n }\r\n\r\n const clickedTarget = /** @type {HTMLElement} */ (e.target);\r\n const childElements = getElementsFromOption(\r\n this.options.children,\r\n this.options.childSelector,\r\n /** @type {HTMLElement} */ (e.currentTarget)\r\n );\r\n const clickedChildIndex = childElements.findIndex(\r\n child => child === clickedTarget || child.contains(clickedTarget)\r\n );\r\n\r\n if (clickedChildIndex !== -1) {\r\n return clickedChildIndex;\r\n } else if (this.options.children || this.options.childSelector) {\r\n // click wasn't on a child element\r\n return -1;\r\n }\r\n\r\n // There is only one item (which is the gallery)\r\n return 0;\r\n }\r\n\r\n /**\r\n * Load and open PhotoSwipe\r\n *\r\n * @param {number} index\r\n * @param {DataSource=} dataSource\r\n * @param {{ x?: number; y?: number }} [initialPoint]\r\n */\r\n loadAndOpen(index, dataSource, initialPoint) {\r\n // Check if the gallery is already open\r\n if (window.pswp) {\r\n return false;\r\n }\r\n\r\n // set initial index\r\n this.options.index = index;\r\n\r\n // define options for PhotoSwipe constructor\r\n this.options.initialPointerPos = initialPoint;\r\n\r\n this.shouldOpen = true;\r\n this.preload(index, dataSource);\r\n return true;\r\n }\r\n\r\n /**\r\n * Load the main module and the slide content by index\r\n *\r\n * @param {number} index\r\n * @param {DataSource=} dataSource\r\n */\r\n preload(index, dataSource) {\r\n const { options } = this;\r\n\r\n if (dataSource) {\r\n options.dataSource = dataSource;\r\n }\r\n\r\n // Add the main module\r\n /** @type {Promise>[]} */\r\n const promiseArray = [];\r\n\r\n const pswpModuleType = typeof options.pswpModule;\r\n if (isPswpClass(options.pswpModule)) {\r\n promiseArray.push(Promise.resolve(/** @type {Type} */ (options.pswpModule)));\r\n } else if (pswpModuleType === 'string') {\r\n throw new Error('pswpModule as string is no longer supported');\r\n } else if (pswpModuleType === 'function') {\r\n promiseArray.push(/** @type {() => Promise>} */ (options.pswpModule)());\r\n } else {\r\n throw new Error('pswpModule is not valid');\r\n }\r\n\r\n // Add custom-defined promise, if any\r\n if (typeof options.openPromise === 'function') {\r\n // allow developers to perform some task before opening\r\n promiseArray.push(options.openPromise());\r\n }\r\n\r\n if (options.preloadFirstSlide !== false && index >= 0) {\r\n this._preloadedContent = lazyLoadSlide(index, this);\r\n }\r\n\r\n // Wait till all promises resolve and open PhotoSwipe\r\n const uid = ++this._uid;\r\n Promise.all(promiseArray).then((iterableModules) => {\r\n if (this.shouldOpen) {\r\n const mainModule = iterableModules[0];\r\n this._openPhotoswipe(mainModule, uid);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {Type | { default: Type }} module\r\n * @param {number} uid\r\n */\r\n _openPhotoswipe(module, uid) {\r\n // Cancel opening if UID doesn't match the current one\r\n // (if user clicked on another gallery item before current was loaded).\r\n //\r\n // Or if shouldOpen flag is set to false\r\n // (developer may modify it via public API)\r\n if (uid !== this._uid && this.shouldOpen) {\r\n return;\r\n }\r\n\r\n this.shouldOpen = false;\r\n\r\n // PhotoSwipe is already open\r\n if (window.pswp) {\r\n return;\r\n }\r\n\r\n /**\r\n * Pass data to PhotoSwipe and open init\r\n *\r\n * @type {PhotoSwipe}\r\n */\r\n const pswp = typeof module === 'object'\r\n ? new module.default(this.options) // eslint-disable-line\r\n : new module(this.options); // eslint-disable-line\r\n\r\n this.pswp = pswp;\r\n window.pswp = pswp;\r\n\r\n // map listeners from Lightbox to PhotoSwipe Core\r\n /** @type {(keyof PhotoSwipeEventsMap)[]} */\r\n (Object.keys(this._listeners)).forEach((name) => {\r\n this._listeners[name].forEach((fn) => {\r\n pswp.on(name, /** @type {EventCallback} */(fn));\r\n });\r\n });\r\n\r\n // same with filters\r\n /** @type {(keyof PhotoSwipeFiltersMap)[]} */\r\n (Object.keys(this._filters)).forEach((name) => {\r\n this._filters[name].forEach((filter) => {\r\n pswp.addFilter(name, filter.fn, filter.priority);\r\n });\r\n });\r\n\r\n if (this._preloadedContent) {\r\n pswp.contentLoader.addToCache(this._preloadedContent);\r\n this._preloadedContent = null;\r\n }\r\n\r\n pswp.on('destroy', () => {\r\n // clean up public variables\r\n this.pswp = null;\r\n window.pswp = null;\r\n });\r\n\r\n pswp.init();\r\n }\r\n\r\n /**\r\n * Unbinds all events, closes PhotoSwipe if it's open.\r\n */\r\n destroy() {\r\n if (this.pswp) {\r\n this.pswp.destroy();\r\n }\r\n\r\n this.shouldOpen = false;\r\n this._listeners = null;\r\n\r\n getElementsFromOption(this.options.gallery, this.options.gallerySelector)\r\n .forEach((galleryElement) => {\r\n galleryElement.removeEventListener('click', this.onThumbnailsClick, false);\r\n });\r\n }\r\n}\r\n\r\nexport default PhotoSwipeLightbox;\r\n", "import PhotoSwipeLightbox from 'photoswipe/lightbox'\nimport 'photoswipe/photoswipe.css'\n\nup.compiler('[lightbox-gallery]', async (element) => {\n\n const lightbox = new PhotoSwipeLightbox({\n gallery: element,\n children: '[lightbox-image]',\n showHideAnimationType: 'zoom',\n pswpModule: (await import('photoswipe')).default,\n })\n\n lightbox.on('itemData', (event) => {\n const lightboxImage = event.itemData.element\n event.itemData = lightboxImage.getItemData()\n })\n\n // Support captions: https://photoswipe.com/caption/\n lightbox.on('uiRegister', () => {\n lightbox.pswp.ui.registerElement({\n name: 'custom-caption',\n order: 9,\n isButton: false,\n appendTo: 'root',\n html: '',\n onInit: (captionElement, _pswp) => {\n lightbox.pswp.on('change', () => {\n const { copyrightText, descriptionText, titleText } = lightbox.pswp.currSlide.data\n\n captionElement.innerHTML = ''\n\n if (titleText) up.element.affix(captionElement, 'h5.m-0', { text: titleText })\n if (descriptionText) up.element.affix(captionElement, 'div', { text: descriptionText })\n if (copyrightText) up.element.affix(captionElement, '.small.text-muted', { text: `Copyright information: ${copyrightText}` })\n })\n },\n })\n })\n\n lightbox.init()\n\n})\n"], "mappings": "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B,MAAO,CAAC,EAAG,GAAG,CAAI,CACtB,CACJ,CACA,MAAO,CACH,WACA,eACA,YACA,kBACA,sBACA,SACA,iBACA,QACA,iBACA,SACA,gBACA,QAAS,GACT,uBACA,OACA,eACA,MACA,WACA,YACA,cACA,QACA,SACA,KAAM,GACN,OAAQ,GACR,UACA,aACA,WACA,iBACA,QACA,SACA,QACA,SACA,aACA,cACA,UACA,YACA,YACA,WACA,WACA,WACA,aACA,WACA,YACA,WACA,YACA,WACA,eACA,aACA,YACA,WACA,aACA,aACA,eACA,SACA,WACA,MAAO,EACP,YACA,kBACA,UACA,QACA,UACA,QACA,uBACA,UACA,UACA,YACA,aACA,kBACA,mBACA,OACA,YACA,YACA,cACA,gBACA,YACA,cACA,WACA,YACA,eACA,UACA,iBACA,YACA,yBACA,gBACA,KAAM,EACN,UAAW,EACX,qBACA,WACA,eACA,YACA,YACA,aACA,cACA,OAAQ,GACR,cACA,cACA,OACA,kBACA,kBACA,OAAQ,GACR,SAAU,GACV,WACA,mBACA,qBACA,oBACA,mBACA,WACA,4BACA,cACA,UAAW,GACX,cACA,SACJ,CACJ,EAAG,CAGG,EAEC,IAAM,CAEb,GAAG,MAAS,UAAY,CACpB,GAAM,GAAI,GAAG,KACb,WAAe,EAAS,EAAQ,CAAC,EAAG,CAChC,AAAI,EAAE,QAAQ,CAAO,GACjB,GAAU,EAAE,QAAQ,GAAG,CAAO,GAElC,GAAM,GAAQ,GAAI,OAAM,CAAO,EAC/B,SAAE,OAAO,EAAO,CAAK,EACd,CACX,CACA,WAAwB,EAAM,EAAO,EAAO,CACxC,GAAM,GAAK,YAAa,EAAM,CAC1B,GAAM,GAAQ,EAAK,GAAG,CAAI,EAC1B,SAAM,KAAO,EACN,CACX,EACA,SAAG,GAAK,GAAS,EAAM,OAAS,EAChC,EAAG,MAAQ,IAAI,IAAS,QAAQ,OAAO,EAAG,GAAG,CAAI,CAAC,EAC3C,CACX,CACA,GAAM,GAAS,EAAe,WAAW,EACnC,EAAU,EAAe,aAAc,AAAC,GACnC,EAAM,GAAW,SAAS,CACpC,EACK,EAAiB,EAAe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", "names": [] }