| Current Path : /home/smartconb/www/armencom33/media/com_eventgallery/dist/ |
| Current File : /home/smartconb/www/armencom33/media/com_eventgallery/dist/eventgallery-debug.js.map |
{"version":3,"file":"eventgallery-debug.js","mappings":"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","sources":["webpack://eventgallery/./common/js/Helpers.js","webpack://eventgallery/./frontend/js/EventgalleryBehavior.js","webpack://eventgallery/./frontend/js/EventgalleryEventsList.js","webpack://eventgallery/./frontend/js/EventgalleryEventsTiles.js","webpack://eventgallery/./frontend/js/EventgalleryGooglePhotosProcessor.js","webpack://eventgallery/./frontend/js/EventgalleryImage.js","webpack://eventgallery/./frontend/js/EventgalleryImageList.js","webpack://eventgallery/./frontend/js/EventgalleryLazyload.js","webpack://eventgallery/./frontend/js/EventgalleryRow.js","webpack://eventgallery/./frontend/js/EventgallerySizeCalculator.js","webpack://eventgallery/./frontend/js/EventgallerySquareList.js","webpack://eventgallery/./frontend/js/EventgalleryTilesCollection.js","webpack://eventgallery/./frontend/js/Overlay.js","webpack://eventgallery/./frontend/js/SlideShow.js","webpack://eventgallery/./frontend/js/URLHelper.js","webpack://eventgallery/./frontend/js/glide_modules/anchor.js","webpack://eventgallery/./frontend/js/jsgallery/EventgalleryJSGallery2.js","webpack://eventgallery/./frontend/js/jsgallery/index.js","webpack://eventgallery/./frontend/js/photoswipe-video-plugin/default-options.js","webpack://eventgallery/./frontend/js/photoswipe-video-plugin/index.js","webpack://eventgallery/./frontend/js/photoswipe-video-plugin/video-content-setup.js","webpack://eventgallery/./frontend/js/photoswipe/HistoryHandler.js","webpack://eventgallery/./frontend/js/photoswipe/PhotoSwipeGallery.js","webpack://eventgallery/./frontend/js/photoswipe/PhotoSwipeGallerySlide.js","webpack://eventgallery/./frontend/js/photoswipe/SlideGenerator.js","webpack://eventgallery/./frontend/js/photoswipe/UrlHandling.js","webpack://eventgallery/./frontend/js/slider/SliderOptions.js","webpack://eventgallery/./frontend/js/slider/SliderStarter.js","webpack://eventgallery/./frontend/js/slider/SliderTransformator.js","webpack://eventgallery/./frontend/js/utils/ElementSize.js","webpack://eventgallery/./frontend/js/utils/camelCaseConverter.js","webpack://eventgallery/./frontend/js/utils/eventshandler.js","webpack://eventgallery/./frontend/js/Polyfill.ts","webpack://eventgallery/./frontend/js/minicart/Add2CartButtonHandler.ts","webpack://eventgallery/./frontend/js/minicart/Add2CartDialogContent.ts","webpack://eventgallery/./frontend/js/minicart/CartConnectorButtonHandler.ts","webpack://eventgallery/./frontend/js/minicart/CartEvents.ts","webpack://eventgallery/./frontend/js/minicart/CartProcessor.ts","webpack://eventgallery/./frontend/js/minicart/MiniCart.ts","webpack://eventgallery/./frontend/js/minicart/index.ts","webpack://eventgallery/./frontend/js/socialbutton/index.ts","webpack://eventgallery/./frontend/js/socialbutton/socialbutton.ts","webpack://eventgallery/./frontend/js/touch/Touch.ts","webpack://eventgallery/./frontend/js/utils/units.ts","webpack://eventgallery/./node_modules/@glidejs/glide/dist/glide.modular.esm.js","webpack://eventgallery/./node_modules/photoswipe/dist/photoswipe.esm.js","webpack://eventgallery/webpack/bootstrap","webpack://eventgallery/webpack/runtime/define property getters","webpack://eventgallery/webpack/runtime/hasOwnProperty shorthand","webpack://eventgallery/webpack/runtime/make namespace object","webpack://eventgallery/./eventgallery.js"],"sourcesContent":["function removeElement(array, elm) {\r\n const index = array.indexOf(elm);\r\n if (index > -1) {\r\n array.splice(index, 1);\r\n }\r\n}\r\n\r\nfunction mergeObjects(defaults, options) {\r\n if (options === null || defaults === null) {\r\n return defaults;\r\n }\r\n\r\n for (let key in options) {\r\n defaults[key] = options[key];\r\n }\r\n\r\n return defaults;\r\n}\r\n\r\n/**\r\n * returns the width of an element.\r\n * @param el HTMLElement\r\n * @return {number}\r\n */\r\nfunction getElementWidth(el) {\r\n if (!el) return 0;\r\n return parseFloat(getComputedStyle(el, null).width.replace(\"px\", \"\"));\r\n}\r\n\r\n/**\r\n * returns the height of an element.\r\n * @param el HTMLElement\r\n * @return {number}\r\n */\r\nfunction getElementHeight(el) {\r\n if (!el) return 0;\r\n return parseFloat(getComputedStyle(el, null).height.replace(\"px\", \"\"));\r\n}\r\n\r\n/**\r\n * calculates the border of the given elements with the given properties\r\n */\r\nfunction calcBorderWidth(elements, properties) {\r\n let sum = 0;\r\n\r\n for (let i=0; i<elements.length; i++) {\r\n let cSSStyleDeclaration = getComputedStyle(elements[i], null);\r\n for (let j=0; j<properties.length; j++) {\r\n let value = parseFloat( cSSStyleDeclaration[properties[j]] );\r\n if (!isNaN(value)) {\r\n sum += value;\r\n }\r\n }\r\n }\r\n\r\n return sum;\r\n}\r\n\r\nfunction addUrlHashParameter(initialUrl, key, value) {\r\n let url = removeUrlHashParameter(initialUrl, key),\r\n fragments = url.split('#'),\r\n urlpart = fragments[0],\r\n hashparts = fragments.length>1? fragments[1].split(\"&\") : [],\r\n result;\r\n\r\n hashparts.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(value));\r\n\r\n if (hashparts.length>0) {\r\n result = urlpart + '#' + hashparts.join('&');\r\n } else {\r\n result = urlpart;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction getUrlHashParameterValue(url, key) {\r\n let fragments=url.split('#'),\r\n hashparts = fragments.length>1? fragments[1].split(\"&\") : [],\r\n result;\r\n\r\n if (hashparts.length>0)\r\n {\r\n let prefix= encodeURIComponent(key)+'=';\r\n\r\n for (let i=0; i<hashparts.length; i++) {\r\n if (hashparts[i].indexOf(prefix, 0) === 0) {\r\n result = hashparts[i].replace(prefix, '');\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction removeUrlHashParameter(url, key) {\r\n let fragments=url.split('#'),\r\n urlpart= fragments[0],\r\n hashparts = fragments.length>1? fragments[1].split(\"&\") : [],\r\n result;\r\n\r\n if (hashparts.length>0)\r\n {\r\n let prefix= encodeURIComponent(key)+'=',\r\n newHashParts = [];\r\n\r\n for (let i=0; i<hashparts.length; i++) {\r\n if (hashparts[i].indexOf(prefix, 0) === 0) {\r\n\r\n } else {\r\n newHashParts.push(hashparts[i]);\r\n }\r\n }\r\n hashparts = newHashParts;\r\n }\r\n\r\n if (hashparts.length>0) {\r\n result = urlpart + '#' + hashparts.join('&');\r\n } else {\r\n result = urlpart;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction addUrlParameter(initialUrl, key, value) {\r\n let url = removeUrlParameter(initialUrl, key),\r\n fragments = url.split('#'),\r\n urlparts= fragments[0].split('?'),\r\n result;\r\n\r\n if (urlparts.length === 1) {\r\n result = urlparts[0] + '?' + encodeURIComponent(key) + \"=\" + encodeURIComponent(value);\r\n } else {\r\n result = urlparts.join('?') + '&' + encodeURIComponent(key) + \"=\" + encodeURIComponent(value);\r\n }\r\n\r\n if (fragments.length>1) {\r\n return result + '#' + fragments[1];\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction removeUrlParameter(url, key) {\r\n let fragments=url.split('#'),\r\n urlparts= fragments[0].split('?'),\r\n result;\r\n\r\n if (urlparts.length>1)\r\n {\r\n let prefix= encodeURIComponent(key)+'=';\r\n let pars= urlparts[1].split('&');\r\n\r\n for (let i=0; i<pars.length; i++) {\r\n if (pars[i].indexOf(prefix, 0) === 0) {\r\n pars.splice(i, 1);\r\n }\r\n }\r\n if (pars.length > 0) {\r\n result = urlparts[0] + '?' + pars.join('&');\r\n }\r\n else {\r\n result = urlparts[0];\r\n }\r\n }\r\n else {\r\n result = urlparts[0];\r\n }\r\n\r\n if (fragments.length>1) {\r\n return result + '#' + fragments[1];\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction setCSSStyle (nodes, style, value) {\r\n for (let i=0; i<nodes.length; i++) {\r\n nodes[i].style[style] = value;\r\n }\r\n}\r\n\r\nfunction getOuterHeight(el) {\r\n let height = el.offsetHeight;\r\n let style = getComputedStyle(el);\r\n\r\n height += parseInt(style.marginTop) + parseInt(style.marginBottom);\r\n return height;\r\n}\r\n\r\n/**\r\n *\r\n * @param node HTMLElement\r\n * @return HTMLElement[]\r\n */\r\nfunction getParents(node) {\r\n let parents = [];\r\n\r\n if (node === null) {\r\n return parents;\r\n }\r\n\r\n while(node.parentElement != null) {\r\n let parent = node.parentElement;\r\n parents.push(parent);\r\n node = parent;\r\n }\r\n return parents;\r\n}\r\n\r\n/**\r\n * Search the parent matching a selector and return it.\r\n *\r\n * @param node HTMLElement\r\n * @param query string\r\n */\r\nfunction getParent(node, query) {\r\n let nodes = getParents(node);\r\n for (let i = 0; i < nodes.length; i++) {\r\n if (nodes[i].matches(query)) {\r\n return nodes[i];\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * set the content as innerHTML and executes the includes Script-Tags\r\n *\r\n * @param htmlElement HTMLElement\r\n * @param newContent string\r\n */\r\nfunction insertAndExecute(htmlElement, newContent) {\r\n htmlElement.innerHTML = newContent;\r\n //we need a clone of that array.\r\n let scripts = Array.prototype.slice.call(htmlElement.getElementsByTagName(\"script\"));\r\n for (let i = 0; i < scripts.length; i++) {\r\n if (scripts[i].src !== \"\") {\r\n let tag = document.createElement(\"script\");\r\n tag.src = scripts[i].src;\r\n document.getElementsByTagName(\"head\")[0].appendChild(tag);\r\n }\r\n else {\r\n try {\r\n eval(scripts[i].innerHTML);\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Loops over an array and executes the callback with it.\r\n *\r\n * @param elements array\r\n * @param callback Function\r\n * @return int number of executions of the callback method.\r\n */\r\nfunction forEach(elements, callback) {\r\n if (!elements) {\r\n return 0;\r\n }\r\n for(let i=0; i<elements.length; i++) {\r\n callback(elements[i], i);\r\n }\r\n\r\n return elements.length\r\n}\r\n/*!\r\n * Serialize all form data into a query string\r\n * (c) 2018 Chris Ferdinandi, MIT License, https://gomakethings.com\r\n * Modified to use any HTML element instead of a form element.\r\n * @param {Node} form The form container to serialize\r\n * @return {String} The serialized form data\r\n */\r\nvar serializeForm = function (form) {\r\n\r\n // Setup our serialized data\r\n var serialized = [];\r\n\r\n let inputElements = form.querySelectorAll('input,select,textarea');\r\n // Loop through each field in the form\r\n for (var i = 0; i < inputElements.length; i++) {\r\n\r\n var field = inputElements[i];\r\n\r\n // Don't serialize fields without a name, submits, buttons, file and reset inputs, and disabled fields\r\n if (!field.name || field.disabled || field.type === 'file' || field.type === 'reset' || field.type === 'submit' || field.type === 'button') continue;\r\n\r\n // If a multi-select, get all selections\r\n if (field.type === 'select-multiple') {\r\n for (var n = 0; n < field.options.length; n++) {\r\n if (!field.options[n].selected) continue;\r\n serialized.push(encodeURIComponent(field.name) + \"=\" + encodeURIComponent(field.options[n].value));\r\n }\r\n }\r\n\r\n // Convert field data to a query string\r\n else if ((field.type !== 'checkbox' && field.type !== 'radio') || field.checked) {\r\n serialized.push(encodeURIComponent(field.name) + \"=\" + encodeURIComponent(field.value));\r\n }\r\n }\r\n\r\n return serialized.join('&');\r\n\r\n};\r\n\r\nexport { getOuterHeight, removeElement, addUrlHashParameter, calcBorderWidth, mergeObjects, getElementWidth, getElementHeight, addUrlParameter, getUrlHashParameterValue, removeUrlHashParameter, removeUrlParameter, setCSSStyle, getParents, serializeForm, getParent, insertAndExecute, forEach };\r\n","import PhotoSwipeGallery from \"./photoswipe/PhotoSwipeGallery\";\r\nimport Overlay from \"./Overlay\";\r\nimport SliderStarter from \"./slider/SliderStarter\";\r\nimport Polyfill from \"./Polyfill\";\r\nimport EventgalleryLazyload from \"./EventgalleryLazyload\";\r\nimport {forEach} from \"../../common/js/Helpers\";\r\nimport EventsList from \"./EventgalleryEventsList\";\r\nimport Imagelist from \"./EventgalleryImageList\";\r\nimport EventsTiles from \"./EventgalleryEventsTiles\";\r\nimport SquareList from \"./EventgallerySquareList\";\r\nimport TilesCollection from \"./EventgalleryTilesCollection\";\r\nimport GooglePhotosProcessor from \"./EventgalleryGooglePhotosProcessor\";\r\n\r\n(function(Eventgallery){\r\n\t\"use strict\";\r\n\tdocument.addEventListener('DOMContentLoaded', () =>{\r\n\r\n\t\t/*\r\n\t\t* GRID LIST OF EVENTS\r\n\t\t*/\r\n\r\n\t\tfunction triggerLazyLoading() {\r\n\t\t\tEventgalleryLazyload.watchImages();\r\n\t\t}\r\n\r\n\t\tforEach(document.querySelectorAll('.eventgallery-events-gridlist'), (container) => {\r\n\t\t\tlet thumbnails = container.querySelectorAll('.event-thumbnails .event-thumbnail');\r\n\r\n\t let options = {\r\n\t rowHeightPercentage: 100,\r\n\t imagesetContainer: container.querySelector('.event-thumbnails'),\r\n\t imageset: thumbnails,\r\n\t initComplete: function () {\r\n triggerLazyLoading();\r\n\t },\r\n\t resizeStart: function () {\r\n\r\n\t },\r\n\t resizeComplete: function () {\r\n\t\t\t\t\tdocument.dispatchEvent(Polyfill.createNewEvent('scroll', null));\r\n\t }\r\n\t };\r\n\r\n\t // initialize the imagelist\r\n\r\n\t if (thumbnails.length>0) {\r\n\t \tnew EventsList(options);\r\n\t }\r\n });\r\n\r\n\r\n\t\t/*\r\n\t\t* TILE LIST OF EVENTS\r\n\t\t*/\r\n\t\tforEach(document.querySelectorAll('.eventgallery-events-tiles-list'), (container) => {\r\n\r\n\t var options = {\r\n\t imagesetContainer: container.querySelector('.event-thumbnails'),\r\n\t imageset: container.querySelectorAll('.event-thumbnail'),\r\n\t eventgalleryTilesCollection: null,\r\n\t initComplete: function () {\r\n\t\t\t\t\ttriggerLazyLoading();\r\n\r\n\t var tilesOptions = {\r\n\t tiles: container.querySelectorAll('.eventgallery-tiles .eventgallery-tile'),\r\n\t tilesContainer: container.querySelector('.eventgallery-tiles')\r\n\t };\r\n\t options.eventgalleryTilesCollection = new TilesCollection(tilesOptions);\r\n\t options.eventgalleryTilesCollection.calculate();\r\n\t // we need to recalculate the whole thing because it might happen that a font loads\r\n\t // and the size of a tile changes.\r\n\t\t\t\t\twindow.addEventListener('load', function(){\r\n\t options.eventgalleryTilesCollection.calculate();\r\n\t });\r\n\r\n\t },\r\n\t resizeStart: function () {\r\n\r\n\t },\r\n\t resizeComplete: function () {\r\n\t options.eventgalleryTilesCollection.calculate();\r\n\t\t\t\t\tdocument.dispatchEvent(Polyfill.createNewEvent('scroll', null));\r\n\t }\r\n\t };\r\n\r\n\t // initialize the imagelist\r\n\t new EventsTiles(options);\r\n\r\n\t });\r\n\r\n\t\t/*\r\n\t\t* TILES LIST OF IMAGES\r\n\t\t*/\r\n\t\tforEach(document.querySelectorAll('.eventgallery-event-tiles-list'), (container) => {\r\n\t let options = {\r\n\t imagesetContainer: container.querySelector('.event-thumbnails'),\r\n\t imageset: container.querySelectorAll('.event-thumbnail'),\r\n\t adjustMode: 'width',\r\n\t eventgalleryTilesCollection: null,\r\n\t initComplete: function () {\r\n\r\n\t let tilesOptions = {\r\n\t tiles: container.querySelectorAll('.eventgallery-tiles .eventgallery-tile'),\r\n\t tilesContainer: container.querySelector('.eventgallery-tiles')\r\n\t };\r\n\r\n options.eventgalleryTilesCollection = new TilesCollection(tilesOptions);\r\n options.eventgalleryTilesCollection.calculate();\r\n\r\n\t // we need to recalculate the whole thing because it might happen that a font loads\r\n\t // and the size of a tile changes.\r\n\t window.addEventListener('load', function(){\r\n\t options.eventgalleryTilesCollection.calculate();\r\n\t });\r\n\r\n\t\t\t\t\ttriggerLazyLoading();\r\n\r\n\t },\r\n\t resizeStart: function () {\r\n\r\n\t },\r\n\t resizeComplete: function () {\r\n\t options.eventgalleryTilesCollection.calculate();\r\n\t document.dispatchEvent(Polyfill.createNewEvent('scroll', null));\r\n\t }\r\n\t };\r\n\r\n\t // initialize the imagelist\r\n\t new EventsTiles(options);\r\n \t});\r\n\r\n\t\t/*\r\n\t\t* SIMPLE IMAGE LIST\r\n\t\t*/\r\n\t\tforEach(document.querySelectorAll('.eventgallery-event-gridlist'), (container) => {\r\n\t\t\tlet options = {\r\n imagesetContainer: container.querySelector('.event-thumbnails'),\r\n imageset: container.querySelectorAll('.event-thumbnail'),\r\n adjustMode: 'height',\r\n initComplete: function () {\r\n\t\t\t\t\ttriggerLazyLoading();\r\n },\r\n resizeStart: function () {\r\n\r\n },\r\n resizeComplete: function () {\r\n document.dispatchEvent(Polyfill.createNewEvent('scroll', null));\r\n }\r\n };\r\n\r\n // initialize the imagelist\r\n new EventsTiles(options);\r\n\t\t});\r\n\r\n\t\t/*\r\n\t\t* IMAGE LIST\r\n\t\t*/\r\n\t\tforEach(document.querySelectorAll('.eventgallery-imagelist'), (container) => {\r\n let options = {\r\n rowHeight: parseInt(container.getAttribute('data-rowheight')),\r\n rowHeightJitter: parseInt(container.getAttribute('data-rowheightjitter')),\r\n firstImageRowHeight: parseInt(container.getAttribute('data-firstimagerowheight')),\r\n doFillLastRow: container.getAttribute('data-dofilllastrow') === 'true',\r\n imagesetContainer: container,\r\n imageset: container.querySelectorAll('.thumbnail'),\r\n\r\n initComplete: function () {\r\n\t\t\t\t\ttriggerLazyLoading();\r\n },\r\n resizeStart: function () {\r\n\r\n },\r\n resizeComplete: function () {\r\n document.dispatchEvent(Polyfill.createNewEvent('scroll', null));\r\n }\r\n };\r\n\r\n // initialize the imagelist\r\n new Imagelist(options);\r\n });\r\n\r\n\t\t/*\r\n\t\t * SQUARE SIZED LIST OF IMAGES\r\n\t\t */\r\n\t\tforEach(document.querySelectorAll('.eventgallery-event-square-list'), (container) => {\r\n\t\t\tlet options = {\r\n\t\t\t\timagesetContainer: container.querySelector('.event-thumbnails'),\r\n\t\t\t\timageset: container.querySelectorAll('.event-thumbnail'),\r\n\t\t\t\tadjustMode: 'width',\r\n\t\t\t\tinitComplete: function () {\r\n\t\t\t\t\ttriggerLazyLoading();\r\n\t\t\t\t},\r\n\t\t\t\tresizeStart: function () {\r\n\r\n\t\t\t\t},\r\n\t\t\t\tresizeComplete: function () {\r\n\t\t\t\t\tdocument.dispatchEvent(Polyfill.createNewEvent('scroll', null));\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t// initialize the imagelist\r\n\t\t\tnew SquareList(options);\r\n\t\t});\r\n\r\n\r\n /**\r\n\t\t * Lightbox init\r\n * @type {PhotoSwipeGallery}\r\n */\r\n Eventgallery.lightbox = new PhotoSwipeGallery();\r\n Eventgallery.lightbox.initPhotoSwipe();\r\n\r\n /**\r\n\t\t * Single Image Page\r\n */\r\n\t\tforEach(document.querySelectorAll('.singleimage-zoom'), (e) => {\r\n\t\t\te.addEventListener('click', (e) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tdocument.getElementById('bigimagelink').click();\r\n\t\t\t})\r\n\t\t})\r\n\r\n /**\r\n\t\t * content overlay (example: checkout review page)\r\n */\r\n\t\tforEach(document.querySelectorAll('a[data-eventgallery-overlay]'), (el) => {\r\n\t\t\tlet contentId = el.getAttribute('href');\r\n\t\t\tel.addEventListener('click', (e) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tlet overlay = new Overlay();\r\n\t\t\t\toverlay.openOverlay(document.getElementById(contentId.replace('#', '')).innerHTML);\r\n\t\t\t});\r\n\t\t})\r\n\r\n let googlePhotosProcessor = new GooglePhotosProcessor();\r\n document.dispatchEvent(Polyfill.createNewEvent('eventgallery-images-added'));\r\n\r\n\r\n let sliderElements = document.querySelectorAll('div[data-slider=\"1\"]');\r\n\r\n\r\n for(let i=0; i<sliderElements.length; i++) {\r\n let sliderStarter = new SliderStarter(sliderElements[i]);\r\n let timer = null;\r\n sliderStarter.start();\r\n\r\n window.addEventListener(\"resize\", () => {\r\n \tif (timer != null) {\r\n \t\tclearTimeout(timer);\r\n\t\t\t\t}\r\n \ttimer = setTimeout(() => sliderStarter.start(), 1000);\r\n }, false);\r\n }\r\n\r\n\t\t/*\r\n\t\t * Make clicks on Events possible even if the link on the image was not clicked\r\n\t\t * directly\r\n\t\t */\r\n\t\tlet links = document.querySelectorAll('*[data-eg-link]')\r\n\t\tfor(let i = 0; i<links.length; i++) {\r\n\t\t\tconst link = links[i]\r\n\t\t\tlink.addEventListener('click', (e) => {\r\n\t\t\t\tif (e.target.nodeName === 'A') {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\te.stopPropagation();\r\n\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\tlet target = e.currentTarget\r\n\t\t\t\tlet href = target.getAttribute('data-eg-link')\r\n\t\t\t\tif (href) {\r\n\t\t\t\t\twindow.location.href = href;\r\n\t\t\t\t}\r\n\r\n\t\t\t}, false)\r\n\t\t}\r\n }); //end domready\r\n})(Eventgallery);\r\n\r\n","import Imagelist from \"./EventgalleryImageList\";\r\nimport {forEach} from \"../../common/js/Helpers\";\r\n\r\nexport default class EventsList extends Imagelist{\r\n constructor(newOptions) {\r\n super(newOptions);\r\n }\r\n\r\n processList() {\r\n let width = this.width;\r\n forEach(this.images, (image) => {\r\n let height = Math.ceil(width * this.options.rowHeightPercentage / 100);\r\n image.setSize(width, height);\r\n })\r\n\r\n };\r\n}\r\n","import Imagelist from \"./EventgalleryImageList\";\r\nimport {forEach} from \"../../common/js/Helpers\";\r\n\r\n/* processes a list of images and tries to resize separately*/\r\nexport default class EventsTiles extends Imagelist {\r\n constructor(newOptions) {\r\n super(newOptions);\r\n }\r\n\r\n processList() {\r\n let width = this.width;\r\n forEach(this.images, (image) => {\r\n let newHeight = Math.round(image.height / image.width * width);\r\n let newWidth = width;\r\n if (this.options.adjustMode == \"height\" && image.height > image.width) {\r\n newHeight = width;\r\n newWidth = Math.round(image.width / image.height * newHeight);\r\n }\r\n image.setSize(newWidth, newHeight);\r\n\r\n });\r\n }\r\n};\r\n","import URLHelper from \"./URLHelper\";\r\n\r\nconst LOADING_MATCHER = 'gp.svg';\r\nconst MARKER_IMAGE_IS_IN_PROGRESS_ATTRIBUTE = 'data-eg-gp-processing';\r\n\r\nexport default class GooglePhotosProcessor {\r\n\r\n\r\n\r\n constructor() {\r\n\r\n this.albumUrl = \"\";\r\n this.albumsUrl = \"\";\r\n\r\n // noinspection JSUnresolvedVariable\r\n if (window.EventGalleryGooglePhotosConfiguration) {\r\n this.albumUrl = window.EventGalleryGooglePhotosConfiguration.albumUrl;\r\n this.albumsUrl = window.EventGalleryGooglePhotosConfiguration.albumsUrl;\r\n }\r\n\r\n this.imageAddedCallback = (e) => this.processImages(e);\r\n document.addEventListener(\"eventgallery-images-added\", this.imageAddedCallback, true);\r\n };\r\n\r\n destroy() {\r\n document.removeEventListener(\"eventgallery-images-added\", this.imageAddedCallback, true);\r\n }\r\n\r\n // noinspection JSUnusedGlobalSymbols\r\n processImages(e) {\r\n let doReloadLightbox = true;\r\n if (e?.detail?.isOverlay) {\r\n doReloadLightbox = false;\r\n }\r\n let albums = this._groupByAlbum(this._collectHTMLElements());\r\n this._markImagesAsInProgress(albums);\r\n this._getMainImageDataFromServer(albums, doReloadLightbox);\r\n }\r\n\r\n // noinspection JSMethodCanBeStatic\r\n /**\r\n * Grabs IMG tag items from the DOM for Google Photos image placeholder.\r\n *\r\n * @returns <Element>[]\r\n * @private\r\n */\r\n _collectHTMLElements() {\r\n let htmlCollection = document.getElementsByTagName('IMG');\r\n\r\n let foundImageHTMLElements = /** @type {HTMLElement} */[...htmlCollection];\r\n\r\n let result = foundImageHTMLElements.filter(img => {\r\n let imageSrcSet = img.getAttribute('srcset');\r\n let dataSrc = img.getAttribute('data-src');\r\n let src = img.src;\r\n\r\n if (img.getAttribute(MARKER_IMAGE_IS_IN_PROGRESS_ATTRIBUTE) === '1') {\r\n return false;\r\n }\r\n\r\n return (imageSrcSet && imageSrcSet.indexOf(LOADING_MATCHER)>0)\r\n || (dataSrc && dataSrc.indexOf(LOADING_MATCHER)>0)\r\n || (src && src.indexOf(LOADING_MATCHER)>0);\r\n });\r\n\r\n htmlCollection = document.getElementsByTagName('A');\r\n let foundLinkHTMLElements = /** @type {HTMLElement} */[...htmlCollection];\r\n result = result.concat(foundLinkHTMLElements.filter(a => {\r\n let dataSrc = a.getAttribute('data-src');\r\n let rel = a.getAttribute('rel');\r\n let href = a.getAttribute('href');\r\n\r\n if (a.getAttribute(MARKER_IMAGE_IS_IN_PROGRESS_ATTRIBUTE) === '1') {\r\n return false;\r\n }\r\n return (href && href.indexOf(LOADING_MATCHER)>0)\r\n || (dataSrc && dataSrc.indexOf(LOADING_MATCHER)>0)\r\n || (rel && rel.indexOf(LOADING_MATCHER)>0);\r\n }));\r\n\r\n return result;\r\n\r\n }\r\n\r\n /**\r\n *\r\n * @param albums {Map<any, any>}\r\n * @private\r\n */\r\n _markImagesAsInProgress(albums) {\r\n for (let [foldername, album] of albums) {\r\n /**\r\n * @var ParsedHTMLElement parsedHTMLElement\r\n */\r\n album.forEach(parsedHTMLElement => {\r\n parsedHTMLElement.getHTMLElement().setAttribute(MARKER_IMAGE_IS_IN_PROGRESS_ATTRIBUTE, 1);\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * sorts all found images into a map: key=folder, value=array of\r\n *\r\n * @param htmlElements\r\n * @returns {Map<any, any>}\r\n * @private\r\n */\r\n _groupByAlbum(htmlElements) {\r\n let albums = new Map();\r\n htmlElements.forEach((imageHTMLElement) => {\r\n let parsedHTMLElement = this._parseHTMLElement(imageHTMLElement);\r\n parsedHTMLElement.updateParameters();\r\n let folder = parsedHTMLElement.parameters.get('folder');\r\n\r\n if (!albums.get(folder)) {\r\n albums.set(folder, []);\r\n }\r\n\r\n albums.get(folder).push(parsedHTMLElement);\r\n });\r\n\r\n return albums;\r\n }\r\n\r\n // noinspection JSMethodCanBeStatic\r\n /**\r\n *\r\n * @param htmlElement\r\n * @returns {ParsedHTMLElement}\r\n * @private\r\n */\r\n _parseHTMLElement(htmlElement) {\r\n if (htmlElement.tagName === 'IMG') {\r\n return new ParsedImageHTMLElement(htmlElement);\r\n }\r\n return new ParsedLinkHTMLElement(htmlElement);\r\n }\r\n\r\n\r\n /**\r\n * starts several requests to the server to determine\r\n *\r\n * @param albums\r\n * @private\r\n */\r\n _getAlbumDataFromServer(albums, doReloadLightbox) {\r\n for (let [foldername, album] of albums) {\r\n this._doAlbumRequest(foldername, album, doReloadLightbox);\r\n }\r\n }\r\n\r\n _doAlbumRequest(foldername, album, doReloadLightbox) {\r\n if (!this.albumUrl || !foldername) return;\r\n fetch(this.albumUrl + '&folder=' + foldername)\r\n .then(response => response.json())\r\n .then(data => this._processAlbumResult(album, data, doReloadLightbox));\r\n }\r\n\r\n _processAlbumResult(album, data, doReloadLightbox) {\r\n this._replaceImages(album, data, doReloadLightbox);\r\n }\r\n\r\n _getMainImageDataFromServer(albums, doReloadLightbox) {\r\n let albumsWithMainImagesOnly = this._filterForAlbumsWithMainImageOnly(albums);\r\n\r\n if (albumsWithMainImagesOnly.size > 0) {\r\n this._doAlbumsRequest(albumsWithMainImagesOnly, albums, doReloadLightbox);\r\n for (let [foldername, album] of albumsWithMainImagesOnly) {\r\n albums.delete(foldername);\r\n }\r\n }\r\n\r\n this._getAlbumDataFromServer(albums, doReloadLightbox);\r\n }\r\n\r\n _doAlbumsRequest(albumsWithMainImagesOnly, albums, doReloadLightbox) {\r\n if (!this.albumsUrl) return;\r\n fetch(this.albumsUrl)\r\n .then(response => response.json())\r\n .then(data => this._processAlbumsResult(albumsWithMainImagesOnly, albums, data, doReloadLightbox));\r\n }\r\n\r\n _processAlbumsResult(albumsWithMainImagesOnly, albums, data, doReloadLightbox) {\r\n for (let [key, album] of albumsWithMainImagesOnly) {\r\n this._replaceImages(album, data[key], doReloadLightbox);\r\n }\r\n this._getAlbumDataFromServer(albums, doReloadLightbox);\r\n }\r\n\r\n // noinspection JSMethodCanBeStatic\r\n _filterForAlbumsWithMainImageOnly(albums) {\r\n let newAlbums = new Map();\r\n for(let [key, album] of albums) {\r\n let mainImages = album.filter(image => image.isMainImage());\r\n\r\n if (mainImages.length> 0 && mainImages.length === album.length) {\r\n newAlbums.set(key, album);\r\n }\r\n }\r\n return newAlbums;\r\n }\r\n\r\n _replaceImages(album, serverResult, doReloadLightbox) {\r\n if (album === undefined || serverResult === undefined) {\r\n return;\r\n }\r\n\r\n album.forEach(parsedImageHTMLElement => {\r\n let imageUrl = serverResult[parsedImageHTMLElement.getFile()];\r\n if (imageUrl === undefined) {\r\n return false;\r\n }\r\n\r\n parsedImageHTMLElement.updateParameters();\r\n parsedImageHTMLElement.replaceElementLinks(imageUrl);\r\n parsedImageHTMLElement.getHTMLElement().setAttribute(MARKER_IMAGE_IS_IN_PROGRESS_ATTRIBUTE, 0);\r\n\r\n });\r\n\r\n if (doReloadLightbox && window.Eventgallery?.lightbox) {\r\n if (Eventgallery.lightbox.isOpen()) {\r\n let link = Eventgallery.lightbox.getCurrentSlide().thumbEl;\r\n Eventgallery.lightbox._gallery.close();\r\n setTimeout(()=>link.click(),500);\r\n }\r\n }\r\n }\r\n};\r\n\r\nclass ParsedHTMLElement {\r\n constructor(htmlElement) {\r\n this.htmlElement = htmlElement;\r\n this.parameters = null;\r\n this.attributeNames = new Set();\r\n }\r\n\r\n updateParametersWithUrl(url) {\r\n let parameterString = url.substring(url.indexOf('#')+1);\r\n this.parameters = URLHelper.parseURLParameter(parameterString);\r\n }\r\n\r\n updateParameters() {\r\n for(let n of this.attributeNames) {\r\n let url = this.getHTMLElement().getAttribute(n);\r\n if (url && url.indexOf(LOADING_MATCHER)>0) {\r\n this.updateParametersWithUrl(url);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n\r\n replaceElementLinks(imageUrl) {\r\n\r\n for(let n of this.attributeNames) {\r\n let url = this.getHTMLElement().getAttribute(n);\r\n if (url && url.indexOf(LOADING_MATCHER)>0) {\r\n this.getHTMLElement().setAttribute(n, this.getImageUrl(imageUrl, this.getWidth(url)));\r\n }\r\n }\r\n }\r\n\r\n getHTMLElement() {\r\n return this.htmlElement;\r\n }\r\n\r\n getFolder() {\r\n return this.parameters.get('folder');\r\n }\r\n\r\n getFile() {\r\n return this.parameters.get('file');\r\n }\r\n\r\n\r\n getWidth(url) {\r\n return URLHelper.parseURLParameter(url).get('width');\r\n }\r\n\r\n getImageUrl(imageUrl, width) {\r\n return imageUrl + '=w' + width;\r\n }\r\n\r\n isMainImage() {\r\n return this.parameters.get('m') === '1';\r\n }\r\n}\r\n\r\nclass ParsedLinkHTMLElement extends ParsedHTMLElement {\r\n\r\n constructor(htmlElement) {\r\n super(htmlElement);\r\n this.attributeNames = new Set(['href', 'data-src', 'rel']);\r\n }\r\n\r\n}\r\n\r\nclass ParsedImageHTMLElement extends ParsedHTMLElement{\r\n\r\n constructor(htmlElement) {\r\n super(htmlElement);\r\n this.attributeNames = new Set(['src', 'data-src', 'srcset']);\r\n }\r\n}\r\n","/*\r\n Class to manage an image. This can be the img tag or a container. It has to manage glue itself.\r\n */\r\n\r\nimport {calcBorderWidth, getElementHeight, getElementWidth, mergeObjects} from \"../../common/js/Helpers\";\r\nimport SizeCalculator from \"./EventgallerySizeCalculator\";\r\n\r\nexport default class Image{\r\n constructor(image, index, newOptions) {\r\n this.options = mergeObjects(this.options, newOptions);\r\n /**\r\n * HTMLElement\r\n */\r\n this.imageTagContainer = image;\r\n this.index = index;\r\n this.calculatedWidth = 0;\r\n this.calcSize()\r\n }\r\n\r\n calcSize() {\r\n // glue includes everything but the image width/heigt: margin, padding, border\r\n let image = this.imageTagContainer.querySelector('img');\r\n\r\n if (!image) {\r\n return;\r\n }\r\n\r\n let elements = [this.imageTagContainer, image];\r\n\r\n this.glueLeft = calcBorderWidth(elements, ['paddingLeft', 'marginLeft', 'borderLeftWidth']);\r\n this.glueRight = calcBorderWidth(elements, ['paddingRight', 'marginRight', 'borderRightWidth']);\r\n this.glueTop = calcBorderWidth(elements, ['paddingTop', 'marginTop', 'borderTopWidth']);\r\n this.glueBottom = calcBorderWidth(elements, ['paddingBottom', 'marginBottom', 'borderBottomWidth']);\r\n\r\n // get image size from data- attributes\r\n\r\n this.width = parseInt(image.getAttribute(\"data-width\"));\r\n this.height = parseInt(image.getAttribute(\"data-height\"));\r\n\r\n // fallback of data- attributes are not there\r\n if (this.width === undefined) {\r\n this.width = getElementWidth(this.imageTagContainer) - this.glueLeft - this.glueRight;\r\n }\r\n\r\n if (this.height === undefined) {\r\n this.height = getElementHeight(this.imageTagContainer) - this.glueTop - this.glueBottom;\r\n }\r\n };\r\n\r\n /**\r\n * calculates the height of that image container. This includes the image and the gap on top/bottom\r\n *\r\n * @returns number\r\n */\r\n getImageTagHeight() {\r\n return parseFloat(window.getComputedStyle(this.imageTagContainer).height) + this.glueTop + this.glueBottom;\r\n };\r\n\r\n setSize(width, height) {\r\n this.calcSize()\r\n\r\n let isFlickr = false;\r\n let newWidth = width - this.glueLeft - this.glueRight;\r\n let newHeight = height - this.glueTop - this.glueBottom;\r\n\r\n let ratio = this.width / this.height;\r\n\r\n //console.log(\"the size of the image should be: \"+width+\"x\"+height+\" so I have to set it to: \"+newWidth+\"x\"+newHeight);\r\n //adjust background images\r\n let image = this.imageTagContainer.querySelector('img');\r\n if (!image) {\r\n return;\r\n }\r\n\r\n let sizeCalculator = new SizeCalculator();\r\n\r\n let dataSrc = image.getAttribute('data-src');\r\n if (!dataSrc) {\r\n dataSrc = \"\";\r\n }\r\n\r\n let secret = image.getAttribute('data-secret');\r\n\r\n if (secret !== null) {\r\n let secret_o = image.getAttribute('data-secret_o');\r\n let secret_h = image.getAttribute('data-secret_h');\r\n let secret_k = image.getAttribute('data-secret_k');\r\n let farm = image.getAttribute('data-farm');\r\n let type = image.getAttribute('data-type')\r\n let server = image.getAttribute('data-server');\r\n let id = image.getAttribute('data-id');\r\n let imageUrl = sizeCalculator.getFlickrURL(farm, server, secret, secret_h, secret_k, secret_o, id, newWidth, newHeight, this.width, this.height);\r\n\r\n dataSrc = imageUrl;\r\n\r\n isFlickr = true;\r\n\r\n } else {\r\n let googleWidth = sizeCalculator.getSize(newWidth, newHeight, ratio);\r\n dataSrc = sizeCalculator.adjustImageURL(dataSrc, googleWidth);\r\n }\r\n\r\n image.setAttribute('data-src', dataSrc);\r\n image.setAttribute('srcset', dataSrc);\r\n image.style.display = 'block';\r\n image.style.margin = 'auto';\r\n\r\n // IE8 fix: check the width/height first\r\n if (newWidth>0) {\r\n image.style.width = newWidth + 'px';\r\n }\r\n if (newHeight>0) {\r\n image.style.height = newHeight + 'px' ;\r\n }\r\n };\r\n\r\n hide() {\r\n this.imageTagContainer.style.display = 'none';\r\n }\r\n\r\n show() {\r\n this.imageTagContainer.style.display = 'block';\r\n }\r\n}\r\n\r\n","import {forEach, getElementWidth, mergeObjects} from \"../../common/js/Helpers\";\r\nimport Image from \"./EventgalleryImage\";\r\nimport Row from \"./EventgalleryRow\";\r\n\r\nexport default class Imagelist {\r\n\r\n constructor(newOptions) {\r\n\r\n this.options = {\r\n rowHeightPercentage: 100,\r\n rowHeight: 150,\r\n rowHeightJitter: 0,\r\n minImageWidth: 150,\r\n // resize the last image to full width\r\n doFillLastRow: false,\r\n // the object where we try to get the width from\r\n imagesetContainer: null,\r\n // the object containing all the images elements. Usually they are retieved with a selector like '.imagelist a',\r\n imageset: null,\r\n firstImageRowHeight: 2,\r\n initComplete: function () {\r\n },\r\n resizeStart: function () {\r\n },\r\n resizeComplete: function () {\r\n }\r\n };\r\n this.images = [];\r\n // used to compare for width changes\r\n this.eventgalleryPageWidth = 0;\r\n // the width of the container. This is kind of tricky since there can be many containers or just one.\r\n this.width = null;\r\n this.options = mergeObjects(this.options, newOptions);\r\n if (undefined !== newOptions) {\r\n this.initialize();\r\n }\r\n };\r\n\r\n initialize() {\r\n\r\n this.width = getElementWidth(this.options.imagesetContainer);\r\n\r\n // save the current width so we don't react on an resize event if not necessary\r\n this.eventgalleryPageWidth = this.width;\r\n\r\n this.images = [];\r\n\r\n forEach(this.options.imageset, (item, index) => {\r\n this.images.push(new Image(item, index));\r\n })\r\n\r\n window.addEventListener('resize', () => {\r\n window.clearTimeout(this.eventgalleryTimer);\r\n\r\n this.eventgalleryTimer = setTimeout(() => {\r\n let new_width = getElementWidth(this.options.imagesetContainer);\r\n this.width = new_width;\r\n if (this.eventgalleryPageWidth !== new_width) {\r\n this.options.resizeStart();\r\n this.eventgalleryPageWidth = new_width;\r\n\r\n this.options.imagesetContainer.style.minHeight = (this.options.rowHeight * this.images.length) + 'px';\r\n\r\n this.processList();\r\n\r\n this.options.imagesetContainer.style.minHeight = '0px';\r\n\r\n this.options.resizeComplete();\r\n }\r\n }, 500);\r\n\r\n });\r\n\r\n if (this.options.imagesetContainer) {\r\n this.options.imagesetContainer.style.minHeight = (this.options.rowHeight * this.images.length) + 'px';\r\n\r\n this.processList();\r\n\r\n this.options.imagesetContainer.style.minHeight = '0px';\r\n }\r\n\r\n //add a tiny timeout. This prevents some issue with lazyload\r\n //where images didn't load since the offset was wrong.\r\n window.setTimeout(this.options.initComplete, 1);\r\n };\r\n\r\n /*calculated the with of an element*/\r\n getRowWidth() {\r\n var rowWidth = this.width;\r\n\r\n /* fix for the internet explorer if width if 45.666% == 699.87px*/\r\n if (window.getComputedStyle) {\r\n let computedStyle = window.getComputedStyle(this.options.imagesetContainer)\r\n if (computedStyle.boxSizing === 'border-box') {\r\n let paddingLeft = parseFloat(computedStyle.paddingLeft)\r\n let paddingRight = parseFloat(computedStyle.paddingRight)\r\n let borderLeft = parseFloat(computedStyle.borderLeftWidth)\r\n let borderRight = parseFloat(computedStyle.borderRightWidth)\r\n rowWidth = Math.floor(parseFloat(computedStyle.width) - paddingLeft - paddingRight - borderLeft - borderRight) - 1;\r\n } else {\r\n rowWidth = Math.floor(parseFloat(computedStyle.width)) - 1;\r\n }\r\n } else {\r\n rowWidth = rowWidth - 1;\r\n }\r\n\r\n return rowWidth;\r\n };\r\n\r\n /* processes the image list*/\r\n processList() {\r\n let options;\r\n\r\n /* find out how much space we have*/\r\n let rowWidth = this.getRowWidth();\r\n\r\n\r\n /* get a copy of the image list because we will pop the image during iteration*/\r\n let imagesToProcess = this.images.slice(0);\r\n\r\n if (imagesToProcess.length === 0) {\r\n return;\r\n }\r\n\r\n /* display the first image larger */\r\n if (this.options.firstImageRowHeight > 1) {\r\n let image = imagesToProcess.shift();\r\n\r\n /*if we have a large image, we have to hide it to get the real available space*/\r\n image.hide();\r\n rowWidth = this.getRowWidth();\r\n image.show();\r\n\r\n let imageHeight = this.options.firstImageRowHeight * this.options.rowHeight;\r\n let imageWidth = Math.floor(image.width / image.height * imageHeight);\r\n\r\n if (imageWidth + this.options.minImageWidth >= rowWidth) {\r\n imageWidth = rowWidth;\r\n }\r\n\r\n image.setSize(imageWidth, imageHeight);\r\n\r\n let rowHeightForRightSideImages = this.options.rowHeight;\r\n\r\n // in case the browser zooms to 110%, we need to make sure, the first image is smaller thand\r\n // the images to the right. We do this by checking if there is a height difference between the\r\n // height we want to get and the actual height. If there is one, we add a pixel to the rows\r\n // on the right side.\r\n\r\n // even if the left side is smaller than the right side, the browsers still have an issue with floating.\r\n // Example: left: 499.98px, right: 249,98px*2=499.96 => issue! So we make the left side a tiny bit bigger.\r\n rowHeightForRightSideImages = (imageHeight + 0.05) / this.options.firstImageRowHeight;\r\n if (imageHeight > image.getImageTagHeight()) {\r\n rowHeightForRightSideImages = (imageHeight + 1) / this.options.firstImageRowHeight;\r\n }\r\n\r\n options = {\r\n maxWidth: rowWidth - imageWidth,\r\n maxHeight: rowHeightForRightSideImages,\r\n adjustHeight: false\r\n };\r\n\r\n if (options.maxWidth > 0) {\r\n this.generateRows(imagesToProcess, this.options.firstImageRowHeight, options, false);\r\n }\r\n }\r\n\r\n options = {\r\n maxWidth: rowWidth,\r\n maxHeight: this.options.rowHeight,\r\n heightJitter: this.options.rowHeightJitter,\r\n doFillLastRow: this.options.doFillLastRow\r\n };\r\n\r\n this.generateRows(imagesToProcess, 99999, options, true);\r\n\r\n };\r\n\r\n /**\r\n * @param imagesToProcess\r\n * @param numberOfRowsToCreate\r\n * @param options\r\n * @param finalRows\r\n */\r\n generateRows(imagesToProcess, numberOfRowsToCreate, options, finalRows) {\r\n let currentRow = new Row(options);\r\n\r\n while (imagesToProcess.length > 0 && numberOfRowsToCreate > 0) {\r\n let addSuccessfull = currentRow.add(imagesToProcess[0]);\r\n if (addSuccessfull) {\r\n imagesToProcess.shift();\r\n } else {\r\n currentRow.processRow();\r\n numberOfRowsToCreate--;\r\n if (numberOfRowsToCreate === 0) break;\r\n currentRow = new Row(options);\r\n }\r\n }\r\n\r\n if (finalRows) {\r\n currentRow.isLastRow = true;\r\n }\r\n currentRow.processRow();\r\n };\r\n\r\n}\r\n","export default class EventgalleryLazyload {\r\n\r\n static instance = null;\r\n static knownImageUrls = [];\r\n\r\n constructor() {\r\n this.options = {\r\n elementSelector: 'img.eventgallery-lazyme',\r\n classForLoaded: 'eventgallery-lazyload-loaded',\r\n classForLoading: 'eventgallery-lazyload-loading'\r\n }\r\n\r\n if ('IntersectionObserver' in window &&\r\n 'IntersectionObserverEntry' in window &&\r\n 'intersectionRatio' in window.IntersectionObserverEntry.prototype) {\r\n\r\n // Minimal polyfill for Edge 15's lack of `isIntersecting`\r\n // See: https://github.com/w3c/IntersectionObserver/issues/211\r\n if (!('isIntersecting' in window.IntersectionObserverEntry.prototype)) {\r\n Object.defineProperty(window.IntersectionObserverEntry.prototype,\r\n 'isIntersecting', {\r\n get: function () {\r\n return this.intersectionRatio > 0;\r\n }\r\n });\r\n }\r\n\r\n\r\n this.imageObserver = new IntersectionObserver((entries, imgObserver) => {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting) {\r\n const lazyImage = entry.target;\r\n if (lazyImage.dataset.src) {\r\n lazyImage.setAttribute('srcset', lazyImage.dataset.src);\r\n\r\n if (!EventgalleryLazyload.knownImageUrls.includes(lazyImage.dataset.src)) {\r\n EventgalleryLazyload.knownImageUrls.push(lazyImage.dataset.src);\r\n lazyImage.classList.add('eventgallery-lazyload-loading');\r\n lazyImage.classList.remove('eventgallery-lazyload-loaded');\r\n\r\n let img = document.createElement('img');\r\n img.src = lazyImage.dataset.src;\r\n img.onload = () => {\r\n lazyImage.classList.remove('eventgallery-lazyload-loading');\r\n lazyImage.classList.add('eventgallery-lazyload-loaded');\r\n }\r\n }\r\n }\r\n }\r\n })\r\n });\r\n }\r\n }\r\n\r\n static watchImages() {\r\n if (!EventgalleryLazyload.instance) {\r\n EventgalleryLazyload.instance = new EventgalleryLazyload();\r\n } else {\r\n return;\r\n }\r\n\r\n let lazyImages = document.querySelectorAll(EventgalleryLazyload.instance.options.elementSelector);\r\n\r\n for (let i = 0; i < lazyImages.length; i++) {\r\n let lazyImage = lazyImages[i];\r\n\r\n if (lazyImage.dataset.src) {\r\n if (EventgalleryLazyload.instance.imageObserver) {\r\n EventgalleryLazyload.instance.imageObserver.observe(lazyImage);\r\n } else {\r\n lazyImage.setAttribute('srcset', lazyImage.dataset.src);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import {mergeObjects} from \"../../common/js/Helpers\";\r\n\r\nexport default class Row {\r\n\r\n /* processes a row is a image list */\r\n constructor(newOptions) {\r\n\r\n this.options = {\r\n maxWidth: 960,\r\n maxHeight: 250,\r\n heightJitter: 0,\r\n adjustHeight: true,\r\n doFillLastRow: true\r\n };\r\n this.options = mergeObjects(this.options, newOptions);\r\n this.isLastRow = false;\r\n this.images = [];\r\n this.width = 0;\r\n if (this.options.heightJitter > 0) {\r\n this.options.maxHeight = Math.floor(this.options.maxHeight + (Math.random() * 2 * this.options.heightJitter) - this.options.heightJitter);\r\n }\r\n };\r\n\r\n add(eventgalleryImage) {\r\n let imageWidth = Math.floor(eventgalleryImage.width / eventgalleryImage.height * this.options.maxHeight);\r\n\r\n // determine the number of images per line. return false if the row is full.\r\n let addThisImage = this.width + imageWidth <= this.options.maxWidth || this.images.length === 0;\r\n\r\n if (!addThisImage) {\r\n let gap = Math.abs(this.options.maxWidth - this.width - imageWidth) / this.options.maxWidth;\r\n if (gap < 0.2) {\r\n addThisImage = true;\r\n }\r\n }\r\n\r\n // determine the number of images per line. return false if the row if full.\r\n if (addThisImage) {\r\n this.images.push(eventgalleryImage);\r\n eventgalleryImage.calculatedWidth = imageWidth;\r\n this.width = this.width + imageWidth;\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n processRow() {\r\n let gap, rowHeight, i;\r\n\r\n gap = this.options.maxWidth - this.width;\r\n\r\n // if there is no gap to fill, we need to resize the last row to fit the image.\r\n if (this.isLastRow && this.options.doFillLastRow === false && gap >= 0) {\r\n if (gap >= 0) {\r\n gap = 0;\r\n }\r\n rowHeight = this.options.maxHeight;\r\n } else {\r\n\r\n rowHeight = this.options.maxHeight / (this.width / this.options.maxWidth);\r\n }\r\n\r\n if (this.options.adjustHeight === false) {\r\n rowHeight = this.options.maxHeight;\r\n }\r\n\r\n for (i = 0; i < this.images.length; i++) {\r\n var image = this.images[i];\r\n\r\n var calculatedWidth = image.calculatedWidth;\r\n\r\n // how much of the gap does this element need to fill?\r\n var gapToClose = (calculatedWidth / this.width) * gap;\r\n\r\n image.setSize(calculatedWidth + gapToClose, rowHeight);\r\n }\r\n }\r\n\r\n}\r\n","\r\n/* determines the size of an image so a image server can deliver it. */\r\n\r\nimport {mergeObjects} from \"../../common/js/Helpers\";\r\n\r\nexport default class SizeCalculator {\r\n constructor(newOptions) {\r\n this.options = {\r\n // to be able to handle internal and google photos images, we need to restrict the availabe image sizes.\r\n availableSizes: [48, 104, 160, 288, 320, 400, 512, 640, 720, 800, 1024, 1280, 1440],\r\n flickrSizes: {100 : 't', 240 : 'm', 320 : 'n', 500 : '-', 640 : 'z', 800 : 'c', 1024 : 'b', 1600 : 'h', 2048 : 'k'}\r\n\r\n };\r\n this.options = mergeObjects(this.options, newOptions);\r\n }\r\n\r\n adjustImageURL(url, size) {\r\n\r\n // only needed for Google Photos\r\n url = url.replace(/=w(\\d+)$/, '=w' + size);\r\n url = url.replace(/=w(\\d+)-nu$/, '=w' + size + '-nu');\r\n\r\n // neded for S3 image structure\r\n url = url.replace(/\\/s(\\d*)\\//, '/s' + size + '/');\r\n url = url.replace(/\\/s(\\d*)-c\\//, '/s' + size + '-c/');\r\n\r\n // used by Event Gallery\r\n url = url.replace(/width=(\\d+)/, 'width=' + size);\r\n url = url.replace(/\\/mainimage_nocrop_(\\d+)_/, '/mainimage_nocrop_' + size + '_');\r\n url = url.replace(/\\/nocrop_(\\d+)_/, '/nocrop_' + size + '_');\r\n\r\n return url;\r\n };\r\n\r\n\r\n getFlickrURL(farm, server, secret, secret_h, secret_k, secret_o, id, width, height, originalwidth, originalheight) {\r\n let longSideSize,\r\n originalLongSideSize,\r\n sizeCode,\r\n secretString,\r\n sizeString;\r\n\r\n let minSizes = this.getMinSizes(width, height, originalwidth, originalheight);\r\n\r\n\r\n if (minSizes.width > minSizes.height) {\r\n longSideSize = minSizes.width;\r\n originalLongSideSize = originalwidth;\r\n } else {\r\n longSideSize = minSizes.height;\r\n originalLongSideSize = originalheight;\r\n }\r\n\r\n sizeCode = 'o';\r\n\r\n if (originalLongSideSize >= longSideSize) {\r\n for (let size in this.options.flickrSizes) {\r\n if (size > longSideSize) {\r\n sizeCode = this.options.flickrSizes[size];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (sizeCode === 'o' && secret_o === '') {\r\n sizeCode = 'k'\r\n }\r\n\r\n if (sizeCode === 'k' && secret_k === '') {\r\n sizeCode = 'h'\r\n }\r\n\r\n if (sizeCode === 'h' && secret_h === '') {\r\n sizeCode = 'b'\r\n }\r\n\r\n switch (sizeCode) {\r\n case \"o\":\r\n secretString = secret_o;\r\n break;\r\n case \"h\":\r\n secretString = secret_h;\r\n break;\r\n case \"k\":\r\n secretString = secret_k;\r\n break;\r\n default:\r\n secretString = secret;\r\n }\r\n\r\n sizeString = sizeCode == '-' ? '' : '_' + sizeCode;\r\n\r\n return 'https://live.staticflickr.com/' + server + '/' + id + '_' + secretString + sizeString + '.jpg';\r\n };\r\n\r\n getSize(width, height, ratio) {\r\n\r\n let googleWidth = this.options.availableSizes[0];\r\n\r\n for(let index=0; index < this.options.availableSizes.length; index++) {\r\n let item = \tthis.options.availableSizes[index];\r\n let widthOkay;\r\n let heightOkay;\r\n\r\n if (googleWidth > this.options.availableSizes[0]){\r\n break;\r\n }\r\n\r\n let lastItem = index == this.options.availableSizes.length - 1;\r\n\r\n if (ratio >= 1) {\r\n widthOkay = item > width;\r\n heightOkay = item / ratio > height;\r\n\r\n if ((widthOkay && heightOkay) || lastItem) {\r\n googleWidth = item;\r\n }\r\n } else {\r\n heightOkay = item > height;\r\n widthOkay = item * ratio > width;\r\n\r\n if ((widthOkay && heightOkay) || lastItem) {\r\n googleWidth = item;\r\n }\r\n }\r\n }\r\n\r\n return googleWidth;\r\n };\r\n\r\n /**\r\n * returns the minimum values for height and width to fill the given box size.\r\n * @param boxWidth\r\n * @param boxHeight\r\n * @param originalWidth\r\n * @param originalHeight\r\n */\r\n getMinSizes(boxWidth, boxHeight, originalWidth, originalHeight) {\r\n\r\n\r\n let ratio = originalWidth / originalHeight;\r\n\r\n let height, width;\r\n\r\n if (originalWidth > originalHeight) {\r\n if (boxWidth > boxHeight) {\r\n width = boxWidth;\r\n height = boxWidth / ratio;\r\n if (height < boxHeight) {\r\n height = boxHeight;\r\n width = boxHeight * ratio;\r\n }\r\n } else {\r\n height = boxHeight;\r\n width = boxHeight * ratio;\r\n if (width < boxWidth) {\r\n width = boxWidth;\r\n height = boxHeight * ratio;\r\n }\r\n }\r\n } else {\r\n if (boxWidth > boxHeight) {\r\n width = boxWidth;\r\n height = boxWidth / ratio;\r\n if (height < boxHeight) {\r\n height = boxHeight;\r\n width = boxHeight * ratio;\r\n }\r\n } else {\r\n height = boxHeight;\r\n width = boxHeight * ratio;\r\n if (width < boxWidth) {\r\n width = boxWidth;\r\n height = boxWidth / ratio;\r\n }\r\n }\r\n }\r\n\r\n return {width: Math.ceil(width), height: Math.ceil(height)};\r\n };\r\n}\r\n","import Imagelist from \"./EventgalleryImageList\";\r\nimport {forEach} from \"../../common/js/Helpers\";\r\n\r\n/**\r\n * Formats a list of images to appear square sized. This class is doing something like the Grid layout for events.\r\n * @param newOptions\r\n * @constructor\r\n */\r\nexport default class SquareList extends Imagelist {\r\n constructor(newOptions) {\r\n super(newOptions);\r\n }\r\n\r\n processList() {\r\n var width = this.width;\r\n forEach(this.images, (image) => {\r\n image.setSize(width, width);\r\n });\r\n };\r\n}\r\n","import {forEach, mergeObjects} from \"../../common/js/Helpers\";\r\n\r\n// create a tile layout and centers images in a tile\r\nexport default class TilesCollection {\r\n\r\n constructor(newOptions) {\r\n\r\n this.options = {\r\n tiles: null, // document.querySelector('#events-tiles .event')\r\n tilesContainer: [] //'#events-tiles .event-tiles'\r\n };\r\n\r\n this.options = mergeObjects(this.options, newOptions);\r\n this.tiles = this.options.tiles;\r\n this.tilesContainer = this.options.tilesContainer;\r\n };\r\n\r\n\r\n calculate() {\r\n let tilesPerRow = 1;\r\n\r\n // reset grid to support resize and media queries\r\n forEach(this.tiles, (tile) => {\r\n tile.style.visibility = 'hidden';\r\n tile.style.position = 'static';\r\n tile.style.float = 'left';\r\n })\r\n\r\n if (!this.tiles.length) {\r\n return;\r\n }\r\n\r\n let firstExampleTile = this.tiles[0];\r\n let columnWidth = firstExampleTile.offsetWidth;\r\n let y = firstExampleTile.offsetTop;\r\n\r\n for (let i = 1; i < this.tiles.length; i++) {\r\n if (this.tiles[i].offsetTop !== y) {\r\n break;\r\n }\r\n tilesPerRow++;\r\n }\r\n\r\n // create array of height values for the columns\r\n let columnHeight = [];\r\n for (let i = 0; i < tilesPerRow; i++) {\r\n columnHeight.push(0);\r\n }\r\n\r\n forEach(this.tiles, (tile)=> {\r\n let smallestColumn = this.getSmallestColumn(columnHeight);\r\n tile.style.left = smallestColumn * columnWidth + 'px';\r\n tile.style.top = columnHeight[smallestColumn] + 'px';\r\n columnHeight[smallestColumn] = columnHeight[smallestColumn] + tile.offsetHeight;\r\n\r\n tile.style.visibility = 'visible';\r\n tile.style.position = 'absolute';\r\n tile.style.float = 'none';\r\n });\r\n\r\n this.tilesContainer.style.height = columnHeight[this.getHighestColumn(columnHeight)] + 'px';\r\n };\r\n\r\n /*\r\n * returns the position of the smallest value in the array\r\n */\r\n getSmallestColumn(columnHeight) {\r\n\r\n let smallestColumnValue = columnHeight[0];\r\n let smallestColumnNumber = 0;\r\n\r\n for (let i = 0; i < columnHeight.length; i++) {\r\n if (smallestColumnValue > columnHeight[i]) {\r\n smallestColumnValue = columnHeight[i];\r\n smallestColumnNumber = i;\r\n }\r\n\r\n }\r\n return smallestColumnNumber;\r\n\r\n };\r\n\r\n /*\r\n * returns the position of the highest value in the array\r\n */\r\n getHighestColumn(columnHeight) {\r\n\r\n let columnValue = columnHeight[0];\r\n let columnNumber = 0;\r\n\r\n for (let i = 0; i < columnHeight.length; i++) {\r\n if (columnValue < columnHeight[i]) {\r\n columnValue = columnHeight[i];\r\n columnNumber = i;\r\n }\r\n\r\n }\r\n return columnNumber;\r\n\r\n };\r\n}\r\n","import Polyfill from \"./Polyfill\";\r\nimport {insertAndExecute} from \"../../common/js/Helpers\";\r\n\r\n\r\n/**\r\n * this class is the basic modal of Event Gallery.\r\n */\r\nexport default class Overlay {\r\n\r\n /**\r\n * @param parent HTML element to append the modal to.\r\n */\r\n constructor(parent = document.body) {\r\n this.isOpen = false;\r\n this.myDiv = null;\r\n this.background = null;\r\n this.parent = parent\r\n this.onClosed = undefined;\r\n this.onLoad = undefined;\r\n this.repositionTimer = null;\r\n this.windowWidth = 0;\r\n this.onResizeOverlay = () => {\r\n this._setRositionTimer(false);\r\n }\r\n }\r\n\r\n /**\r\n * opens an overlay. The content can be a url or content.\r\n * Url start with http or /\r\n *\r\n * @param dataUrl\r\n */\r\n openOverlay(dataUrl) {\r\n\r\n this.isOpen = true;\r\n this.myDiv = document.createElement('div');\r\n this.myDiv.id = 'eventgallery-overlay';\r\n this.myDiv.innerHTML = '<i class=\"egfa egfa-2x egfa-cog egfa-spin\"></i>';\r\n this.myDiv.style.opacity = '1 !important';\r\n this.myDiv.style.position = 'absolute';\r\n this.myDiv.style.maxWidth = '100%';\r\n\r\n this.background = document.createElement('div');\r\n this.background.id = 'eventgallery-overlay-background';\r\n this.background.addEventListener('click', () => {\r\n this.closeOverlay()\r\n });\r\n\r\n this.parent.append(this.background);\r\n this.parent.append(this.myDiv);\r\n\r\n this.reposition(true);\r\n\r\n if (dataUrl.startsWith('http') || dataUrl.startsWith('/')) {\r\n Overlay._getRemoteData(dataUrl, (data) => {\r\n this._addContent(data);\r\n })\r\n } else {\r\n this._addContent(`<button class=\"btn-close-overlay eventgallery-close-overlay\"><i class=\"egfa egfa-2x egfa-times-circle\"></i></button>` + dataUrl);\r\n }\r\n\r\n window.addEventListener('resize', this.onResizeOverlay);\r\n }\r\n\r\n /**\r\n * triggers a timeout for the repositioning. This will avoid too much flickering.\r\n *\r\n * @param force\r\n * @private\r\n */\r\n _setRositionTimer(force) {\r\n if (this.repositionTimer) {\r\n clearTimeout(this.repositionTimer)\r\n }\r\n this.repositionTimer = setTimeout(() => this.reposition(force), 500);\r\n }\r\n\r\n static _getRemoteData(url, callback) {\r\n fetch(url)\r\n .then(response => response.text())\r\n .then(data => callback(data));\r\n }\r\n\r\n /**\r\n * moves the given content into the content overlay. Executes the onload method when finished.\r\n *\r\n * @param content\r\n * @private\r\n */\r\n _addContent(content) {\r\n insertAndExecute(this.myDiv, content);\r\n\r\n let elements = this.myDiv.getElementsByClassName('eventgallery-close-overlay');\r\n for(let i=0; i<elements.length;i++) {\r\n elements[i].addEventListener('click', (e) => {\r\n e.preventDefault();\r\n this.closeOverlay()\r\n });\r\n }\r\n\r\n this.reposition(true);\r\n\r\n if (this.onLoad !== undefined) {\r\n this.onLoad();\r\n }\r\n\r\n document.dispatchEvent(Polyfill.createNewEvent('eventgallery-images-added', {isOverlay: true}));\r\n }\r\n\r\n /**\r\n * Closes the overlay and fires the onclose method if defined.\r\n */\r\n closeOverlay() {\r\n this.isOpen = false;\r\n\r\n window.removeEventListener('resize', this.onResizeOverlay);\r\n\r\n Polyfill.removeHtmlElementNode(this.myDiv);\r\n Polyfill.removeHtmlElementNode(this.background);\r\n if (this.onClosed !== undefined) {\r\n this.onClosed();\r\n }\r\n }\r\n\r\n /**\r\n * Move the overlay to a good position.\r\n *\r\n * @param force defines if we force the reposition. If set to false, we do it only in case the width of the window changed.\r\n */\r\n reposition(force) {\r\n\r\n if (this.repositionTimer !== null) {\r\n clearTimeout(this.repositionTimer);\r\n }\r\n\r\n let maxWidth = document.body.clientWidth;\r\n\r\n if (!force) {\r\n if (this.windowWidth === maxWidth) {\r\n return;\r\n }\r\n }\r\n\r\n this.windowWidth = maxWidth;\r\n\r\n this.myDiv.style.opacity = 0;\r\n this.myDiv.style.top = 0;\r\n this.myDiv.style.left = 0;\r\n\r\n\r\n let maxHeight = window.innerHeight,\r\n width = this.myDiv.offsetWidth,\r\n height = this.myDiv.offsetHeight,\r\n scrollTop = 0,\r\n left = 0;\r\n\r\n // this allows the overlay to support two different containers:\r\n // 1. the body (which is the default)\r\n // 2. a full page html element which is positioned absolute\r\n // we can make this more complicated later\r\n\r\n if (this.parent == document.body) {\r\n scrollTop = window.pageYOffset\r\n }\r\n\r\n let top = scrollTop;\r\n\r\n if (maxWidth - width > 0) {\r\n left = (maxWidth - width) / 2;\r\n }\r\n\r\n if (maxHeight - height > 0) {\r\n top = scrollTop + (maxHeight - height) / 2;\r\n }\r\n\r\n this.myDiv.style.top = top + 'px';\r\n // there is a margin of 3px in overlay.less => we should not set this more to the left.\r\n if (left > 3) {\r\n this.myDiv.style.left = left + 'px';\r\n }\r\n\r\n this.myDiv.style.opacity = 1;\r\n };\r\n}\r\n","import PhotoSwipeGallery from \"./photoswipe/PhotoSwipeGallery\";\r\n\r\n/**\r\n * Builds a slide show on top of PhotoSwipe.\r\n */\r\nexport default class SlideShow {\r\n\r\n /**\r\n *\r\n * @param photoSwipeGallery PhotoSwipe\r\n */\r\n constructor(photoSwipe) {\r\n if (!window.EventGalleryLightboxConfiguration) {\r\n return;\r\n }\r\n\r\n if (!window.EventGalleryLightboxConfiguration.doUseSlideshow) {\r\n return;\r\n }\r\n\r\n this._photoSwipe = photoSwipe;\r\n this._SlideShow_Running = false;\r\n this._currentTimer = null;\r\n this._SlideShow_Delay = window?.EventGalleryLightboxConfiguration?.slideshowSpeed || 2000 /*ms*/;\r\n this._SlideShow_Button = null;\r\n this._photoSwipe.ui.registerElement({\r\n name: 'playpause-button',\r\n order: 9,\r\n isButton: true,\r\n html: '',\r\n onInit: (el) => {\r\n this._SlideShow_Button = el;\r\n this._adjustNavigation();\r\n },\r\n onClick: (event, el) => {\r\n //console.log('slideshow click')\r\n return this.toggleSlideShowState();\r\n }\r\n });\r\n\r\n this._photoSwipe.on('change', () => {\r\n this._planNextSwitch(false);\r\n });\r\n\r\n this._photoSwipe.on('destroy', () => this._photoSwipeGallery=null);\r\n this._photoSwipe.on('keydown', (e) => {if (e.originalEvent.target !== this._SlideShow_Button) this._stopSlideshow()} )\r\n this._photoSwipe.on('pointerDown', (e) => {if (e.originalEvent.target !== this._SlideShow_Button) this._stopSlideshow()} )\r\n\r\n if (window.EventGalleryLightboxConfiguration.doUseAutoplay) {\r\n this.toggleSlideShowState();\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param delay int\r\n */\r\n setDelay(delay) {\r\n this._SlideShow_Delay = delay;\r\n }\r\n\r\n /**\r\n * switches the slide show on/off depending on the current state\r\n */\r\n toggleSlideShowState() {\r\n\r\n if (this._SlideShow_Running) {\r\n this._stopSlideshow();\r\n } else {\r\n this._startSlideshow();\r\n }\r\n }\r\n\r\n _stopSlideshow() {\r\n this._SlideShow_Running = false;\r\n this._adjustNavigation();\r\n }\r\n\r\n _startSlideshow() {\r\n this._SlideShow_Running = true;\r\n this._planNextSwitch(true);\r\n this._adjustNavigation();\r\n }\r\n\r\n /**\r\n * make sure the navigation displays the current slide show state.\r\n */\r\n _adjustNavigation() {\r\n if (this._SlideShow_Button) {\r\n this._SlideShow_Button.classList.remove(this._SlideShow_Running ? \"play\" : \"pause\");\r\n this._SlideShow_Button.classList.add(this._SlideShow_Running ? \"pause\" : \"play\");\r\n //this._SlideShow_Button.setAttribute('title', this._SlideShow_Running ? this._SlideShow_Button.getAttribute('data-title-pause') : this._SlideShow_Button.getAttribute('data-title-play'));\r\n }\r\n }\r\n\r\n /**\r\n * create the timeout for the next switch.\r\n *\r\n * @param isForTheFirstSwitch Boolean changes the switch time so the first switch can be faster\r\n */\r\n _planNextSwitch(isForTheFirstSwitch) {\r\n clearTimeout(this._currentTimer);\r\n this._currentTimer = setTimeout(() => this._nextSlide(), isForTheFirstSwitch ? this._SlideShow_Delay / 2.0 :this._SlideShow_Delay);\r\n }\r\n\r\n /**\r\n * change to the next slide\r\n */\r\n _nextSlide() {\r\n if (this._photoSwipe === null) {\r\n return;\r\n }\r\n\r\n if (!this._SlideShow_Running) {\r\n return;\r\n }\r\n\r\n this._photoSwipe.next();\r\n }\r\n}\r\n","export default class URLHelper {\r\n\r\n constructor() {\r\n }\r\n\r\n /**\r\n * splits a URL parameter like foo=bar&1=2 into a parameter map\r\n *\r\n * @param urlParameterString\r\n * @returns {Map<any, any>}\r\n */\r\n static parseURLParameter(urlParameterString) {\r\n let pairs = urlParameterString.split('&');\r\n let parameters = new Map();\r\n\r\n pairs.forEach(pair => {\r\n let splittedPair = pair.split('=');\r\n if (splittedPair.length === 2) {\r\n parameters.set(splittedPair[0], splittedPair[1]);\r\n }\r\n });\r\n\r\n return parameters;\r\n }\r\n\r\n /**\r\n * returns a map of the query string of an full url\r\n *\r\n * @param urlSring\r\n * @returns {URLSearchParams}\r\n */\r\n static getParameters(urlSring) {\r\n let parts = urlSring.split('?');\r\n if (parts.length < 2) {\r\n return new Map();\r\n }\r\n let queryParts = parts[1].split('#');\r\n return URLHelper.parseURLParameter(queryParts[0]);\r\n }\r\n\r\n /**\r\n * returns the url from strings like \"url ('foobar.jpg')\"\r\n *\r\n * @param urlString\r\n * @returns {*}\r\n */\r\n static extractBackgroudUrl(urlString) {\r\n return urlString.replace(/(url\\(|\\)|\"|')/g, '');\r\n }\r\n};\r\n\r\n\r\n","import EventsHandler from \"../utils/eventshandler\";\r\n\r\nexport default function (Glide, Components, Events) {\r\n /**\r\n * Instance of the binder for DOM Events.\r\n *\r\n * @type {EventsHandler}\r\n */\r\n const Binder = new EventsHandler();\r\n\r\n /**\r\n * Holds preventing status of anchors.\r\n * If `true` redirection after click will be disabled.\r\n *\r\n * @private\r\n * @type {Boolean}\r\n */\r\n let prevented = false;\r\n\r\n let isSwiping = false;\r\n\r\n const Anchors = {\r\n /**\r\n * Setups a initial state of anchors component.\r\n *\r\n */\r\n mount () {\r\n /**\r\n * Holds collection of anchors elements.\r\n *\r\n * @private\r\n * @type {HTMLCollection}\r\n */\r\n this._a = Components.Html.wrapper.querySelectorAll('a,span,img');\r\n\r\n this.bind();\r\n isSwiping = false;\r\n },\r\n\r\n /**\r\n * Binds events to anchors inside a track.\r\n *\r\n */\r\n bind () {\r\n Binder.on('click', Components.Html.wrapper, this.click, true)\r\n },\r\n\r\n /**\r\n * Unbinds events attached to anchors inside a track.\r\n *\r\n */\r\n unbind () {\r\n Binder.off('click', Components.Html.wrapper)\r\n },\r\n\r\n /**\r\n * Handler for click event. Prevents clicks when glide is in `prevent` status.\r\n *\r\n * @param {Object} event\r\n */\r\n click (event) {\r\n if (prevented) {\r\n event.stopPropagation();\r\n event.preventDefault()\r\n }\r\n },\r\n\r\n /**\r\n * Detaches anchors click event inside glide.\r\n *\r\n * @return {self}\r\n */\r\n detach () {\r\n prevented = true;\r\n\r\n return this\r\n },\r\n\r\n /**\r\n * Attaches anchors click events inside glide.\r\n *\r\n * @return {self}\r\n */\r\n attach () {\r\n prevented = false;\r\n\r\n return this\r\n }\r\n };\r\n\r\n Object.defineProperty(Anchors, 'items', {\r\n /**\r\n * Gets collection of the arrows HTML elements.\r\n *\r\n * @return {HTMLElement[]}\r\n */\r\n get () {\r\n return Anchors._a\r\n }\r\n });\r\n\r\n /**\r\n * Detach anchors inside slides:\r\n * - on swiping, so they won't redirect to its `href` attributes\r\n */\r\n Events.on('swipe.move', () => {\r\n Anchors.detach();\r\n });\r\n\r\n /**\r\n * Attach anchors inside slides:\r\n * - after swiping and transitions ends, so they can redirect after click again\r\n */\r\n Events.on('swipe.end', () => {\r\n Components.Transition.after(() => {\r\n Anchors.attach()\r\n });\r\n });\r\n\r\n /**\r\n * Unbind anchors inside slides:\r\n * - on destroying, to bring anchors to its initial state\r\n */\r\n Events.on('destroy', () => {\r\n Anchors.attach();\r\n Anchors.unbind();\r\n Binder.destroy()\r\n });\r\n\r\n return Anchors\r\n}\r\n","import Polyfill from \"../Polyfill\";\r\nimport {Events} from \"../minicart/CartEvents\";\r\nimport {addTouch} from \"../touch/Touch\";\r\nimport Overlay from \"../Overlay\";\r\nimport {\r\n addUrlHashParameter,\r\n forEach, getElementHeight,\r\n getElementWidth,\r\n getUrlHashParameterValue,\r\n mergeObjects\r\n} from \"../../../common/js/Helpers\";\r\nimport SizeCalculator from \"../EventgallerySizeCalculator\";\r\n\r\n /*\r\n * Constructor. Starts up the whole thing :-)\r\n *\r\n * This script is free to use. It has been created by http://www.aplusmedia.de and\r\n * can be downloaded on http://www.esteak.net.\r\n * License: GNU GPL 2.0: http://creativecommons.org/licenses/GPL/2.0/\r\n * Example on: http://blog.aplusmedia.de/moo-gallery2\r\n * Known issues:\r\n * - preloading does not care about initialIndex param\r\n * - hovering to a control over the border of the big image will make the other one flickering\r\n * - if you enter and leave the control area very quickly, the control flickers sometimes\r\n * - does not work in IE6\r\n *\r\n * @param {HTMLelement] The main gallery element\r\n * @param {Array} thumbs, An array of HTML elements\r\n * @param {HTMLelement} bigImageContainer, the full size image\r\n * @param {HTMLelement} pageContainer, If you have several pages, put them in this container\r\n * @param {Object} options, You have to pass imagesPerPage if you have more than one!\r\n */\r\nexport class JSGallery2 {\r\n constructor(galleryElement, thumbs, bigImageContainer, pageContainer, newOptions) {\r\n this.options = {\r\n 'prevHandle': null,\t\t\t//if you pass a previous page handle in here, it will be hidden if it's not needed\r\n 'nextHandle': null,\t\t\t//like above, but for next page\r\n 'countHandle': null,\t\t//handle of the counter variable\r\n 'titleTarget': null,\t\t//target HTML element where image texts are copied into\r\n 'initialIndex': -1,\t\t\t//which thumb to select after init. you could create deep links with it.\r\n 'maxOpacity': 0.8,\t\t\t//maximum opacity before cursor reaches prev/next control, then it will be set to 1 instantly.\r\n 'showSocialMediaButton': true,\r\n 'showCartButton': true,\r\n 'showCartConnector': false,\r\n 'cartConnectorLinkRel': '',\r\n 'activeClass': 'thumbnail-active', // the css class for the active thumbnail\r\n 'lightboxRel': 'lightbo2', // the trigger rel for the lightbox script\r\n 'touchContainerSelector' : '#bigimageContainer'\r\n };\r\n\r\n this.galleryElement = galleryElement;\r\n this.nav = galleryElement.querySelector('.navigation');\r\n this.image = galleryElement.querySelector('.image');\r\n\r\n this.options = mergeObjects(this.options, newOptions);\r\n\r\n let pages = pageContainer.children;\r\n\r\n // defines if thumbs are currently running\r\n this.running = false;\r\n this.currentPageNumber = 0;\r\n\r\n this.blockKeys = false;\r\n this.imagesPerFirstPage = pages[0].querySelectorAll('div.ajax-thumbnail-container').length;\r\n this.imagesPerPage = this.imagesPerFirstPage;\r\n\r\n if (pages.length>1 && pages[1].querySelectorAll('div.ajax-thumbnail-container').length>0) {\r\n this.imagesPerPage = pages[1].querySelectorAll('div.ajax-thumbnail-container').length;\r\n }\r\n\r\n this.thumbs = [];\r\n for (let i=0; i<thumbs.length; i++) {\r\n this.thumbs.push(thumbs[i]);\r\n }\r\n this.bigImageContainer = bigImageContainer;\r\n this.bigImage = bigImageContainer.querySelector('img');\r\n this.pageContainer = pageContainer;\r\n\r\n this.convertThumbs();\r\n\r\n this.lastPage = Math.ceil((this.thumbs.length - this.imagesPerFirstPage) / this.imagesPerPage) + 1;\r\n\r\n let url = document.location.href;\r\n this.initialIndex = parseInt(getUrlHashParameterValue(url, 'imageno'));\r\n if (isNaN(this.initialIndex)) {\r\n this.initialIndex = 0;\r\n }\r\n\r\n this.createControls();\r\n\r\n this.createGallerySlides();\r\n this.adjustWidth();\r\n this.adjustPageHeight();\r\n this.adjustImageSize();\r\n\r\n this.gotoPage(0);\r\n\r\n if (this.options.initialIndex !== -1) {\r\n this.unBlockKeys();\r\n this.selectByIndex(this.options.initialIndex);\r\n } else if (this.initialIndex !== 0) {\r\n\r\n this.unBlockKeys();\r\n this.selectByIndex(this.initialIndex);\r\n }\r\n\r\n window.addEventListener('load', () => {this.resizePage()});\r\n window.addEventListener('resize', () => {this.resizePage()});\r\n }\r\n\r\n adjustWidth() {\r\n let width = this.nav.offsetWidth;\r\n forEach(this.galleryElement.querySelectorAll('.navigation .page'), (e) => {\r\n e.style.width = width + 2 + \"px\";\r\n })\r\n };\r\n\r\n /* Method to bring the thumb rel attribute to the right size */\r\n adjustImageSize() {\r\n let sizeCalculator = new SizeCalculator();\r\n let width = getElementWidth(this.bigImageContainer);\r\n\r\n forEach(this.nav.querySelectorAll('#thumbs .ajax-thumbnail'), (thumbnail, index) => {\r\n\r\n\r\n let originalwidth = thumbnail.getAttribute('data-width');\r\n let originalheight = thumbnail.getAttribute('data-height');\r\n let ratio = originalwidth / originalheight;\r\n let height = Math.round(width / ratio);\r\n let secret = thumbnail.getAttribute('data-secret');\r\n\r\n let imageUrl\r\n if (secret !== null) {\r\n let secret_o = thumbnail.getAttribute('data-secret_o');\r\n let secret_h = thumbnail.getAttribute('data-secret_h');\r\n let secret_k = thumbnail.getAttribute('data-secret_k');\r\n let farm = thumbnail.getAttribute('data-farm');\r\n let type = thumbnail.getAttribute('data-type');\r\n let server = thumbnail.getAttribute('data-server');\r\n let id = thumbnail.getAttribute('data-file');\r\n\r\n imageUrl = sizeCalculator.getFlickrURL(farm, server, secret, secret_h, secret_k, secret_o, id, width, height, originalwidth, originalheight);\r\n } else {\r\n let googleWidth = sizeCalculator.getSize(width, height, ratio);\r\n imageUrl = sizeCalculator.adjustImageURL(thumbnail.getAttribute('rel'), googleWidth);\r\n }\r\n thumbnail.setAttribute('rel', imageUrl);\r\n });\r\n };\r\n\r\n /* Method which handles the case the window got resized */\r\n resizePage() {\r\n window.clearTimeout(this.eventgalleryAjaxResizeTimer);\r\n\r\n this.eventgalleryAjaxResizeTimer = setTimeout(() => {\r\n this.adjustWidth();\r\n this.adjustImageSize();\r\n this.resetThumbs();\r\n this.gotoPage(this.currentPageNumber);\r\n this.adjustPageHeight();\r\n\r\n }, 500);\r\n };\r\n\r\n\r\n createGallerySlides() {\r\n this.slides = [];\r\n forEach(this.thumbs, (thumbContainer) => {\r\n let lightboxLinkElement = thumbContainer.getElementsByTagName('A')[0];\r\n let title = decodeURIComponent(lightboxLinkElement.getAttribute('data-description'));\r\n let slide = {\r\n w: lightboxLinkElement.getAttribute('data-width'),\r\n h: lightboxLinkElement.getAttribute('data-height'),\r\n src: lightboxLinkElement.getAttribute('href'),\r\n title: title,\r\n type: lightboxLinkElement.getAttribute('data-type')\r\n };\r\n if (slide.type === 'video' && lightboxLinkElement) {\r\n if (lightboxLinkElement.dataset.pswpVideoSources) {\r\n slide.videoSources = JSON.parse(pswpVideoSources);\r\n } else if (lightboxLinkElement.dataset.pswpVideoSrc) {\r\n slide.videoSrc = lightboxLinkElement.dataset.pswpVideoSrc;\r\n } else {\r\n slide.videoSrc = lightboxLinkElement.getAttribute('href');\r\n }\r\n }\r\n this.slides.push(slide)\r\n })\r\n };\r\n\r\n createControls() {\r\n this.prevLink = document.createElement('a');\r\n this.prevLink.href='#';\r\n this.prevLink.classList.add('link','jsgallery-prev');\r\n this.prevLink.addEventListener('click', (e)=> this.prevImage(e));\r\n this.prevLink.addEventListener('mouseleave', () => this.mouseLeaveHandler())\r\n this.prevLink.addEventListener('mouseover', (e) => this.focusControl(e, this.prevLink));\r\n\r\n this.zoomLink = document.createElement('a');\r\n this.zoomLink.href='#';\r\n this.zoomLink.classList.add('link','jsgallery-zoom');\r\n this.zoomLink.addEventListener('click', (e) => this.bigImageClickHandler(e));\r\n this.zoomLink.addEventListener('mouseleave', (e) => this.mouseLeaveHandler());\r\n this.zoomLink.addEventListener('mouseover', (e) => this.focusControl(e, this.zoomLink));\r\n\r\n this.nextLink = document.createElement('a');\r\n this.nextLink.href = '#';\r\n this.nextLink.classList.add('link','jsgallery-next');\r\n this.nextLink.addEventListener('click', (e) => this.nextImage(e));\r\n this.nextLink.addEventListener('mouseleave', () => this.mouseLeaveHandler())\r\n this.nextLink.addEventListener('mouseover', (e) => this.focusControl(e, this.nextLink));\r\n\r\n\t\tthis.bigImage.parentElement.appendChild(this.prevLink);\r\n this.bigImage.parentElement.appendChild(this.zoomLink);\r\n this.bigImage.parentElement.appendChild(this.nextLink);\r\n\r\n this.bigImage.addEventListener('load', ()=>this.showBigImage());\r\n\r\n if (this.options.showCartButton) {\r\n this.add2cartLink = document.createElement('a');\r\n this.add2cartLink.href = '#';\r\n this.add2cartLink.classList.add('eventgallery-add2cart','eventgallery-openAdd2cart','jsgallery-add2cart');\r\n this.add2cartLink.innerHTML = '<i class=\"egfa egfa-2x egfa-cart-plus\"></i>';\r\n this.bigImage.parentElement.appendChild(this.add2cartLink);\r\n document.dispatchEvent(Polyfill.createNewEvent(Events.rebindAdd2CartButtons, null));\r\n }\r\n\r\n if (this.options.showCartConnector) {\r\n\r\n this.cartConnectorLink = document.createElement('a');\r\n this.cartConnectorLink.href = '#';\r\n this.cartConnectorLink.id = 'ajax-cartconnector';\r\n this.cartConnectorLink.classList.add('button-cart-connector','jsgallery-cartconnector');\r\n this.cartConnectorLink.innerHTML = '<i class=\"egfa egfa-2x egfa-cart-plus\"></i>';\r\n this.cartConnectorLink.setAttribute('rel', this.options.cartConnectorLinkRel);\r\n this.bigImage.parentElement.appendChild(this.cartConnectorLink);\r\n }\r\n\r\n if (this.options.showSocialMediaButton) {\r\n let div = document.createElement('div');\r\n div.innerHTML = '<a id=\"ajax-social-media-button\" class=\"social-share-button jsgallery-socialmedia\" rel=\"nofollow\" href=\"#\"><i class=\"egfa egfa-2x egfa-share-alt-square\"></i></a>';\r\n this.socialmediabutton = div.firstChild;\r\n this.socialmediabutton.addEventListener('click', e => {\r\n e.preventDefault();\r\n let href = this.socialmediabutton.getAttribute('data-href');\r\n let overlay = new Overlay();\r\n overlay.openOverlay(href);\r\n });\r\n this.bigImage.parentElement.appendChild(this.socialmediabutton);\r\n }\r\n\r\n document.addEventListener('keydown', (e) => this.keyboardHandler(e));\r\n\r\n\t\tlet swipeleft = (e) => {\r\n\t\t this.nextImage(e);\r\n\t\t};\r\n\r\n\t\tlet swiperight = (e) => {\r\n\t\t this.prevImage(e);\r\n\t\t};\r\n\r\n let tabaction = (e) => {\r\n this.bigImage.click();\r\n };\r\n\r\n addTouch(document.querySelector(this.options.touchContainerSelector),\r\n swiperight,\r\n swipeleft,\r\n tabaction,\r\n null,\r\n );\r\n\r\n this.mouseLeaveHandler();\r\n };\r\n\r\n /**\r\n * Focuses one control\r\n *\r\n * @param {Event} event\r\n * @param {HTMLElement} control\r\n */\r\n focusControl(event, control) {\r\n control.style.opacity = '1';\r\n };\r\n\r\n /**\r\n * Hides the controls.\r\n */\r\n mouseLeaveHandler() {\r\n this.nextLink.style.opacity = '0';\r\n this.prevLink.style.opacity = '0';\r\n this.zoomLink.style.opacity = '0';\r\n };\r\n\r\n /**\r\n * Handles keyboard interactions.\r\n * @param {Event} event\r\n */\r\n keyboardHandler(event) {\r\n\r\n\r\n if (!this.blockKeys && Eventgallery.lightbox?.isOpen() !== true) {\r\n if (event.keyCode >= 49 && event.keyCode <= 57) {\r\n this.gotoPage(event.key - 1);\r\n } else if (event.keyCode == 37) {\r\n this.prevImage(event);\r\n } else if (event.keyCode == 39) {\r\n this.nextImage(event);\r\n }\r\n }\r\n };\r\n\r\n adjustPageHeight() {\r\n // fix height of the page-container\r\n let maxHeight = 0;\r\n forEach(this.pageContainer.children, (page) => {\r\n let height = page.offsetHeight;\r\n if (height > maxHeight) {\r\n maxHeight = height;\r\n }\r\n })\r\n\r\n this.pageContainer.style.height = maxHeight +'px';\r\n this.nav.style.opacity = 1;\r\n }\r\n\r\n resetThumbs() {\r\n \tthis.running = false;\r\n\r\n\t\tthis.convertThumbs();\r\n\r\n //if we like to select another image on that page than the first one\r\n this.select(this.selectedContainer, true);\r\n };\r\n\r\n /**\r\n * Adds the border to the thumbs and so on. (conversion of static thumbs)\r\n */\r\n convertThumbs() {\r\n forEach(this.thumbs, (thumbContainer, count)=>{\r\n this.convertThumb(thumbContainer, count);\r\n })\r\n };\r\n\r\n /**\r\n * Converts one single thumb.\r\n * @param {HTMLElement} thumbContainer\r\n * @param {Integer} count\r\n */\r\n convertThumb(thumbContainer, count) {\r\n\r\n if (thumbContainer === undefined) {\r\n return;\r\n }\r\n\r\n thumbContainer.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n this.select(thumbContainer);\r\n });\r\n\r\n\r\n thumbContainer.style.position = 'relative';\r\n thumbContainer.setAttribute('data-counter', count);\r\n thumbContainer.setAttribute('href', '#');\r\n };\r\n\r\n /**\r\n * Removes key blocking.\r\n */\r\n unBlockKeys() {\r\n this.blockKeys = false;\r\n };\r\n\r\n /**\r\n * Selects a certain image. (You have to pass the outer container of the image)\r\n * @param container\r\n * @param forceReload\r\n */\r\n select(container, forceReload) {\r\n forceReload = typeof forceReload !== 'undefined' ? forceReload : false;\r\n\r\n if (this.blockKeys || container === null) {\r\n return false;\r\n }\r\n\r\n\r\n this.blockKeys = true;\r\n if ( this.selectedContainer !== undefined ) {\r\n //this prevents an ugly effect if you click on the currently selected item\r\n if (container == this.selectedContainer && !forceReload) {\r\n this.unBlockKeys();\r\n return false;\r\n }\r\n this.deselect(this.selectedContainer);\r\n }\r\n\r\n // handle URL\r\n if (history && history.pushState) {\r\n history.pushState('', '', addUrlHashParameter(window.location.href, 'imageno', this.thumbs.indexOf(container)));\r\n }\r\n //if target image is not on current page, we have to go there first\r\n let targetPage = Math.floor((container.getAttribute('data-counter') - this.imagesPerFirstPage) / this.imagesPerPage) + 1;\r\n\r\n if (this.currentPageNumber != targetPage) {\r\n this.gotoPage(targetPage, container);\r\n }\r\n this.selectedContainer = container;\r\n\r\n container.classList.add(this.options.activeClass);\r\n\r\n //first link in the container\r\n let source = container.children[0];\r\n\r\n // prepare the add2cart button\r\n if (this.options.showCartButton) {\r\n if (container.getElementsByTagName('A')[0]?.getAttribute('data-type') === 'image') {\r\n this.add2cartLink.setAttribute('data-id', source.getAttribute('data-id'));\r\n this.add2cartLink.style.display = 'block';\r\n } else {\r\n this.add2cartLink.style.display = 'none';\r\n }\r\n }\r\n\r\n if (this.options.showCartConnector) {\r\n this.cartConnectorLink.setAttribute('data-folder', source.getAttribute('data-folder'));\r\n this.cartConnectorLink.setAttribute('data-file', source.getAttribute('data-file'));\r\n this.cartConnectorLink.setAttribute('href', decodeURIComponent(source.getAttribute('data-cart-connector-link')));\r\n }\r\n\r\n if (this.options.showSocialMediaButton) {\r\n this.socialmediabutton.setAttribute('data-href', decodeURIComponent(source.getAttribute('data-social-sharing-link')) );\r\n }\r\n\r\n document.dispatchEvent(Polyfill.createNewEvent(Events.rebindAdd2CartButtons, null));\r\n\r\n // now lets set the image\r\n this.setImage(source);\r\n };\r\n\r\n\r\n /**\r\n * Selects an image by its thumbnail index.\r\n * @param {integer} index of the thumbnail, starting with 0\r\n */\r\n selectByIndex(index) {\r\n //this.mouseLeaveHandler();\r\n if (index < 0 || this.thumbs.length <= index) {\r\n index = 0;\r\n }\r\n this.select(this.thumbs[index]);\r\n };\r\n\r\n /**\r\n * Opposite to method above.\r\n * @param {HTMLHtmlElement} container\r\n */\r\n deselect(container) {\r\n container.classList.remove(this.options.activeClass);\r\n };\r\n\r\n bigImageClickHandler(e) {\r\n this.createGallerySlides();\r\n let currentIndex = this.thumbs.indexOf(this.selectedContainer);\r\n Eventgallery.lightbox.openPhotoSwipe(\r\n currentIndex, this.slides, true, false, false\r\n );\r\n Eventgallery.lightbox.setAfterChangeEventListener(() => {\r\n let gid = Eventgallery.lightbox.getCurrentSlide().gid;\r\n if (this.slides.length>0 && gid === this.slides[0].gid) {\r\n this.selectByIndex(Eventgallery.lightbox.getCurrentIndex());\r\n }\r\n });\r\n }\r\n /**\r\n * Changes the full size image to given one.\r\n * @param lightboxLinkElement\r\n */\r\n setImage(lightboxLinkElement) {\r\n\r\n this.bigImage.style.opacity = '0.1';\r\n let newSrc = lightboxLinkElement.getAttribute('rel');\r\n let title = decodeURIComponent(lightboxLinkElement.getAttribute('data-description'));\r\n\r\n let currentIndex = this.thumbs.indexOf(this.selectedContainer);\r\n\r\n\r\n if (Eventgallery.lightbox?.isOpen() === true) {\r\n Eventgallery.lightbox.gotoSlide(currentIndex);\r\n }\r\n\r\n this.galleryElement.querySelector(this.options.titleTarget).innerHTML = title;\r\n\r\n this.bigImage.setAttribute('src', newSrc);\r\n this.unBlockKeys();\r\n };\r\n\r\n showBigImage() {\r\n this.image.style.opacity = 1;\r\n this.bigImage.style.opacity = 1;\r\n };\r\n\r\n /**\r\n * Navigates to previous page.\r\n */\r\n prevPage() {\r\n this.gotoPage(this.currentPageNumber - 1);\r\n };\r\n /**\r\n * Navigates to next page.\r\n */\r\n nextPage() {\r\n this.gotoPage(this.currentPageNumber + 1);\r\n };\r\n /**\r\n * Selects the previous image.\r\n */\r\n prevImage(e) {\r\n if (e !== undefined) {\r\n e.preventDefault();\r\n }\r\n this.selectByIndex(this.thumbs.indexOf(this.selectedContainer) - 1);\r\n };\r\n /**\r\n * Selects the next image.\r\n */\r\n nextImage(e) {\r\n if (e !== undefined) {\r\n e.preventDefault();\r\n }\r\n this.selectByIndex(this.thumbs.indexOf(this.selectedContainer) + 1);\r\n };\r\n\r\n /**\r\n * Zooms an image\r\n */\r\n zoomImage(e) {\r\n if (e !== undefined) {\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n /**\r\n * Navigates to given page and selects the first image of it.\r\n * Also hides the handles (if set).\r\n * @param {Integer} pageNumber, index of the target page (0-n)\r\n * @param {HTMLElement} selectImage, optionally receives a particular image to select\r\n */\r\n gotoPage(pageNumber, selectImage) {\r\n //if we like to select another image on that page than the first one\r\n if (pageNumber === 0) {\r\n selectImage = selectImage === undefined ? this.thumbs[0] : selectImage;\r\n } else {\r\n let i = (pageNumber - 1) * this.imagesPerPage + this.imagesPerFirstPage;\r\n selectImage = this.thumbs[i] === undefined ? selectImage : this.thumbs[i];\r\n }\r\n\r\n if (pageNumber >= 0 && pageNumber < this.lastPage) {\r\n this.pageContainer.style.marginLeft = (getElementWidth(this.pageContainer.children[0]) * pageNumber * -1) + 'px';\r\n this.currentPageNumber = pageNumber;\r\n this.select(selectImage);\r\n this.updateHandles();\r\n }\r\n };\r\n\r\n updateHandles() {\r\n //update handles\r\n\r\n if (this.options.prevHandle) {\r\n this.currentPageNumber === 0 ? this.options.prevHandle.style.opacity = 0:this.options.prevHandle.style.opacity = 1;\r\n }\r\n if (this.options.nextHandle) {\r\n this.currentPageNumber == this.lastPage - 1 ? this.options.nextHandle.style.opacity = 0:this.options.nextHandle.style.opacity = 1;\r\n }\r\n\r\n if (this.options.countHandle) {\r\n this.updatePagingBar(this.currentPageNumber, this.lastPage);\r\n }\r\n\r\n };\r\n\r\n updatePagingBar(currentPage, pageCount) {\r\n if (pageCount <= 1 ) {\r\n return;\r\n }\r\n\r\n //init the pagingbar\r\n if (pageCount > 1 && this.options.countHandle.innerHTML === '') {\r\n\r\n for (let i = 0; i < pageCount; i++) {\r\n this.createCountLink(i);\r\n }\r\n }\r\n\r\n let pageSpeed = this.options.pageSpeed;\r\n\r\n\r\n if (pageCount > 9) {\r\n\r\n for (let i = 0; i < pageCount; i++) {\r\n this.galleryElement.querySelector('#count' + i).style.display = inline;\r\n }\r\n\r\n let skipFromRight = pageCount;\r\n let skipFromLeft = 0;\r\n\r\n let spaceToRight = pageCount - currentPage - 1;\r\n let spaceToLeft = currentPage;\r\n\r\n if (spaceToLeft > 4 && spaceToRight > 4) {\r\n skipFromLeft = currentPage - 4;\r\n skipFromRight = currentPage + 5;\r\n } else {\r\n if (spaceToLeft <= 4) {\r\n skipFromLeft = 0;\r\n skipFromRight = currentPage + 5 + (4 - spaceToLeft);\r\n }\r\n if (spaceToRight <= 4) {\r\n skipFromLeft = currentPage - 4 - (4 - spaceToRight);\r\n skipFromRight = pageCount;\r\n }\r\n }\r\n\r\n for (let i = 0; i < skipFromLeft; i++) {\r\n this.galleryElement.querySelector('#count' + i).style.display = 'none';\r\n }\r\n\r\n for (let i = skipFromRight; i < pageCount; i++) {\r\n this.galleryElement.querySelector('#count' + i).style.display = 'none';\r\n\r\n }\r\n }\r\n\r\n forEach(this.options.countHandle.children, (child) => child.classList.remove('active'));\r\n this.galleryElement.querySelector('#count' + currentPage).classList.add('active');\r\n\r\n };\r\n\r\n createCountLink(currentPageNumber) {\r\n\r\n let myAnchor = document.createElement('A');\r\n myAnchor.href = '#';\r\n myAnchor.classList.add('page-link');\r\n myAnchor.innerText = currentPageNumber + 1;\r\n\r\n myAnchor.addEventListener('click',(e) => {\r\n e.preventDefault();\r\n this.gotoPage(currentPageNumber, null);\r\n return false;\r\n });\r\n\r\n let myListItem = document.createElement('LI');\r\n myListItem.classList.add('count');\r\n myListItem.classList.add('page-item');\r\n myListItem.id = 'count' + currentPageNumber;\r\n\r\n myListItem.appendChild(myAnchor);\r\n\r\n this.options.countHandle.appendChild(myListItem);\r\n }\r\n}\r\n\r\n\r\n","const {forEach} = require(\"../../../common/js/Helpers\");\r\nconst {JSGallery2} = require(\"./EventgalleryJSGallery2\");\r\n\r\n\r\n/* start the eventgallery*/\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n\r\n let galleryElements = document.querySelectorAll('.ajaxpaging');\r\n for(let i=0; i<galleryElements.length; i++) {\r\n let galleryElement = galleryElements[i];\r\n\r\n new JSGallery2(\r\n galleryElement,\r\n galleryElement.querySelectorAll('.ajax-thumbnail-container'),\r\n galleryElement.querySelector('#bigimageContainer'),\r\n galleryElement.querySelector('#pageContainer'),\r\n {\r\n 'prevHandle': galleryElement.querySelector('#prev'),\r\n 'nextHandle': galleryElement.querySelector('#next'),\r\n 'countHandle': galleryElement.querySelector('#count'),\r\n 'titleTarget': '#bigImageDescription',\r\n 'showSocialMediaButton': galleryElement.getAttribute('data-showSocialMediaButton')=='true',\r\n 'showCartButton': galleryElement.getAttribute('data-showCartButton')=='true',\r\n 'showCartConnector': galleryElement.getAttribute('data-showCartConnector')=='true',\r\n 'cartConnectorLinkRel': galleryElement.getAttribute('data-cartConnectorLinkRel'),\r\n 'lightboxRel': 'gallery'\r\n });\r\n\r\n }\r\n});\r\n","export const defaultOptions = {\n videoAttributes: { controls: '', playsinline: '', preload: 'auto' },\n autoplay: true,\n\n // prevent drag/swipe gesture over the bottom part of video\n // set to 0 to disable\n preventDragOffset: 40\n};\n","import { defaultOptions } from './default-options.js';\nimport VideoContentSetup from './video-content-setup.js';\n\nclass PhotoSwipeVideoPlugin {\n constructor(lightbox, options) {\n new VideoContentSetup(lightbox, {\n ...defaultOptions,\n ...options\n });\n }\n}\n\nexport default PhotoSwipeVideoPlugin;\n","/**\n * Check if slide has video content\n *\n * @param {Slide|Content} content Slide or Content object\n * @returns Boolean\n */\nfunction isVideoContent(content) {\n return (content && content.data && content.data.type === 'video');\n}\n\nclass VideoContentSetup {\n constructor(lightbox, options) {\n this.options = options;\n\n this.initLightboxEvents(lightbox);\n lightbox.on('init', () => {\n this.initPswpEvents(lightbox);\n });\n }\n\n initLightboxEvents(lightbox) {\n lightbox.on('contentLoad', this.onContentLoad.bind(this));\n lightbox.on('contentDestroy', this.onContentDestroy.bind(this));\n lightbox.on('contentActivate', this.onContentActivate.bind(this));\n lightbox.on('contentDeactivate', this.onContentDeactivate.bind(this));\n lightbox.on('contentAppend', this.onContentAppend.bind(this));\n lightbox.on('contentResize', this.onContentResize.bind(this));\n\n lightbox.addFilter('isKeepingPlaceholder', this.isKeepingPlaceholder.bind(this));\n lightbox.addFilter('isContentZoomable', this.isContentZoomable.bind(this));\n lightbox.addFilter('useContentPlaceholder', this.useContentPlaceholder.bind(this));\n\n lightbox.addFilter('domItemData', (itemData, element, linkEl) => {\n if (itemData.type === 'video' && linkEl) {\n if (linkEl.dataset.pswpVideoSources) {\n itemData.videoSources = JSON.parse(pswpVideoSources);\n } else if (linkEl.dataset.pswpVideoSrc) {\n itemData.videoSrc = linkEl.dataset.pswpVideoSrc;\n } else {\n itemData.videoSrc = linkEl.href;\n }\n }\n return itemData;\n });\n }\n\n initPswpEvents(pswp) {\n // Prevent draggin when pointer is in bottom part of the video\n // todo: add option for this\n pswp.on('pointerDown', (e) => {\n const slide = pswp.currSlide;\n if (isVideoContent(slide) && this.options.preventDragOffset) {\n const origEvent = e.originalEvent;\n if (origEvent.type === 'pointerdown') {\n const videoHeight = Math.ceil(slide.height * slide.currZoomLevel);\n const verticalEnding = videoHeight + slide.bounds.center.y;\n const pointerYPos = origEvent.pageY - pswp.offset.y;\n if (pointerYPos > verticalEnding - this.options.preventDragOffset\n && pointerYPos < verticalEnding) {\n e.preventDefault();\n }\n }\n }\n });\n\n // do not append video on nearby slides\n pswp.on('appendHeavy', (e) => {\n if (isVideoContent(e.slide) && !e.slide.isActive) {\n e.preventDefault();\n }\n });\n\n pswp.on('close', () => {\n if (isVideoContent(pswp.currSlide.content)) {\n // Switch from zoom to fade closing transition,\n // as zoom transition is choppy for videos\n if (!pswp.options.showHideAnimationType\n || pswp.options.showHideAnimationType === 'zoom') {\n pswp.options.showHideAnimationType = 'fade';\n }\n\n // pause video when closing\n this.pauseVideo(pswp.currSlide.content);\n }\n });\n }\n\n onContentDestroy({ content }) {\n if (isVideoContent(content)) {\n if (content._videoPosterImg) {\n content._videoPosterImg.onload = content._videoPosterImg.onerror = null;\n content._videoPosterImg = null;\n }\n }\n }\n\n onContentResize(e) {\n if (isVideoContent(e.content)) {\n e.preventDefault();\n\n const width = e.width;\n const height = e.height;\n const content = e.content;\n\n if (content.element) {\n content.element.style.width = width + 'px';\n content.element.style.height = height + 'px';\n }\n\n if (content.slide && content.slide.placeholder) {\n // override placeholder size, so it more accurately matches the video\n const placeholderElStyle = content.slide.placeholder.element.style;\n placeholderElStyle.transform = 'none';\n placeholderElStyle.width = width + 'px';\n placeholderElStyle.height = height + 'px';\n }\n }\n }\n\n\n isKeepingPlaceholder(isZoomable, content) {\n if (isVideoContent(content)) {\n return false;\n }\n return isZoomable;\n }\n\n isContentZoomable(isZoomable, content) {\n if (isVideoContent(content)) {\n return false;\n }\n return isZoomable;\n }\n\n onContentActivate({ content }) {\n if (isVideoContent(content) && this.options.autoplay) {\n this.playVideo(content);\n }\n }\n\n onContentDeactivate({ content }) {\n if (isVideoContent(content)) {\n this.pauseVideo(content);\n }\n }\n\n onContentAppend(e) {\n if (isVideoContent(e.content)) {\n e.preventDefault();\n e.content.isAttached = true;\n e.content.appendImage();\n }\n }\n\n onContentLoad(e) {\n const content = e.content; // todo: videocontent\n\n if (!isVideoContent(e.content)) {\n return;\n }\n\n // stop default content load\n e.preventDefault();\n\n if (content.element) {\n return;\n }\n\n content.state = 'loading';\n content.type = 'video'; // TODO: move this to pswp core?\n\n content.element = document.createElement('video');\n\n if (this.options.videoAttributes) {\n for(let key in this.options.videoAttributes) {\n content.element.setAttribute(key, this.options.videoAttributes[key] || '');\n }\n }\n\n if (content.data.msrc) {\n content.element.setAttribute('poster', content.data.msrc);\n }\n\n this.preloadVideoPoster(content, content.data.msrc);\n\n content.element.style.position = 'absolute';\n content.element.style.left = 0;\n content.element.style.top = 0;\n\n if (content.data.videoSources) {\n content.data.videoSources.forEach((source) => {\n let sourceEl = document.createElement('source');\n sourceEl.src = source.src;\n sourceEl.type = source.type;\n content.element.appendChild(sourceEl);\n });\n } else if (content.data.videoSrc) {\n // Force video preload\n // https://muffinman.io/blog/hack-for-ios-safari-to-display-html-video-thumbnail/\n // this.element.src = this.data.videoSrc + '#t=0.001';\n content.element.src = content.data.videoSrc;\n }\n }\n\n preloadVideoPoster(content, src) {\n if (!content._videoPosterImg && src) {\n content._videoPosterImg = new Image();\n content._videoPosterImg.src = src;\n if (content._videoPosterImg.complete) {\n content.onLoaded();\n } else {\n content._videoPosterImg.onload = content._videoPosterImg.onerror = () => {\n content.onLoaded();\n };\n }\n }\n }\n\n\n playVideo(content) {\n if (content.element) {\n content.element.play();\n }\n }\n\n pauseVideo(content) {\n if (content.element) {\n content.element.pause();\n }\n }\n\n useContentPlaceholder(usePlaceholder, content) {\n if (isVideoContent(content)) {\n return true;\n }\n return usePlaceholder;\n }\n\n}\n\nexport default VideoContentSetup;\n","import {addUrlHashParameter, mergeObjects, removeUrlHashParameter} from \"../../../common/js/Helpers\";\r\n\r\nexport default class HistoryHandler {\r\n\r\n constructor(newOptions) {\r\n this.options = {\r\n onClose: () => {},\r\n window: window,\r\n history: history\r\n }\r\n this.options = mergeObjects(this.options, newOptions);\r\n }\r\n\r\n browserBackHappened = false;\r\n\r\n _close = () => {\r\n this.browserBackHappened = true;\r\n this.options.onClose();\r\n }\r\n\r\n /**\r\n * Add a cleaned history item on the stack,\r\n * watch for browser back\r\n */\r\n startUrlHistory() {\r\n if (!this.options.history) return;\r\n\r\n this.options.window.addEventListener('popstate', this._close)\r\n this.browserBackHappened = false;\r\n let url = this.options.window.location.href;\r\n\r\n url = removeUrlHashParameter(url, 'gid');\r\n url = removeUrlHashParameter(url, 'pid')\r\n\r\n this.options.history.replaceState(null, '', url);\r\n this.options.history.pushState(null,'', null);\r\n }\r\n\r\n /**\r\n * remove the listener\r\n * go one step back in the history if NO browser-back detected\r\n */\r\n endUrlHistory() {\r\n if (!this.options.history) return;\r\n this.options.window.removeEventListener('popstate', this._close)\r\n if (!this.browserBackHappened) this.options.history.go(-1);\r\n }\r\n\r\n /**\r\n * set the URL for the current slide\r\n * @param slide PhotoSwipeGallerySlide\r\n */\r\n adjustUrlHistory(slide) {\r\n if (!this.options.history) return;\r\n let url = this.options.window.location.href;\r\n\r\n url = addUrlHashParameter(url, 'gid', slide.gid);\r\n url = addUrlHashParameter(url, 'pid', slide.pid)\r\n\r\n this.options.history.replaceState(null, '', url);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import PhotoSwipe from 'photoswipe';\r\nimport 'photoswipe/style.css';\r\nimport PhotoSwipeVideoPlugin from '../photoswipe-video-plugin/index';\r\nimport {getElementHeight, getParent, mergeObjects, removeElement} from \"../../../common/js/Helpers\";\r\nimport Polyfill from \"../Polyfill\";\r\nimport Overlay from \"../Overlay\";\r\nimport SlideShow from \"../SlideShow\";\r\nimport {parseHash} from \"./UrlHandling\";\r\nimport {closest, getThumbnailContainers, parseThumbnailElement} from \"./SlideGenerator\";\r\nimport {Events} from \"../minicart/CartEvents\";\r\nimport HistoryHandler from \"./HistoryHandler\";\r\n\r\n\r\n\r\nexport default class PhotoSwipeGallery {\r\n\r\n constructor(options) {\r\n this._isOpen = false;\r\n this._gallery = null;\r\n this._videoPlugin = null;\r\n this.options = mergeObjects({\r\n doOverlapToolbar: false,\r\n imagePadding: 0,\r\n doOverlapImageWithCaption: false,\r\n showHideAnimationType: 'zoom',\r\n }, options);\r\n }\r\n\r\n initPhotoSwipe() {\r\n this.translations = this._translate();\r\n this._registerClickEvents();\r\n\r\n // Parse URL and open gallery if it contains #&pid=3&gid=1\r\n let hashData = parseHash();\r\n if(hashData.pid && hashData.gid) {\r\n this.openPhotoSwipe( hashData.pid , this.getGalleries().get(hashData.gid), true, true );\r\n }\r\n };\r\n\r\n _translate() {\r\n if (!window.EventGalleryLightboxConfiguration) {\r\n return {};\r\n }\r\n\r\n return {\r\n closeTitle: EventGalleryLightboxConfiguration.KEY_CLOSE,\r\n zoomTitle: EventGalleryLightboxConfiguration.KEY_ZOOM,\r\n arrowPrevTitle: EventGalleryLightboxConfiguration.KEY_PREVIOUS,\r\n arrowNextTitle: EventGalleryLightboxConfiguration.KEY_NEXT,\r\n errorMsg: 'The image cannot be loaded',\r\n indexIndicatorSep: ' / ',\r\n share: EventGalleryLightboxConfiguration.KEY_SHARE,\r\n download: EventGalleryLightboxConfiguration.KEY_DOWNLOAD,\r\n buy: EventGalleryLightboxConfiguration.KEY_BUY,\r\n 'playpause-buttonTitle': EventGalleryLightboxConfiguration.KEY_PLAYSLIDESHOW,\r\n pause: EventGalleryLightboxConfiguration.KEY_PAUSESLIDESHOW,\r\n }\r\n }\r\n\r\n onThumbnailsClick(e) {\r\n e = e || window.event;\r\n e.preventDefault ? e.preventDefault() : e.returnValue = false;\r\n\r\n let eTarget = e.target || e.srcElement;\r\n\r\n // leave the icons for cart&sharing alone\r\n let iconContainer = closest(eTarget, function(el) {\r\n return (el.classList && el.classList.contains('eventgallery-icon-container'));\r\n });\r\n if (iconContainer !== null) {\r\n return;\r\n }\r\n\r\n // find root element of slide\r\n let clickedListItem = closest(eTarget, function(el) {\r\n return (el.tagName && el.tagName.toUpperCase() === 'A');\r\n });\r\n\r\n if(!clickedListItem) {\r\n return;\r\n }\r\n\r\n let slide = this.getSlideBy(clickedListItem);\r\n let index = this.getIndexOfSlide(slide);\r\n let slides = this.getGalleries().get(slide.gid);\r\n\r\n if(index >= 0) {\r\n // open PhotoSwipe if valid index found\r\n this.openPhotoSwipe( index, slides );\r\n }\r\n return false;\r\n };\r\n\r\n /**\r\n *\r\n * @param index\r\n * @param slides\r\n * @param disableAnimation\r\n * @param fromURL\r\n */\r\n openPhotoSwipe(index, slides, disableAnimation, fromURL, useHistory = true) {\r\n if (slides === undefined || slides.length === 0 ) {\r\n return;\r\n }\r\n\r\n // define options (if needed)\r\n let options = mergeObjects({\r\n pswpModule: PhotoSwipe,\r\n\r\n galleryPIDs:true,\r\n bgOpacity: 1,\r\n trapFocus: false,\r\n showHideAnimationType: this.options.showHideAnimationType,\r\n\r\n // define gallery index (for URL)\r\n galleryUID: slides[0].gid,\r\n\r\n 'tapAction': () => {\r\n this._gallery.element.classList.toggle('pswp--ui-visible');\r\n if (this._gallery.element.classList.contains('pswp--ui-visible')) {\r\n this._gallery.element.classList.remove('pswp--ui-invisible');\r\n } else {\r\n this._gallery.element.classList.add('pswp--ui-invisible');\r\n }\r\n\r\n this._gallery.updateSize(true);\r\n },\r\n\r\n\r\n paddingFn: (viewportSize, itemData, index) => {\r\n\r\n let top = 0;\r\n let bottom = 0;\r\n let captionHeight = 0;\r\n\r\n if (!this._gallery.element.classList.contains('pswp--ui-invisible')) {\r\n\r\n if (this.options.doOverlapToolbar === false) {\r\n top = getElementHeight(document.querySelector('.pswp__top-bar'))\r\n }\r\n\r\n top += this.options.imagePadding;\r\n\r\n if (!this.options.doOverlapImageWithCaption) {\r\n if (itemData.title) {\r\n const el = document.createElement('div');\r\n el.className = 'pswp__custom-caption';\r\n el.innerHTML = itemData.title;\r\n this._gallery.element.appendChild(el);\r\n captionHeight = getElementHeight(el);\r\n let cSSStyleDeclaration = getComputedStyle(el);\r\n\r\n if (cSSStyleDeclaration['bottom']) {\r\n let captionBottom = parseInt(cSSStyleDeclaration['bottom'], 10)\r\n captionHeight += captionBottom;\r\n captionHeight += Math.max(0, 4 - this.options.imagePadding);\r\n }\r\n\r\n Polyfill.removeHtmlElementNode(el);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n top,\r\n bottom: bottom + captionHeight,\r\n left: 0,\r\n right: 0\r\n };\r\n },\r\n }, this.translations);\r\n\r\n // disable close gestures to avoid trouble with the add2cart dialog.\r\n options.pinchToClose = !options.add2cartEl;\r\n options.closeOnVerticalDrag = !options.add2cartEl;\r\n options.closeOnScroll = !options.add2cartEl;\r\n\r\n if (window.EventGalleryLightboxConfiguration) {\r\n if (parseInt(window.EventGalleryLightboxConfiguration.navigationFadeDelay) > 0) {\r\n options.timeToIdle = parseInt(window.EventGalleryLightboxConfiguration.navigationFadeDelay);\r\n options.timeToIdleOutside = parseInt(window.EventGalleryLightboxConfiguration.navigationFadeDelay);\r\n }\r\n }\r\n\r\n // PhotoSwipe opened from URL\r\n if(fromURL) {\r\n if(options.galleryPIDs) {\r\n index = parseInt(index, 10);\r\n // parse real index when custom PIDs are used\r\n // http://photoswipe.com/documentation/faq.html#custom-pid-in-url\r\n for(let j = 0; j < slides.length; j++) {\r\n if(slides[j].pid === index) {\r\n options.index = j;\r\n break;\r\n }\r\n }\r\n } else {\r\n // in URL indexes start from 1\r\n options.index = parseInt(index, 10) - 1;\r\n }\r\n } else {\r\n options.index = parseInt(index, 10);\r\n }\r\n\r\n // exit if index not found\r\n if( isNaN(options.index) ) {\r\n return;\r\n }\r\n\r\n if(disableAnimation) {\r\n options.showAnimationDuration = 0;\r\n }\r\n\r\n // Pass data to PhotoSwipe and initialize it\r\n\r\n options.dataSource = slides;\r\n\r\n\r\n this._gallery = new PhotoSwipe(options);\r\n\r\n\r\n /** allows the zoom closing */\r\n this._gallery.addFilter('thumbEl', (thumbEl, data, index) => {\r\n if (data.thumbEl) {\r\n const el = data.thumbEl.querySelector('img');\r\n if (el) {\r\n return el;\r\n }\r\n }\r\n return thumbEl;\r\n });\r\n\r\n /** get a placeholder */\r\n /*this._gallery.addFilter('placeholderSrc', (placeholderSrc, slide) => {\r\n const el = slide.data.thumbEl.querySelector('img');\r\n if (el) {\r\n return el.src;\r\n }\r\n return placeholderSrc;\r\n });*/\r\n\r\n this._gallery.on('close', () => {\r\n return this._isOpen = false;\r\n });\r\n\r\n this._gallery.on('change', () => {\r\n this.overlay?.closeOverlay();\r\n })\r\n\r\n // HISTORY\r\n\r\n let historyHandler = new HistoryHandler({\r\n onClose: () => this._gallery.close(),\r\n history: useHistory ? history : null\r\n })\r\n\r\n this._gallery.on('afterInit', () => {\r\n historyHandler.startUrlHistory();\r\n historyHandler.adjustUrlHistory(this.getCurrentSlide());\r\n });\r\n\r\n this._gallery.on('change', () => {\r\n historyHandler.adjustUrlHistory(this.getCurrentSlide());\r\n })\r\n\r\n this._gallery.on('close', () => {\r\n historyHandler.endUrlHistory();\r\n })\r\n // END HISTORY\r\n\r\n this._gallery.on('keydown', (e) => {\r\n // prevent photoswipe to react on keypresses\r\n if (this.overlay?.isOpen) {\r\n e.defaultPrevented = true;\r\n }\r\n })\r\n\r\n this._gallery.on('close', () => {\r\n this.overlay?.closeOverlay();\r\n })\r\n\r\n this._gallery.on('change', () => {\r\n document.dispatchEvent(Polyfill.createNewEvent('eventgallery-lightbox-changed'));\r\n });\r\n\r\n this._registerUIElements();\r\n\r\n this._videoPlugin = new PhotoSwipeVideoPlugin(this._gallery, {\r\n // options\r\n });\r\n\r\n this._gallery.init();\r\n\r\n this._isOpen = true;\r\n\r\n document.dispatchEvent(Polyfill.createNewEvent('eventgallery-lightbox-opened'));\r\n\r\n };\r\n\r\n _registerUIElements() {\r\n this._gallery.on('uiRegister', () => {\r\n\r\n this._gallery.ui.registerElement({\r\n name: 'custom-caption',\r\n order: 9,\r\n isButton: false,\r\n appendTo: 'root',\r\n html: 'Caption text',\r\n onInit: (el, pswp) => {\r\n pswp.on('change', () => {\r\n const currSlideElement = this.getCurrentSlide();\r\n let captionHTML = '';\r\n if (currSlideElement) {\r\n captionHTML = currSlideElement.title;\r\n }\r\n\r\n el.innerHTML = captionHTML || '';\r\n if (captionHTML.length > 0 ) {\r\n el.style.display = 'block';\r\n } else {\r\n el.style.display = 'none';\r\n }\r\n\r\n });\r\n }\r\n });\r\n\r\n this._gallery.ui.registerElement({\r\n name: 'share-button',\r\n ariaLabel: this.translations.share,\r\n title: this.translations.share,\r\n order: 10,\r\n isButton: true,\r\n html: '',\r\n onInit: (el, pswp) => {\r\n pswp.on('change', (a,) => {\r\n if (this.getCurrentSlide().shareUrl) {\r\n el.style.display = 'block';\r\n } else {\r\n el.style.display = 'none';\r\n }\r\n });\r\n },\r\n onClick: (event, el, pswp) => {\r\n this.overlay = new Overlay();\r\n let url = this.getCurrentSlide().shareUrl\r\n this.overlay.openOverlay(url);\r\n return false;\r\n }\r\n });\r\n\r\n this._gallery.ui.registerElement({\r\n name: 'add2cart-button',\r\n ariaLabel: this.translations.buy,\r\n title: this.translations.buy,\r\n order: 11,\r\n isButton: true,\r\n html: '',\r\n onInit: (el, pswp) => {\r\n pswp.on('change', (a,) => {\r\n if (this.getCurrentSlide().add2cartUrl) {\r\n el.style.display = 'block';\r\n } else {\r\n el.style.display = 'none';\r\n }\r\n\r\n });\r\n },\r\n onClick: (event, el, pswp) => {\r\n this.overlay = new Overlay();\r\n\r\n this.overlay.onLoad = () => {\r\n document.dispatchEvent(Polyfill.createNewEvent(Events.prepareAdd2cartDialogContent, null));\r\n };\r\n\r\n let url = this.getCurrentSlide().add2cartUrl;\r\n this.overlay.openOverlay(url);\r\n\r\n return false;\r\n }\r\n\r\n });\r\n\r\n this._gallery.ui.registerElement({\r\n name: 'download-button',\r\n ariaLabel: this.translations.download,\r\n title: this.translations.download,\r\n order: 12,\r\n isButton: true,\r\n html: '',\r\n onInit: (el, pswp) => {\r\n pswp.on('change', (a,) => {\r\n if (this.getCurrentSlide().directDownloadButton) {\r\n el.style.display = 'block';\r\n } else {\r\n el.style.display = 'none';\r\n }\r\n\r\n });\r\n },\r\n onClick: (event, el) => {\r\n this.getCurrentSlide().directDownloadButton?.click();\r\n return false;\r\n }\r\n });\r\n\r\n new SlideShow(this._gallery);\r\n })\r\n\r\n\r\n }\r\n\r\n _registerClickEvents() {\r\n // loop through all gallery elements and bind events\r\n let galleries = this.getGalleries();\r\n\r\n for(let gallery of galleries.values()) {\r\n for (let i = 0, l = gallery.length; i < l; i++) {\r\n gallery[i].thumbEl.onclick = (e) => {this.onThumbnailsClick(e)};\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * searches the galleries for a thumbnail container and returns the\r\n * Slide object\r\n *\r\n * @param thumbEl\r\n * @returns PhotoSwipeGallerySlide\r\n */\r\n getSlideBy(thumbEl) {\r\n let galleries = this.getGalleries();\r\n\r\n for(let gallery of galleries.values()) {\r\n for (let i = 0, l = gallery.length; i < l; i++) {\r\n if (gallery[i].thumbEl === thumbEl) {\r\n return gallery[i];\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n\r\n /**\r\n *\r\n * @param slide PhotoSwipeGallerySlide\r\n * @returns {*|number}\r\n */\r\n getIndexOfSlide(slide) {\r\n let slides = this.getGalleries().get(slide.gid);\r\n return slides.map(function(e) { return e.hash(); }).indexOf(slide.hash());\r\n }\r\n\r\n /**\r\n * Parses all elements on the page so we know which triggers for a lightbox exist.\r\n * Returns a mal containing the gallery and all elements\r\n * @returns {Map<String, Array>}\r\n */\r\n getGalleries() {\r\n let galleries = new Map(),\r\n thumbnails = getThumbnailContainers();\r\n\r\n for(let i=0; i<thumbnails.length; i++) {\r\n let thumbEl = thumbnails[i];\r\n let gallery;\r\n\r\n let item = parseThumbnailElement(thumbEl);\r\n if (item !== null) {\r\n if (galleries.get(item.gid) === undefined) {\r\n galleries.set(item.gid, []);\r\n }\r\n gallery = galleries.get(item.gid);\r\n gallery.push(item);\r\n galleries.set(item.gid, gallery);\r\n }\r\n }\r\n\r\n return galleries;\r\n }\r\n\r\n /**\r\n * grabs the current slide from the lightbox\r\n * @returns PhotoSwipeGallerySlide\r\n */\r\n getCurrentSlide() {\r\n return this._gallery.currSlide.data;\r\n }\r\n\r\n /**\r\n * Returns the index if the current item in the lightbox\r\n *\r\n * @returns integer\r\n */\r\n getCurrentIndex() {\r\n return this._gallery.currIndex;\r\n }\r\n\r\n /**\r\n * reinitiate the lightbox. Register the click events for existing and new elements.\r\n */\r\n reload() {\r\n this._registerClickEvents();\r\n }\r\n\r\n /**\r\n * reports back if the lightbox is currently open\r\n * @returns {boolean}\r\n */\r\n isOpen() {\r\n return this._isOpen;\r\n }\r\n\r\n /**\r\n *\r\n * @param afterChangeFunction\r\n */\r\n setAfterChangeEventListener(afterChangeFunction) {\r\n this._gallery.on('change', afterChangeFunction);\r\n }\r\n\r\n /**\r\n * jump to a specific slide.\r\n * @param index\r\n */\r\n gotoSlide(index) {\r\n this._gallery.goTo(index);\r\n }\r\n\r\n}\r\n\r\n","\r\nexport default class PhotoSwipeGallerySlide {\r\n constructor() {\r\n this.width = 0;\r\n this.height = 0;\r\n this.src = '';\r\n this.alt = '';\r\n this.title = '';\r\n this.pid = '';\r\n this.gid = '';\r\n this.thumbEl = null;\r\n this.msrc= '';\r\n this.shareUrl = '';\r\n this.add2cartUrl = '';\r\n this.directDownloadButton = '';\r\n this.type = '';\r\n this.videoSrc = '';\r\n this.videoSources = null;\r\n }\r\n\r\n hash() {\r\n return this.gid + this.src;\r\n }\r\n}\r\n","/**\r\n * Finds all thumbnail containers on the page\r\n * @returns {NodeListOf<Element>}\r\n */\r\nimport {getParents} from \"../../../common/js/Helpers\";\r\nimport PhotoSwipeGallerySlide from \"./PhotoSwipeGallerySlide\";\r\n\r\n/**\r\n *\r\n * @returns {Element[]}\r\n */\r\nexport function getThumbnailContainers() {\r\n let thumbEl = document.querySelectorAll( 'a[data-eg-lightbox]' );\r\n\r\n // don't add images from the clone slides. They are not clickable but will add duplicates to the lightbox => #818\r\n return Array.from(thumbEl).filter((tc => {\r\n let parents = getParents(tc);\r\n let thumbElIsAllowed = true;\r\n parents.forEach(parent => {\r\n if (thumbElIsAllowed && parent.classList.contains('glide__slide--clone')) {\r\n thumbElIsAllowed = false;\r\n }\r\n });\r\n return thumbElIsAllowed;\r\n }))\r\n}\r\n\r\n/**\r\n *\r\n * @param el\r\n * @param fn\r\n * @returns {Element}\r\n */\r\nexport function closest(el, fn) {\r\n return el && ( fn(el) ? el : closest(el.parentNode, fn) );\r\n}\r\n\r\n/**\r\n *\r\n * @param thumbEl Node\r\n * @returns PhotoSwipeGallerySlide\r\n */\r\nexport function parseThumbnailElement(thumbEl) {\r\n let item,\r\n imgEl,\r\n height,\r\n width,\r\n pid,\r\n gid;\r\n\r\n // include only element nodes\r\n if(thumbEl.nodeType !== 1) {\r\n return null;\r\n }\r\n\r\n imgEl = thumbEl.getElementsByTagName('IMG')[0];\r\n\r\n if (imgEl === undefined) {\r\n return null;\r\n }\r\n\r\n height = thumbEl.getAttribute('data-height');\r\n width = thumbEl.getAttribute('data-width');\r\n pid = thumbEl.getAttribute('data-pid');\r\n gid = thumbEl.getAttribute('data-gid');\r\n\r\n if (height === null || width === null || pid === null) {\r\n return null;\r\n }\r\n\r\n // create slide object\r\n item = new PhotoSwipeGallerySlide();\r\n item.type = thumbEl.getAttribute('data-type')\r\n\r\n if (item.type === 'video' && thumbEl) {\r\n if (thumbEl.dataset.pswpVideoSources) {\r\n item.videoSources = JSON.parse(pswpVideoSources);\r\n } else if (thumbEl.dataset.pswpVideoSrc) {\r\n item.videoSrc = thumbEl.dataset.pswpVideoSrc;\r\n } else {\r\n item.videoSrc = thumbEl.href;\r\n }\r\n }\r\n\r\n item.src = thumbEl.getAttribute('href');\r\n item.width = parseInt(width, 10);\r\n item.height = parseInt(height, 10);\r\n\r\n // prevent null entry\r\n item.title = decodeURIComponent(thumbEl.getAttribute('data-bs-title') || thumbEl.getAttribute('data-title') || '');\r\n\r\n item.pid = parseInt(pid, 10);\r\n\r\n item.gid = gid;\r\n\r\n item.thumbEl = thumbEl; // save link to element for getThumbBoundsFn\r\n\r\n\r\n let shareButton = thumbEl.querySelector('.social-share-button');\r\n if (shareButton) {\r\n item.shareUrl = shareButton.getAttribute('data-href');\r\n }\r\n\r\n item.directDownloadButton = thumbEl.querySelector('.eg-download');\r\n\r\n let add2cartButton = thumbEl.querySelector('.eventgallery-add2cart');\r\n if (add2cartButton) {\r\n item.add2cartUrl = window.EventGalleryCartConfiguration?.add2cartdialogurl + '&' + add2cartButton.getAttribute('data-id');\r\n }\r\n\r\n return item;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n","/**\r\n * splits a hash value into its elements. returns an empty object if there is nothing in\r\n */\r\nexport function _parseHashString(hash) {\r\n let params = {};\r\n\r\n if(hash.length < 5) {\r\n return params;\r\n }\r\n\r\n let vars = hash.split('&');\r\n for (let i = 0; i < vars.length; i++) {\r\n if(!vars[i]) {\r\n continue;\r\n }\r\n let pair = vars[i].split('=');\r\n if(pair.length < 2) {\r\n continue;\r\n }\r\n params[pair[0]] = pair[1];\r\n }\r\n\r\n return params;\r\n}\r\n\r\nexport function parseHash() {\r\n return _parseHashString(window.location.hash.substring(1));\r\n}\r\n\r\n\r\n","import CamelCaseConverter from \"../utils/camelCaseConverter\";\r\n\r\nconst prefix = \"data-slider-\";\r\n\r\nexport default class SliderOptions {\r\n\r\n constructor(element) {\r\n this.element = element;\r\n this.options = Object.assign({\r\n autoplay: false,\r\n slidesElementsSelector: '',\r\n numberOfRowsPerSlide: 1,\r\n showNav: 'true',\r\n }, SliderOptions._parseOptions(element));\r\n }\r\n\r\n\r\n /**\r\n *\r\n * @param element HTMLElement\r\n * @private\r\n */\r\n static _parseOptions(element) {\r\n let options = {};\r\n\r\n let attributes = element.attributes;\r\n for (let i =0; i< attributes.length; i++) {\r\n if (attributes[i].name.indexOf(prefix) === 0) {\r\n options[CamelCaseConverter.toCamelCase(attributes[i].name.replace(prefix,''))] = attributes[i].value;\r\n }\r\n }\r\n\r\n return options;\r\n }\r\n\r\n getAutoPlay() {\r\n\r\n if (this.options.autoplay === false) {\r\n return false;\r\n }\r\n return parseInt(this.options.autoplay);\r\n }\r\n\r\n getSlidesElementsSelector() {\r\n return this.options.slidesElementsSelector;\r\n }\r\n\r\n doShowNav() {\r\n return this.options.showNav === 'true';\r\n }\r\n\r\n getNumberOfRowsPerSlide() {\r\n return parseInt(this.options.numberOfRowsPerSlide);\r\n }\r\n}\r\n","import Anchor from \"../glide_modules/anchor\"\r\nimport Glide, { Controls, Breakpoints, Swipe, Autoplay, Images } from '@glidejs/glide/dist/glide.modular.esm'\r\nimport SliderTransformator from \"./SliderTransformator\";\r\nimport SliderOptions from \"./SliderOptions\";\r\nimport ElementSize from \"../utils/ElementSize\";\r\nimport EventgalleryLazyload from \"../EventgalleryLazyload\";\r\n\r\nexport default class SliderStarter {\r\n\r\n constructor(sourceGroupElement) {\r\n this.sourceGroupElement = sourceGroupElement;\r\n this.sliderTransformator = null;\r\n }\r\n\r\n start() {\r\n\r\n this.sliderOptions = SliderStarter._loadOptions(this.sourceGroupElement);\r\n\r\n let sourceElementSelector = this.sliderOptions.getSlidesElementsSelector();\r\n let autoplay = this.sliderOptions.getAutoPlay();\r\n let doShowNav = this.sliderOptions.doShowNav();\r\n let numberOfItemsPerSlide = ElementSize.calclateNumberOfFittingItemsPerSlide(this.sourceGroupElement, this.sourceGroupElement.querySelector(sourceElementSelector), this.sliderOptions.getNumberOfRowsPerSlide());\r\n\r\n if (null == this.sliderTransformator) {\r\n this.sliderTransformator = new SliderTransformator(this.sourceGroupElement, sourceElementSelector, doShowNav);\r\n }\r\n let rootElement = this.sliderTransformator.transform(numberOfItemsPerSlide);\r\n\r\n if (rootElement === null) {\r\n return;\r\n }\r\n\r\n EventgalleryLazyload.watchImages();\r\n\r\n let glide = new Glide(rootElement, {\r\n type: 'carousel',\r\n perView: 1,\r\n gap: 15,\r\n keyboard: false,\r\n autoplay: autoplay\r\n });\r\n\r\n glide.mount({ Swipe, Controls, Breakpoints, Autoplay, Anchor, Images });\r\n\r\n }\r\n\r\n static _loadOptions(element) {\r\n return new SliderOptions(element);\r\n }\r\n\r\n\r\n}\r\n","import Polyfill from \"../Polyfill\";\r\n\r\nconst sliderRootSelector = '.glide';\r\nconst sliderGroupSelector = '.glide__slides';\r\nconst basicMarkup = `\r\n<div class=\"glide\">\r\n <div class=\"glide__track\" data-glide-el=\"track\">\r\n <ul class=\"glide__slides\"> \r\n </ul>\r\n </div>\r\n <div class=\"glide__arrows\" data-glide-el=\"controls\">\r\n <button class=\"glide__arrow glide__arrow--left\" data-glide-dir=\"<\">prev</button>\r\n <button class=\"glide__arrow glide__arrow--right\" data-glide-dir=\">\">next</button>\r\n </div>\r\n</div>`;\r\n\r\nexport default class SliderTransformator {\r\n\r\n constructor(sourceGroupElement, sourceElementSelector, doShowNav) {\r\n this.elementSelector = sourceElementSelector;\r\n this.sourceGroupElement = sourceGroupElement;\r\n this.doShowNav = doShowNav;\r\n this.sourceElements = this.getSourceElements();\r\n }\r\n\r\n getSourceElements() {\r\n if (this.sourceGroupElement === null) {\r\n return null;\r\n }\r\n return this.sourceGroupElement.querySelectorAll(this.elementSelector);\r\n }\r\n\r\n transform(numberOfItemsPerSlide) {\r\n if (this.sourceGroupElement === null || this.sourceElements === null) {\r\n return null;\r\n }\r\n\r\n if (this.sourceElements.length === 0) {\r\n return null;\r\n }\r\n // cleanup\r\n let sliderRoot = this.sourceGroupElement.querySelector(sliderRootSelector);\r\n\r\n if (sliderRoot !== null) {\r\n sliderRoot.remove();\r\n }\r\n // transformation\r\n\r\n let sliderMarkup = document.createRange().createContextualFragment(basicMarkup);\r\n if (!this.doShowNav) {\r\n\r\n let controlElement = sliderMarkup.querySelector('.glide__arrows');\r\n\r\n Polyfill.removeHtmlElementNode(controlElement);\r\n }\r\n let sliderGroupElement = sliderMarkup.querySelector(sliderGroupSelector);\r\n let currentSliderElement = null;\r\n\r\n for(let index=0; index<this.sourceElements.length; index++) {\r\n let element = this.sourceElements[index];\r\n if (index % numberOfItemsPerSlide === 0) {\r\n currentSliderElement = document.createElement('li');\r\n currentSliderElement.className = 'glide__slide';\r\n sliderGroupElement.appendChild(currentSliderElement);\r\n }\r\n currentSliderElement.appendChild(element);\r\n }\r\n\r\n this.sourceGroupElement.appendChild(sliderMarkup);\r\n\r\n return this.sourceGroupElement.querySelector(sliderRootSelector);\r\n\r\n }\r\n\r\n}\r\n","export default class ElementSize {\r\n /**\r\n *\r\n * @param element\r\n * @returns float\r\n */\r\n static getOuterWidth(element) {\r\n var domRect = element.getBoundingClientRect();\r\n let computedStyle = getComputedStyle(element);\r\n let marginLeft = parseFloat(computedStyle.marginLeft);\r\n let marginRight = parseFloat(computedStyle.marginRight);\r\n return domRect.width + marginLeft + marginRight;\r\n }\r\n\r\n /**\r\n * Tries to find out, how many elements we can fit into the container so\r\n * they do not wrap.\r\n *\r\n * @param containerElement\r\n * @param element\r\n * @param numberOfRows\r\n * @returns {number}\r\n */\r\n static calclateNumberOfFittingItemsPerSlide(containerElement, element, numberOfRows) {\r\n\r\n if (null == element || containerElement == null) {\r\n return 1;\r\n }\r\n\r\n var domRect = containerElement.getBoundingClientRect();\r\n let numberOfItemsPerSlide = Math.floor(domRect.width / ElementSize.getOuterWidth(element)) * numberOfRows;\r\n\r\n\r\n if (numberOfItemsPerSlide < 1) {\r\n numberOfItemsPerSlide = 1 * numberOfRows;\r\n }\r\n\r\n return numberOfItemsPerSlide;\r\n }\r\n}\r\n","export default class CamelCaseConverter {\r\n\r\n static toCamelCase(str) {\r\n return str.replace(/-([a-z])/g, function (m, w) {\r\n return w.toUpperCase();\r\n });\r\n }\r\n}\r\n","import {isString, isArray, isNodeList} from \"./units\";\r\n\r\nexport default class EventsHandler {\r\n /**\r\n * Construct a EventsHandler instance.\r\n */\r\n constructor (listeners = {}) {\r\n this.listeners = listeners;\r\n }\r\n\r\n /**\r\n * Adds events listeners to arrows HTML elements.\r\n *\r\n * @param {String|Array} events\r\n * @param {NodeList|Element|Window|Document} el\r\n * @param {Function} closure\r\n * @param {boolean} capture\r\n */\r\n on (events, el, closure, capture = false, passive = false) {\r\n if (isString(events)) {\r\n events = [events]\r\n }\r\n\r\n if (!isNodeList(el) && !isArray(el)) {\r\n el = [el];\r\n }\r\n\r\n events.forEach((event)=> {\r\n this.listeners[event] = {'closure': closure, 'options': {'capture': capture, 'passive': passive}};\r\n\r\n for (let i=0; i<el.length;i++) {\r\n el[i].addEventListener(event, this.listeners[event].closure, this.listeners[event].options)\r\n }\r\n\r\n });\r\n }\r\n\r\n /**\r\n * Removes event listeners from arrows HTML elements.\r\n *\r\n * @param {String|Array} events\r\n * @param {NodeList|Element|Window|Document} el\r\n */\r\n off (events, el) {\r\n if (isString(events)) {\r\n events = [events]\r\n }\r\n\r\n if (!isNodeList(el) && !isArray(el)) {\r\n el = [el];\r\n }\r\n\r\n events.forEach((event) => {\r\n for (let i=0; i<el.length;i++) {\r\n let listener = this.listeners[event];\r\n if (listener === undefined) {\r\n continue;\r\n }\r\n el[i].removeEventListener(event, listener.closure, listener.options)\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Destroy collected listeners.\r\n *\r\n */\r\n destroy () {\r\n delete this.listeners\r\n }\r\n}\r\n","export default class Polyfill {\r\n static removeHtmlElementNode(element:any) {\r\n if (element.parentNode !== null)\r\n element.parentNode.removeChild(element);\r\n }\r\n\r\n static createNewEvent(eventName:string, data:any) {\r\n let event = null;\r\n\r\n if(typeof(CustomEvent) === 'function') {\r\n event = new CustomEvent(eventName, {detail: data});\r\n }else{\r\n event = document.createEvent('Event');\r\n event.initEvent(eventName, true, true);\r\n // @ts-ignore\r\n event.detail = data;\r\n }\r\n return event;\r\n }\r\n}\r\n","import {Add2CartDialogContent} from \"./Add2CartDialogContent\";\r\nimport Overlay from \"../Overlay\";\r\nimport {CartProcessor} from \"./CartProcessor\";\r\nimport EventsHandler from \"../utils/eventshandler\";\r\nimport {Events} from \"./CartEvents\";\r\n\r\n/**\r\n * takes care about the add2cart buttons on the images:\r\n * - update the click events\r\n */\r\n\r\nexport class Add2CartButtonHandler {\r\n cartProcessor: CartProcessor;\r\n eventHandler:EventsHandler = new EventsHandler();\r\n add2cartdialogurl: string;\r\n\r\n constructor(cartProcessor: CartProcessor, add2cartdialogurl: string) {\r\n this.cartProcessor = cartProcessor;\r\n this.add2cartdialogurl = add2cartdialogurl;\r\n this.initializeCartButtons();\r\n document.addEventListener(Events.rebindAdd2CartButtons, () => {this.initializeCartButtons()})\r\n }\r\n\r\n initializeCartButtons() {\r\n let add2cartButtons = document.getElementsByClassName('eventgallery-openAdd2cart');\r\n Array.prototype.forEach.call(add2cartButtons, (btn: HTMLBaseElement)=> {\r\n this.eventHandler.off('click', btn);\r\n this.eventHandler.on('click', btn, (e:Event) => {this.openAdd2CartDialog(e)});\r\n });\r\n }\r\n\r\n openAdd2CartDialog(e: Event) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n let link: HTMLElement = e.target as HTMLElement;\r\n\r\n if (!link.getAttribute('data-id')) {\r\n link = link.parentElement;\r\n }\r\n\r\n let overlay = new Overlay();\r\n overlay.onLoad = () => {\r\n new Add2CartDialogContent(this.cartProcessor);\r\n };\r\n\r\n overlay.openOverlay(this.add2cartdialogurl + '&' + link.getAttribute('data-id'));\r\n\r\n return false;\r\n };\r\n}\r\n","import {CartProcessor} from \"./CartProcessor\";\r\n\r\n/**\r\n * Helps to bring the content of the add2cart dialog to life. e.g. makes the plus/minus-buttons work.\r\n */\r\nexport class Add2CartDialogContent {\r\n static CART_BUTTON_QUERY_SELECTOR = '.eventgallery-opencart'\r\n cartProcessor: CartProcessor;\r\n inputFields: HTMLInputElement[] = []\r\n plusButtons: Element[] = []\r\n minusButtons: Element[] = []\r\n cartButton : Element\r\n\r\n constructor(cartProcessor: CartProcessor) {\r\n this.cartProcessor = cartProcessor;\r\n this.initialize();\r\n }\r\n\r\n initialize() {\r\n\r\n this.cartButton = document.querySelector(Add2CartDialogContent.CART_BUTTON_QUERY_SELECTOR)\r\n\r\n\r\n let q = document.getElementsByClassName('eventgallery-cartquantity');\r\n for(let i=0; i<q.length; i++) {\r\n q[i].addEventListener('change', (e)=>this.updateQuantity(e));\r\n this.inputFields.push(<HTMLInputElement>q[i])\r\n }\r\n\r\n let p = document.getElementsByClassName('eventgallery-qtyplus');\r\n for(let i=0; i<p.length; i++) {\r\n p[i].addEventListener('click', (e) => this.quantityPlus(e), {capture: true});\r\n this.plusButtons.push(p[i])\r\n }\r\n\r\n let m = document.getElementsByClassName('eventgallery-qtyminus');\r\n for(let i=0; i<m.length; i++) {\r\n m[i].addEventListener('click', (e) => this.quantityMinus(e), {capture: true});\r\n this.minusButtons.push(m[i])\r\n }\r\n\r\n if (document.querySelector('#eg-single-image-type-action-needed')) {\r\n this.cartProcessor.loadCart();\r\n }\r\n\r\n this.updateToCartButton()\r\n }\r\n\r\n updateToCartButton() {\r\n let sum = 0\r\n this.inputFields.forEach((field) => {\r\n sum += parseInt(field.value);\r\n })\r\n\r\n if (sum > 0 || this.inputFields.length === 0) {\r\n this.cartButton.disabled = false\r\n } else {\r\n this.cartButton.disabled = true\r\n }\r\n }\r\n\r\n updateQuantity(e:Event) {\r\n e.preventDefault();\r\n\r\n let inputFild: HTMLInputElement = e.target as HTMLInputElement;\r\n let quantity: number = parseInt(inputFild.value);\r\n if (isNaN(quantity)) {\r\n quantity = 1;\r\n }\r\n let reference = inputFild.getAttribute('data-id');\r\n\r\n this.cartProcessor.add(reference, quantity);\r\n this.updateToCartButton()\r\n };\r\n\r\n quantityPlus(e:Event) {\r\n e.preventDefault();\r\n\r\n let target = e.target as HTMLElement;\r\n let fieldName: string = target.getAttribute('field');\r\n let inputField: HTMLInputElement = document.getElementsByName(fieldName)[0] as HTMLInputElement;\r\n let currentVal: number = parseInt(inputField.value);\r\n\r\n if (!isNaN(currentVal)) {\r\n let maxOrderQuantity:number = parseInt(inputField.getAttribute('data-maxorderquantity'));\r\n if (maxOrderQuantity === 0 || currentVal<maxOrderQuantity) {\r\n inputField.value = String(currentVal + 1);\r\n }\r\n let changeEvent = new Event('change');\r\n inputField.dispatchEvent(changeEvent);\r\n } else {\r\n inputField.value = \"0\";\r\n }\r\n this.updateToCartButton()\r\n };\r\n\r\n quantityMinus(e:Event) {\r\n e.preventDefault();\r\n\r\n let target = e.target as HTMLElement;\r\n let fieldName: string = target.getAttribute('field');\r\n let inputField: HTMLInputElement = document.getElementsByName(fieldName)[0] as HTMLInputElement;\r\n let currentVal: number = parseInt(inputField.value);\r\n\r\n if (!isNaN(currentVal) && currentVal > 0) {\r\n inputField.value = String(currentVal - 1);\r\n let changeEvent = new Event('change');\r\n inputField.dispatchEvent(changeEvent);\r\n } else {\r\n inputField.value = \"0\";\r\n }\r\n this.updateToCartButton()\r\n };\r\n}","import EventsHandler from \"../utils/eventshandler\";\r\nimport {Events} from \"./CartEvents\";\r\nimport {getParent} from \"../../../common/js/Helpers\";\r\n\r\n/**\r\n * takes care about the external cart connector buttons on the images:\r\n * - update the click events\r\n */\r\n\r\nexport class CartConnectorButtonHandler {\r\n eventHandler:EventsHandler = new EventsHandler();\r\n\r\n\r\n constructor() {\r\n this.initializeCartConnectorButtons();\r\n document.addEventListener(Events.rebindAdd2CartButtons, () => {this.initializeCartConnectorButtons()})\r\n }\r\n\r\n initializeCartConnectorButtons() {\r\n let cartConnectorButtons = document.getElementsByClassName('eventgallery-cart-connector');\r\n Array.prototype.forEach.call(cartConnectorButtons, (btn: HTMLBaseElement)=> {\r\n this.eventHandler.off('click', btn);\r\n this.eventHandler.on('click', btn, (e:Event) => {this.openLink(e)});\r\n });\r\n }\r\n\r\n openLink(e: Event) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n let link: HTMLElement = e.target as HTMLElement;\r\n\r\n if (!link.getAttribute('data-href')) {\r\n link = getParent(link, 'SPAN');\r\n }\r\n\r\n window.location.href = link.getAttribute('data-href');\r\n };\r\n}\r\n","export enum Events {\r\n reload = 'eventgallery-minicart-reload',\r\n prepareAdd2cartDialogContent = 'eventgallery-prepare-add2cartdialogcontent',\r\n rebindAdd2CartButtons = 'eventgallery-rebind-add2cart-buttons'\r\n}","import Polyfill from \"../Polyfill\";\r\nimport {Add2CartButtonHandler} from \"./Add2CartButtonHandler\";\r\nimport {Events} from \"./CartEvents\";\r\nimport {CartConnectorButtonHandler} from \"./CartConnectorButtonHandler\";\r\n\r\nclass CartUrls {\r\n removeUrl:string = \"\";\r\n add2cartUrl:string = \"\";\r\n getCartUrl:string = \"\";\r\n add2cartdialogurl:string = \"\";\r\n}\r\n\r\nexport class CartProcessor {\r\n\r\n urls: CartUrls;\r\n add2CartButtonHandler: Add2CartButtonHandler;\r\n cartConnectorButtonHandler: CartConnectorButtonHandler;\r\n\r\n constructor() {\r\n // @ts-ignore\r\n this.urls = window.EventGalleryCartConfiguration as CartUrls || CartUrls;\r\n this.add2CartButtonHandler = new Add2CartButtonHandler(this, this.urls?.add2cartdialogurl);\r\n this.cartConnectorButtonHandler = new CartConnectorButtonHandler();\r\n }\r\n\r\n add(reference: string, quantity:number) {\r\n fetch(this.urls.add2cartUrl + '&' + reference + '&quantity=' + quantity)\r\n .then(response => response.json())\r\n .then(data => this.dispatchCartData(data));\r\n }\r\n\r\n remove(reference: string) {\r\n fetch(this.urls.removeUrl + '&' + reference)\r\n .then(response => response.json())\r\n .then(data => this.dispatchCartData(data));\r\n }\r\n\r\n loadCart() {\r\n fetch(this.urls.getCartUrl)\r\n .then(response => response.json())\r\n .then(data => this.dispatchCartData(data));\r\n }\r\n\r\n dispatchCartData(data: any) {\r\n document.dispatchEvent(Polyfill.createNewEvent(Events.reload, {cart: data}));\r\n }\r\n}\r\n","import {getOuterHeight, mergeObjects} from \"../../../common/js/Helpers\";\r\nimport Polyfill from \"../Polyfill\";\r\nimport {CartProcessor} from \"./CartProcessor\";\r\nimport {Events} from \"./CartEvents\";\r\n\r\nenum MiniCartMode {\r\n short,\r\n long\r\n}\r\n\r\nclass MiniCartOptions {\r\n buttonShowType:string = 'inline';\r\n emptyCartSelector:string = '.eventgallery-empty-minicart';\r\n cartSelector:string = '.eventgallery-minicart';\r\n cartItemContainerSelector:string = '.cart-items-container';\r\n cartItemsSelector:string = '.cart-items';\r\n cartItemSelector:string = '.cart-items .cart-item';\r\n cartCountSelector:string = '.itemscount';\r\n buttonDownSelector:string = '.toggle-down';\r\n buttonUpSelector:string = '.toggle-up';\r\n cartItemsMinHeight:number = null;\r\n removeLinkTitle:string = \"Remove\";\r\n}\r\n\r\nexport class MiniCart {\r\n containerElement: HTMLElement;\r\n cartElement: HTMLElement;\r\n cartItemsElement: HTMLElement;\r\n emptyCartElement: HTMLElement;\r\n buttonToShort: HTMLElement;\r\n buttonToLong: HTMLElement;\r\n options: MiniCartOptions;\r\n lineItems: any;\r\n cartProcessor: CartProcessor;\r\n minicartMode: MiniCartMode = MiniCartMode.short;\r\n\r\n constructor(cartProcessor: CartProcessor, containerElement: HTMLElement, options:MiniCartOptions) {\r\n this.containerElement = containerElement;\r\n this.cartProcessor = cartProcessor;\r\n this.lineItems = [];\r\n\r\n this.options = mergeObjects(new MiniCartOptions(), options);\r\n // @ts-ignore\r\n let globalConfigStore = window.EventGalleryCartConfiguration;\r\n this.options = mergeObjects(this.options, globalConfigStore);\r\n\r\n this.initUI();\r\n\r\n document.addEventListener(Events.reload, (e: CustomEvent)=>this.updateCartData(e.detail));\r\n document.addEventListener(Events.rebindAdd2CartButtons, () => {this.updateAdd2CartIcons()})\r\n }\r\n\r\n initUI() {\r\n this.cartElement = this.containerElement?.querySelector(this.options.cartSelector);\r\n this.cartItemsElement = this.cartElement?.querySelector(this.options.cartItemsSelector);\r\n this.emptyCartElement = this.containerElement?.querySelector(this.options.emptyCartSelector);\r\n this.buttonToShort = this.cartElement?.querySelector(this.options.buttonUpSelector);\r\n this.buttonToLong = this.cartElement?.querySelector(this.options.buttonDownSelector);\r\n\r\n this.buttonToLong.addEventListener('click', () => {this.resizeCartArea(MiniCartMode.long)});\r\n this.buttonToShort.addEventListener('click', () => {this.resizeCartArea(MiniCartMode.short)});\r\n }\r\n\r\n _generateId(lineItem: any) {\r\n return 'folder=' + encodeURIComponent(lineItem.folder) + '&file=' + encodeURIComponent(lineItem.file);\r\n }\r\n\r\n updateAdd2CartIcons() {\r\n\r\n let elements = document.querySelectorAll('.eventgallery-add2cart i.egfa');\r\n for(let i=0; i<elements.length; i++) {\r\n elements[i].classList.remove('egfa-shopping-cart');\r\n elements[i].classList.add('egfa-cart-plus');\r\n }\r\n\r\n // mark the add2cart link to show the item is already in the cart\r\n for (let i = 0; i<this.lineItems.length; i++) {\r\n let id = this._generateId(this.lineItems[i])\r\n\r\n let elements = document.querySelectorAll(`.eventgallery-add2cart[data-id*='${id}'] i.egfa`);\r\n for (let i = 0; i < elements.length; i++) {\r\n elements[i].classList.add('egfa-shopping-cart');\r\n elements[i].classList.remove('egfa-cart-plus');\r\n }\r\n }\r\n }\r\n\r\n resizeCartArea(miniCartMode: MiniCartMode) {\r\n this.minicartMode = miniCartMode;\r\n\r\n let amountOfLines:number = 1;\r\n let lineHeight = -1;\r\n\r\n let lastY:number = -1;\r\n let cartElements = this.cartItemsElement.querySelectorAll(this.options.cartItemSelector);\r\n for(let i = 0; i<cartElements.length; i++) {\r\n let cartElement: HTMLElement = cartElements[i] as HTMLElement;\r\n if (lineHeight<0) {\r\n lineHeight = getOuterHeight(cartElement);\r\n }\r\n if (lastY>-1 && lastY != cartElement.offsetTop) {\r\n amountOfLines++\r\n }\r\n lastY = cartElement.offsetTop;\r\n }\r\n\r\n let visibleAmountOfLines = 1;\r\n\r\n if (amountOfLines === 1) {\r\n this.buttonToShort.style.display = 'none';\r\n this.buttonToLong.style.display = 'none';\r\n } else {\r\n if (this.minicartMode == MiniCartMode.short) {\r\n this.buttonToShort.style.display = 'none';\r\n this.buttonToLong.style.display = 'inline';\r\n } else {\r\n this.buttonToShort.style.display = 'inline';\r\n this.buttonToLong.style.display = 'none';\r\n visibleAmountOfLines = amountOfLines;\r\n }\r\n }\r\n\r\n this.cartItemsElement.style.height = (visibleAmountOfLines*lineHeight) + 'px';\r\n }\r\n\r\n updateCartData(data:any) {\r\n\r\n this.lineItems = data.cart;\r\n\r\n if (this.lineItems.length>0) {\r\n this.cartElement.style.display = 'block';\r\n if (this.emptyCartElement) this.emptyCartElement.style.display = 'none';\r\n } else {\r\n this.cartElement.style.display = 'none';\r\n if (this.emptyCartElement) this.emptyCartElement.style.display = 'block';\r\n }\r\n\r\n let cartItemsHTML = '';\r\n for (let i = this.lineItems.length - 1; i >= 0; i--) {\r\n cartItemsHTML = cartItemsHTML +\r\n `<div>\r\n <div class=\"cart-item\">\r\n <span class=\"badge badge-pill badge-info\">${this.lineItems[i].count}</span>\r\n ${this.lineItems[i].imagetag}\r\n <a href=\"#\" title=\"${this.options.removeLinkTitle}\" \r\n class=\"button-removeFromCart eventgallery-removeFromCart\" \r\n data-id=\"lineitemid=${this.lineItems[i].lineitemid}\">\r\n <i class=\"egfa egfa-2x egfa-remove\"></i>\r\n </a>\r\n </div>\r\n </div>`;\r\n }\r\n\r\n this.cartItemsElement.innerHTML = cartItemsHTML;\r\n\r\n let newLineItemElements = this.cartItemsElement.querySelectorAll('.eventgallery-removeFromCart');\r\n for(let i = 0; i<newLineItemElements.length; i++) {\r\n newLineItemElements[i].addEventListener('click', (e: Event) => this.remove(e));\r\n }\r\n\r\n this.updateAdd2CartIcons();\r\n this.resizeCartArea(this.minicartMode);\r\n\r\n this.cartElement.querySelector('.itemscount').innerHTML = this.lineItems.length;\r\n\r\n // force the lightbox to rescan the page so we can open cart items in a lightbox.\r\n // @ts-ignore\r\n if (Eventgallery !== undefined && Eventgallery.lightbox !== undefined) {\r\n // @ts-ignore\r\n Eventgallery.lightbox.reload();\r\n }\r\n // tigger the loading of Google Photos images for example.\r\n document.dispatchEvent(Polyfill.createNewEvent('eventgallery-images-added', {isOverlay: true}));\r\n }\r\n\r\n remove(e:Event) {\r\n e.preventDefault();\r\n\r\n let button: HTMLElement = e.target as HTMLElement;\r\n let reference:string;\r\n if (button.getAttribute('data-id')) {\r\n reference = button.getAttribute('data-id');\r\n } else {\r\n reference = button.parentElement.getAttribute('data-id');\r\n }\r\n\r\n\r\n this.cartProcessor.remove(reference);\r\n }\r\n}\r\n","import {MiniCart} from \"./MiniCart\";\r\nimport {Add2CartDialogContent} from \"./Add2CartDialogContent\";\r\nimport {CartProcessor} from \"./CartProcessor\";\r\nimport {Events} from \"./CartEvents\";\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n try {\r\n let cartProcessor = new CartProcessor();\r\n\r\n document.addEventListener(Events.prepareAdd2cartDialogContent, () => {\r\n new Add2CartDialogContent(cartProcessor)\r\n });\r\n\r\n let carts = document.getElementsByClassName('eventgallery-minicart-container');\r\n if (carts.length == 0) return\r\n\r\n for (let i = 0; i < carts.length; i++) {\r\n new MiniCart(cartProcessor, carts[i] as HTMLElement, null);\r\n }\r\n\r\n cartProcessor.loadCart();\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n\r\n})\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n let container = document.querySelector('.orderimages-container');\r\n if (!container) {\r\n return;\r\n }\r\n let doUseStickyImagetypeSelection = container.getAttribute(\"data-sticky-image-type-selection\") === \"true\";\r\n\r\n let orderimagesHideButton: HTMLElement = container.querySelector('.orderimages-hide'),\r\n orderimagesShowButton: HTMLElement = container.querySelector('.orderimages-show'),\r\n orderimagesHelp: HTMLElement = container.querySelector('.orderimages-help');\r\n\r\n function closeImageTypeSelection(e:Event) {\r\n if (e) {\r\n e.preventDefault();\r\n }\r\n orderimagesHideButton.style.display= 'none';\r\n orderimagesHelp.style.display= 'none';\r\n orderimagesShowButton.style.display= 'block';\r\n makeCartButtonsVisible(false);\r\n }\r\n\r\n function openImageTypeSelection(e:Event) {\r\n if (e) {\r\n e.preventDefault();\r\n }\r\n orderimagesHideButton.style.display= 'block';\r\n orderimagesHelp.style.display= 'block';\r\n orderimagesShowButton.style.display= 'none';\r\n\r\n makeCartButtonsVisible(true);\r\n }\r\n\r\n function makeCartButtonsVisible(doShow:boolean) {\r\n let cartButtons = document.querySelectorAll<HTMLElement>('.eventgallery-add2cart');\r\n for(let i=0; i<cartButtons.length; i++) {\r\n cartButtons[i].style.display = doShow ? 'inline-block':'none';\r\n }\r\n }\r\n\r\n\r\n orderimagesShowButton.addEventListener('click', openImageTypeSelection);\r\n orderimagesHideButton.addEventListener('click', closeImageTypeSelection);\r\n\r\n if (doUseStickyImagetypeSelection) {\r\n orderimagesShowButton.style.display= 'none';\r\n orderimagesHideButton.style.display= 'none';\r\n makeCartButtonsVisible(true);\r\n }\r\n else\r\n {\r\n closeImageTypeSelection(null);\r\n }\r\n\r\n});\r\n","import {ClickableButton, DownloadButton} from \"./socialbutton\";\r\nimport Overlay from \"../Overlay\";\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n\r\n let elements = document.querySelectorAll('.social-share-button-open');\r\n for (let i=0; i<elements.length;i++) {\r\n let href = elements[i].getAttribute('data-href');\r\n elements[i].addEventListener(\"click\", (e) => {\r\n e.preventDefault();\r\n let overlay = new Overlay();\r\n overlay.openOverlay(href);\r\n }, true);\r\n }\r\n\r\n elements = document.querySelectorAll('.eg-download');\r\n for (let i=0; i<elements.length;i++) {\r\n let element = elements[i];\r\n let href = element.getAttribute('data-href');\r\n let download = element.getAttribute('data-download');\r\n\r\n if (download != null) {\r\n element.addEventListener(\"click\", (e) => {\r\n DownloadButton.download(e, href, download);\r\n }, true);\r\n } else {\r\n element.addEventListener(\"click\", (e) => {\r\n ClickableButton.click(e, href);\r\n }, true);\r\n }\r\n }\r\n\r\n});\r\n","import {getParent, insertAndExecute} from \"../../../common/js/Helpers\";\r\n\r\nexport class DownloadButton {\r\n static download(e:Event, href:string, download:string) {\r\n e.preventDefault();\r\n let a = document.createElement('a');\r\n a.href = href;\r\n a.setAttribute(\"target\", \"_blank\");\r\n a.download = download;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a)\r\n }\r\n}\r\n\r\nexport class ClickableButton {\r\n static click(e:Event, href:string) {\r\n e.preventDefault();\r\n document.location.href = href;\r\n }\r\n}\r\n","import EventsHandler from \"../utils/eventshandler\";\r\nlet eventsHandler = new EventsHandler();\r\n\r\nexport function addTouch(element:HTMLElement, leftAction:Function, rightAction:Function, tabAction:Function, bottomAction:Function) {\r\n\r\n let hDistance:number;\r\n let vDistance:number;\r\n\r\n\r\n let vSwipe = false;\r\n let hSwipe = false;\r\n let hSwipMinDistance = 50;\r\n let vSwipMinDistance = 50;\r\n let swipMinDistanceForClick = 5;\r\n let startCoords: Touch;\r\n let endCoords: Touch;\r\n\r\n eventsHandler.off('touchstart', element);\r\n eventsHandler.off( 'touchend', element);\r\n\r\n eventsHandler.on('touchstart', element, (event:TouchEvent)=>{\r\n startCoords = event.targetTouches[0];\r\n }, false, true);\r\n\r\n\r\n eventsHandler.on('touchend', element, (event:TouchEvent)=>{\r\n\r\n endCoords = event.changedTouches[0];\r\n if (!endCoords) {\r\n return false;\r\n }\r\n\r\n vDistance = endCoords.pageY - startCoords.pageY;\r\n hDistance = endCoords.pageX - startCoords.pageX;\r\n\r\n\r\n vDistance = endCoords.pageY - startCoords.pageY;\r\n if ( Math.abs( vDistance ) >= vSwipMinDistance ) {\r\n vSwipe = true;\r\n }\r\n\r\n hDistance = endCoords.pageX - startCoords.pageX;\r\n\r\n if ( ! vSwipe && Math.abs( hDistance ) >= hSwipMinDistance ) {\r\n hSwipe = true;\r\n }\r\n\r\n // Swipe to bottom to close\r\n if ( vSwipe ) {\r\n vSwipe = false;\r\n if ( Math.abs( vDistance ) >= 2 * vSwipMinDistance ) {\r\n bottomAction && bottomAction();\r\n }\r\n\r\n } else if ( hSwipe ) {\r\n\r\n hSwipe = false;\r\n\r\n // swipeLeft\r\n if( hDistance >= hSwipMinDistance) {\r\n leftAction && leftAction();\r\n // swipeRight\r\n } else if ( hDistance <= -hSwipMinDistance) {\r\n rightAction && rightAction();\r\n }\r\n\r\n } else if (Math.abs(vDistance)<swipMinDistanceForClick && Math.abs(hDistance)<swipMinDistanceForClick) {\r\n if (undefined !== tabAction)\r\n {\r\n tabAction();\r\n } else {\r\n let target:HTMLElement = event.target as HTMLElement;\r\n target.click();\r\n }\r\n }\r\n return true;\r\n\r\n }, false, true);\r\n\r\n\r\n\r\n}\r\n\r\n\r\n","\r\n/**\r\n * Indicates whether the specified value is a string.\r\n *\r\n * @param {*} value\r\n * @return {Boolean}\r\n */\r\nexport function isString (value: any) {\r\n return typeof value === 'string'\r\n}\r\n\r\nexport function isArray(value: any) {\r\n return Array.isArray(value);\r\n}\r\n\r\nexport function isNodeList(value: any) {\r\n return NodeList.prototype.isPrototypeOf(value);\r\n}\r\n","/*!\n * Glide.js v3.6.2\n * (c) 2013-2024 Jędrzej Chałubek (https://github.com/jedrzejchalubek/)\n * Released under the MIT License.\n */\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n\n return _assertThisInitialized(self);\n}\n\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n}\n\nfunction _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = _getPrototypeOf(object);\n if (object === null) break;\n }\n\n return object;\n}\n\nfunction _get() {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get;\n } else {\n _get = function _get(target, property, receiver) {\n var base = _superPropBase(target, property);\n\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n\n if (desc.get) {\n return desc.get.call(arguments.length < 3 ? target : receiver);\n }\n\n return desc.value;\n };\n }\n\n return _get.apply(this, arguments);\n}\n\nvar defaults = {\n /**\n * Type of the movement.\n *\n * Available types:\n * `slider` - Rewinds slider to the start/end when it reaches the first or last slide.\n * `carousel` - Changes slides without starting over when it reaches the first or last slide.\n *\n * @type {String}\n */\n type: 'slider',\n\n /**\n * Start at specific slide number defined with zero-based index.\n *\n * @type {Number}\n */\n startAt: 0,\n\n /**\n * A number of slides visible on the single viewport.\n *\n * @type {Number}\n */\n perView: 1,\n\n /**\n * Focus currently active slide at a specified position in the track.\n *\n * Available inputs:\n * `center` - Current slide will be always focused at the center of a track.\n * `0,1,2,3...` - Current slide will be focused on the specified zero-based index.\n *\n * @type {String|Number}\n */\n focusAt: 0,\n\n /**\n * A size of the gap added between slides.\n *\n * @type {Number}\n */\n gap: 10,\n\n /**\n * Change slides after a specified interval. Use `false` for turning off autoplay.\n *\n * @type {Number|Boolean}\n */\n autoplay: false,\n\n /**\n * Stop autoplay on mouseover event.\n *\n * @type {Boolean}\n */\n hoverpause: true,\n\n /**\n * Allow for changing slides with left and right keyboard arrows.\n *\n * @type {Boolean}\n */\n keyboard: true,\n\n /**\n * Stop running `perView` number of slides from the end. Use this\n * option if you don't want to have an empty space after\n * a slider. Works only with `slider` type and a\n * non-centered `focusAt` setting.\n *\n * @type {Boolean}\n */\n bound: false,\n\n /**\n * Minimal swipe distance needed to change the slide. Use `false` for turning off a swiping.\n *\n * @type {Number|Boolean}\n */\n swipeThreshold: 80,\n\n /**\n * Minimal mouse drag distance needed to change the slide. Use `false` for turning off a dragging.\n *\n * @type {Number|Boolean}\n */\n dragThreshold: 120,\n\n /**\n * A number of slides moved on single swipe.\n *\n * Available types:\n * `` - Moves slider by one slide per swipe\n * `|` - Moves slider between views per swipe (number of slides defined in `perView` options)\n *\n * @type {String}\n */\n perSwipe: '',\n\n /**\n * Moving distance ratio of the slides on a swiping and dragging.\n *\n * @type {Number}\n */\n touchRatio: 0.5,\n\n /**\n * Angle required to activate slides moving on swiping or dragging.\n *\n * @type {Number}\n */\n touchAngle: 45,\n\n /**\n * Duration of the animation in milliseconds.\n *\n * @type {Number}\n */\n animationDuration: 400,\n\n /**\n * Allows looping the `slider` type. Slider will rewind to the first/last slide when it's at the start/end.\n *\n * @type {Boolean}\n */\n rewind: true,\n\n /**\n * Duration of the rewinding animation of the `slider` type in milliseconds.\n *\n * @type {Number}\n */\n rewindDuration: 800,\n\n /**\n * Easing function for the animation.\n *\n * @type {String}\n */\n animationTimingFunc: 'cubic-bezier(.165, .840, .440, 1)',\n\n /**\n * Wait for the animation to finish until the next user input can be processed\n *\n * @type {boolean}\n */\n waitForTransition: true,\n\n /**\n * Throttle costly events at most once per every wait milliseconds.\n *\n * @type {Number}\n */\n throttle: 10,\n\n /**\n * Moving direction mode.\n *\n * Available inputs:\n * - 'ltr' - left to right movement,\n * - 'rtl' - right to left movement.\n *\n * @type {String}\n */\n direction: 'ltr',\n\n /**\n * The distance value of the next and previous viewports which\n * have to peek in the current view. Accepts number and\n * pixels as a string. Left and right peeking can be\n * set up separately with a directions object.\n *\n * For example:\n * `100` - Peek 100px on the both sides.\n * { before: 100, after: 50 }` - Peek 100px on the left side and 50px on the right side.\n *\n * @type {Number|String|Object}\n */\n peek: 0,\n\n /**\n * Defines how many clones of current viewport will be generated.\n *\n * @type {Number}\n */\n cloningRatio: 1,\n\n /**\n * Collection of options applied at specified media breakpoints.\n * For example: display two slides per view under 800px.\n * `{\n * '800px': {\n * perView: 2\n * }\n * }`\n */\n breakpoints: {},\n\n /**\n * Collection of internally used HTML classes.\n *\n * @todo Refactor `slider` and `carousel` properties to single `type: { slider: '', carousel: '' }` object\n * @type {Object}\n */\n classes: {\n swipeable: 'glide--swipeable',\n dragging: 'glide--dragging',\n direction: {\n ltr: 'glide--ltr',\n rtl: 'glide--rtl'\n },\n type: {\n slider: 'glide--slider',\n carousel: 'glide--carousel'\n },\n slide: {\n clone: 'glide__slide--clone',\n active: 'glide__slide--active'\n },\n arrow: {\n disabled: 'glide__arrow--disabled'\n },\n nav: {\n active: 'glide__bullet--active'\n }\n }\n};\n\n/**\n * Outputs warning message to the bowser console.\n *\n * @param {String} msg\n * @return {Void}\n */\nfunction warn(msg) {\n console.error(\"[Glide warn]: \".concat(msg));\n}\n\n/**\n * Converts value entered as number\n * or string to integer value.\n *\n * @param {String} value\n * @returns {Number}\n */\nfunction toInt(value) {\n return parseInt(value);\n}\n/**\n * Converts value entered as number\n * or string to flat value.\n *\n * @param {String} value\n * @returns {Number}\n */\n\nfunction toFloat(value) {\n return parseFloat(value);\n}\n/**\n * Indicates whether the specified value is a string.\n *\n * @param {*} value\n * @return {Boolean}\n */\n\nfunction isString(value) {\n return typeof value === 'string';\n}\n/**\n * Indicates whether the specified value is an object.\n *\n * @param {*} value\n * @return {Boolean}\n *\n * @see https://github.com/jashkenas/underscore\n */\n\nfunction isObject(value) {\n var type = _typeof(value);\n\n return type === 'function' || type === 'object' && !!value; // eslint-disable-line no-mixed-operators\n}\n/**\n * Indicates whether the specified value is a function.\n *\n * @param {*} value\n * @return {Boolean}\n */\n\nfunction isFunction(value) {\n return typeof value === 'function';\n}\n/**\n * Indicates whether the specified value is undefined.\n *\n * @param {*} value\n * @return {Boolean}\n */\n\nfunction isUndefined(value) {\n return typeof value === 'undefined';\n}\n/**\n * Indicates whether the specified value is an array.\n *\n * @param {*} value\n * @return {Boolean}\n */\n\nfunction isArray(value) {\n return value.constructor === Array;\n}\n\n/**\n * Creates and initializes specified collection of extensions.\n * Each extension receives access to instance of glide and rest of components.\n *\n * @param {Object} glide\n * @param {Object} extensions\n *\n * @returns {Object}\n */\n\nfunction mount(glide, extensions, events) {\n var components = {};\n\n for (var name in extensions) {\n if (isFunction(extensions[name])) {\n components[name] = extensions[name](glide, components, events);\n } else {\n warn('Extension must be a function');\n }\n }\n\n for (var _name in components) {\n if (isFunction(components[_name].mount)) {\n components[_name].mount();\n }\n }\n\n return components;\n}\n\n/**\n * Defines getter and setter property on the specified object.\n *\n * @param {Object} obj Object where property has to be defined.\n * @param {String} prop Name of the defined property.\n * @param {Object} definition Get and set definitions for the property.\n * @return {Void}\n */\nfunction define(obj, prop, definition) {\n Object.defineProperty(obj, prop, definition);\n}\n/**\n * Sorts aphabetically object keys.\n *\n * @param {Object} obj\n * @return {Object}\n */\n\nfunction sortKeys(obj) {\n return Object.keys(obj).sort().reduce(function (r, k) {\n r[k] = obj[k];\n return r[k], r;\n }, {});\n}\n/**\n * Merges passed settings object with default options.\n *\n * @param {Object} defaults\n * @param {Object} settings\n * @return {Object}\n */\n\nfunction mergeOptions(defaults, settings) {\n var options = Object.assign({}, defaults, settings); // `Object.assign` do not deeply merge objects, so we\n // have to do it manually for every nested object\n // in options. Although it does not look smart,\n // it's smaller and faster than some fancy\n // merging deep-merge algorithm script.\n\n if (settings.hasOwnProperty('classes')) {\n options.classes = Object.assign({}, defaults.classes, settings.classes);\n var properties = ['direction', 'type', 'slide', 'arrow', 'nav'];\n properties.forEach(function (property) {\n if (settings.classes.hasOwnProperty(property)) {\n options.classes[property] = _objectSpread2(_objectSpread2({}, defaults.classes[property]), settings.classes[property]);\n }\n });\n }\n\n if (settings.hasOwnProperty('breakpoints')) {\n options.breakpoints = Object.assign({}, defaults.breakpoints, settings.breakpoints);\n }\n\n return options;\n}\n\nvar EventsBus = /*#__PURE__*/function () {\n /**\n * Construct a EventBus instance.\n *\n * @param {Object} events\n */\n function EventsBus() {\n var events = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, EventsBus);\n\n this.events = events;\n this.hop = events.hasOwnProperty;\n }\n /**\n * Adds listener to the specifed event.\n *\n * @param {String|Array} event\n * @param {Function} handler\n */\n\n\n _createClass(EventsBus, [{\n key: \"on\",\n value: function on(event, handler) {\n if (isArray(event)) {\n for (var i = 0; i < event.length; i++) {\n this.on(event[i], handler);\n }\n\n return;\n } // Create the event's object if not yet created\n\n\n if (!this.hop.call(this.events, event)) {\n this.events[event] = [];\n } // Add the handler to queue\n\n\n var index = this.events[event].push(handler) - 1; // Provide handle back for removal of event\n\n return {\n remove: function remove() {\n delete this.events[event][index];\n }\n };\n }\n /**\n * Runs registered handlers for specified event.\n *\n * @param {String|Array} event\n * @param {Object=} context\n */\n\n }, {\n key: \"emit\",\n value: function emit(event, context) {\n if (isArray(event)) {\n for (var i = 0; i < event.length; i++) {\n this.emit(event[i], context);\n }\n\n return;\n } // If the event doesn't exist, or there's no handlers in queue, just leave\n\n\n if (!this.hop.call(this.events, event)) {\n return;\n } // Cycle through events queue, fire!\n\n\n this.events[event].forEach(function (item) {\n item(context || {});\n });\n }\n }]);\n\n return EventsBus;\n}();\n\nvar Glide$1 = /*#__PURE__*/function () {\n /**\r\n * Construct glide.\r\n *\r\n * @param {String} selector\r\n * @param {Object} options\r\n */\n function Glide(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Glide);\n\n this._c = {};\n this._t = [];\n this._e = new EventsBus();\n this.disabled = false;\n this.selector = selector;\n this.settings = mergeOptions(defaults, options);\n this.index = this.settings.startAt;\n }\n /**\r\n * Initializes glide.\r\n *\r\n * @param {Object} extensions Collection of extensions to initialize.\r\n * @return {Glide}\r\n */\n\n\n _createClass(Glide, [{\n key: \"mount\",\n value: function mount$1() {\n var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n this._e.emit('mount.before');\n\n if (isObject(extensions)) {\n this._c = mount(this, extensions, this._e);\n } else {\n warn('You need to provide a object on `mount()`');\n }\n\n this._e.emit('mount.after');\n\n return this;\n }\n /**\r\n * Collects an instance `translate` transformers.\r\n *\r\n * @param {Array} transformers Collection of transformers.\r\n * @return {Void}\r\n */\n\n }, {\n key: \"mutate\",\n value: function mutate() {\n var transformers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n if (isArray(transformers)) {\n this._t = transformers;\n } else {\n warn('You need to provide a array on `mutate()`');\n }\n\n return this;\n }\n /**\r\n * Updates glide with specified settings.\r\n *\r\n * @param {Object} settings\r\n * @return {Glide}\r\n */\n\n }, {\n key: \"update\",\n value: function update() {\n var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.settings = mergeOptions(this.settings, settings);\n\n if (settings.hasOwnProperty('startAt')) {\n this.index = settings.startAt;\n }\n\n this._e.emit('update');\n\n return this;\n }\n /**\r\n * Change slide with specified pattern. A pattern must be in the special format:\r\n * `>` - Move one forward\r\n * `<` - Move one backward\r\n * `={i}` - Go to {i} zero-based slide (eq. '=1', will go to second slide)\r\n * `>>` - Rewinds to end (last slide)\r\n * `<<` - Rewinds to start (first slide)\r\n * `|>` - Move one viewport forward\r\n * `|<` - Move one viewport backward\r\n *\r\n * @param {String} pattern\r\n * @return {Glide}\r\n */\n\n }, {\n key: \"go\",\n value: function go(pattern) {\n this._c.Run.make(pattern);\n\n return this;\n }\n /**\r\n * Move track by specified distance.\r\n *\r\n * @param {String} distance\r\n * @return {Glide}\r\n */\n\n }, {\n key: \"move\",\n value: function move(distance) {\n this._c.Transition.disable();\n\n this._c.Move.make(distance);\n\n return this;\n }\n /**\r\n * Destroy instance and revert all changes done by this._c.\r\n *\r\n * @return {Glide}\r\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this._e.emit('destroy');\n\n return this;\n }\n /**\r\n * Start instance autoplaying.\r\n *\r\n * @param {Boolean|Number} interval Run autoplaying with passed interval regardless of `autoplay` settings\r\n * @return {Glide}\r\n */\n\n }, {\n key: \"play\",\n value: function play() {\n var interval = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (interval) {\n this.settings.autoplay = interval;\n }\n\n this._e.emit('play');\n\n return this;\n }\n /**\r\n * Stop instance autoplaying.\r\n *\r\n * @return {Glide}\r\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n this._e.emit('pause');\n\n return this;\n }\n /**\r\n * Sets glide into a idle status.\r\n *\r\n * @return {Glide}\r\n */\n\n }, {\n key: \"disable\",\n value: function disable() {\n this.disabled = true;\n return this;\n }\n /**\r\n * Sets glide into a active status.\r\n *\r\n * @return {Glide}\r\n */\n\n }, {\n key: \"enable\",\n value: function enable() {\n this.disabled = false;\n return this;\n }\n /**\r\n * Adds cuutom event listener with handler.\r\n *\r\n * @param {String|Array} event\r\n * @param {Function} handler\r\n * @return {Glide}\r\n */\n\n }, {\n key: \"on\",\n value: function on(event, handler) {\n this._e.on(event, handler);\n\n return this;\n }\n /**\r\n * Checks if glide is a precised type.\r\n *\r\n * @param {String} name\r\n * @return {Boolean}\r\n */\n\n }, {\n key: \"isType\",\n value: function isType(name) {\n return this.settings.type === name;\n }\n /**\r\n * Gets value of the core options.\r\n *\r\n * @return {Object}\r\n */\n\n }, {\n key: \"settings\",\n get: function get() {\n return this._o;\n }\n /**\r\n * Sets value of the core options.\r\n *\r\n * @param {Object} o\r\n * @return {Void}\r\n */\n ,\n set: function set(o) {\n if (isObject(o)) {\n this._o = o;\n } else {\n warn('Options must be an `object` instance.');\n }\n }\n /**\r\n * Gets current index of the slider.\r\n *\r\n * @return {Object}\r\n */\n\n }, {\n key: \"index\",\n get: function get() {\n return this._i;\n }\n /**\r\n * Sets current index a slider.\r\n *\r\n * @return {Object}\r\n */\n ,\n set: function set(i) {\n this._i = toInt(i);\n }\n /**\r\n * Gets type name of the slider.\r\n *\r\n * @return {String}\r\n */\n\n }, {\n key: \"type\",\n get: function get() {\n return this.settings.type;\n }\n /**\r\n * Gets value of the idle status.\r\n *\r\n * @return {Boolean}\r\n */\n\n }, {\n key: \"disabled\",\n get: function get() {\n return this._d;\n }\n /**\r\n * Sets value of the idle status.\r\n *\r\n * @return {Boolean}\r\n */\n ,\n set: function set(status) {\n this._d = !!status;\n }\n }]);\n\n return Glide;\n}();\n\nfunction Run (Glide, Components, Events) {\n var Run = {\n /**\n * Initializes autorunning of the glide.\n *\n * @return {Void}\n */\n mount: function mount() {\n this._o = false;\n },\n\n /**\n * Makes glides running based on the passed moving schema.\n *\n * @param {String} move\n */\n make: function make(move) {\n var _this = this;\n\n if (!Glide.disabled) {\n !Glide.settings.waitForTransition || Glide.disable();\n this.move = move;\n Events.emit('run.before', this.move);\n this.calculate();\n Events.emit('run', this.move);\n Components.Transition.after(function () {\n if (_this.isStart()) {\n Events.emit('run.start', _this.move);\n }\n\n if (_this.isEnd()) {\n Events.emit('run.end', _this.move);\n }\n\n if (_this.isOffset()) {\n _this._o = false;\n Events.emit('run.offset', _this.move);\n }\n\n Events.emit('run.after', _this.move);\n Glide.enable();\n });\n }\n },\n\n /**\n * Calculates current index based on defined move.\n *\n * @return {Number|Undefined}\n */\n calculate: function calculate() {\n var move = this.move,\n length = this.length;\n var steps = move.steps,\n direction = move.direction; // By default assume that size of view is equal to one slide\n\n var viewSize = 1; // While direction is `=` we want jump to\n // a specified index described in steps.\n\n if (direction === '=') {\n // Check if bound is true, \n // as we want to avoid whitespaces.\n if (Glide.settings.bound && toInt(steps) > length) {\n Glide.index = length;\n return;\n }\n\n Glide.index = steps;\n return;\n } // When pattern is equal to `>>` we want\n // fast forward to the last slide.\n\n\n if (direction === '>' && steps === '>') {\n Glide.index = length;\n return;\n } // When pattern is equal to `<<` we want\n // fast forward to the first slide.\n\n\n if (direction === '<' && steps === '<') {\n Glide.index = 0;\n return;\n } // pagination movement\n\n\n if (direction === '|') {\n viewSize = Glide.settings.perView || 1;\n } // we are moving forward\n\n\n if (direction === '>' || direction === '|' && steps === '>') {\n var index = calculateForwardIndex(viewSize);\n\n if (index > length) {\n this._o = true;\n }\n\n Glide.index = normalizeForwardIndex(index, viewSize);\n return;\n } // we are moving backward\n\n\n if (direction === '<' || direction === '|' && steps === '<') {\n var _index = calculateBackwardIndex(viewSize);\n\n if (_index < 0) {\n this._o = true;\n }\n\n Glide.index = normalizeBackwardIndex(_index, viewSize);\n return;\n }\n\n warn(\"Invalid direction pattern [\".concat(direction).concat(steps, \"] has been used\"));\n },\n\n /**\n * Checks if we are on the first slide.\n *\n * @return {Boolean}\n */\n isStart: function isStart() {\n return Glide.index <= 0;\n },\n\n /**\n * Checks if we are on the last slide.\n *\n * @return {Boolean}\n */\n isEnd: function isEnd() {\n return Glide.index >= this.length;\n },\n\n /**\n * Checks if we are making a offset run.\n *\n * @param {String} direction\n * @return {Boolean}\n */\n isOffset: function isOffset() {\n var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;\n\n if (!direction) {\n return this._o;\n }\n\n if (!this._o) {\n return false;\n } // did we view to the right?\n\n\n if (direction === '|>') {\n return this.move.direction === '|' && this.move.steps === '>';\n } // did we view to the left?\n\n\n if (direction === '|<') {\n return this.move.direction === '|' && this.move.steps === '<';\n }\n\n return this.move.direction === direction;\n },\n\n /**\n * Checks if bound mode is active\n *\n * @return {Boolean}\n */\n isBound: function isBound() {\n return Glide.isType('slider') && Glide.settings.focusAt !== 'center' && Glide.settings.bound;\n }\n };\n /**\n * Returns index value to move forward/to the right\n *\n * @param viewSize\n * @returns {Number}\n */\n\n function calculateForwardIndex(viewSize) {\n var index = Glide.index;\n\n if (Glide.isType('carousel')) {\n return index + viewSize;\n }\n\n return index + (viewSize - index % viewSize);\n }\n /**\n * Normalizes the given forward index based on glide settings, preventing it to exceed certain boundaries\n *\n * @param index\n * @param length\n * @param viewSize\n * @returns {Number}\n */\n\n\n function normalizeForwardIndex(index, viewSize) {\n var length = Run.length;\n\n if (index <= length) {\n return index;\n }\n\n if (Glide.isType('carousel')) {\n return index - (length + 1);\n }\n\n if (Glide.settings.rewind) {\n // bound does funny things with the length, therefor we have to be certain\n // that we are on the last possible index value given by bound\n if (Run.isBound() && !Run.isEnd()) {\n return length;\n }\n\n return 0;\n }\n\n if (Run.isBound()) {\n return length;\n }\n\n return Math.floor(length / viewSize) * viewSize;\n }\n /**\n * Calculates index value to move backward/to the left\n *\n * @param viewSize\n * @returns {Number}\n */\n\n\n function calculateBackwardIndex(viewSize) {\n var index = Glide.index;\n\n if (Glide.isType('carousel')) {\n return index - viewSize;\n } // ensure our back navigation results in the same index as a forward navigation\n // to experience a homogeneous paging\n\n\n var view = Math.ceil(index / viewSize);\n return (view - 1) * viewSize;\n }\n /**\n * Normalizes the given backward index based on glide settings, preventing it to exceed certain boundaries\n *\n * @param index\n * @param length\n * @param viewSize\n * @returns {*}\n */\n\n\n function normalizeBackwardIndex(index, viewSize) {\n var length = Run.length;\n\n if (index >= 0) {\n return index;\n }\n\n if (Glide.isType('carousel')) {\n return index + (length + 1);\n }\n\n if (Glide.settings.rewind) {\n // bound does funny things with the length, therefor we have to be certain\n // that we are on first possible index value before we to rewind to the length given by bound\n if (Run.isBound() && Run.isStart()) {\n return length;\n }\n\n return Math.floor(length / viewSize) * viewSize;\n }\n\n return 0;\n }\n\n define(Run, 'move', {\n /**\n * Gets value of the move schema.\n *\n * @returns {Object}\n */\n get: function get() {\n return this._m;\n },\n\n /**\n * Sets value of the move schema.\n *\n * @returns {Object}\n */\n set: function set(value) {\n var step = value.substr(1);\n this._m = {\n direction: value.substr(0, 1),\n steps: step ? toInt(step) ? toInt(step) : step : 0\n };\n }\n });\n define(Run, 'length', {\n /**\n * Gets value of the running distance based\n * on zero-indexing number of slides.\n *\n * @return {Number}\n */\n get: function get() {\n var settings = Glide.settings;\n var length = Components.Html.slides.length; // If the `bound` option is active, a maximum running distance should be\n // reduced by `perView` and `focusAt` settings. Running distance\n // should end before creating an empty space after instance.\n\n if (this.isBound()) {\n return length - 1 - (toInt(settings.perView) - 1) + toInt(settings.focusAt);\n }\n\n return length - 1;\n }\n });\n define(Run, 'offset', {\n /**\n * Gets status of the offsetting flag.\n *\n * @return {Boolean}\n */\n get: function get() {\n return this._o;\n }\n });\n return Run;\n}\n\n/**\n * Returns a current time.\n *\n * @return {Number}\n */\nfunction now() {\n return new Date().getTime();\n}\n\n/**\n * Returns a function, that, when invoked, will only be triggered\n * at most once during a given window of time.\n *\n * @param {Function} func\n * @param {Number} wait\n * @param {Object=} options\n * @return {Function}\n *\n * @see https://github.com/jashkenas/underscore\n */\n\nfunction throttle(func, wait) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var timeout, context, args, result;\n var previous = 0;\n\n var later = function later() {\n previous = options.leading === false ? 0 : now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n\n var throttled = function throttled() {\n var at = now();\n if (!previous && options.leading === false) previous = at;\n var remaining = wait - (at - previous);\n context = this;\n args = arguments;\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n\n previous = at;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n\n return result;\n };\n\n throttled.cancel = function () {\n clearTimeout(timeout);\n previous = 0;\n timeout = context = args = null;\n };\n\n return throttled;\n}\n\nvar MARGIN_TYPE = {\n ltr: ['marginLeft', 'marginRight'],\n rtl: ['marginRight', 'marginLeft']\n};\nfunction Gaps (Glide, Components, Events) {\n var Gaps = {\n /**\n * Applies gaps between slides. First and last\n * slides do not receive it's edge margins.\n *\n * @param {HTMLCollection} slides\n * @return {Void}\n */\n apply: function apply(slides) {\n for (var i = 0, len = slides.length; i < len; i++) {\n var style = slides[i].style;\n var direction = Components.Direction.value;\n\n if (i !== 0) {\n style[MARGIN_TYPE[direction][0]] = \"\".concat(this.value / 2, \"px\");\n } else {\n style[MARGIN_TYPE[direction][0]] = '';\n }\n\n if (i !== slides.length - 1) {\n style[MARGIN_TYPE[direction][1]] = \"\".concat(this.value / 2, \"px\");\n } else {\n style[MARGIN_TYPE[direction][1]] = '';\n }\n }\n },\n\n /**\n * Removes gaps from the slides.\n *\n * @param {HTMLCollection} slides\n * @returns {Void}\n */\n remove: function remove(slides) {\n for (var i = 0, len = slides.length; i < len; i++) {\n var style = slides[i].style;\n style.marginLeft = '';\n style.marginRight = '';\n }\n }\n };\n define(Gaps, 'value', {\n /**\n * Gets value of the gap.\n *\n * @returns {Number}\n */\n get: function get() {\n return toInt(Glide.settings.gap);\n }\n });\n define(Gaps, 'grow', {\n /**\n * Gets additional dimensions value caused by gaps.\n * Used to increase width of the slides wrapper.\n *\n * @returns {Number}\n */\n get: function get() {\n return Gaps.value * Components.Sizes.length;\n }\n });\n define(Gaps, 'reductor', {\n /**\n * Gets reduction value caused by gaps.\n * Used to subtract width of the slides.\n *\n * @returns {Number}\n */\n get: function get() {\n var perView = Glide.settings.perView;\n return Gaps.value * (perView - 1) / perView;\n }\n });\n /**\n * Apply calculated gaps:\n * - after building, so slides (including clones) will receive proper margins\n * - on updating via API, to recalculate gaps with new options\n */\n\n Events.on(['build.after', 'update'], throttle(function () {\n Gaps.apply(Components.Html.wrapper.children);\n }, 30));\n /**\n * Remove gaps:\n * - on destroying to bring markup to its inital state\n */\n\n Events.on('destroy', function () {\n Gaps.remove(Components.Html.wrapper.children);\n });\n return Gaps;\n}\n\n/**\n * Finds siblings nodes of the passed node.\n *\n * @param {Element} node\n * @return {Array}\n */\nfunction siblings(node) {\n if (node && node.parentNode) {\n var n = node.parentNode.firstChild;\n var matched = [];\n\n for (; n; n = n.nextSibling) {\n if (n.nodeType === 1 && n !== node) {\n matched.push(n);\n }\n }\n\n return matched;\n }\n\n return [];\n}\n/**\n * Coerces a NodeList to an Array.\n *\n * @param {NodeList} nodeList\n * @return {Array}\n */\n\nfunction toArray(nodeList) {\n return Array.prototype.slice.call(nodeList);\n}\n\nvar TRACK_SELECTOR = '[data-glide-el=\"track\"]';\nfunction Html (Glide, Components, Events) {\n var Html = {\n /**\n * Setup slider HTML nodes.\n *\n * @param {Glide} glide\n */\n mount: function mount() {\n this.root = Glide.selector;\n this.track = this.root.querySelector(TRACK_SELECTOR);\n this.collectSlides();\n },\n\n /**\n * Collect slides\n */\n collectSlides: function collectSlides() {\n this.slides = toArray(this.wrapper.children).filter(function (slide) {\n return !slide.classList.contains(Glide.settings.classes.slide.clone);\n });\n }\n };\n define(Html, 'root', {\n /**\n * Gets node of the glide main element.\n *\n * @return {Object}\n */\n get: function get() {\n return Html._r;\n },\n\n /**\n * Sets node of the glide main element.\n *\n * @return {Object}\n */\n set: function set(r) {\n if (isString(r)) {\n r = document.querySelector(r);\n }\n\n if (r !== null) {\n Html._r = r;\n } else {\n warn('Root element must be a existing Html node');\n }\n }\n });\n define(Html, 'track', {\n /**\n * Gets node of the glide track with slides.\n *\n * @return {Object}\n */\n get: function get() {\n return Html._t;\n },\n\n /**\n * Sets node of the glide track with slides.\n *\n * @return {Object}\n */\n set: function set(t) {\n Html._t = t;\n }\n });\n define(Html, 'wrapper', {\n /**\n * Gets node of the slides wrapper.\n *\n * @return {Object}\n */\n get: function get() {\n return Html.track.children[0];\n }\n });\n /**\n * Add/remove/reorder dynamic slides\n */\n\n Events.on('update', function () {\n Html.collectSlides();\n });\n return Html;\n}\n\nfunction Peek (Glide, Components, Events) {\n var Peek = {\n /**\n * Setups how much to peek based on settings.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.value = Glide.settings.peek;\n }\n };\n define(Peek, 'value', {\n /**\n * Gets value of the peek.\n *\n * @returns {Number|Object}\n */\n get: function get() {\n return Peek._v;\n },\n\n /**\n * Sets value of the peek.\n *\n * @param {Number|Object} value\n * @return {Void}\n */\n set: function set(value) {\n if (isObject(value)) {\n value.before = toInt(value.before);\n value.after = toInt(value.after);\n } else {\n value = toInt(value);\n }\n\n Peek._v = value;\n }\n });\n define(Peek, 'reductor', {\n /**\n * Gets reduction value caused by peek.\n *\n * @returns {Number}\n */\n get: function get() {\n var value = Peek.value;\n var perView = Glide.settings.perView;\n\n if (isObject(value)) {\n return value.before / perView + value.after / perView;\n }\n\n return value * 2 / perView;\n }\n });\n /**\n * Recalculate peeking sizes on:\n * - when resizing window to update to proper percents\n */\n\n Events.on(['resize', 'update'], function () {\n Peek.mount();\n });\n return Peek;\n}\n\nfunction Move (Glide, Components, Events) {\n var Move = {\n /**\n * Constructs move component.\n *\n * @returns {Void}\n */\n mount: function mount() {\n this._o = 0;\n },\n\n /**\n * Calculates a movement value based on passed offset and currently active index.\n *\n * @param {Number} offset\n * @return {Void}\n */\n make: function make() {\n var _this = this;\n\n var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n this.offset = offset;\n Events.emit('move', {\n movement: this.value\n });\n Components.Transition.after(function () {\n Events.emit('move.after', {\n movement: _this.value\n });\n });\n }\n };\n define(Move, 'offset', {\n /**\n * Gets an offset value used to modify current translate.\n *\n * @return {Object}\n */\n get: function get() {\n return Move._o;\n },\n\n /**\n * Sets an offset value used to modify current translate.\n *\n * @return {Object}\n */\n set: function set(value) {\n Move._o = !isUndefined(value) ? toInt(value) : 0;\n }\n });\n define(Move, 'translate', {\n /**\n * Gets a raw movement value.\n *\n * @return {Number}\n */\n get: function get() {\n return Components.Sizes.slideWidth * Glide.index;\n }\n });\n define(Move, 'value', {\n /**\n * Gets an actual movement value corrected by offset.\n *\n * @return {Number}\n */\n get: function get() {\n var offset = this.offset;\n var translate = this.translate;\n\n if (Components.Direction.is('rtl')) {\n return translate + offset;\n }\n\n return translate - offset;\n }\n });\n /**\n * Make movement to proper slide on:\n * - before build, so glide will start at `startAt` index\n * - on each standard run to move to newly calculated index\n */\n\n Events.on(['build.before', 'run'], function () {\n Move.make();\n });\n return Move;\n}\n\nfunction Sizes (Glide, Components, Events) {\n var Sizes = {\n /**\n * Setups dimensions of slides.\n *\n * @return {Void}\n */\n setupSlides: function setupSlides() {\n var width = \"\".concat(this.slideWidth, \"px\");\n var slides = Components.Html.slides;\n\n for (var i = 0; i < slides.length; i++) {\n slides[i].style.width = width;\n }\n },\n\n /**\n * Setups dimensions of slides wrapper.\n *\n * @return {Void}\n */\n setupWrapper: function setupWrapper() {\n Components.Html.wrapper.style.width = \"\".concat(this.wrapperSize, \"px\");\n },\n\n /**\n * Removes applied styles from HTML elements.\n *\n * @returns {Void}\n */\n remove: function remove() {\n var slides = Components.Html.slides;\n\n for (var i = 0; i < slides.length; i++) {\n slides[i].style.width = '';\n }\n\n Components.Html.wrapper.style.width = '';\n }\n };\n define(Sizes, 'length', {\n /**\n * Gets count number of the slides.\n *\n * @return {Number}\n */\n get: function get() {\n return Components.Html.slides.length;\n }\n });\n define(Sizes, 'width', {\n /**\n * Gets width value of the slider (visible area).\n *\n * @return {Number}\n */\n get: function get() {\n return Components.Html.track.offsetWidth;\n }\n });\n define(Sizes, 'wrapperSize', {\n /**\n * Gets size of the slides wrapper.\n *\n * @return {Number}\n */\n get: function get() {\n return Sizes.slideWidth * Sizes.length + Components.Gaps.grow + Components.Clones.grow;\n }\n });\n define(Sizes, 'slideWidth', {\n /**\n * Gets width value of a single slide.\n *\n * @return {Number}\n */\n get: function get() {\n return Sizes.width / Glide.settings.perView - Components.Peek.reductor - Components.Gaps.reductor;\n }\n });\n /**\n * Apply calculated glide's dimensions:\n * - before building, so other dimensions (e.g. translate) will be calculated propertly\n * - when resizing window to recalculate sildes dimensions\n * - on updating via API, to calculate dimensions based on new options\n */\n\n Events.on(['build.before', 'resize', 'update'], function () {\n Sizes.setupSlides();\n Sizes.setupWrapper();\n });\n /**\n * Remove calculated glide's dimensions:\n * - on destoting to bring markup to its inital state\n */\n\n Events.on('destroy', function () {\n Sizes.remove();\n });\n return Sizes;\n}\n\nfunction Build (Glide, Components, Events) {\n var Build = {\n /**\n * Init glide building. Adds classes, sets\n * dimensions and setups initial state.\n *\n * @return {Void}\n */\n mount: function mount() {\n Events.emit('build.before');\n this.typeClass();\n this.activeClass();\n Events.emit('build.after');\n },\n\n /**\n * Adds `type` class to the glide element.\n *\n * @return {Void}\n */\n typeClass: function typeClass() {\n Components.Html.root.classList.add(Glide.settings.classes.type[Glide.settings.type]);\n },\n\n /**\n * Sets active class to current slide.\n *\n * @return {Void}\n */\n activeClass: function activeClass() {\n var classes = Glide.settings.classes;\n var slide = Components.Html.slides[Glide.index];\n\n if (slide) {\n slide.classList.add(classes.slide.active);\n siblings(slide).forEach(function (sibling) {\n sibling.classList.remove(classes.slide.active);\n });\n }\n },\n\n /**\n * Removes HTML classes applied at building.\n *\n * @return {Void}\n */\n removeClasses: function removeClasses() {\n var _Glide$settings$class = Glide.settings.classes,\n type = _Glide$settings$class.type,\n slide = _Glide$settings$class.slide;\n Components.Html.root.classList.remove(type[Glide.settings.type]);\n Components.Html.slides.forEach(function (sibling) {\n sibling.classList.remove(slide.active);\n });\n }\n };\n /**\n * Clear building classes:\n * - on destroying to bring HTML to its initial state\n * - on updating to remove classes before remounting component\n */\n\n Events.on(['destroy', 'update'], function () {\n Build.removeClasses();\n });\n /**\n * Remount component:\n * - on resizing of the window to calculate new dimensions\n * - on updating settings via API\n */\n\n Events.on(['resize', 'update'], function () {\n Build.mount();\n });\n /**\n * Swap active class of current slide:\n * - after each move to the new index\n */\n\n Events.on('move.after', function () {\n Build.activeClass();\n });\n return Build;\n}\n\nfunction Clones (Glide, Components, Events) {\n var Clones = {\n /**\n * Create pattern map and collect slides to be cloned.\n */\n mount: function mount() {\n this.items = [];\n\n if (Glide.isType('carousel')) {\n this.items = this.collect();\n }\n },\n\n /**\n * Collect clones with pattern.\n *\n * @return {[]}\n */\n collect: function collect() {\n var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var slides = Components.Html.slides;\n var _Glide$settings = Glide.settings,\n perView = _Glide$settings.perView,\n classes = _Glide$settings.classes,\n cloningRatio = _Glide$settings.cloningRatio;\n\n if (slides.length > 0) {\n var peekIncrementer = +!!Glide.settings.peek;\n var cloneCount = perView + peekIncrementer + Math.round(perView / 2);\n var append = slides.slice(0, cloneCount).reverse();\n var prepend = slides.slice(cloneCount * -1);\n\n for (var r = 0; r < Math.max(cloningRatio, Math.floor(perView / slides.length)); r++) {\n for (var i = 0; i < append.length; i++) {\n var clone = append[i].cloneNode(true);\n clone.classList.add(classes.slide.clone);\n items.push(clone);\n }\n\n for (var _i = 0; _i < prepend.length; _i++) {\n var _clone = prepend[_i].cloneNode(true);\n\n _clone.classList.add(classes.slide.clone);\n\n items.unshift(_clone);\n }\n }\n }\n\n return items;\n },\n\n /**\n * Append cloned slides with generated pattern.\n *\n * @return {Void}\n */\n append: function append() {\n var items = this.items;\n var _Components$Html = Components.Html,\n wrapper = _Components$Html.wrapper,\n slides = _Components$Html.slides;\n var half = Math.floor(items.length / 2);\n var prepend = items.slice(0, half).reverse();\n var append = items.slice(half * -1).reverse();\n var width = \"\".concat(Components.Sizes.slideWidth, \"px\");\n\n for (var i = 0; i < append.length; i++) {\n wrapper.appendChild(append[i]);\n }\n\n for (var _i2 = 0; _i2 < prepend.length; _i2++) {\n wrapper.insertBefore(prepend[_i2], slides[0]);\n }\n\n for (var _i3 = 0; _i3 < items.length; _i3++) {\n items[_i3].style.width = width;\n }\n },\n\n /**\n * Remove all cloned slides.\n *\n * @return {Void}\n */\n remove: function remove() {\n var items = this.items;\n\n for (var i = 0; i < items.length; i++) {\n Components.Html.wrapper.removeChild(items[i]);\n }\n }\n };\n define(Clones, 'grow', {\n /**\n * Gets additional dimensions value caused by clones.\n *\n * @return {Number}\n */\n get: function get() {\n return (Components.Sizes.slideWidth + Components.Gaps.value) * Clones.items.length;\n }\n });\n /**\n * Append additional slide's clones:\n * - while glide's type is `carousel`\n */\n\n Events.on('update', function () {\n Clones.remove();\n Clones.mount();\n Clones.append();\n });\n /**\n * Append additional slide's clones:\n * - while glide's type is `carousel`\n */\n\n Events.on('build.before', function () {\n if (Glide.isType('carousel')) {\n Clones.append();\n }\n });\n /**\n * Remove clones HTMLElements:\n * - on destroying, to bring HTML to its initial state\n */\n\n Events.on('destroy', function () {\n Clones.remove();\n });\n return Clones;\n}\n\nvar EventsBinder = /*#__PURE__*/function () {\n /**\n * Construct a EventsBinder instance.\n */\n function EventsBinder() {\n var listeners = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, EventsBinder);\n\n this.listeners = listeners;\n }\n /**\n * Adds events listeners to arrows HTML elements.\n *\n * @param {String|Array} events\n * @param {Element|Window|Document} el\n * @param {Function} closure\n * @param {Boolean|Object} capture\n * @return {Void}\n */\n\n\n _createClass(EventsBinder, [{\n key: \"on\",\n value: function on(events, el, closure) {\n var capture = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n if (isString(events)) {\n events = [events];\n }\n\n for (var i = 0; i < events.length; i++) {\n this.listeners[events[i]] = closure;\n el.addEventListener(events[i], this.listeners[events[i]], capture);\n }\n }\n /**\n * Removes event listeners from arrows HTML elements.\n *\n * @param {String|Array} events\n * @param {Element|Window|Document} el\n * @param {Boolean|Object} capture\n * @return {Void}\n */\n\n }, {\n key: \"off\",\n value: function off(events, el) {\n var capture = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (isString(events)) {\n events = [events];\n }\n\n for (var i = 0; i < events.length; i++) {\n el.removeEventListener(events[i], this.listeners[events[i]], capture);\n }\n }\n /**\n * Destroy collected listeners.\n *\n * @returns {Void}\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n delete this.listeners;\n }\n }]);\n\n return EventsBinder;\n}();\n\nfunction Resize (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var Resize = {\n /**\n * Initializes window bindings.\n */\n mount: function mount() {\n this.bind();\n },\n\n /**\n * Binds `rezsize` listener to the window.\n * It's a costly event, so we are debouncing it.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('resize', window, throttle(function () {\n Events.emit('resize');\n }, Glide.settings.throttle));\n },\n\n /**\n * Unbinds listeners from the window.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('resize', window);\n }\n };\n /**\n * Remove bindings from window:\n * - on destroying, to remove added EventListener\n */\n\n Events.on('destroy', function () {\n Resize.unbind();\n Binder.destroy();\n });\n return Resize;\n}\n\nvar VALID_DIRECTIONS = ['ltr', 'rtl'];\nvar FLIPED_MOVEMENTS = {\n '>': '<',\n '<': '>',\n '=': '='\n};\nfunction Direction (Glide, Components, Events) {\n var Direction = {\n /**\n * Setups gap value based on settings.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.value = Glide.settings.direction;\n },\n\n /**\n * Resolves pattern based on direction value\n *\n * @param {String} pattern\n * @returns {String}\n */\n resolve: function resolve(pattern) {\n var token = pattern.slice(0, 1);\n\n if (this.is('rtl')) {\n return pattern.split(token).join(FLIPED_MOVEMENTS[token]);\n }\n\n return pattern;\n },\n\n /**\n * Checks value of direction mode.\n *\n * @param {String} direction\n * @returns {Boolean}\n */\n is: function is(direction) {\n return this.value === direction;\n },\n\n /**\n * Applies direction class to the root HTML element.\n *\n * @return {Void}\n */\n addClass: function addClass() {\n Components.Html.root.classList.add(Glide.settings.classes.direction[this.value]);\n },\n\n /**\n * Removes direction class from the root HTML element.\n *\n * @return {Void}\n */\n removeClass: function removeClass() {\n Components.Html.root.classList.remove(Glide.settings.classes.direction[this.value]);\n }\n };\n define(Direction, 'value', {\n /**\n * Gets value of the direction.\n *\n * @returns {Number}\n */\n get: function get() {\n return Direction._v;\n },\n\n /**\n * Sets value of the direction.\n *\n * @param {String} value\n * @return {Void}\n */\n set: function set(value) {\n if (VALID_DIRECTIONS.indexOf(value) > -1) {\n Direction._v = value;\n } else {\n warn('Direction value must be `ltr` or `rtl`');\n }\n }\n });\n /**\n * Clear direction class:\n * - on destroy to bring HTML to its initial state\n * - on update to remove class before reappling bellow\n */\n\n Events.on(['destroy', 'update'], function () {\n Direction.removeClass();\n });\n /**\n * Remount component:\n * - on update to reflect changes in direction value\n */\n\n Events.on('update', function () {\n Direction.mount();\n });\n /**\n * Apply direction class:\n * - before building to apply class for the first time\n * - on updating to reapply direction class that may changed\n */\n\n Events.on(['build.before', 'update'], function () {\n Direction.addClass();\n });\n return Direction;\n}\n\n/**\n * Reflects value of glide movement.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\nfunction Rtl (Glide, Components) {\n return {\n /**\n * Negates the passed translate if glide is in RTL option.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n if (Components.Direction.is('rtl')) {\n return -translate;\n }\n\n return translate;\n }\n };\n}\n\n/**\n * Updates glide movement with a `gap` settings.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\nfunction Gap (Glide, Components) {\n return {\n /**\n * Modifies passed translate value with number in the `gap` settings.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n var multiplier = Math.floor(translate / Components.Sizes.slideWidth);\n return translate + Components.Gaps.value * multiplier;\n }\n };\n}\n\n/**\n * Updates glide movement with width of additional clones width.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\nfunction Grow (Glide, Components) {\n return {\n /**\n * Adds to the passed translate width of the half of clones.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n return translate + Components.Clones.grow / 2;\n }\n };\n}\n\n/**\n * Updates glide movement with a `peek` settings.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\nfunction Peeking (Glide, Components) {\n return {\n /**\n * Modifies passed translate value with a `peek` setting.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n if (Glide.settings.focusAt >= 0) {\n var peek = Components.Peek.value;\n\n if (isObject(peek)) {\n return translate - peek.before;\n }\n\n return translate - peek;\n }\n\n return translate;\n }\n };\n}\n\n/**\n * Updates glide movement with a `focusAt` settings.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\nfunction Focusing (Glide, Components) {\n return {\n /**\n * Modifies passed translate value with index in the `focusAt` setting.\n *\n * @param {Number} translate\n * @return {Number}\n */\n modify: function modify(translate) {\n var gap = Components.Gaps.value;\n var width = Components.Sizes.width;\n var focusAt = Glide.settings.focusAt;\n var slideWidth = Components.Sizes.slideWidth;\n\n if (focusAt === 'center') {\n return translate - (width / 2 - slideWidth / 2);\n }\n\n return translate - slideWidth * focusAt - gap * focusAt;\n }\n };\n}\n\n/**\n * Applies diffrent transformers on translate value.\n *\n * @param {Object} Glide\n * @param {Object} Components\n * @return {Object}\n */\n\nfunction mutator (Glide, Components, Events) {\n /**\n * Merge instance transformers with collection of default transformers.\n * It's important that the Rtl component be last on the list,\n * so it reflects all previous transformations.\n *\n * @type {Array}\n */\n var TRANSFORMERS = [Gap, Grow, Peeking, Focusing].concat(Glide._t, [Rtl]);\n return {\n /**\n * Piplines translate value with registered transformers.\n *\n * @param {Number} translate\n * @return {Number}\n */\n mutate: function mutate(translate) {\n for (var i = 0; i < TRANSFORMERS.length; i++) {\n var transformer = TRANSFORMERS[i];\n\n if (isFunction(transformer) && isFunction(transformer().modify)) {\n translate = transformer(Glide, Components, Events).modify(translate);\n } else {\n warn('Transformer should be a function that returns an object with `modify()` method');\n }\n }\n\n return translate;\n }\n };\n}\n\nfunction Translate (Glide, Components, Events) {\n var Translate = {\n /**\n * Sets value of translate on HTML element.\n *\n * @param {Number} value\n * @return {Void}\n */\n set: function set(value) {\n var transform = mutator(Glide, Components).mutate(value);\n var translate3d = \"translate3d(\".concat(-1 * transform, \"px, 0px, 0px)\");\n Components.Html.wrapper.style.mozTransform = translate3d; // needed for supported Firefox 10-15\n\n Components.Html.wrapper.style.webkitTransform = translate3d; // needed for supported Chrome 10-35, Safari 5.1-8, and Opera 15-22\n\n Components.Html.wrapper.style.transform = translate3d;\n },\n\n /**\n * Removes value of translate from HTML element.\n *\n * @return {Void}\n */\n remove: function remove() {\n Components.Html.wrapper.style.transform = '';\n },\n\n /**\n * @return {number}\n */\n getStartIndex: function getStartIndex() {\n var length = Components.Sizes.length;\n var index = Glide.index;\n var perView = Glide.settings.perView;\n\n if (Components.Run.isOffset('>') || Components.Run.isOffset('|>')) {\n return length + (index - perView);\n } // \"modulo length\" converts an index that equals length to zero\n\n\n return (index + perView) % length;\n },\n\n /**\n * @return {number}\n */\n getTravelDistance: function getTravelDistance() {\n var travelDistance = Components.Sizes.slideWidth * Glide.settings.perView;\n\n if (Components.Run.isOffset('>') || Components.Run.isOffset('|>')) {\n // reverse travel distance so that we don't have to change subtract operations\n return travelDistance * -1;\n }\n\n return travelDistance;\n }\n };\n /**\n * Set new translate value:\n * - on move to reflect index change\n * - on updating via API to reflect possible changes in options\n */\n\n Events.on('move', function (context) {\n if (!Glide.isType('carousel') || !Components.Run.isOffset()) {\n return Translate.set(context.movement);\n }\n\n Components.Transition.after(function () {\n Events.emit('translate.jump');\n Translate.set(Components.Sizes.slideWidth * Glide.index);\n });\n var startWidth = Components.Sizes.slideWidth * Components.Translate.getStartIndex();\n return Translate.set(startWidth - Components.Translate.getTravelDistance());\n });\n /**\n * Remove translate:\n * - on destroying to bring markup to its inital state\n */\n\n Events.on('destroy', function () {\n Translate.remove();\n });\n return Translate;\n}\n\nfunction Transition (Glide, Components, Events) {\n /**\n * Holds inactivity status of transition.\n * When true transition is not applied.\n *\n * @type {Boolean}\n */\n var disabled = false;\n var Transition = {\n /**\n * Composes string of the CSS transition.\n *\n * @param {String} property\n * @return {String}\n */\n compose: function compose(property) {\n var settings = Glide.settings;\n\n if (disabled) {\n return \"\".concat(property, \" 0ms \").concat(settings.animationTimingFunc);\n }\n\n return \"\".concat(property, \" \").concat(this.duration, \"ms \").concat(settings.animationTimingFunc);\n },\n\n /**\n * Sets value of transition on HTML element.\n *\n * @param {String=} property\n * @return {Void}\n */\n set: function set() {\n var property = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'transform';\n Components.Html.wrapper.style.transition = this.compose(property);\n },\n\n /**\n * Removes value of transition from HTML element.\n *\n * @return {Void}\n */\n remove: function remove() {\n Components.Html.wrapper.style.transition = '';\n },\n\n /**\n * Runs callback after animation.\n *\n * @param {Function} callback\n * @return {Void}\n */\n after: function after(callback) {\n setTimeout(function () {\n callback();\n }, this.duration);\n },\n\n /**\n * Enable transition.\n *\n * @return {Void}\n */\n enable: function enable() {\n disabled = false;\n this.set();\n },\n\n /**\n * Disable transition.\n *\n * @return {Void}\n */\n disable: function disable() {\n disabled = true;\n this.set();\n }\n };\n define(Transition, 'duration', {\n /**\n * Gets duration of the transition based\n * on currently running animation type.\n *\n * @return {Number}\n */\n get: function get() {\n var settings = Glide.settings;\n\n if (Glide.isType('slider') && Components.Run.offset) {\n return settings.rewindDuration;\n }\n\n return settings.animationDuration;\n }\n });\n /**\n * Set transition `style` value:\n * - on each moving, because it may be cleared by offset move\n */\n\n Events.on('move', function () {\n Transition.set();\n });\n /**\n * Disable transition:\n * - before initial build to avoid transitioning from `0` to `startAt` index\n * - while resizing window and recalculating dimensions\n * - on jumping from offset transition at start and end edges in `carousel` type\n */\n\n Events.on(['build.before', 'resize', 'translate.jump'], function () {\n Transition.disable();\n });\n /**\n * Enable transition:\n * - on each running, because it may be disabled by offset move\n */\n\n Events.on('run', function () {\n Transition.enable();\n });\n /**\n * Remove transition:\n * - on destroying to bring markup to its inital state\n */\n\n Events.on('destroy', function () {\n Transition.remove();\n });\n return Transition;\n}\n\n/**\n * Test via a getter in the options object to see\n * if the passive property is accessed.\n *\n * @see https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection\n */\nvar supportsPassive = false;\n\ntry {\n var opts = Object.defineProperty({}, 'passive', {\n get: function get() {\n supportsPassive = true;\n }\n });\n window.addEventListener('testPassive', null, opts);\n window.removeEventListener('testPassive', null, opts);\n} catch (e) {}\n\nvar supportsPassive$1 = supportsPassive;\n\nvar START_EVENTS = ['touchstart', 'mousedown'];\nvar MOVE_EVENTS = ['touchmove', 'mousemove'];\nvar END_EVENTS = ['touchend', 'touchcancel', 'mouseup', 'mouseleave'];\nvar MOUSE_EVENTS = ['mousedown', 'mousemove', 'mouseup', 'mouseleave'];\nfunction swipe (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var swipeSin = 0;\n var swipeStartX = 0;\n var swipeStartY = 0;\n var disabled = false;\n var capture = supportsPassive$1 ? {\n passive: true\n } : false;\n var Swipe = {\n /**\n * Initializes swipe bindings.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.bindSwipeStart();\n },\n\n /**\n * Handler for `swipestart` event. Calculates entry points of the user's tap.\n *\n * @param {Object} event\n * @return {Void}\n */\n start: function start(event) {\n if (!disabled && !Glide.disabled) {\n this.disable();\n var swipe = this.touches(event);\n swipeSin = null;\n swipeStartX = toInt(swipe.pageX);\n swipeStartY = toInt(swipe.pageY);\n this.bindSwipeMove();\n this.bindSwipeEnd();\n Events.emit('swipe.start');\n }\n },\n\n /**\n * Handler for `swipemove` event. Calculates user's tap angle and distance.\n *\n * @param {Object} event\n */\n move: function move(event) {\n if (!Glide.disabled) {\n var _Glide$settings = Glide.settings,\n touchAngle = _Glide$settings.touchAngle,\n touchRatio = _Glide$settings.touchRatio,\n classes = _Glide$settings.classes;\n var swipe = this.touches(event);\n var subExSx = toInt(swipe.pageX) - swipeStartX;\n var subEySy = toInt(swipe.pageY) - swipeStartY;\n var powEX = Math.abs(subExSx << 2);\n var powEY = Math.abs(subEySy << 2);\n var swipeHypotenuse = Math.sqrt(powEX + powEY);\n var swipeCathetus = Math.sqrt(powEY);\n swipeSin = Math.asin(swipeCathetus / swipeHypotenuse);\n\n if (swipeSin * 180 / Math.PI < touchAngle) {\n event.stopPropagation();\n Components.Move.make(subExSx * toFloat(touchRatio));\n Components.Html.root.classList.add(classes.dragging);\n Events.emit('swipe.move');\n } else {\n return false;\n }\n }\n },\n\n /**\n * Handler for `swipeend` event. Finitializes user's tap and decides about glide move.\n *\n * @param {Object} event\n * @return {Void}\n */\n end: function end(event) {\n if (!Glide.disabled) {\n var _Glide$settings2 = Glide.settings,\n perSwipe = _Glide$settings2.perSwipe,\n touchAngle = _Glide$settings2.touchAngle,\n classes = _Glide$settings2.classes;\n var swipe = this.touches(event);\n var threshold = this.threshold(event);\n var swipeDistance = swipe.pageX - swipeStartX;\n var swipeDeg = swipeSin * 180 / Math.PI;\n this.enable();\n\n if (swipeDistance > threshold && swipeDeg < touchAngle) {\n Components.Run.make(Components.Direction.resolve(\"\".concat(perSwipe, \"<\")));\n } else if (swipeDistance < -threshold && swipeDeg < touchAngle) {\n Components.Run.make(Components.Direction.resolve(\"\".concat(perSwipe, \">\")));\n } else {\n // While swipe don't reach distance apply previous transform.\n Components.Move.make();\n }\n\n Components.Html.root.classList.remove(classes.dragging);\n this.unbindSwipeMove();\n this.unbindSwipeEnd();\n Events.emit('swipe.end');\n }\n },\n\n /**\n * Binds swipe's starting event.\n *\n * @return {Void}\n */\n bindSwipeStart: function bindSwipeStart() {\n var _this = this;\n\n var _Glide$settings3 = Glide.settings,\n swipeThreshold = _Glide$settings3.swipeThreshold,\n dragThreshold = _Glide$settings3.dragThreshold;\n\n if (swipeThreshold) {\n Binder.on(START_EVENTS[0], Components.Html.wrapper, function (event) {\n _this.start(event);\n }, capture);\n }\n\n if (dragThreshold) {\n Binder.on(START_EVENTS[1], Components.Html.wrapper, function (event) {\n _this.start(event);\n }, capture);\n }\n },\n\n /**\n * Unbinds swipe's starting event.\n *\n * @return {Void}\n */\n unbindSwipeStart: function unbindSwipeStart() {\n Binder.off(START_EVENTS[0], Components.Html.wrapper, capture);\n Binder.off(START_EVENTS[1], Components.Html.wrapper, capture);\n },\n\n /**\n * Binds swipe's moving event.\n *\n * @return {Void}\n */\n bindSwipeMove: function bindSwipeMove() {\n var _this2 = this;\n\n Binder.on(MOVE_EVENTS, Components.Html.wrapper, throttle(function (event) {\n _this2.move(event);\n }, Glide.settings.throttle), capture);\n },\n\n /**\n * Unbinds swipe's moving event.\n *\n * @return {Void}\n */\n unbindSwipeMove: function unbindSwipeMove() {\n Binder.off(MOVE_EVENTS, Components.Html.wrapper, capture);\n },\n\n /**\n * Binds swipe's ending event.\n *\n * @return {Void}\n */\n bindSwipeEnd: function bindSwipeEnd() {\n var _this3 = this;\n\n Binder.on(END_EVENTS, Components.Html.wrapper, function (event) {\n _this3.end(event);\n });\n },\n\n /**\n * Unbinds swipe's ending event.\n *\n * @return {Void}\n */\n unbindSwipeEnd: function unbindSwipeEnd() {\n Binder.off(END_EVENTS, Components.Html.wrapper);\n },\n\n /**\n * Normalizes event touches points accorting to different types.\n *\n * @param {Object} event\n */\n touches: function touches(event) {\n if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n return event;\n }\n\n return event.touches[0] || event.changedTouches[0];\n },\n\n /**\n * Gets value of minimum swipe distance settings based on event type.\n *\n * @return {Number}\n */\n threshold: function threshold(event) {\n var settings = Glide.settings;\n\n if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n return settings.dragThreshold;\n }\n\n return settings.swipeThreshold;\n },\n\n /**\n * Enables swipe event.\n *\n * @return {self}\n */\n enable: function enable() {\n disabled = false;\n Components.Transition.enable();\n return this;\n },\n\n /**\n * Disables swipe event.\n *\n * @return {self}\n */\n disable: function disable() {\n disabled = true;\n Components.Transition.disable();\n return this;\n }\n };\n /**\n * Add component class:\n * - after initial building\n */\n\n Events.on('build.after', function () {\n Components.Html.root.classList.add(Glide.settings.classes.swipeable);\n });\n /**\n * Remove swiping bindings:\n * - on destroying, to remove added EventListeners\n */\n\n Events.on('destroy', function () {\n Swipe.unbindSwipeStart();\n Swipe.unbindSwipeMove();\n Swipe.unbindSwipeEnd();\n Binder.destroy();\n });\n return Swipe;\n}\n\nfunction images (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var Images = {\n /**\n * Binds listener to glide wrapper.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.bind();\n },\n\n /**\n * Binds `dragstart` event on wrapper to prevent dragging images.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('dragstart', Components.Html.wrapper, this.dragstart);\n },\n\n /**\n * Unbinds `dragstart` event on wrapper.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('dragstart', Components.Html.wrapper);\n },\n\n /**\n * Event handler. Prevents dragging.\n *\n * @return {Void}\n */\n dragstart: function dragstart(event) {\n event.preventDefault();\n }\n };\n /**\n * Remove bindings from images:\n * - on destroying, to remove added EventListeners\n */\n\n Events.on('destroy', function () {\n Images.unbind();\n Binder.destroy();\n });\n return Images;\n}\n\nfunction anchors (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n /**\n * Holds detaching status of anchors.\n * Prevents detaching of already detached anchors.\n *\n * @private\n * @type {Boolean}\n */\n\n var detached = false;\n /**\n * Holds preventing status of anchors.\n * If `true` redirection after click will be disabled.\n *\n * @private\n * @type {Boolean}\n */\n\n var prevented = false;\n var Anchors = {\n /**\n * Setups a initial state of anchors component.\n *\n * @returns {Void}\n */\n mount: function mount() {\n /**\n * Holds collection of anchors elements.\n *\n * @private\n * @type {HTMLCollection}\n */\n this._a = Components.Html.wrapper.querySelectorAll('a');\n this.bind();\n },\n\n /**\n * Binds events to anchors inside a track.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('click', Components.Html.wrapper, this.click);\n },\n\n /**\n * Unbinds events attached to anchors inside a track.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('click', Components.Html.wrapper);\n },\n\n /**\n * Handler for click event. Prevents clicks when glide is in `prevent` status.\n *\n * @param {Object} event\n * @return {Void}\n */\n click: function click(event) {\n if (prevented) {\n event.stopPropagation();\n event.preventDefault();\n }\n },\n\n /**\n * Detaches anchors click event inside glide.\n *\n * @return {self}\n */\n detach: function detach() {\n prevented = true;\n\n if (!detached) {\n for (var i = 0; i < this.items.length; i++) {\n this.items[i].draggable = false;\n }\n\n detached = true;\n }\n\n return this;\n },\n\n /**\n * Attaches anchors click events inside glide.\n *\n * @return {self}\n */\n attach: function attach() {\n prevented = false;\n\n if (detached) {\n for (var i = 0; i < this.items.length; i++) {\n this.items[i].draggable = true;\n }\n\n detached = false;\n }\n\n return this;\n }\n };\n define(Anchors, 'items', {\n /**\n * Gets collection of the arrows HTML elements.\n *\n * @return {HTMLElement[]}\n */\n get: function get() {\n return Anchors._a;\n }\n });\n /**\n * Detach anchors inside slides:\n * - on swiping, so they won't redirect to its `href` attributes\n */\n\n Events.on('swipe.move', function () {\n Anchors.detach();\n });\n /**\n * Attach anchors inside slides:\n * - after swiping and transitions ends, so they can redirect after click again\n */\n\n Events.on('swipe.end', function () {\n Components.Transition.after(function () {\n Anchors.attach();\n });\n });\n /**\n * Unbind anchors inside slides:\n * - on destroying, to bring anchors to its initial state\n */\n\n Events.on('destroy', function () {\n Anchors.attach();\n Anchors.unbind();\n Binder.destroy();\n });\n return Anchors;\n}\n\nvar NAV_SELECTOR = '[data-glide-el=\"controls[nav]\"]';\nvar CONTROLS_SELECTOR = '[data-glide-el^=\"controls\"]';\nvar PREVIOUS_CONTROLS_SELECTOR = \"\".concat(CONTROLS_SELECTOR, \" [data-glide-dir*=\\\"<\\\"]\");\nvar NEXT_CONTROLS_SELECTOR = \"\".concat(CONTROLS_SELECTOR, \" [data-glide-dir*=\\\">\\\"]\");\nfunction controls (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var capture = supportsPassive$1 ? {\n passive: true\n } : false;\n var Controls = {\n /**\n * Inits arrows. Binds events listeners\n * to the arrows HTML elements.\n *\n * @return {Void}\n */\n mount: function mount() {\n /**\n * Collection of navigation HTML elements.\n *\n * @private\n * @type {HTMLCollection}\n */\n this._n = Components.Html.root.querySelectorAll(NAV_SELECTOR);\n /**\n * Collection of controls HTML elements.\n *\n * @private\n * @type {HTMLCollection}\n */\n\n this._c = Components.Html.root.querySelectorAll(CONTROLS_SELECTOR);\n /**\n * Collection of arrow control HTML elements.\n *\n * @private\n * @type {Object}\n */\n\n this._arrowControls = {\n previous: Components.Html.root.querySelectorAll(PREVIOUS_CONTROLS_SELECTOR),\n next: Components.Html.root.querySelectorAll(NEXT_CONTROLS_SELECTOR)\n };\n this.addBindings();\n },\n\n /**\n * Sets active class to current slide.\n *\n * @return {Void}\n */\n setActive: function setActive() {\n for (var i = 0; i < this._n.length; i++) {\n this.addClass(this._n[i].children);\n }\n },\n\n /**\n * Removes active class to current slide.\n *\n * @return {Void}\n */\n removeActive: function removeActive() {\n for (var i = 0; i < this._n.length; i++) {\n this.removeClass(this._n[i].children);\n }\n },\n\n /**\n * Toggles active class on items inside navigation.\n *\n * @param {HTMLElement} controls\n * @return {Void}\n */\n addClass: function addClass(controls) {\n var settings = Glide.settings;\n var item = controls[Glide.index];\n\n if (!item) {\n return;\n }\n\n item.classList.add(settings.classes.nav.active);\n siblings(item).forEach(function (sibling) {\n sibling.classList.remove(settings.classes.nav.active);\n });\n },\n\n /**\n * Removes active class from active control.\n *\n * @param {HTMLElement} controls\n * @return {Void}\n */\n removeClass: function removeClass(controls) {\n var item = controls[Glide.index];\n item === null || item === void 0 ? void 0 : item.classList.remove(Glide.settings.classes.nav.active);\n },\n\n /**\n * Calculates, removes or adds `Glide.settings.classes.disabledArrow` class on the control arrows\n */\n setArrowState: function setArrowState() {\n if (Glide.settings.rewind) {\n return;\n }\n\n var next = Controls._arrowControls.next;\n var previous = Controls._arrowControls.previous;\n this.resetArrowState(next, previous);\n\n if (Glide.index === 0) {\n this.disableArrow(previous);\n }\n\n if (Glide.index === Components.Run.length) {\n this.disableArrow(next);\n }\n },\n\n /**\n * Removes `Glide.settings.classes.disabledArrow` from given NodeList elements\n *\n * @param {NodeList[]} lists\n */\n resetArrowState: function resetArrowState() {\n var settings = Glide.settings;\n\n for (var _len = arguments.length, lists = new Array(_len), _key = 0; _key < _len; _key++) {\n lists[_key] = arguments[_key];\n }\n\n lists.forEach(function (list) {\n toArray(list).forEach(function (element) {\n element.classList.remove(settings.classes.arrow.disabled);\n });\n });\n },\n\n /**\n * Adds `Glide.settings.classes.disabledArrow` to given NodeList elements\n *\n * @param {NodeList[]} lists\n */\n disableArrow: function disableArrow() {\n var settings = Glide.settings;\n\n for (var _len2 = arguments.length, lists = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n lists[_key2] = arguments[_key2];\n }\n\n lists.forEach(function (list) {\n toArray(list).forEach(function (element) {\n element.classList.add(settings.classes.arrow.disabled);\n });\n });\n },\n\n /**\n * Adds handles to the each group of controls.\n *\n * @return {Void}\n */\n addBindings: function addBindings() {\n for (var i = 0; i < this._c.length; i++) {\n this.bind(this._c[i].children);\n }\n },\n\n /**\n * Removes handles from the each group of controls.\n *\n * @return {Void}\n */\n removeBindings: function removeBindings() {\n for (var i = 0; i < this._c.length; i++) {\n this.unbind(this._c[i].children);\n }\n },\n\n /**\n * Binds events to arrows HTML elements.\n *\n * @param {HTMLCollection} elements\n * @return {Void}\n */\n bind: function bind(elements) {\n for (var i = 0; i < elements.length; i++) {\n Binder.on('click', elements[i], this.click);\n Binder.on('touchstart', elements[i], this.click, capture);\n }\n },\n\n /**\n * Unbinds events binded to the arrows HTML elements.\n *\n * @param {HTMLCollection} elements\n * @return {Void}\n */\n unbind: function unbind(elements) {\n for (var i = 0; i < elements.length; i++) {\n Binder.off(['click', 'touchstart'], elements[i]);\n }\n },\n\n /**\n * Handles `click` event on the arrows HTML elements.\n * Moves slider in direction given via the\n * `data-glide-dir` attribute.\n *\n * @param {Object} event\n * @return {void}\n */\n click: function click(event) {\n if (!supportsPassive$1 && event.type === 'touchstart') {\n event.preventDefault();\n }\n\n var direction = event.currentTarget.getAttribute('data-glide-dir');\n Components.Run.make(Components.Direction.resolve(direction));\n }\n };\n define(Controls, 'items', {\n /**\n * Gets collection of the controls HTML elements.\n *\n * @return {HTMLElement[]}\n */\n get: function get() {\n return Controls._c;\n }\n });\n /**\n * Swap active class of current navigation item:\n * - after mounting to set it to initial index\n * - after each move to the new index\n */\n\n Events.on(['mount.after', 'move.after'], function () {\n Controls.setActive();\n });\n /**\n * Add or remove disabled class of arrow elements\n */\n\n Events.on(['mount.after', 'run'], function () {\n Controls.setArrowState();\n });\n /**\n * Remove bindings and HTML Classes:\n * - on destroying, to bring markup to its initial state\n */\n\n Events.on('destroy', function () {\n Controls.removeBindings();\n Controls.removeActive();\n Binder.destroy();\n });\n return Controls;\n}\n\nfunction keyboard (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var Keyboard = {\n /**\n * Binds keyboard events on component mount.\n *\n * @return {Void}\n */\n mount: function mount() {\n if (Glide.settings.keyboard) {\n this.bind();\n }\n },\n\n /**\n * Adds keyboard press events.\n *\n * @return {Void}\n */\n bind: function bind() {\n Binder.on('keyup', document, this.press);\n },\n\n /**\n * Removes keyboard press events.\n *\n * @return {Void}\n */\n unbind: function unbind() {\n Binder.off('keyup', document);\n },\n\n /**\n * Handles keyboard's arrows press and moving glide foward and backward.\n *\n * @param {Object} event\n * @return {Void}\n */\n press: function press(event) {\n var perSwipe = Glide.settings.perSwipe;\n var arrowSymbols = {\n ArrowRight: '>',\n ArrowLeft: '<'\n };\n\n if (['ArrowRight', 'ArrowLeft'].includes(event.code)) {\n Components.Run.make(Components.Direction.resolve(\"\".concat(perSwipe).concat(arrowSymbols[event.code])));\n }\n }\n };\n /**\n * Remove bindings from keyboard:\n * - on destroying to remove added events\n * - on updating to remove events before remounting\n */\n\n Events.on(['destroy', 'update'], function () {\n Keyboard.unbind();\n });\n /**\n * Remount component\n * - on updating to reflect potential changes in settings\n */\n\n Events.on('update', function () {\n Keyboard.mount();\n });\n /**\n * Destroy binder:\n * - on destroying to remove listeners\n */\n\n Events.on('destroy', function () {\n Binder.destroy();\n });\n return Keyboard;\n}\n\nfunction autoplay (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n var Autoplay = {\n /**\n * Initializes autoplaying and events.\n *\n * @return {Void}\n */\n mount: function mount() {\n this.enable();\n this.start();\n\n if (Glide.settings.hoverpause) {\n this.bind();\n }\n },\n\n /**\n * Enables autoplaying\n *\n * @returns {Void}\n */\n enable: function enable() {\n this._e = true;\n },\n\n /**\n * Disables autoplaying.\n *\n * @returns {Void}\n */\n disable: function disable() {\n this._e = false;\n },\n\n /**\n * Starts autoplaying in configured interval.\n *\n * @param {Boolean|Number} force Run autoplaying with passed interval regardless of `autoplay` settings\n * @return {Void}\n */\n start: function start() {\n var _this = this;\n\n if (!this._e) {\n return;\n }\n\n this.enable();\n\n if (Glide.settings.autoplay) {\n if (isUndefined(this._i)) {\n this._i = setInterval(function () {\n _this.stop();\n\n Components.Run.make('>');\n\n _this.start();\n\n Events.emit('autoplay');\n }, this.time);\n }\n }\n },\n\n /**\n * Stops autorunning of the glide.\n *\n * @return {Void}\n */\n stop: function stop() {\n this._i = clearInterval(this._i);\n },\n\n /**\n * Stops autoplaying while mouse is over glide's area.\n *\n * @return {Void}\n */\n bind: function bind() {\n var _this2 = this;\n\n Binder.on('mouseover', Components.Html.root, function () {\n if (_this2._e) {\n _this2.stop();\n }\n });\n Binder.on('mouseout', Components.Html.root, function () {\n if (_this2._e) {\n _this2.start();\n }\n });\n },\n\n /**\n * Unbind mouseover events.\n *\n * @returns {Void}\n */\n unbind: function unbind() {\n Binder.off(['mouseover', 'mouseout'], Components.Html.root);\n }\n };\n define(Autoplay, 'time', {\n /**\n * Gets time period value for the autoplay interval. Prioritizes\n * times in `data-glide-autoplay` attrubutes over options.\n *\n * @return {Number}\n */\n get: function get() {\n var autoplay = Components.Html.slides[Glide.index].getAttribute('data-glide-autoplay');\n\n if (autoplay) {\n return toInt(autoplay);\n }\n\n return toInt(Glide.settings.autoplay);\n }\n });\n /**\n * Stop autoplaying and unbind events:\n * - on destroying, to clear defined interval\n * - on updating via API to reset interval that may changed\n */\n\n Events.on(['destroy', 'update'], function () {\n Autoplay.unbind();\n });\n /**\n * Stop autoplaying:\n * - before each run, to restart autoplaying\n * - on pausing via API\n * - on destroying, to clear defined interval\n * - while starting a swipe\n * - on updating via API to reset interval that may changed\n */\n\n Events.on(['run.before', 'swipe.start', 'update'], function () {\n Autoplay.stop();\n });\n Events.on(['pause', 'destroy'], function () {\n Autoplay.disable();\n Autoplay.stop();\n });\n /**\n * Start autoplaying:\n * - after each run, to restart autoplaying\n * - on playing via API\n * - while ending a swipe\n */\n\n Events.on(['run.after', 'swipe.end'], function () {\n Autoplay.start();\n });\n /**\n * Start autoplaying:\n * - after each run, to restart autoplaying\n * - on playing via API\n * - while ending a swipe\n */\n\n Events.on(['play'], function () {\n Autoplay.enable();\n Autoplay.start();\n });\n /**\n * Remount autoplaying:\n * - on updating via API to reset interval that may changed\n */\n\n Events.on('update', function () {\n Autoplay.mount();\n });\n /**\n * Destroy a binder:\n * - on destroying glide instance to clearup listeners\n */\n\n Events.on('destroy', function () {\n Binder.destroy();\n });\n return Autoplay;\n}\n\n/**\n * Sorts keys of breakpoint object so they will be ordered from lower to bigger.\n *\n * @param {Object} points\n * @returns {Object}\n */\n\nfunction sortBreakpoints(points) {\n if (isObject(points)) {\n return sortKeys(points);\n } else {\n warn(\"Breakpoints option must be an object\");\n }\n\n return {};\n}\n\nfunction breakpoints (Glide, Components, Events) {\n /**\n * Instance of the binder for DOM Events.\n *\n * @type {EventsBinder}\n */\n var Binder = new EventsBinder();\n /**\n * Holds reference to settings.\n *\n * @type {Object}\n */\n\n var settings = Glide.settings;\n /**\n * Holds reference to breakpoints object in settings. Sorts breakpoints\n * from smaller to larger. It is required in order to proper\n * matching currently active breakpoint settings.\n *\n * @type {Object}\n */\n\n var points = sortBreakpoints(settings.breakpoints);\n /**\n * Cache initial settings before overwritting.\n *\n * @type {Object}\n */\n\n var defaults = Object.assign({}, settings);\n var Breakpoints = {\n /**\n * Matches settings for currectly matching media breakpoint.\n *\n * @param {Object} points\n * @returns {Object}\n */\n match: function match(points) {\n if (typeof window.matchMedia !== 'undefined') {\n for (var point in points) {\n if (points.hasOwnProperty(point)) {\n if (window.matchMedia(\"(max-width: \".concat(point, \"px)\")).matches) {\n return points[point];\n }\n }\n }\n }\n\n return defaults;\n }\n };\n /**\n * Overwrite instance settings with currently matching breakpoint settings.\n * This happens right after component initialization.\n */\n\n Object.assign(settings, Breakpoints.match(points));\n /**\n * Update glide with settings of matched brekpoint:\n * - window resize to update slider\n */\n\n Binder.on('resize', window, throttle(function () {\n Glide.settings = mergeOptions(settings, Breakpoints.match(points));\n }, Glide.settings.throttle));\n /**\n * Resort and update default settings:\n * - on reinit via API, so breakpoint matching will be performed with options\n */\n\n Events.on('update', function () {\n points = sortBreakpoints(points);\n defaults = Object.assign({}, settings);\n });\n /**\n * Unbind resize listener:\n * - on destroying, to bring markup to its initial state\n */\n\n Events.on('destroy', function () {\n Binder.off('resize', window);\n });\n return Breakpoints;\n}\n\nvar COMPONENTS = {\n Html: Html,\n Translate: Translate,\n Transition: Transition,\n Direction: Direction,\n Peek: Peek,\n Sizes: Sizes,\n Gaps: Gaps,\n Move: Move,\n Clones: Clones,\n Resize: Resize,\n Build: Build,\n Run: Run\n};\n\nvar Glide = /*#__PURE__*/function (_Core) {\n _inherits(Glide, _Core);\n\n var _super = _createSuper(Glide);\n\n function Glide() {\n _classCallCheck(this, Glide);\n\n return _super.apply(this, arguments);\n }\n\n _createClass(Glide, [{\n key: \"mount\",\n value: function mount() {\n var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return _get(_getPrototypeOf(Glide.prototype), \"mount\", this).call(this, Object.assign({}, COMPONENTS, extensions));\n }\n }]);\n\n return Glide;\n}(Glide$1);\n\nexport { anchors as Anchors, autoplay as Autoplay, breakpoints as Breakpoints, controls as Controls, images as Images, keyboard as Keyboard, swipe as Swipe, Glide as default };\n","/*!\n * PhotoSwipe 5.4.4 - https://photoswipe.com\n * (c) 2024 Dmytro Semenov\n */\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/**\r\n * @template {keyof HTMLElementTagNameMap} T\r\n * @param {string} className\r\n * @param {T} tagName\r\n * @param {Node} [appendToEl]\r\n * @returns {HTMLElementTagNameMap[T]}\r\n */\nfunction createElement(className, tagName, appendToEl) {\n const el = document.createElement(tagName);\n\n if (className) {\n el.className = className;\n }\n\n if (appendToEl) {\n appendToEl.appendChild(el);\n }\n\n return el;\n}\n/**\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {Point}\r\n */\n\nfunction equalizePoints(p1, p2) {\n p1.x = p2.x;\n p1.y = p2.y;\n\n if (p2.id !== undefined) {\n p1.id = p2.id;\n }\n\n return p1;\n}\n/**\r\n * @param {Point} p\r\n */\n\nfunction roundPoint(p) {\n p.x = Math.round(p.x);\n p.y = Math.round(p.y);\n}\n/**\r\n * Returns distance between two points.\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {number}\r\n */\n\nfunction getDistanceBetween(p1, p2) {\n const x = Math.abs(p1.x - p2.x);\n const y = Math.abs(p1.y - p2.y);\n return Math.sqrt(x * x + y * y);\n}\n/**\r\n * Whether X and Y positions of points are equal\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {boolean}\r\n */\n\nfunction pointsEqual(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\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 * @returns {number}\r\n */\n\nfunction clamp(val, min, max) {\n return Math.min(Math.max(val, min), max);\n}\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 * @returns {string}\r\n */\n\nfunction toTransformString(x, y, scale) {\n let propValue = `translate3d(${x}px,${y || 0}px,0)`;\n\n if (scale !== undefined) {\n propValue += ` scale3d(${scale},${scale},1)`;\n }\n\n return propValue;\n}\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 */\n\nfunction setTransform(el, x, y, scale) {\n el.style.transform = toTransformString(x, y, scale);\n}\nconst defaultCSSEasing = 'cubic-bezier(.4,0,.22,1)';\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 */\n\nfunction setTransitionStyle(el, prop, duration, ease) {\n // inOut: 'cubic-bezier(.4, 0, .22, 1)', // for \"toggle state\" transitions\n // out: 'cubic-bezier(0, 0, .22, 1)', // for \"show\" transitions\n // in: 'cubic-bezier(.4, 0, 1, 1)'// for \"hide\" transitions\n el.style.transition = prop ? `${prop} ${duration}ms ${ease || defaultCSSEasing}` : 'none';\n}\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 */\n\nfunction setWidthHeight(el, w, h) {\n el.style.width = typeof w === 'number' ? `${w}px` : w;\n el.style.height = typeof h === 'number' ? `${h}px` : h;\n}\n/**\r\n * @param {HTMLElement} el\r\n */\n\nfunction removeTransitionStyle(el) {\n setTransitionStyle(el);\n}\n/**\r\n * @param {HTMLImageElement} img\r\n * @returns {Promise<HTMLImageElement | void>}\r\n */\n\nfunction decodeImage(img) {\n if ('decode' in img) {\n return img.decode().catch(() => {});\n }\n\n if (img.complete) {\n return Promise.resolve(img);\n }\n\n return new Promise((resolve, reject) => {\n img.onload = () => resolve(img);\n\n img.onerror = reject;\n });\n}\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\n\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\n\nconst LOAD_STATE = {\n IDLE: 'idle',\n LOADING: 'loading',\n LOADED: 'loaded',\n ERROR: 'error'\n};\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 * @returns {boolean}\r\n */\n\nfunction specialKeyUsed(e) {\n return 'button' in e && e.button === 1 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey;\n}\n/**\r\n * Parse `gallery` or `children` options.\r\n *\r\n * @param {import('../photoswipe.js').ElementProvider} [option]\r\n * @param {string} [legacySelector]\r\n * @param {HTMLElement | Document} [parent]\r\n * @returns HTMLElement[]\r\n */\n\nfunction getElementsFromOption(option, legacySelector, parent = document) {\n /** @type {HTMLElement[]} */\n let elements = [];\n\n if (option instanceof Element) {\n elements = [option];\n } else if (option instanceof NodeList || Array.isArray(option)) {\n elements = Array.from(option);\n } else {\n const selector = typeof option === 'string' ? option : legacySelector;\n\n if (selector) {\n elements = Array.from(parent.querySelectorAll(selector));\n }\n }\n\n return elements;\n}\n/**\r\n * Check if browser is Safari\r\n *\r\n * @returns {boolean}\r\n */\n\nfunction isSafari() {\n return !!(navigator.vendor && navigator.vendor.match(/apple/i));\n}\n\n// Detect passive event listener support\nlet supportsPassive = false;\n/* eslint-disable */\n\ntry {\n /* @ts-ignore */\n window.addEventListener('test', null, Object.defineProperty({}, 'passive', {\n get: () => {\n supportsPassive = true;\n }\n }));\n} catch (e) {}\n/* eslint-enable */\n\n/**\r\n * @typedef {Object} PoolItem\r\n * @prop {HTMLElement | Window | Document | undefined | null} target\r\n * @prop {string} type\r\n * @prop {EventListenerOrEventListenerObject} listener\r\n * @prop {boolean} [passive]\r\n */\n\n\nclass DOMEvents {\n constructor() {\n /**\r\n * @type {PoolItem[]}\r\n * @private\r\n */\n this._pool = [];\n }\n /**\r\n * Adds event listeners\r\n *\r\n * @param {PoolItem['target']} target\r\n * @param {PoolItem['type']} type Can be multiple, separated by space.\r\n * @param {PoolItem['listener']} listener\r\n * @param {PoolItem['passive']} [passive]\r\n */\n\n\n add(target, type, listener, passive) {\n this._toggleListener(target, type, listener, passive);\n }\n /**\r\n * Removes event listeners\r\n *\r\n * @param {PoolItem['target']} target\r\n * @param {PoolItem['type']} type\r\n * @param {PoolItem['listener']} listener\r\n * @param {PoolItem['passive']} [passive]\r\n */\n\n\n remove(target, type, listener, passive) {\n this._toggleListener(target, type, listener, passive, true);\n }\n /**\r\n * Removes all bound events\r\n */\n\n\n removeAll() {\n this._pool.forEach(poolItem => {\n this._toggleListener(poolItem.target, poolItem.type, poolItem.listener, poolItem.passive, true, true);\n });\n\n this._pool = [];\n }\n /**\r\n * Adds or removes event\r\n *\r\n * @private\r\n * @param {PoolItem['target']} target\r\n * @param {PoolItem['type']} type\r\n * @param {PoolItem['listener']} listener\r\n * @param {PoolItem['passive']} [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 */\n\n\n _toggleListener(target, type, listener, passive, unbind, skipPool) {\n if (!target) {\n return;\n }\n\n const methodName = unbind ? 'removeEventListener' : 'addEventListener';\n const types = type.split(' ');\n types.forEach(eType => {\n if (eType) {\n // Events pool is used to easily unbind all events when PhotoSwipe is closed,\n // so developer doesn't need to do this manually\n if (!skipPool) {\n if (unbind) {\n // Remove from the events pool\n this._pool = this._pool.filter(poolItem => {\n return poolItem.type !== eType || poolItem.listener !== listener || poolItem.target !== target;\n });\n } else {\n // Add to the events pool\n this._pool.push({\n target,\n type: eType,\n listener,\n passive\n });\n }\n } // most PhotoSwipe events call preventDefault,\n // and we do not need browser to scroll the page\n\n\n const eventOptions = supportsPassive ? {\n passive: passive || false\n } : false;\n target[methodName](eType, listener, eventOptions);\n }\n });\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipeBase} pswp\r\n * @returns {Point}\r\n */\nfunction getViewportSize(options, pswp) {\n if (options.getViewportSizeFn) {\n const newViewportSize = options.getViewportSizeFn(options, pswp);\n\n if (newViewportSize) {\n return newViewportSize;\n }\n }\n\n return {\n x: document.documentElement.clientWidth,\n // TODO: height on mobile is very incosistent due to toolbar\n // find a way to improve this\n //\n // document.documentElement.clientHeight - doesn't seem to work well\n y: window.innerHeight\n };\n}\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 {Point} 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 */\n\nfunction parsePaddingOption(prop, options, viewportSize, itemData, index) {\n let paddingValue = 0;\n\n if (options.paddingFn) {\n paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\n } else if (options.padding) {\n paddingValue = options.padding[prop];\n } else {\n const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1); // @ts-expect-error\n\n if (options[legacyPropName]) {\n // @ts-expect-error\n paddingValue = options[legacyPropName];\n }\n }\n\n return Number(paddingValue) || 0;\n}\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {Point} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n * @returns {Point}\r\n */\n\nfunction getPanAreaSize(options, viewportSize, itemData, index) {\n return {\n x: viewportSize.x - parsePaddingOption('left', options, viewportSize, itemData, index) - parsePaddingOption('right', options, viewportSize, itemData, index),\n y: viewportSize.y - parsePaddingOption('top', options, viewportSize, itemData, index) - parsePaddingOption('bottom', options, viewportSize, itemData, index)\n };\n}\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {Record<Axis, number>} Point */\n\n/** @typedef {'x' | 'y'} Axis */\n\n/**\r\n * Calculates minimum, maximum and initial (center) bounds of a slide\r\n */\n\nclass PanBounds {\n /**\r\n * @param {Slide} slide\r\n */\n constructor(slide) {\n this.slide = slide;\n this.currZoomLevel = 1;\n this.center =\n /** @type {Point} */\n {\n x: 0,\n y: 0\n };\n this.max =\n /** @type {Point} */\n {\n x: 0,\n y: 0\n };\n this.min =\n /** @type {Point} */\n {\n x: 0,\n y: 0\n };\n }\n /**\r\n * _getItemBounds\r\n *\r\n * @param {number} currZoomLevel\r\n */\n\n\n update(currZoomLevel) {\n this.currZoomLevel = currZoomLevel;\n\n if (!this.slide.width) {\n this.reset();\n } else {\n this._updateAxis('x');\n\n this._updateAxis('y');\n\n this.slide.pswp.dispatch('calcBounds', {\n slide: this.slide\n });\n }\n }\n /**\r\n * _calculateItemBoundsForAxis\r\n *\r\n * @param {Axis} axis\r\n */\n\n\n _updateAxis(axis) {\n const {\n pswp\n } = this.slide;\n const elSize = this.slide[axis === 'x' ? 'width' : 'height'] * this.currZoomLevel;\n const paddingProp = axis === 'x' ? 'left' : 'top';\n const padding = parsePaddingOption(paddingProp, pswp.options, pswp.viewportSize, this.slide.data, this.slide.index);\n const panAreaSize = this.slide.panAreaSize[axis]; // Default position of element.\n // By default, it is center of viewport:\n\n this.center[axis] = Math.round((panAreaSize - elSize) / 2) + padding; // maximum pan position\n\n this.max[axis] = elSize > panAreaSize ? Math.round(panAreaSize - elSize) + padding : this.center[axis]; // minimum pan position\n\n this.min[axis] = elSize > panAreaSize ? padding : this.center[axis];\n } // _getZeroBounds\n\n\n reset() {\n this.center.x = 0;\n this.center.y = 0;\n this.max.x = 0;\n this.max.y = 0;\n this.min.x = 0;\n this.min.y = 0;\n }\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 * @returns {number}\r\n */\n\n\n correctPan(axis, panOffset) {\n // checkPanBounds\n return clamp(panOffset, this.max[axis], this.min[axis]);\n }\n\n}\n\nconst MAX_IMAGE_WIDTH = 4000;\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\n\n/**\r\n * Calculates zoom levels for specific slide.\r\n * Depends on viewport size and image size.\r\n */\n\nclass ZoomLevel {\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 */\n constructor(options, itemData, index, pswp) {\n this.pswp = pswp;\n this.options = options;\n this.itemData = itemData;\n this.index = index;\n /** @type { Point | null } */\n\n this.panAreaSize = null;\n /** @type { Point | null } */\n\n this.elementSize = null;\n this.fit = 1;\n this.fill = 1;\n this.vFill = 1;\n this.initial = 1;\n this.secondary = 1;\n this.max = 1;\n this.min = 1;\n }\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 {Point} panAreaSize\r\n */\n\n\n update(maxWidth, maxHeight, panAreaSize) {\n /** @type {Point} */\n const elementSize = {\n x: maxWidth,\n y: maxHeight\n };\n this.elementSize = elementSize;\n this.panAreaSize = panAreaSize;\n const hRatio = panAreaSize.x / elementSize.x;\n const vRatio = panAreaSize.y / elementSize.y;\n this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\n this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio); // zoom.vFill defines zoom level of the image\n // when it has 100% of viewport vertical space (height)\n\n this.vFill = Math.min(1, vRatio);\n this.initial = this._getInitial();\n this.secondary = this._getSecondary();\n this.max = Math.max(this.initial, this.secondary, this._getMax());\n this.min = Math.min(this.fit, this.initial, this.secondary);\n\n if (this.pswp) {\n this.pswp.dispatch('zoomLevelsUpdate', {\n zoomLevels: this,\n slideData: this.itemData\n });\n }\n }\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 * @returns { number | undefined }\r\n */\n\n\n _parseZoomLevelOption(optionPrefix) {\n const optionName =\n /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */\n optionPrefix + 'ZoomLevel';\n const optionValue = this.options[optionName];\n\n if (!optionValue) {\n return;\n }\n\n if (typeof optionValue === 'function') {\n return optionValue(this);\n }\n\n if (optionValue === 'fill') {\n return this.fill;\n }\n\n if (optionValue === 'fit') {\n return this.fit;\n }\n\n return Number(optionValue);\n }\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 */\n\n\n _getSecondary() {\n let currZoomLevel = this._parseZoomLevelOption('secondary');\n\n if (currZoomLevel) {\n return currZoomLevel;\n } // 3x of \"fit\" state, but not larger than original\n\n\n currZoomLevel = Math.min(1, this.fit * 3);\n\n if (this.elementSize && currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\n currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\n }\n\n return currZoomLevel;\n }\n /**\r\n * Get initial image zoom level.\r\n *\r\n * @private\r\n * @return {number}\r\n */\n\n\n _getInitial() {\n return this._parseZoomLevelOption('initial') || this.fit;\n }\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 */\n\n\n _getMax() {\n // max zoom level is x4 from \"fit state\",\n // used for zoom gesture and ctrl/trackpad zoom\n return this._parseZoomLevelOption('max') || Math.max(1, this.fit * 4);\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n/**\r\n * Renders and allows to control a single slide\r\n */\n\nclass Slide {\n /**\r\n * @param {SlideData} data\r\n * @param {number} index\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(data, index, pswp) {\n this.data = data;\n this.index = index;\n this.pswp = pswp;\n this.isActive = index === pswp.currIndex;\n this.currentResolution = 0;\n /** @type {Point} */\n\n this.panAreaSize = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.pan = {\n x: 0,\n y: 0\n };\n this.isFirstSlide = this.isActive && !pswp.opener.isOpen;\n this.zoomLevels = new ZoomLevel(pswp.options, data, index, pswp);\n this.pswp.dispatch('gettingData', {\n slide: this,\n data: this.data,\n index\n });\n this.content = this.pswp.contentLoader.getContentBySlide(this);\n this.container = createElement('pswp__zoom-wrap', 'div');\n /** @type {HTMLElement | null} */\n\n this.holderElement = null;\n this.currZoomLevel = 1;\n /** @type {number} */\n\n this.width = this.content.width;\n /** @type {number} */\n\n this.height = this.content.height;\n this.heavyAppended = false;\n this.bounds = new PanBounds(this);\n this.prevDisplayedWidth = -1;\n this.prevDisplayedHeight = -1;\n this.pswp.dispatch('slideInit', {\n slide: this\n });\n }\n /**\r\n * If this slide is active/current/visible\r\n *\r\n * @param {boolean} isActive\r\n */\n\n\n setIsActive(isActive) {\n if (isActive && !this.isActive) {\n // slide just became active\n this.activate();\n } else if (!isActive && this.isActive) {\n // slide just became non-active\n this.deactivate();\n }\n }\n /**\r\n * Appends slide content to DOM\r\n *\r\n * @param {HTMLElement} holderElement\r\n */\n\n\n append(holderElement) {\n this.holderElement = holderElement;\n this.container.style.transformOrigin = '0 0'; // Slide appended to DOM\n\n if (!this.data) {\n return;\n }\n\n this.calculateSize();\n this.load();\n this.updateContentSize();\n this.appendHeavy();\n this.holderElement.appendChild(this.container);\n this.zoomAndPanToInitial();\n this.pswp.dispatch('firstZoomPan', {\n slide: this\n });\n this.applyCurrentZoomPan();\n this.pswp.dispatch('afterSetContent', {\n slide: this\n });\n\n if (this.isActive) {\n this.activate();\n }\n }\n\n load() {\n this.content.load(false);\n this.pswp.dispatch('slideLoad', {\n slide: this\n });\n }\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 */\n\n\n appendHeavy() {\n const {\n pswp\n } = this;\n const appendHeavyNearby = true; // todo\n // Avoid appending heavy elements during animations\n\n if (this.heavyAppended || !pswp.opener.isOpen || pswp.mainScroll.isShifted() || !this.isActive && !appendHeavyNearby) {\n return;\n }\n\n if (this.pswp.dispatch('appendHeavy', {\n slide: this\n }).defaultPrevented) {\n return;\n }\n\n this.heavyAppended = true;\n this.content.append();\n this.pswp.dispatch('appendHeavyContent', {\n slide: this\n });\n }\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 */\n\n\n activate() {\n this.isActive = true;\n this.appendHeavy();\n this.content.activate();\n this.pswp.dispatch('slideActivate', {\n slide: this\n });\n }\n /**\r\n * Triggered when this slide becomes inactive.\r\n *\r\n * Slide can become inactive only after it was active.\r\n */\n\n\n deactivate() {\n this.isActive = false;\n this.content.deactivate();\n\n if (this.currZoomLevel !== this.zoomLevels.initial) {\n // allow filtering\n this.calculateSize();\n } // reset zoom level\n\n\n this.currentResolution = 0;\n this.zoomAndPanToInitial();\n this.applyCurrentZoomPan();\n this.updateContentSize();\n this.pswp.dispatch('slideDeactivate', {\n slide: this\n });\n }\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 */\n\n\n destroy() {\n this.content.hasSlide = false;\n this.content.remove();\n this.container.remove();\n this.pswp.dispatch('slideDestroy', {\n slide: this\n });\n }\n\n resize() {\n if (this.currZoomLevel === this.zoomLevels.initial || !this.isActive) {\n // Keep initial zoom level if it was before the resize,\n // as well as when this slide is not active\n // Reset position and scale to original state\n this.calculateSize();\n this.currentResolution = 0;\n this.zoomAndPanToInitial();\n this.applyCurrentZoomPan();\n this.updateContentSize();\n } else {\n // readjust pan position if it's beyond the bounds\n this.calculateSize();\n this.bounds.update(this.currZoomLevel);\n this.panTo(this.pan.x, this.pan.y);\n }\n }\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 */\n\n\n updateContentSize(force) {\n // Use initial zoom level\n // if resolution is not defined (user didn't zoom yet)\n const scaleMultiplier = this.currentResolution || this.zoomLevels.initial;\n\n if (!scaleMultiplier) {\n return;\n }\n\n const width = Math.round(this.width * scaleMultiplier) || this.pswp.viewportSize.x;\n const height = Math.round(this.height * scaleMultiplier) || this.pswp.viewportSize.y;\n\n if (!this.sizeChanged(width, height) && !force) {\n return;\n }\n\n this.content.setDisplayedSize(width, height);\n }\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\n\n\n sizeChanged(width, height) {\n if (width !== this.prevDisplayedWidth || height !== this.prevDisplayedHeight) {\n this.prevDisplayedWidth = width;\n this.prevDisplayedHeight = height;\n return true;\n }\n\n return false;\n }\n /** @returns {HTMLImageElement | HTMLDivElement | null | undefined} */\n\n\n getPlaceholderElement() {\n var _this$content$placeho;\n\n return (_this$content$placeho = this.content.placeholder) === null || _this$content$placeho === void 0 ? void 0 : _this$content$placeho.element;\n }\n /**\r\n * Zoom current slide image to...\r\n *\r\n * @param {number} destZoomLevel Destination zoom level.\r\n * @param {Point} [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 */\n\n\n zoomTo(destZoomLevel, centerPoint, transitionDuration, ignoreBounds) {\n const {\n pswp\n } = this;\n\n if (!this.isZoomable() || pswp.mainScroll.isShifted()) {\n return;\n }\n\n pswp.dispatch('beforeZoomTo', {\n destZoomLevel,\n centerPoint,\n transitionDuration\n }); // stop all pan and zoom transitions\n\n pswp.animations.stopAllPan(); // if (!centerPoint) {\n // centerPoint = pswp.getViewportCenterPoint();\n // }\n\n const prevZoomLevel = this.currZoomLevel;\n\n if (!ignoreBounds) {\n destZoomLevel = clamp(destZoomLevel, this.zoomLevels.min, this.zoomLevels.max);\n } // if (transitionDuration === undefined) {\n // transitionDuration = this.pswp.options.zoomAnimationDuration;\n // }\n\n\n this.setZoomLevel(destZoomLevel);\n this.pan.x = this.calculateZoomToPanOffset('x', centerPoint, prevZoomLevel);\n this.pan.y = this.calculateZoomToPanOffset('y', centerPoint, prevZoomLevel);\n roundPoint(this.pan);\n\n const finishTransition = () => {\n this._setResolution(destZoomLevel);\n\n this.applyCurrentZoomPan();\n };\n\n if (!transitionDuration) {\n finishTransition();\n } else {\n pswp.animations.startTransition({\n isPan: true,\n name: 'zoomTo',\n target: this.container,\n transform: this.getCurrentTransform(),\n onComplete: finishTransition,\n duration: transitionDuration,\n easing: pswp.options.easing\n });\n }\n }\n /**\r\n * @param {Point} [centerPoint]\r\n */\n\n\n toggleZoom(centerPoint) {\n this.zoomTo(this.currZoomLevel === this.zoomLevels.initial ? this.zoomLevels.secondary : this.zoomLevels.initial, centerPoint, this.pswp.options.zoomAnimationDuration);\n }\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 */\n\n\n setZoomLevel(currZoomLevel) {\n this.currZoomLevel = currZoomLevel;\n this.bounds.update(this.currZoomLevel);\n }\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 {Point} [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 * @returns {number}\r\n */\n\n\n calculateZoomToPanOffset(axis, point, prevZoomLevel) {\n const totalPanDistance = this.bounds.max[axis] - this.bounds.min[axis];\n\n if (totalPanDistance === 0) {\n return this.bounds.center[axis];\n }\n\n if (!point) {\n point = this.pswp.getViewportCenterPoint();\n }\n\n if (!prevZoomLevel) {\n prevZoomLevel = this.zoomLevels.initial;\n }\n\n const zoomFactor = this.currZoomLevel / prevZoomLevel;\n return this.bounds.correctPan(axis, (this.pan[axis] - point[axis]) * zoomFactor + point[axis]);\n }\n /**\r\n * Apply pan and keep it within bounds.\r\n *\r\n * @param {number} panX\r\n * @param {number} panY\r\n */\n\n\n panTo(panX, panY) {\n this.pan.x = this.bounds.correctPan('x', panX);\n this.pan.y = this.bounds.correctPan('y', panY);\n this.applyCurrentZoomPan();\n }\n /**\r\n * If the slide in the current state can be panned by the user\r\n * @returns {boolean}\r\n */\n\n\n isPannable() {\n return Boolean(this.width) && this.currZoomLevel > this.zoomLevels.fit;\n }\n /**\r\n * If the slide can be zoomed\r\n * @returns {boolean}\r\n */\n\n\n isZoomable() {\n return Boolean(this.width) && this.content.isZoomable();\n }\n /**\r\n * Apply transform and scale based on\r\n * the current pan position (this.pan) and zoom level (this.currZoomLevel)\r\n */\n\n\n applyCurrentZoomPan() {\n this._applyZoomTransform(this.pan.x, this.pan.y, this.currZoomLevel);\n\n if (this === this.pswp.currSlide) {\n this.pswp.dispatch('zoomPanUpdate', {\n slide: this\n });\n }\n }\n\n zoomAndPanToInitial() {\n this.currZoomLevel = this.zoomLevels.initial; // pan according to the zoom level\n\n this.bounds.update(this.currZoomLevel);\n equalizePoints(this.pan, this.bounds.center);\n this.pswp.dispatch('initialZoomPan', {\n slide: this\n });\n }\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 * @private\r\n */\n\n\n _applyZoomTransform(x, y, zoom) {\n zoom /= this.currentResolution || this.zoomLevels.initial;\n setTransform(this.container, x, y, zoom);\n }\n\n calculateSize() {\n const {\n pswp\n } = this;\n equalizePoints(this.panAreaSize, getPanAreaSize(pswp.options, pswp.viewportSize, this.data, this.index));\n this.zoomLevels.update(this.width, this.height, this.panAreaSize);\n pswp.dispatch('calcSlideSize', {\n slide: this\n });\n }\n /** @returns {string} */\n\n\n getCurrentTransform() {\n const scale = this.currZoomLevel / (this.currentResolution || this.zoomLevels.initial);\n return toTransformString(this.pan.x, this.pan.y, scale);\n }\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 the highest quality.\r\n * Also used by responsive images to load the correct one.\r\n *\r\n * @param {number} newResolution\r\n */\n\n\n _setResolution(newResolution) {\n if (newResolution === this.currentResolution) {\n return;\n }\n\n this.currentResolution = newResolution;\n this.updateContentSize();\n this.pswp.dispatch('resolutionChanged');\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('./gestures.js').default} Gestures */\n\nconst PAN_END_FRICTION = 0.35;\nconst VERTICAL_DRAG_FRICTION = 0.6; // 1 corresponds to the third of viewport height\n\nconst MIN_RATIO_TO_CLOSE = 0.4; // Minimum speed required to navigate\n// to next or previous slide\n\nconst MIN_NEXT_SLIDE_SPEED = 0.5;\n/**\r\n * @param {number} initialVelocity\r\n * @param {number} decelerationRate\r\n * @returns {number}\r\n */\n\nfunction project(initialVelocity, decelerationRate) {\n return initialVelocity * decelerationRate / (1 - decelerationRate);\n}\n/**\r\n * Handles single pointer dragging\r\n */\n\n\nclass DragHandler {\n /**\r\n * @param {Gestures} gestures\r\n */\n constructor(gestures) {\n this.gestures = gestures;\n this.pswp = gestures.pswp;\n /** @type {Point} */\n\n this.startPan = {\n x: 0,\n y: 0\n };\n }\n\n start() {\n if (this.pswp.currSlide) {\n equalizePoints(this.startPan, this.pswp.currSlide.pan);\n }\n\n this.pswp.animations.stopAll();\n }\n\n change() {\n const {\n p1,\n prevP1,\n dragAxis\n } = this.gestures;\n const {\n currSlide\n } = this.pswp;\n\n if (dragAxis === 'y' && this.pswp.options.closeOnVerticalDrag && currSlide && currSlide.currZoomLevel <= currSlide.zoomLevels.fit && !this.gestures.isMultitouch) {\n // Handle vertical drag to close\n const panY = currSlide.pan.y + (p1.y - prevP1.y);\n\n if (!this.pswp.dispatch('verticalDrag', {\n panY\n }).defaultPrevented) {\n this._setPanWithFriction('y', panY, VERTICAL_DRAG_FRICTION);\n\n const bgOpacity = 1 - Math.abs(this._getVerticalDragRatio(currSlide.pan.y));\n this.pswp.applyBgOpacity(bgOpacity);\n currSlide.applyCurrentZoomPan();\n }\n } else {\n const mainScrollChanged = this._panOrMoveMainScroll('x');\n\n if (!mainScrollChanged) {\n this._panOrMoveMainScroll('y');\n\n if (currSlide) {\n roundPoint(currSlide.pan);\n currSlide.applyCurrentZoomPan();\n }\n }\n }\n }\n\n end() {\n const {\n velocity\n } = this.gestures;\n const {\n mainScroll,\n currSlide\n } = this.pswp;\n let indexDiff = 0;\n this.pswp.animations.stopAll(); // Handle main scroll if it's shifted\n\n if (mainScroll.isShifted()) {\n // Position of the main scroll relative to the viewport\n const mainScrollShiftDiff = mainScroll.x - mainScroll.getCurrSlideX(); // Ratio between 0 and 1:\n // 0 - slide is not visible at all,\n // 0.5 - half of the slide is visible\n // 1 - slide is fully visible\n\n const currentSlideVisibilityRatio = mainScrollShiftDiff / this.pswp.viewportSize.x; // Go next slide.\n //\n // - if velocity and its direction is matched,\n // and we see at least tiny part of the next slide\n //\n // - or if we see less than 50% of the current slide\n // and velocity is close to 0\n //\n\n if (velocity.x < -MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio < 0 || velocity.x < 0.1 && currentSlideVisibilityRatio < -0.5) {\n // Go to next slide\n indexDiff = 1;\n velocity.x = Math.min(velocity.x, 0);\n } else if (velocity.x > MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio > 0 || velocity.x > -0.1 && currentSlideVisibilityRatio > 0.5) {\n // Go to prev slide\n indexDiff = -1;\n velocity.x = Math.max(velocity.x, 0);\n }\n\n mainScroll.moveIndexBy(indexDiff, true, velocity.x);\n } // Restore zoom level\n\n\n if (currSlide && currSlide.currZoomLevel > currSlide.zoomLevels.max || this.gestures.isMultitouch) {\n this.gestures.zoomLevels.correctZoomPan(true);\n } else {\n // we run two animations instead of one,\n // as each axis has own pan boundaries and thus different spring function\n // (correctZoomPan does not have this functionality,\n // it animates all properties with single timing function)\n this._finishPanGestureForAxis('x');\n\n this._finishPanGestureForAxis('y');\n }\n }\n /**\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n */\n\n\n _finishPanGestureForAxis(axis) {\n const {\n velocity\n } = this.gestures;\n const {\n currSlide\n } = this.pswp;\n\n if (!currSlide) {\n return;\n }\n\n const {\n pan,\n bounds\n } = currSlide;\n const panPos = pan[axis];\n const restoreBgOpacity = this.pswp.bgOpacity < 1 && axis === 'y'; // 0.995 means - scroll view loses 0.5% of its velocity per millisecond\n // Increasing this number will reduce travel distance\n\n const decelerationRate = 0.995; // 0.99\n // Pan position if there is no bounds\n\n const projectedPosition = panPos + project(velocity[axis], decelerationRate);\n\n if (restoreBgOpacity) {\n const vDragRatio = this._getVerticalDragRatio(panPos);\n\n const projectedVDragRatio = this._getVerticalDragRatio(projectedPosition); // If we are above and moving upwards,\n // or if we are below and moving downwards\n\n\n if (vDragRatio < 0 && projectedVDragRatio < -MIN_RATIO_TO_CLOSE || vDragRatio > 0 && projectedVDragRatio > MIN_RATIO_TO_CLOSE) {\n this.pswp.close();\n return;\n }\n } // Pan position with corrected bounds\n\n\n const correctedPanPosition = bounds.correctPan(axis, projectedPosition); // Exit if pan position should not be changed\n // or if speed it too low\n\n if (panPos === correctedPanPosition) {\n return;\n } // Overshoot if the final position is out of pan bounds\n\n\n const dampingRatio = correctedPanPosition === projectedPosition ? 1 : 0.82;\n const initialBgOpacity = this.pswp.bgOpacity;\n const totalPanDist = correctedPanPosition - panPos;\n this.pswp.animations.startSpring({\n name: 'panGesture' + axis,\n isPan: true,\n start: panPos,\n end: correctedPanPosition,\n velocity: velocity[axis],\n dampingRatio,\n onUpdate: pos => {\n // Animate opacity of background relative to Y pan position of an image\n if (restoreBgOpacity && this.pswp.bgOpacity < 1) {\n // 0 - start of animation, 1 - end of animation\n const animationProgressRatio = 1 - (correctedPanPosition - pos) / totalPanDist; // We clamp opacity to keep it between 0 and 1.\n // As progress ratio can be larger than 1 due to overshoot,\n // and we do not want to bounce opacity.\n\n this.pswp.applyBgOpacity(clamp(initialBgOpacity + (1 - initialBgOpacity) * animationProgressRatio, 0, 1));\n }\n\n pan[axis] = Math.floor(pos);\n currSlide.applyCurrentZoomPan();\n }\n });\n }\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 * @returns {boolean}\r\n */\n\n\n _panOrMoveMainScroll(axis) {\n const {\n p1,\n dragAxis,\n prevP1,\n isMultitouch\n } = this.gestures;\n const {\n currSlide,\n mainScroll\n } = this.pswp;\n const delta = p1[axis] - prevP1[axis];\n const newMainScrollX = mainScroll.x + delta;\n\n if (!delta || !currSlide) {\n return false;\n } // Always move main scroll if image can not be panned\n\n\n if (axis === 'x' && !currSlide.isPannable() && !isMultitouch) {\n mainScroll.moveTo(newMainScrollX, true);\n return true; // changed main scroll\n }\n\n const {\n bounds\n } = currSlide;\n const newPan = currSlide.pan[axis] + delta;\n\n if (this.pswp.options.allowPanToNext && dragAxis === 'x' && axis === 'x' && !isMultitouch) {\n const currSlideMainScrollX = mainScroll.getCurrSlideX(); // Position of the main scroll relative to the viewport\n\n const mainScrollShiftDiff = mainScroll.x - currSlideMainScrollX;\n const isLeftToRight = delta > 0;\n const isRightToLeft = !isLeftToRight;\n\n if (newPan > bounds.min[axis] && isLeftToRight) {\n // Panning from left to right, beyond the left edge\n // Wether the image was at minimum pan position (or less)\n // when this drag gesture started.\n // Minimum pan position refers to the left edge of the image.\n const wasAtMinPanPosition = bounds.min[axis] <= this.startPan[axis];\n\n if (wasAtMinPanPosition) {\n mainScroll.moveTo(newMainScrollX, true);\n return true;\n } else {\n this._setPanWithFriction(axis, newPan); //currSlide.pan[axis] = newPan;\n\n }\n } else if (newPan < bounds.max[axis] && isRightToLeft) {\n // Paning from right to left, beyond the right edge\n // Maximum pan position refers to the right edge of the image.\n const wasAtMaxPanPosition = this.startPan[axis] <= bounds.max[axis];\n\n if (wasAtMaxPanPosition) {\n mainScroll.moveTo(newMainScrollX, true);\n return true;\n } else {\n this._setPanWithFriction(axis, newPan); //currSlide.pan[axis] = newPan;\n\n }\n } else {\n // If main scroll is shifted\n if (mainScrollShiftDiff !== 0) {\n // If main scroll is shifted right\n if (mainScrollShiftDiff > 0\n /*&& isRightToLeft*/\n ) {\n mainScroll.moveTo(Math.max(newMainScrollX, currSlideMainScrollX), true);\n return true;\n } else if (mainScrollShiftDiff < 0\n /*&& isLeftToRight*/\n ) {\n // Main scroll is shifted left (Position is less than 0 comparing to the viewport 0)\n mainScroll.moveTo(Math.min(newMainScrollX, currSlideMainScrollX), true);\n return true;\n }\n } else {\n // We are within pan bounds, so just pan\n this._setPanWithFriction(axis, newPan);\n }\n }\n } else {\n if (axis === 'y') {\n // Do not pan vertically if main scroll is shifted o\n if (!mainScroll.isShifted() && bounds.min.y !== bounds.max.y) {\n this._setPanWithFriction(axis, newPan);\n }\n } else {\n this._setPanWithFriction(axis, newPan);\n }\n }\n\n return false;\n } // If we move above - the ratio is negative\n // If we move below the ratio is positive\n\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 * @returns {number}\r\n */\n\n\n _getVerticalDragRatio(panY) {\n var _this$pswp$currSlide$, _this$pswp$currSlide;\n\n return (panY - ((_this$pswp$currSlide$ = (_this$pswp$currSlide = this.pswp.currSlide) === null || _this$pswp$currSlide === void 0 ? void 0 : _this$pswp$currSlide.bounds.center.y) !== null && _this$pswp$currSlide$ !== void 0 ? _this$pswp$currSlide$ : 0)) / (this.pswp.viewportSize.y / 3);\n }\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 */\n\n\n _setPanWithFriction(axis, potentialPan, customFriction) {\n const {\n currSlide\n } = this.pswp;\n\n if (!currSlide) {\n return;\n }\n\n const {\n pan,\n bounds\n } = currSlide;\n const correctedPan = bounds.correctPan(axis, potentialPan); // If we are out of pan bounds\n\n if (correctedPan !== potentialPan || customFriction) {\n const delta = Math.round(potentialPan - pan[axis]);\n pan[axis] += delta * (customFriction || PAN_END_FRICTION);\n } else {\n pan[axis] = potentialPan;\n }\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('./gestures.js').default} Gestures */\n\nconst UPPER_ZOOM_FRICTION = 0.05;\nconst LOWER_ZOOM_FRICTION = 0.15;\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 * @returns {Point}\r\n */\n\nfunction getZoomPointsCenter(p, p1, p2) {\n p.x = (p1.x + p2.x) / 2;\n p.y = (p1.y + p2.y) / 2;\n return p;\n}\n\nclass ZoomHandler {\n /**\r\n * @param {Gestures} gestures\r\n */\n constructor(gestures) {\n this.gestures = gestures;\n /**\r\n * @private\r\n * @type {Point}\r\n */\n\n this._startPan = {\n x: 0,\n y: 0\n };\n /**\r\n * @private\r\n * @type {Point}\r\n */\n\n this._startZoomPoint = {\n x: 0,\n y: 0\n };\n /**\r\n * @private\r\n * @type {Point}\r\n */\n\n this._zoomPoint = {\n x: 0,\n y: 0\n };\n /** @private */\n\n this._wasOverFitZoomLevel = false;\n /** @private */\n\n this._startZoomLevel = 1;\n }\n\n start() {\n const {\n currSlide\n } = this.gestures.pswp;\n\n if (currSlide) {\n this._startZoomLevel = currSlide.currZoomLevel;\n equalizePoints(this._startPan, currSlide.pan);\n }\n\n this.gestures.pswp.animations.stopAllPan();\n this._wasOverFitZoomLevel = false;\n }\n\n change() {\n const {\n p1,\n startP1,\n p2,\n startP2,\n pswp\n } = this.gestures;\n const {\n currSlide\n } = pswp;\n\n if (!currSlide) {\n return;\n }\n\n const minZoomLevel = currSlide.zoomLevels.min;\n const maxZoomLevel = currSlide.zoomLevels.max;\n\n if (!currSlide.isZoomable() || pswp.mainScroll.isShifted()) {\n return;\n }\n\n getZoomPointsCenter(this._startZoomPoint, startP1, startP2);\n getZoomPointsCenter(this._zoomPoint, p1, p2);\n\n let currZoomLevel = 1 / getDistanceBetween(startP1, startP2) * getDistanceBetween(p1, p2) * this._startZoomLevel; // slightly over the zoom.fit\n\n\n if (currZoomLevel > currSlide.zoomLevels.initial + currSlide.zoomLevels.initial / 15) {\n this._wasOverFitZoomLevel = true;\n }\n\n if (currZoomLevel < minZoomLevel) {\n if (pswp.options.pinchToClose && !this._wasOverFitZoomLevel && this._startZoomLevel <= currSlide.zoomLevels.initial) {\n // fade out background if zooming out\n const bgOpacity = 1 - (minZoomLevel - currZoomLevel) / (minZoomLevel / 1.2);\n\n if (!pswp.dispatch('pinchClose', {\n bgOpacity\n }).defaultPrevented) {\n pswp.applyBgOpacity(bgOpacity);\n }\n } else {\n // Apply the friction if zoom level is below the min\n currZoomLevel = minZoomLevel - (minZoomLevel - currZoomLevel) * LOWER_ZOOM_FRICTION;\n }\n } else if (currZoomLevel > maxZoomLevel) {\n // Apply the friction if zoom level is above the max\n currZoomLevel = maxZoomLevel + (currZoomLevel - maxZoomLevel) * UPPER_ZOOM_FRICTION;\n }\n\n currSlide.pan.x = this._calculatePanForZoomLevel('x', currZoomLevel);\n currSlide.pan.y = this._calculatePanForZoomLevel('y', currZoomLevel);\n currSlide.setZoomLevel(currZoomLevel);\n currSlide.applyCurrentZoomPan();\n }\n\n end() {\n const {\n pswp\n } = this.gestures;\n const {\n currSlide\n } = pswp;\n\n if ((!currSlide || currSlide.currZoomLevel < currSlide.zoomLevels.initial) && !this._wasOverFitZoomLevel && pswp.options.pinchToClose) {\n pswp.close();\n } else {\n this.correctZoomPan();\n }\n }\n /**\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @param {number} currZoomLevel\r\n * @returns {number}\r\n */\n\n\n _calculatePanForZoomLevel(axis, currZoomLevel) {\n const zoomFactor = currZoomLevel / this._startZoomLevel;\n return this._zoomPoint[axis] - (this._startZoomPoint[axis] - this._startPan[axis]) * zoomFactor;\n }\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 */\n\n\n correctZoomPan(ignoreGesture) {\n const {\n pswp\n } = this.gestures;\n const {\n currSlide\n } = pswp;\n\n if (!(currSlide !== null && currSlide !== void 0 && currSlide.isZoomable())) {\n return;\n }\n\n if (this._zoomPoint.x === 0) {\n ignoreGesture = true;\n }\n\n const prevZoomLevel = currSlide.currZoomLevel;\n /** @type {number} */\n\n let destinationZoomLevel;\n let currZoomLevelNeedsChange = true;\n\n if (prevZoomLevel < currSlide.zoomLevels.initial) {\n destinationZoomLevel = currSlide.zoomLevels.initial; // zoom to min\n } else if (prevZoomLevel > currSlide.zoomLevels.max) {\n destinationZoomLevel = currSlide.zoomLevels.max; // zoom to max\n } else {\n currZoomLevelNeedsChange = false;\n destinationZoomLevel = prevZoomLevel;\n }\n\n const initialBgOpacity = pswp.bgOpacity;\n const restoreBgOpacity = pswp.bgOpacity < 1;\n const initialPan = equalizePoints({\n x: 0,\n y: 0\n }, currSlide.pan);\n let destinationPan = equalizePoints({\n x: 0,\n y: 0\n }, initialPan);\n\n if (ignoreGesture) {\n this._zoomPoint.x = 0;\n this._zoomPoint.y = 0;\n this._startZoomPoint.x = 0;\n this._startZoomPoint.y = 0;\n this._startZoomLevel = prevZoomLevel;\n equalizePoints(this._startPan, initialPan);\n }\n\n if (currZoomLevelNeedsChange) {\n destinationPan = {\n x: this._calculatePanForZoomLevel('x', destinationZoomLevel),\n y: this._calculatePanForZoomLevel('y', destinationZoomLevel)\n };\n } // set zoom level, so pan bounds are updated according to it\n\n\n currSlide.setZoomLevel(destinationZoomLevel);\n destinationPan = {\n x: currSlide.bounds.correctPan('x', destinationPan.x),\n y: currSlide.bounds.correctPan('y', destinationPan.y)\n }; // return zoom level and its bounds to initial\n\n currSlide.setZoomLevel(prevZoomLevel);\n const panNeedsChange = !pointsEqual(destinationPan, initialPan);\n\n if (!panNeedsChange && !currZoomLevelNeedsChange && !restoreBgOpacity) {\n // update resolution after gesture\n currSlide._setResolution(destinationZoomLevel);\n\n currSlide.applyCurrentZoomPan(); // nothing to animate\n\n return;\n }\n\n pswp.animations.stopAllPan();\n pswp.animations.startSpring({\n isPan: true,\n start: 0,\n end: 1000,\n velocity: 0,\n dampingRatio: 1,\n naturalFrequency: 40,\n onUpdate: now => {\n now /= 1000; // 0 - start, 1 - end\n\n if (panNeedsChange || currZoomLevelNeedsChange) {\n if (panNeedsChange) {\n currSlide.pan.x = initialPan.x + (destinationPan.x - initialPan.x) * now;\n currSlide.pan.y = initialPan.y + (destinationPan.y - initialPan.y) * now;\n }\n\n if (currZoomLevelNeedsChange) {\n const newZoomLevel = prevZoomLevel + (destinationZoomLevel - prevZoomLevel) * now;\n currSlide.setZoomLevel(newZoomLevel);\n }\n\n currSlide.applyCurrentZoomPan();\n } // Restore background opacity\n\n\n if (restoreBgOpacity && pswp.bgOpacity < 1) {\n // We clamp opacity to keep it between 0 and 1.\n // As progress ratio can be larger than 1 due to overshoot,\n // and we do not want to bounce opacity.\n pswp.applyBgOpacity(clamp(initialBgOpacity + (1 - initialBgOpacity) * now, 0, 1));\n }\n },\n onComplete: () => {\n // update resolution after transition ends\n currSlide._setResolution(destinationZoomLevel);\n\n currSlide.applyCurrentZoomPan();\n }\n });\n }\n\n}\n\n/**\r\n * @template {string} T\r\n * @template {string} P\r\n * @typedef {import('../types.js').AddPostfix<T, P>} AddPostfix<T, P>\r\n */\n\n/** @typedef {import('./gestures.js').default} Gestures */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {'imageClick' | 'bgClick' | 'tap' | 'doubleTap'} Actions */\n\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 * @returns {boolean}\r\n */\nfunction didTapOnMainContent(event) {\n return !!\n /** @type {HTMLElement} */\n event.target.closest('.pswp__container');\n}\n/**\r\n * Tap, double-tap handler.\r\n */\n\n\nclass TapHandler {\n /**\r\n * @param {Gestures} gestures\r\n */\n constructor(gestures) {\n this.gestures = gestures;\n }\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\n\n\n click(point, originalEvent) {\n const targetClassList =\n /** @type {HTMLElement} */\n originalEvent.target.classList;\n const isImageClick = targetClassList.contains('pswp__img');\n const isBackgroundClick = targetClassList.contains('pswp__item') || targetClassList.contains('pswp__zoom-wrap');\n\n if (isImageClick) {\n this._doClickOrTapAction('imageClick', point, originalEvent);\n } else if (isBackgroundClick) {\n this._doClickOrTapAction('bgClick', point, originalEvent);\n }\n }\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\n\n\n tap(point, originalEvent) {\n if (didTapOnMainContent(originalEvent)) {\n this._doClickOrTapAction('tap', point, originalEvent);\n }\n }\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\n\n\n doubleTap(point, originalEvent) {\n if (didTapOnMainContent(originalEvent)) {\n this._doClickOrTapAction('doubleTap', point, originalEvent);\n }\n }\n /**\r\n * @private\r\n * @param {Actions} actionName\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\n\n\n _doClickOrTapAction(actionName, point, originalEvent) {\n var _this$gestures$pswp$e;\n\n const {\n pswp\n } = this.gestures;\n const {\n currSlide\n } = pswp;\n const actionFullName =\n /** @type {AddPostfix<Actions, 'Action'>} */\n actionName + 'Action';\n const optionValue = pswp.options[actionFullName];\n\n if (pswp.dispatch(actionFullName, {\n point,\n originalEvent\n }).defaultPrevented) {\n return;\n }\n\n if (typeof optionValue === 'function') {\n optionValue.call(pswp, point, originalEvent);\n return;\n }\n\n switch (optionValue) {\n case 'close':\n case 'next':\n pswp[optionValue]();\n break;\n\n case 'zoom':\n currSlide === null || currSlide === void 0 || currSlide.toggleZoom(point);\n break;\n\n case 'zoom-or-close':\n // by default click zooms current image,\n // if it can not be zoomed - gallery will be closed\n if (currSlide !== null && currSlide !== void 0 && currSlide.isZoomable() && currSlide.zoomLevels.secondary !== currSlide.zoomLevels.initial) {\n currSlide.toggleZoom(point);\n } else if (pswp.options.clickToCloseNonZoomable) {\n pswp.close();\n }\n\n break;\n\n case 'toggle-controls':\n (_this$gestures$pswp$e = this.gestures.pswp.element) === null || _this$gestures$pswp$e === void 0 || _this$gestures$pswp$e.classList.toggle('pswp--ui-visible'); // if (_controlsVisible) {\n // _ui.hideControls();\n // } else {\n // _ui.showControls();\n // }\n\n break;\n }\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n// How far should user should drag\n// until we can determine that the gesture is swipe and its direction\n\nconst AXIS_SWIPE_HYSTERISIS = 10; //const PAN_END_FRICTION = 0.35;\n\nconst DOUBLE_TAP_DELAY = 300; // ms\n\nconst MIN_TAP_DISTANCE = 25; // px\n\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 */\n\nclass Gestures {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n /** @type {'x' | 'y' | null} */\n\n this.dragAxis = null; // point objects are defined once and reused\n // PhotoSwipe keeps track only of two pointers, others are ignored\n\n /** @type {Point} */\n\n this.p1 = {\n x: 0,\n y: 0\n }; // the first pressed pointer\n\n /** @type {Point} */\n\n this.p2 = {\n x: 0,\n y: 0\n }; // the second pressed pointer\n\n /** @type {Point} */\n\n this.prevP1 = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.prevP2 = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.startP1 = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.startP2 = {\n x: 0,\n y: 0\n };\n /** @type {Point} */\n\n this.velocity = {\n x: 0,\n y: 0\n };\n /** @type {Point}\r\n * @private\r\n */\n\n this._lastStartP1 = {\n x: 0,\n y: 0\n };\n /** @type {Point}\r\n * @private\r\n */\n\n this._intervalP1 = {\n x: 0,\n y: 0\n };\n /** @private */\n\n this._numActivePoints = 0;\n /** @type {Point[]}\r\n * @private\r\n */\n\n this._ongoingPointers = [];\n /** @private */\n\n this._touchEventEnabled = 'ontouchstart' in window;\n /** @private */\n\n this._pointerEventEnabled = !!window.PointerEvent;\n this.supportsTouch = this._touchEventEnabled || this._pointerEventEnabled && navigator.maxTouchPoints > 1;\n /** @private */\n\n this._numActivePoints = 0;\n /** @private */\n\n this._intervalTime = 0;\n /** @private */\n\n this._velocityCalculated = false;\n this.isMultitouch = false;\n this.isDragging = false;\n this.isZooming = false;\n /** @type {number | null} */\n\n this.raf = null;\n /** @type {NodeJS.Timeout | null}\r\n * @private\r\n */\n\n this._tapTimer = null;\n\n if (!this.supportsTouch) {\n // disable pan to next slide for non-touch devices\n pswp.options.allowPanToNext = false;\n }\n\n this.drag = new DragHandler(this);\n this.zoomLevels = new ZoomHandler(this);\n this.tapHandler = new TapHandler(this);\n pswp.on('bindEvents', () => {\n pswp.events.add(pswp.scrollWrap, 'click',\n /** @type EventListener */\n this._onClick.bind(this));\n\n if (this._pointerEventEnabled) {\n this._bindEvents('pointer', 'down', 'up', 'cancel');\n } else if (this._touchEventEnabled) {\n this._bindEvents('touch', 'start', 'end', 'cancel'); // In previous versions we also bound mouse event here,\n // in case device supports both touch and mouse events,\n // but newer versions of browsers now support PointerEvent.\n // on iOS10 if you bind touchmove/end after touchstart,\n // and you don't preventDefault touchstart (which PhotoSwipe does),\n // preventDefault will have no effect on touchmove and touchend.\n // Unless you bind it previously.\n\n\n if (pswp.scrollWrap) {\n pswp.scrollWrap.ontouchmove = () => {};\n\n pswp.scrollWrap.ontouchend = () => {};\n }\n } else {\n this._bindEvents('mouse', 'down', 'up');\n }\n });\n }\n /**\r\n * @private\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 */\n\n\n _bindEvents(pref, down, up, cancel) {\n const {\n pswp\n } = this;\n const {\n events\n } = pswp;\n const cancelEvent = cancel ? pref + cancel : '';\n events.add(pswp.scrollWrap, pref + down,\n /** @type EventListener */\n this.onPointerDown.bind(this));\n events.add(window, pref + 'move',\n /** @type EventListener */\n this.onPointerMove.bind(this));\n events.add(window, pref + up,\n /** @type EventListener */\n this.onPointerUp.bind(this));\n\n if (cancelEvent) {\n events.add(pswp.scrollWrap, cancelEvent,\n /** @type EventListener */\n this.onPointerUp.bind(this));\n }\n }\n /**\r\n * @param {PointerEvent} e\r\n */\n\n\n onPointerDown(e) {\n // We do not call preventDefault for touch events\n // to allow browser to show native dialog on longpress\n // (the one that allows to save image or open it in new tab).\n //\n // Desktop Safari allows to drag images when preventDefault isn't called on mousedown,\n // even though preventDefault IS called on mousemove. That's why we preventDefault mousedown.\n const isMousePointer = e.type === 'mousedown' || e.pointerType === 'mouse'; // Allow dragging only via left mouse button.\n // http://www.quirksmode.org/js/events_properties.html\n // https://developer.mozilla.org/en-US/docs/Web/API/event.button\n\n if (isMousePointer && e.button > 0) {\n return;\n }\n\n const {\n pswp\n } = this; // if PhotoSwipe is opening or closing\n\n if (!pswp.opener.isOpen) {\n e.preventDefault();\n return;\n }\n\n if (pswp.dispatch('pointerDown', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (isMousePointer) {\n pswp.mouseDetected(); // preventDefault mouse event to prevent\n // browser image drag feature\n\n this._preventPointerEventBehaviour(e, 'down');\n }\n\n pswp.animations.stopAll();\n\n this._updatePoints(e, 'down');\n\n if (this._numActivePoints === 1) {\n this.dragAxis = null; // we need to store initial point to determine the main axis,\n // drag is activated only after the axis is determined\n\n equalizePoints(this.startP1, this.p1);\n }\n\n if (this._numActivePoints > 1) {\n // Tap or double tap should not trigger if more than one pointer\n this._clearTapTimer();\n\n this.isMultitouch = true;\n } else {\n this.isMultitouch = false;\n }\n }\n /**\r\n * @param {PointerEvent} e\r\n */\n\n\n onPointerMove(e) {\n this._preventPointerEventBehaviour(e, 'move');\n\n if (!this._numActivePoints) {\n return;\n }\n\n this._updatePoints(e, 'move');\n\n if (this.pswp.dispatch('pointerMove', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (this._numActivePoints === 1 && !this.isDragging) {\n if (!this.dragAxis) {\n this._calculateDragDirection();\n } // Drag axis was detected, emit drag.start\n\n\n if (this.dragAxis && !this.isDragging) {\n if (this.isZooming) {\n this.isZooming = false;\n this.zoomLevels.end();\n }\n\n this.isDragging = true;\n\n this._clearTapTimer(); // Tap can not trigger after drag\n // Adjust starting point\n\n\n this._updateStartPoints();\n\n this._intervalTime = Date.now(); //this._startTime = this._intervalTime;\n\n this._velocityCalculated = false;\n equalizePoints(this._intervalP1, this.p1);\n this.velocity.x = 0;\n this.velocity.y = 0;\n this.drag.start();\n\n this._rafStopLoop();\n\n this._rafRenderLoop();\n }\n } else if (this._numActivePoints > 1 && !this.isZooming) {\n this._finishDrag();\n\n this.isZooming = true; // Adjust starting points\n\n this._updateStartPoints();\n\n this.zoomLevels.start();\n\n this._rafStopLoop();\n\n this._rafRenderLoop();\n }\n }\n /**\r\n * @private\r\n */\n\n\n _finishDrag() {\n if (this.isDragging) {\n this.isDragging = false; // Try to calculate velocity,\n // if it wasn't calculated yet in drag.change\n\n if (!this._velocityCalculated) {\n this._updateVelocity(true);\n }\n\n this.drag.end();\n this.dragAxis = null;\n }\n }\n /**\r\n * @param {PointerEvent} e\r\n */\n\n\n onPointerUp(e) {\n if (!this._numActivePoints) {\n return;\n }\n\n this._updatePoints(e, 'up');\n\n if (this.pswp.dispatch('pointerUp', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (this._numActivePoints === 0) {\n this._rafStopLoop();\n\n if (this.isDragging) {\n this._finishDrag();\n } else if (!this.isZooming && !this.isMultitouch) {\n //this.zoomLevels.correctZoomPan();\n this._finishTap(e);\n }\n }\n\n if (this._numActivePoints < 2 && this.isZooming) {\n this.isZooming = false;\n this.zoomLevels.end();\n\n if (this._numActivePoints === 1) {\n // Since we have 1 point left, we need to reinitiate drag\n this.dragAxis = null;\n\n this._updateStartPoints();\n }\n }\n }\n /**\r\n * @private\r\n */\n\n\n _rafRenderLoop() {\n if (this.isDragging || this.isZooming) {\n this._updateVelocity();\n\n if (this.isDragging) {\n // make sure that pointer moved since the last update\n if (!pointsEqual(this.p1, this.prevP1)) {\n this.drag.change();\n }\n } else\n /* if (this.isZooming) */\n {\n if (!pointsEqual(this.p1, this.prevP1) || !pointsEqual(this.p2, this.prevP2)) {\n this.zoomLevels.change();\n }\n }\n\n this._updatePrevPoints();\n\n this.raf = requestAnimationFrame(this._rafRenderLoop.bind(this));\n }\n }\n /**\r\n * Update velocity at 50ms interval\r\n *\r\n * @private\r\n * @param {boolean} [force]\r\n */\n\n\n _updateVelocity(force) {\n const time = Date.now();\n const duration = time - this._intervalTime;\n\n if (duration < 50 && !force) {\n return;\n }\n\n this.velocity.x = this._getVelocity('x', duration);\n this.velocity.y = this._getVelocity('y', duration);\n this._intervalTime = time;\n equalizePoints(this._intervalP1, this.p1);\n this._velocityCalculated = true;\n }\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n */\n\n\n _finishTap(e) {\n const {\n mainScroll\n } = this.pswp; // Do not trigger tap events if main scroll is shifted\n\n if (mainScroll.isShifted()) {\n // restore main scroll position\n // (usually happens if stopped in the middle of animation)\n mainScroll.moveIndexBy(0, true);\n return;\n } // Do not trigger tap for touchcancel or pointercancel\n\n\n if (e.type.indexOf('cancel') > 0) {\n return;\n } // Trigger click instead of tap for mouse events\n\n\n if (e.type === 'mouseup' || e.pointerType === 'mouse') {\n this.tapHandler.click(this.startP1, e);\n return;\n } // Disable delay if there is no doubleTapAction\n\n\n const tapDelay = this.pswp.options.doubleTapAction ? DOUBLE_TAP_DELAY : 0; // If tapTimer is defined - we tapped recently,\n // check if the current tap is close to the previous one,\n // if yes - trigger double tap\n\n if (this._tapTimer) {\n this._clearTapTimer(); // Check if two taps were more or less on the same place\n\n\n if (getDistanceBetween(this._lastStartP1, this.startP1) < MIN_TAP_DISTANCE) {\n this.tapHandler.doubleTap(this.startP1, e);\n }\n } else {\n equalizePoints(this._lastStartP1, this.startP1);\n this._tapTimer = setTimeout(() => {\n this.tapHandler.tap(this.startP1, e);\n\n this._clearTapTimer();\n }, tapDelay);\n }\n }\n /**\r\n * @private\r\n */\n\n\n _clearTapTimer() {\n if (this._tapTimer) {\n clearTimeout(this._tapTimer);\n this._tapTimer = null;\n }\n }\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 * @returns {number}\r\n */\n\n\n _getVelocity(axis, duration) {\n // displacement is like distance, but can be negative.\n const displacement = this.p1[axis] - this._intervalP1[axis];\n\n if (Math.abs(displacement) > 1 && duration > 5) {\n return displacement / duration;\n }\n\n return 0;\n }\n /**\r\n * @private\r\n */\n\n\n _rafStopLoop() {\n if (this.raf) {\n cancelAnimationFrame(this.raf);\n this.raf = null;\n }\n }\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n * @param {'up' | 'down' | 'move'} pointerType Normalized pointer type\r\n */\n\n\n _preventPointerEventBehaviour(e, pointerType) {\n const preventPointerEvent = this.pswp.applyFilters('preventPointerEvent', true, e, pointerType);\n\n if (preventPointerEvent) {\n e.preventDefault();\n }\n }\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 */\n\n\n _updatePoints(e, pointerType) {\n if (this._pointerEventEnabled) {\n const pointerEvent =\n /** @type {PointerEvent} */\n e; // Try to find the current pointer in ongoing pointers by its ID\n\n const pointerIndex = this._ongoingPointers.findIndex(ongoingPointer => {\n return ongoingPointer.id === pointerEvent.pointerId;\n });\n\n if (pointerType === 'up' && pointerIndex > -1) {\n // release the pointer - remove it from ongoing\n this._ongoingPointers.splice(pointerIndex, 1);\n } else if (pointerType === 'down' && pointerIndex === -1) {\n // add new pointer\n this._ongoingPointers.push(this._convertEventPosToPoint(pointerEvent, {\n x: 0,\n y: 0\n }));\n } else if (pointerIndex > -1) {\n // update existing pointer\n this._convertEventPosToPoint(pointerEvent, this._ongoingPointers[pointerIndex]);\n }\n\n this._numActivePoints = this._ongoingPointers.length; // update points that PhotoSwipe uses\n // to calculate position and scale\n\n if (this._numActivePoints > 0) {\n equalizePoints(this.p1, this._ongoingPointers[0]);\n }\n\n if (this._numActivePoints > 1) {\n equalizePoints(this.p2, this._ongoingPointers[1]);\n }\n } else {\n const touchEvent =\n /** @type {TouchEvent} */\n e;\n this._numActivePoints = 0;\n\n if (touchEvent.type.indexOf('touch') > -1) {\n // Touch Event\n // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n if (touchEvent.touches && touchEvent.touches.length > 0) {\n this._convertEventPosToPoint(touchEvent.touches[0], this.p1);\n\n this._numActivePoints++;\n\n if (touchEvent.touches.length > 1) {\n this._convertEventPosToPoint(touchEvent.touches[1], this.p2);\n\n this._numActivePoints++;\n }\n }\n } else {\n // Mouse Event\n this._convertEventPosToPoint(\n /** @type {PointerEvent} */\n e, this.p1);\n\n if (pointerType === 'up') {\n // clear all points on mouseup\n this._numActivePoints = 0;\n } else {\n this._numActivePoints++;\n }\n }\n }\n }\n /** update points that were used during previous rAF tick\r\n * @private\r\n */\n\n\n _updatePrevPoints() {\n equalizePoints(this.prevP1, this.p1);\n equalizePoints(this.prevP2, this.p2);\n }\n /** update points at the start of gesture\r\n * @private\r\n */\n\n\n _updateStartPoints() {\n equalizePoints(this.startP1, this.p1);\n equalizePoints(this.startP2, this.p2);\n\n this._updatePrevPoints();\n }\n /** @private */\n\n\n _calculateDragDirection() {\n if (this.pswp.mainScroll.isShifted()) {\n // if main scroll position is shifted – direction is always horizontal\n this.dragAxis = 'x';\n } else {\n // calculate delta of the last touchmove tick\n const diff = Math.abs(this.p1.x - this.startP1.x) - Math.abs(this.p1.y - this.startP1.y);\n\n if (diff !== 0) {\n // check if pointer was shifted horizontally or vertically\n const axisToCheck = diff > 0 ? 'x' : 'y';\n\n if (Math.abs(this.p1[axisToCheck] - this.startP1[axisToCheck]) >= AXIS_SWIPE_HYSTERISIS) {\n this.dragAxis = axisToCheck;\n }\n }\n }\n }\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 * @returns {Point}\r\n */\n\n\n _convertEventPosToPoint(e, p) {\n p.x = e.pageX - this.pswp.offset.x;\n p.y = e.pageY - this.pswp.offset.y;\n\n if ('pointerId' in e) {\n p.id = e.pointerId;\n } else if (e.identifier !== undefined) {\n p.id = e.identifier;\n }\n\n return p;\n }\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n */\n\n\n _onClick(e) {\n // Do not allow click event to pass through after drag\n if (this.pswp.mainScroll.isShifted()) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('./slide/slide.js').default} Slide */\n\n/** @typedef {{ el: HTMLDivElement; slide?: Slide }} ItemHolder */\n\nconst MAIN_SCROLL_END_FRICTION = 0.35; // const MIN_SWIPE_TRANSITION_DURATION = 250;\n// const MAX_SWIPE_TRABSITION_DURATION = 500;\n// const DEFAULT_SWIPE_TRANSITION_DURATION = 333;\n\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 */\n\nclass MainScroll {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n this.x = 0;\n this.slideWidth = 0;\n /** @private */\n\n this._currPositionIndex = 0;\n /** @private */\n\n this._prevPositionIndex = 0;\n /** @private */\n\n this._containerShiftIndex = -1;\n /** @type {ItemHolder[]} */\n\n this.itemHolders = [];\n }\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 */\n\n\n resize(resizeSlides) {\n const {\n pswp\n } = this;\n const newSlideWidth = Math.round(pswp.viewportSize.x + pswp.viewportSize.x * pswp.options.spacing); // Mobile browsers might trigger a resize event during a gesture.\n // (due to toolbar appearing or hiding).\n // Avoid re-adjusting main scroll position if width wasn't changed\n\n const slideWidthChanged = newSlideWidth !== this.slideWidth;\n\n if (slideWidthChanged) {\n this.slideWidth = newSlideWidth;\n this.moveTo(this.getCurrSlideX());\n }\n\n this.itemHolders.forEach((itemHolder, index) => {\n if (slideWidthChanged) {\n setTransform(itemHolder.el, (index + this._containerShiftIndex) * this.slideWidth);\n }\n\n if (resizeSlides && itemHolder.slide) {\n itemHolder.slide.resize();\n }\n });\n }\n /**\r\n * Reset X position of the main scroller to zero\r\n */\n\n\n resetPosition() {\n // Position on the main scroller (offset)\n // it is independent from slide index\n this._currPositionIndex = 0;\n this._prevPositionIndex = 0; // This will force recalculation of size on next resize()\n\n this.slideWidth = 0; // _containerShiftIndex*viewportSize will give you amount of transform of the current slide\n\n this._containerShiftIndex = -1;\n }\n /**\r\n * Create and append array of three items\r\n * that hold data about slides in DOM\r\n */\n\n\n appendHolders() {\n this.itemHolders = []; // append our three slide holders -\n // previous, current, and next\n\n for (let i = 0; i < 3; i++) {\n const el = createElement('pswp__item', 'div', this.pswp.container);\n el.setAttribute('role', 'group');\n el.setAttribute('aria-roledescription', 'slide');\n el.setAttribute('aria-hidden', 'true'); // hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\n\n el.style.display = i === 1 ? 'block' : 'none';\n this.itemHolders.push({\n el //index: -1\n\n });\n }\n }\n /**\r\n * Whether the main scroll can be horizontally swiped to the next or previous slide.\r\n * @returns {boolean}\r\n */\n\n\n canBeSwiped() {\n return this.pswp.getNumItems() > 1;\n }\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 */\n\n\n moveIndexBy(diff, animate, velocityX) {\n const {\n pswp\n } = this;\n let newIndex = pswp.potentialIndex + diff;\n const numSlides = pswp.getNumItems();\n\n if (pswp.canLoop()) {\n newIndex = pswp.getLoopedIndex(newIndex);\n const distance = (diff + numSlides) % numSlides;\n\n if (distance <= numSlides / 2) {\n // go forward\n diff = distance;\n } else {\n // go backwards\n diff = distance - numSlides;\n }\n } else {\n if (newIndex < 0) {\n newIndex = 0;\n } else if (newIndex >= numSlides) {\n newIndex = numSlides - 1;\n }\n\n diff = newIndex - pswp.potentialIndex;\n }\n\n pswp.potentialIndex = newIndex;\n this._currPositionIndex -= diff;\n pswp.animations.stopMainScroll();\n const destinationX = this.getCurrSlideX();\n\n if (!animate) {\n this.moveTo(destinationX);\n this.updateCurrItem();\n } else {\n pswp.animations.startSpring({\n isMainScroll: true,\n start: this.x,\n end: destinationX,\n velocity: velocityX || 0,\n naturalFrequency: 30,\n dampingRatio: 1,\n //0.7,\n onUpdate: x => {\n this.moveTo(x);\n },\n onComplete: () => {\n this.updateCurrItem();\n pswp.appendHeavy();\n }\n });\n let currDiff = pswp.potentialIndex - pswp.currIndex;\n\n if (pswp.canLoop()) {\n const currDistance = (currDiff + numSlides) % numSlides;\n\n if (currDistance <= numSlides / 2) {\n // go forward\n currDiff = currDistance;\n } else {\n // go backwards\n currDiff = currDistance - numSlides;\n }\n } // Force-append new slides during transition\n // if difference between slides is more than 1\n\n\n if (Math.abs(currDiff) > 1) {\n this.updateCurrItem();\n }\n }\n\n return Boolean(diff);\n }\n /**\r\n * X position of the main scroll for the current slide\r\n * (ignores position during dragging)\r\n * @returns {number}\r\n */\n\n\n getCurrSlideX() {\n return this.slideWidth * this._currPositionIndex;\n }\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 * @returns {boolean}\r\n */\n\n\n isShifted() {\n return this.x !== this.getCurrSlideX();\n }\n /**\r\n * Update slides X positions and set their content\r\n */\n\n\n updateCurrItem() {\n var _this$itemHolders$;\n\n const {\n pswp\n } = this;\n const positionDifference = this._prevPositionIndex - this._currPositionIndex;\n\n if (!positionDifference) {\n return;\n }\n\n this._prevPositionIndex = this._currPositionIndex;\n pswp.currIndex = pswp.potentialIndex;\n let diffAbs = Math.abs(positionDifference);\n /** @type {ItemHolder | undefined} */\n\n let tempHolder;\n\n if (diffAbs >= 3) {\n this._containerShiftIndex += positionDifference + (positionDifference > 0 ? -3 : 3);\n diffAbs = 3; // If slides are changed by 3 screens or more - clean up previous slides\n\n this.itemHolders.forEach(itemHolder => {\n var _itemHolder$slide;\n\n (_itemHolder$slide = itemHolder.slide) === null || _itemHolder$slide === void 0 || _itemHolder$slide.destroy();\n itemHolder.slide = undefined;\n });\n }\n\n for (let i = 0; i < diffAbs; i++) {\n if (positionDifference > 0) {\n tempHolder = this.itemHolders.shift();\n\n if (tempHolder) {\n this.itemHolders[2] = tempHolder; // move first to last\n\n this._containerShiftIndex++;\n setTransform(tempHolder.el, (this._containerShiftIndex + 2) * this.slideWidth);\n pswp.setContent(tempHolder, pswp.currIndex - diffAbs + i + 2);\n }\n } else {\n tempHolder = this.itemHolders.pop();\n\n if (tempHolder) {\n this.itemHolders.unshift(tempHolder); // move last to first\n\n this._containerShiftIndex--;\n setTransform(tempHolder.el, this._containerShiftIndex * this.slideWidth);\n pswp.setContent(tempHolder, pswp.currIndex + diffAbs - i - 2);\n }\n }\n } // Reset transfrom every 50ish navigations in one direction.\n //\n // Otherwise transform will keep growing indefinitely,\n // which might cause issues as browsers have a maximum transform limit.\n // I wasn't able to reach it, but just to be safe.\n // This should not cause noticable lag.\n\n\n if (Math.abs(this._containerShiftIndex) > 50 && !this.isShifted()) {\n this.resetPosition();\n this.resize();\n } // Pan transition might be running (and consntantly updating pan position)\n\n\n pswp.animations.stopAllPan();\n this.itemHolders.forEach((itemHolder, i) => {\n if (itemHolder.slide) {\n // Slide in the 2nd holder is always active\n itemHolder.slide.setIsActive(i === 1);\n }\n });\n pswp.currSlide = (_this$itemHolders$ = this.itemHolders[1]) === null || _this$itemHolders$ === void 0 ? void 0 : _this$itemHolders$.slide;\n pswp.contentLoader.updateLazy(positionDifference);\n\n if (pswp.currSlide) {\n pswp.currSlide.applyCurrentZoomPan();\n }\n\n pswp.dispatch('change');\n }\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 */\n\n\n moveTo(x, dragging) {\n if (!this.pswp.canLoop() && dragging) {\n // Apply friction\n let newSlideIndexOffset = (this.slideWidth * this._currPositionIndex - x) / this.slideWidth;\n newSlideIndexOffset += this.pswp.currIndex;\n const delta = Math.round(x - this.x);\n\n if (newSlideIndexOffset < 0 && delta > 0 || newSlideIndexOffset >= this.pswp.getNumItems() - 1 && delta < 0) {\n x = this.x + delta * MAIN_SCROLL_END_FRICTION;\n }\n }\n\n this.x = x;\n\n if (this.pswp.container) {\n setTransform(this.pswp.container, x);\n }\n\n this.pswp.dispatch('moveMainScroll', {\n x,\n dragging: dragging !== null && dragging !== void 0 ? dragging : false\n });\n }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Methods<T>} Methods<T>\r\n */\n\nconst KeyboardKeyCodesMap = {\n Escape: 27,\n z: 90,\n ArrowLeft: 37,\n ArrowUp: 38,\n ArrowRight: 39,\n ArrowDown: 40,\n Tab: 9\n};\n/**\r\n * @template {keyof KeyboardKeyCodesMap} T\r\n * @param {T} key\r\n * @param {boolean} isKeySupported\r\n * @returns {T | number | undefined}\r\n */\n\nconst getKeyboardEventKey = (key, isKeySupported) => {\n return isKeySupported ? key : KeyboardKeyCodesMap[key];\n};\n/**\r\n * - Manages keyboard shortcuts.\r\n * - Helps trap focus within photoswipe.\r\n */\n\n\nclass Keyboard {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n /** @private */\n\n this._wasFocused = false;\n pswp.on('bindEvents', () => {\n if (pswp.options.trapFocus) {\n // Dialog was likely opened by keyboard if initial point is not defined\n if (!pswp.options.initialPointerPos) {\n // focus causes layout,\n // which causes lag during the animation,\n // that's why we delay it until the opener transition ends\n this._focusRoot();\n }\n\n pswp.events.add(document, 'focusin',\n /** @type EventListener */\n this._onFocusIn.bind(this));\n }\n\n pswp.events.add(document, 'keydown',\n /** @type EventListener */\n this._onKeyDown.bind(this));\n });\n const lastActiveElement =\n /** @type {HTMLElement} */\n document.activeElement;\n pswp.on('destroy', () => {\n if (pswp.options.returnFocus && lastActiveElement && this._wasFocused) {\n lastActiveElement.focus();\n }\n });\n }\n /** @private */\n\n\n _focusRoot() {\n if (!this._wasFocused && this.pswp.element) {\n this.pswp.element.focus();\n this._wasFocused = true;\n }\n }\n /**\r\n * @private\r\n * @param {KeyboardEvent} e\r\n */\n\n\n _onKeyDown(e) {\n const {\n pswp\n } = this;\n\n if (pswp.dispatch('keydown', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (specialKeyUsed(e)) {\n // don't do anything if special key pressed\n // to prevent from overriding default browser actions\n // for example, in Chrome on Mac cmd+arrow-left returns to previous page\n return;\n }\n /** @type {Methods<PhotoSwipe> | undefined} */\n\n\n let keydownAction;\n /** @type {'x' | 'y' | undefined} */\n\n let axis;\n let isForward = false;\n const isKeySupported = ('key' in e);\n\n switch (isKeySupported ? e.key : e.keyCode) {\n case getKeyboardEventKey('Escape', isKeySupported):\n if (pswp.options.escKey) {\n keydownAction = 'close';\n }\n\n break;\n\n case getKeyboardEventKey('z', isKeySupported):\n keydownAction = 'toggleZoom';\n break;\n\n case getKeyboardEventKey('ArrowLeft', isKeySupported):\n axis = 'x';\n break;\n\n case getKeyboardEventKey('ArrowUp', isKeySupported):\n axis = 'y';\n break;\n\n case getKeyboardEventKey('ArrowRight', isKeySupported):\n axis = 'x';\n isForward = true;\n break;\n\n case getKeyboardEventKey('ArrowDown', isKeySupported):\n isForward = true;\n axis = 'y';\n break;\n\n case getKeyboardEventKey('Tab', isKeySupported):\n this._focusRoot();\n\n break;\n } // if left/right/top/bottom key\n\n\n if (axis) {\n // prevent page scroll\n e.preventDefault();\n const {\n currSlide\n } = pswp;\n\n if (pswp.options.arrowKeys && axis === 'x' && pswp.getNumItems() > 1) {\n keydownAction = isForward ? 'next' : 'prev';\n } else if (currSlide && currSlide.currZoomLevel > currSlide.zoomLevels.fit) {\n // up/down arrow keys pan the image vertically\n // left/right arrow keys pan horizontally.\n // Unless there is only one image,\n // or arrowKeys option is disabled\n currSlide.pan[axis] += isForward ? -80 : 80;\n currSlide.panTo(currSlide.pan.x, currSlide.pan.y);\n }\n }\n\n if (keydownAction) {\n e.preventDefault(); // @ts-ignore\n\n pswp[keydownAction]();\n }\n }\n /**\r\n * Trap focus inside photoswipe\r\n *\r\n * @private\r\n * @param {FocusEvent} e\r\n */\n\n\n _onFocusIn(e) {\n const {\n template\n } = this.pswp;\n\n if (template && document !== e.target && template !== e.target && !template.contains(\n /** @type {Node} */\n e.target)) {\n // focus root element\n template.focus();\n }\n }\n\n}\n\nconst DEFAULT_EASING = 'cubic-bezier(.4,0,.22,1)';\n/** @typedef {import('./animations.js').SharedAnimationProps} SharedAnimationProps */\n\n/** @typedef {Object} DefaultCssAnimationProps\r\n *\r\n * @prop {HTMLElement} target\r\n * @prop {number} [duration]\r\n * @prop {string} [easing]\r\n * @prop {string} [transform]\r\n * @prop {string} [opacity]\r\n * */\n\n/** @typedef {SharedAnimationProps & DefaultCssAnimationProps} CssAnimationProps */\n\n/**\r\n * Runs CSS transition.\r\n */\n\nclass CSSAnimation {\n /**\r\n * onComplete can be unpredictable, be careful about current state\r\n *\r\n * @param {CssAnimationProps} props\r\n */\n constructor(props) {\n var _props$prop;\n\n this.props = props;\n const {\n target,\n onComplete,\n transform,\n onFinish = () => {},\n duration = 333,\n easing = DEFAULT_EASING\n } = props;\n this.onFinish = onFinish; // support only transform and opacity\n\n const prop = transform ? 'transform' : 'opacity';\n const propValue = (_props$prop = props[prop]) !== null && _props$prop !== void 0 ? _props$prop : '';\n /** @private */\n\n this._target = target;\n /** @private */\n\n this._onComplete = onComplete;\n /** @private */\n\n this._finished = false;\n /** @private */\n\n this._onTransitionEnd = this._onTransitionEnd.bind(this); // Using timeout hack to make sure that animation\n // starts even if the animated property was changed recently,\n // otherwise transitionend might not fire or transition won't start.\n // https://drafts.csswg.org/css-transitions/#starting\n //\n // ¯\\_(ツ)_/¯\n\n /** @private */\n\n this._helperTimeout = setTimeout(() => {\n setTransitionStyle(target, prop, duration, easing);\n this._helperTimeout = setTimeout(() => {\n target.addEventListener('transitionend', this._onTransitionEnd, false);\n target.addEventListener('transitioncancel', this._onTransitionEnd, false); // Safari occasionally does not emit transitionend event\n // if element property was modified during the transition,\n // which may be caused by resize or third party component,\n // using timeout as a safety fallback\n\n this._helperTimeout = setTimeout(() => {\n this._finalizeAnimation();\n }, duration + 500);\n target.style[prop] = propValue;\n }, 30); // Do not reduce this number\n }, 0);\n }\n /**\r\n * @private\r\n * @param {TransitionEvent} e\r\n */\n\n\n _onTransitionEnd(e) {\n if (e.target === this._target) {\n this._finalizeAnimation();\n }\n }\n /**\r\n * @private\r\n */\n\n\n _finalizeAnimation() {\n if (!this._finished) {\n this._finished = true;\n this.onFinish();\n\n if (this._onComplete) {\n this._onComplete();\n }\n }\n } // Destroy is called automatically onFinish\n\n\n destroy() {\n if (this._helperTimeout) {\n clearTimeout(this._helperTimeout);\n }\n\n removeTransitionStyle(this._target);\n\n this._target.removeEventListener('transitionend', this._onTransitionEnd, false);\n\n this._target.removeEventListener('transitioncancel', this._onTransitionEnd, false);\n\n if (!this._finished) {\n this._finalizeAnimation();\n }\n }\n\n}\n\nconst DEFAULT_NATURAL_FREQUENCY = 12;\nconst DEFAULT_DAMPING_RATIO = 0.75;\n/**\r\n * Spring easing helper\r\n */\n\nclass SpringEaser {\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 */\n constructor(initialVelocity, dampingRatio, naturalFrequency) {\n this.velocity = initialVelocity * 1000; // convert to \"pixels per second\"\n // https://en.wikipedia.org/wiki/Damping_ratio\n\n this._dampingRatio = dampingRatio || DEFAULT_DAMPING_RATIO; // https://en.wikipedia.org/wiki/Natural_frequency\n\n this._naturalFrequency = naturalFrequency || DEFAULT_NATURAL_FREQUENCY;\n this._dampedFrequency = this._naturalFrequency;\n\n if (this._dampingRatio < 1) {\n this._dampedFrequency *= Math.sqrt(1 - this._dampingRatio * this._dampingRatio);\n }\n }\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 */\n\n\n easeFrame(deltaPosition, deltaTime) {\n // Inspired by Apple Webkit and Android spring function implementation\n // https://en.wikipedia.org/wiki/Oscillation\n // https://en.wikipedia.org/wiki/Damping_ratio\n // we ignore mass (assume that it's 1kg)\n let displacement = 0;\n let coeff;\n deltaTime /= 1000;\n const naturalDumpingPow = Math.E ** (-this._dampingRatio * this._naturalFrequency * deltaTime);\n\n if (this._dampingRatio === 1) {\n coeff = this.velocity + this._naturalFrequency * deltaPosition;\n displacement = (deltaPosition + coeff * deltaTime) * naturalDumpingPow;\n this.velocity = displacement * -this._naturalFrequency + coeff * naturalDumpingPow;\n } else if (this._dampingRatio < 1) {\n coeff = 1 / this._dampedFrequency * (this._dampingRatio * this._naturalFrequency * deltaPosition + this.velocity);\n const dumpedFCos = Math.cos(this._dampedFrequency * deltaTime);\n const dumpedFSin = Math.sin(this._dampedFrequency * deltaTime);\n displacement = naturalDumpingPow * (deltaPosition * dumpedFCos + coeff * dumpedFSin);\n this.velocity = displacement * -this._naturalFrequency * this._dampingRatio + naturalDumpingPow * (-this._dampedFrequency * deltaPosition * dumpedFSin + this._dampedFrequency * coeff * dumpedFCos);\n } // Overdamped (>1) damping ratio is not supported\n\n\n return displacement;\n }\n\n}\n\n/** @typedef {import('./animations.js').SharedAnimationProps} SharedAnimationProps */\n\n/**\r\n * @typedef {Object} DefaultSpringAnimationProps\r\n *\r\n * @prop {number} start\r\n * @prop {number} end\r\n * @prop {number} velocity\r\n * @prop {number} [dampingRatio]\r\n * @prop {number} [naturalFrequency]\r\n * @prop {(end: number) => void} onUpdate\r\n */\n\n/** @typedef {SharedAnimationProps & DefaultSpringAnimationProps} SpringAnimationProps */\n\nclass SpringAnimation {\n /**\r\n * @param {SpringAnimationProps} props\r\n */\n constructor(props) {\n this.props = props;\n this._raf = 0;\n const {\n start,\n end,\n velocity,\n onUpdate,\n onComplete,\n onFinish = () => {},\n dampingRatio,\n naturalFrequency\n } = props;\n this.onFinish = onFinish;\n const easer = new SpringEaser(velocity, dampingRatio, naturalFrequency);\n let prevTime = Date.now();\n let deltaPosition = start - end;\n\n const animationLoop = () => {\n if (this._raf) {\n deltaPosition = easer.easeFrame(deltaPosition, Date.now() - prevTime); // Stop the animation if velocity is low and position is close to end\n\n if (Math.abs(deltaPosition) < 1 && Math.abs(easer.velocity) < 50) {\n // Finalize the animation\n onUpdate(end);\n\n if (onComplete) {\n onComplete();\n }\n\n this.onFinish();\n } else {\n prevTime = Date.now();\n onUpdate(deltaPosition + end);\n this._raf = requestAnimationFrame(animationLoop);\n }\n }\n };\n\n this._raf = requestAnimationFrame(animationLoop);\n } // Destroy is called automatically onFinish\n\n\n destroy() {\n if (this._raf >= 0) {\n cancelAnimationFrame(this._raf);\n }\n\n this._raf = 0;\n }\n\n}\n\n/** @typedef {import('./css-animation.js').CssAnimationProps} CssAnimationProps */\n\n/** @typedef {import('./spring-animation.js').SpringAnimationProps} SpringAnimationProps */\n\n/** @typedef {Object} SharedAnimationProps\r\n * @prop {string} [name]\r\n * @prop {boolean} [isPan]\r\n * @prop {boolean} [isMainScroll]\r\n * @prop {VoidFunction} [onComplete]\r\n * @prop {VoidFunction} [onFinish]\r\n */\n\n/** @typedef {SpringAnimation | CSSAnimation} Animation */\n\n/** @typedef {SpringAnimationProps | CssAnimationProps} AnimationProps */\n\n/**\r\n * Manages animations\r\n */\n\nclass Animations {\n constructor() {\n /** @type {Animation[]} */\n this.activeAnimations = [];\n }\n /**\r\n * @param {SpringAnimationProps} props\r\n */\n\n\n startSpring(props) {\n this._start(props, true);\n }\n /**\r\n * @param {CssAnimationProps} props\r\n */\n\n\n startTransition(props) {\n this._start(props);\n }\n /**\r\n * @private\r\n * @param {AnimationProps} props\r\n * @param {boolean} [isSpring]\r\n * @returns {Animation}\r\n */\n\n\n _start(props, isSpring) {\n const animation = isSpring ? new SpringAnimation(\n /** @type SpringAnimationProps */\n props) : new CSSAnimation(\n /** @type CssAnimationProps */\n props);\n this.activeAnimations.push(animation);\n\n animation.onFinish = () => this.stop(animation);\n\n return animation;\n }\n /**\r\n * @param {Animation} animation\r\n */\n\n\n stop(animation) {\n animation.destroy();\n const index = this.activeAnimations.indexOf(animation);\n\n if (index > -1) {\n this.activeAnimations.splice(index, 1);\n }\n }\n\n stopAll() {\n // _stopAllAnimations\n this.activeAnimations.forEach(animation => {\n animation.destroy();\n });\n this.activeAnimations = [];\n }\n /**\r\n * Stop all pan or zoom transitions\r\n */\n\n\n stopAllPan() {\n this.activeAnimations = this.activeAnimations.filter(animation => {\n if (animation.props.isPan) {\n animation.destroy();\n return false;\n }\n\n return true;\n });\n }\n\n stopMainScroll() {\n this.activeAnimations = this.activeAnimations.filter(animation => {\n if (animation.props.isMainScroll) {\n animation.destroy();\n return false;\n }\n\n return true;\n });\n }\n /**\r\n * Returns true if main scroll transition is running\r\n */\n // isMainScrollRunning() {\n // return this.activeAnimations.some((animation) => {\n // return animation.props.isMainScroll;\n // });\n // }\n\n /**\r\n * Returns true if any pan or zoom transition is running\r\n */\n\n\n isPanRunning() {\n return this.activeAnimations.some(animation => {\n return animation.props.isPan;\n });\n }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/**\r\n * Handles scroll wheel.\r\n * Can pan and zoom current slide image.\r\n */\nclass ScrollWheel {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n pswp.events.add(pswp.element, 'wheel',\n /** @type EventListener */\n this._onWheel.bind(this));\n }\n /**\r\n * @private\r\n * @param {WheelEvent} e\r\n */\n\n\n _onWheel(e) {\n e.preventDefault();\n const {\n currSlide\n } = this.pswp;\n let {\n deltaX,\n deltaY\n } = e;\n\n if (!currSlide) {\n return;\n }\n\n if (this.pswp.dispatch('wheel', {\n originalEvent: e\n }).defaultPrevented) {\n return;\n }\n\n if (e.ctrlKey || this.pswp.options.wheelToZoom) {\n // zoom\n if (currSlide.isZoomable()) {\n let zoomFactor = -deltaY;\n\n if (e.deltaMode === 1\n /* DOM_DELTA_LINE */\n ) {\n zoomFactor *= 0.05;\n } else {\n zoomFactor *= e.deltaMode ? 1 : 0.002;\n }\n\n zoomFactor = 2 ** zoomFactor;\n const destZoomLevel = currSlide.currZoomLevel * zoomFactor;\n currSlide.zoomTo(destZoomLevel, {\n x: e.clientX,\n y: e.clientY\n });\n }\n } else {\n // pan\n if (currSlide.isPannable()) {\n if (e.deltaMode === 1\n /* DOM_DELTA_LINE */\n ) {\n // 18 - average line height\n deltaX *= 18;\n deltaY *= 18;\n }\n\n currSlide.panTo(currSlide.pan.x - deltaX, currSlide.pan.y - deltaY);\n }\n }\n }\n\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Methods<T>} Methods<T>\r\n */\n\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 */\n\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<PhotoSwipe> | ((e: MouseEvent, element: HTMLElement, pswp: PhotoSwipe) => void)} [onClick]\r\n * @prop {'bar' | 'wrapper' | 'root'} [appendTo]\r\n * @prop {number} [order]\r\n */\n\n/** @typedef {'arrowPrev' | 'arrowNext' | 'close' | 'zoom' | 'counter'} DefaultUIElements */\n\n/** @typedef {string | UIElementMarkupProps} UIElementMarkup */\n\n/**\r\n * @param {UIElementMarkup} [htmlData]\r\n * @returns {string}\r\n */\n\nfunction addElementHTML(htmlData) {\n if (typeof htmlData === 'string') {\n // Allow developers to provide full svg,\n // For example:\n // <svg viewBox=\"0 0 32 32\" width=\"32\" height=\"32\" aria-hidden=\"true\" class=\"pswp__icn\">\n // <path d=\"...\" />\n // <circle ... />\n // </svg>\n // Can also be any HTML string.\n return htmlData;\n }\n\n if (!htmlData || !htmlData.isCustomSVG) {\n return '';\n }\n\n const svgData = htmlData;\n let out = '<svg aria-hidden=\"true\" class=\"pswp__icn\" viewBox=\"0 0 %d %d\" width=\"%d\" height=\"%d\">'; // replace all %d with size\n\n out = out.split('%d').join(\n /** @type {string} */\n svgData.size || 32); // Icons may contain outline/shadow,\n // to make it we \"clone\" base icon shape and add border to it.\n // Icon itself and border are styled via CSS.\n //\n // Property shadowID defines ID of element that should be cloned.\n\n if (svgData.outlineID) {\n out += '<use class=\"pswp__icn-shadow\" xlink:href=\"#' + svgData.outlineID + '\"/>';\n }\n\n out += svgData.inner;\n out += '</svg>';\n return out;\n}\n\nclass UIElement {\n /**\r\n * @param {PhotoSwipe} pswp\r\n * @param {UIElementData} data\r\n */\n constructor(pswp, data) {\n var _container;\n\n const name = data.name || data.className;\n let elementHTML = data.html; // @ts-expect-error lookup only by `data.name` maybe?\n\n if (pswp.options[name] === false) {\n // exit if element is disabled from options\n return;\n } // Allow to override SVG icons from options\n // @ts-expect-error lookup only by `data.name` maybe?\n\n\n if (typeof pswp.options[name + 'SVG'] === 'string') {\n // arrowPrevSVG\n // arrowNextSVG\n // closeSVG\n // zoomSVG\n // @ts-expect-error lookup only by `data.name` maybe?\n elementHTML = pswp.options[name + 'SVG'];\n }\n\n pswp.dispatch('uiElementCreate', {\n data\n });\n let className = '';\n\n if (data.isButton) {\n className += 'pswp__button ';\n className += data.className || `pswp__button--${data.name}`;\n } else {\n className += data.className || `pswp__${data.name}`;\n }\n\n let tagName = data.isButton ? data.tagName || 'button' : data.tagName || 'div';\n tagName =\n /** @type {keyof HTMLElementTagNameMap} */\n tagName.toLowerCase();\n /** @type {HTMLElement} */\n\n const element = createElement(className, tagName);\n\n if (data.isButton) {\n if (tagName === 'button') {\n /** @type {HTMLButtonElement} */\n element.type = 'button';\n }\n\n let {\n title\n } = data;\n const {\n ariaLabel\n } = data; // @ts-expect-error lookup only by `data.name` maybe?\n\n if (typeof pswp.options[name + 'Title'] === 'string') {\n // @ts-expect-error lookup only by `data.name` maybe?\n title = pswp.options[name + 'Title'];\n }\n\n if (title) {\n element.title = title;\n }\n\n const ariaText = ariaLabel || title;\n\n if (ariaText) {\n element.setAttribute('aria-label', ariaText);\n }\n }\n\n element.innerHTML = addElementHTML(elementHTML);\n\n if (data.onInit) {\n data.onInit(element, pswp);\n }\n\n if (data.onClick) {\n element.onclick = e => {\n if (typeof data.onClick === 'string') {\n // @ts-ignore\n pswp[data.onClick]();\n } else if (typeof data.onClick === 'function') {\n data.onClick(e, element, pswp);\n }\n };\n } // Top bar is default position\n\n\n const appendTo = data.appendTo || 'bar';\n /** @type {HTMLElement | undefined} root element by default */\n\n let container = pswp.element;\n\n if (appendTo === 'bar') {\n if (!pswp.topBar) {\n pswp.topBar = createElement('pswp__top-bar pswp__hide-on-close', 'div', pswp.scrollWrap);\n }\n\n container = pswp.topBar;\n } else {\n // element outside of top bar gets a secondary class\n // that makes element fade out on close\n element.classList.add('pswp__hide-on-close');\n\n if (appendTo === 'wrapper') {\n container = pswp.scrollWrap;\n }\n }\n\n (_container = container) === null || _container === void 0 || _container.appendChild(pswp.applyFilters('uiElement', element, data));\n }\n\n}\n\n/*\r\n Backward and forward arrow buttons\r\n */\n\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/**\r\n *\r\n * @param {HTMLElement} element\r\n * @param {PhotoSwipe} pswp\r\n * @param {boolean} [isNextButton]\r\n */\nfunction initArrowButton(element, pswp, isNextButton) {\n element.classList.add('pswp__button--arrow'); // TODO: this should point to a unique id for this instance\n\n element.setAttribute('aria-controls', 'pswp__items');\n pswp.on('change', () => {\n if (!pswp.options.loop) {\n if (isNextButton) {\n /** @type {HTMLButtonElement} */\n element.disabled = !(pswp.currIndex < pswp.getNumItems() - 1);\n } else {\n /** @type {HTMLButtonElement} */\n element.disabled = !(pswp.currIndex > 0);\n }\n }\n });\n}\n/** @type {UIElementData} */\n\n\nconst arrowPrev = {\n name: 'arrowPrev',\n className: 'pswp__button--arrow--prev',\n title: 'Previous',\n order: 10,\n isButton: true,\n appendTo: 'wrapper',\n html: {\n isCustomSVG: true,\n size: 60,\n inner: '<path d=\"M29 43l-3 3-16-16 16-16 3 3-13 13 13 13z\" id=\"pswp__icn-arrow\"/>',\n outlineID: 'pswp__icn-arrow'\n },\n onClick: 'prev',\n onInit: initArrowButton\n};\n/** @type {UIElementData} */\n\nconst arrowNext = {\n name: 'arrowNext',\n className: 'pswp__button--arrow--next',\n title: 'Next',\n order: 11,\n isButton: true,\n appendTo: 'wrapper',\n html: {\n isCustomSVG: true,\n size: 60,\n inner: '<use xlink:href=\"#pswp__icn-arrow\"/>',\n outlineID: 'pswp__icn-arrow'\n },\n onClick: 'next',\n onInit: (el, pswp) => {\n initArrowButton(el, pswp, true);\n }\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst closeButton = {\n name: 'close',\n title: 'Close',\n order: 20,\n isButton: true,\n html: {\n isCustomSVG: true,\n inner: '<path d=\"M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z\" id=\"pswp__icn-close\"/>',\n outlineID: 'pswp__icn-close'\n },\n onClick: 'close'\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst zoomButton = {\n name: 'zoom',\n title: 'Zoom',\n order: 10,\n isButton: true,\n html: {\n isCustomSVG: true,\n // eslint-disable-next-line max-len\n inner: '<path d=\"M17.426 19.926a6 6 0 1 1 1.5-1.5L23 22.5 21.5 24l-4.074-4.074z\" id=\"pswp__icn-zoom\"/>' + '<path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-h\" d=\"M11 16v-2h6v2z\"/>' + '<path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-v\" d=\"M13 12h2v6h-2z\"/>',\n outlineID: 'pswp__icn-zoom'\n },\n onClick: 'toggleZoom'\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst loadingIndicator = {\n name: 'preloader',\n appendTo: 'bar',\n order: 7,\n html: {\n isCustomSVG: true,\n // eslint-disable-next-line max-len\n inner: '<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.2 16a5.2 5.2 0 1 1-5.2-5.2V8a8 8 0 1 0 8 8h-2.8Z\" id=\"pswp__icn-loading\"/>',\n outlineID: 'pswp__icn-loading'\n },\n onInit: (indicatorElement, pswp) => {\n /** @type {boolean | undefined} */\n let isVisible;\n /** @type {NodeJS.Timeout | null} */\n\n let delayTimeout = null;\n /**\r\n * @param {string} className\r\n * @param {boolean} add\r\n */\n\n const toggleIndicatorClass = (className, add) => {\n indicatorElement.classList.toggle('pswp__preloader--' + className, add);\n };\n /**\r\n * @param {boolean} visible\r\n */\n\n\n const setIndicatorVisibility = visible => {\n if (isVisible !== visible) {\n isVisible = visible;\n toggleIndicatorClass('active', visible);\n }\n };\n\n const updatePreloaderVisibility = () => {\n var _pswp$currSlide;\n\n if (!((_pswp$currSlide = pswp.currSlide) !== null && _pswp$currSlide !== void 0 && _pswp$currSlide.content.isLoading())) {\n setIndicatorVisibility(false);\n\n if (delayTimeout) {\n clearTimeout(delayTimeout);\n delayTimeout = null;\n }\n\n return;\n }\n\n if (!delayTimeout) {\n // display loading indicator with delay\n delayTimeout = setTimeout(() => {\n var _pswp$currSlide2;\n\n setIndicatorVisibility(Boolean((_pswp$currSlide2 = pswp.currSlide) === null || _pswp$currSlide2 === void 0 ? void 0 : _pswp$currSlide2.content.isLoading()));\n delayTimeout = null;\n }, pswp.options.preloaderDelay);\n }\n };\n\n pswp.on('change', updatePreloaderVisibility);\n pswp.on('loadComplete', e => {\n if (pswp.currSlide === e.slide) {\n updatePreloaderVisibility();\n }\n }); // expose the method\n\n if (pswp.ui) {\n pswp.ui.updatePreloaderVisibility = updatePreloaderVisibility;\n }\n }\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst counterIndicator = {\n name: 'counter',\n order: 5,\n onInit: (counterElement, pswp) => {\n pswp.on('change', () => {\n counterElement.innerText = pswp.currIndex + 1 + pswp.options.indexIndicatorSep + pswp.getNumItems();\n });\n }\n};\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\n\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 */\n\nfunction setZoomedIn(el, isZoomedIn) {\n el.classList.toggle('pswp--zoomed-in', isZoomedIn);\n}\n\nclass UI {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n this.isRegistered = false;\n /** @type {UIElementData[]} */\n\n this.uiElementsData = [];\n /** @type {(UIElement | UIElementData)[]} */\n\n this.items = [];\n /** @type {() => void} */\n\n this.updatePreloaderVisibility = () => {};\n /**\r\n * @private\r\n * @type {number | undefined}\r\n */\n\n\n this._lastUpdatedZoomLevel = undefined;\n }\n\n init() {\n const {\n pswp\n } = this;\n this.isRegistered = false;\n this.uiElementsData = [closeButton, arrowPrev, arrowNext, zoomButton, loadingIndicator, counterIndicator];\n pswp.dispatch('uiRegister'); // sort by order\n\n this.uiElementsData.sort((a, b) => {\n // default order is 0\n return (a.order || 0) - (b.order || 0);\n });\n this.items = [];\n this.isRegistered = true;\n this.uiElementsData.forEach(uiElementData => {\n this.registerElement(uiElementData);\n });\n pswp.on('change', () => {\n var _pswp$element;\n\n (_pswp$element = pswp.element) === null || _pswp$element === void 0 || _pswp$element.classList.toggle('pswp--one-slide', pswp.getNumItems() === 1);\n });\n pswp.on('zoomPanUpdate', () => this._onZoomPanUpdate());\n }\n /**\r\n * @param {UIElementData} elementData\r\n */\n\n\n registerElement(elementData) {\n if (this.isRegistered) {\n this.items.push(new UIElement(this.pswp, elementData));\n } else {\n this.uiElementsData.push(elementData);\n }\n }\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 * @private\r\n */\n\n\n _onZoomPanUpdate() {\n const {\n template,\n currSlide,\n options\n } = this.pswp;\n\n if (this.pswp.opener.isClosing || !template || !currSlide) {\n return;\n }\n\n let {\n currZoomLevel\n } = currSlide; // if not open yet - check against initial zoom level\n\n if (!this.pswp.opener.isOpen) {\n currZoomLevel = currSlide.zoomLevels.initial;\n }\n\n if (currZoomLevel === this._lastUpdatedZoomLevel) {\n return;\n }\n\n this._lastUpdatedZoomLevel = currZoomLevel;\n const currZoomLevelDiff = currSlide.zoomLevels.initial - currSlide.zoomLevels.secondary; // Initial and secondary zoom levels are almost equal\n\n if (Math.abs(currZoomLevelDiff) < 0.01 || !currSlide.isZoomable()) {\n // disable zoom\n setZoomedIn(template, false);\n template.classList.remove('pswp--zoom-allowed');\n return;\n }\n\n template.classList.add('pswp--zoom-allowed');\n const potentialZoomLevel = currZoomLevel === currSlide.zoomLevels.initial ? currSlide.zoomLevels.secondary : currSlide.zoomLevels.initial;\n setZoomedIn(template, potentialZoomLevel <= currZoomLevel);\n\n if (options.imageClickAction === 'zoom' || options.imageClickAction === 'zoom-or-close') {\n template.classList.add('pswp--click-to-zoom');\n }\n }\n\n}\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {{ x: number; y: number; w: number; innerRect?: { w: number; h: number; x: number; y: number } }} Bounds */\n\n/**\r\n * @param {HTMLElement} el\r\n * @returns Bounds\r\n */\nfunction getBoundsByElement(el) {\n const thumbAreaRect = el.getBoundingClientRect();\n return {\n x: thumbAreaRect.left,\n y: thumbAreaRect.top,\n w: thumbAreaRect.width\n };\n}\n/**\r\n * @param {HTMLElement} el\r\n * @param {number} imageWidth\r\n * @param {number} imageHeight\r\n * @returns Bounds\r\n */\n\n\nfunction getCroppedBoundsByElement(el, imageWidth, imageHeight) {\n const thumbAreaRect = el.getBoundingClientRect(); // fill image into the area\n // (do they same as object-fit:cover does to retrieve coordinates)\n\n const hRatio = thumbAreaRect.width / imageWidth;\n const vRatio = thumbAreaRect.height / imageHeight;\n const fillZoomLevel = hRatio > vRatio ? hRatio : vRatio;\n const offsetX = (thumbAreaRect.width - imageWidth * fillZoomLevel) / 2;\n const offsetY = (thumbAreaRect.height - imageHeight * fillZoomLevel) / 2;\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 */\n\n const bounds = {\n x: thumbAreaRect.left + offsetX,\n y: thumbAreaRect.top + offsetY,\n w: imageWidth * fillZoomLevel\n }; // Coordinates of inner crop area\n // relative to the image\n\n bounds.innerRect = {\n w: thumbAreaRect.width,\n h: thumbAreaRect.height,\n x: offsetX,\n y: offsetY\n };\n return bounds;\n}\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 */\n\n\nfunction getThumbBounds(index, itemData, instance) {\n // legacy event, before filters were introduced\n const event = instance.dispatch('thumbBounds', {\n index,\n itemData,\n instance\n }); // @ts-expect-error\n\n if (event.thumbBounds) {\n // @ts-expect-error\n return event.thumbBounds;\n }\n\n const {\n element\n } = itemData;\n /** @type {Bounds | undefined} */\n\n let thumbBounds;\n /** @type {HTMLElement | null | undefined} */\n\n let thumbnail;\n\n if (element && instance.options.thumbSelector !== false) {\n const thumbSelector = instance.options.thumbSelector || 'img';\n thumbnail = element.matches(thumbSelector) ? element :\n /** @type {HTMLElement | null} */\n element.querySelector(thumbSelector);\n }\n\n thumbnail = instance.applyFilters('thumbEl', thumbnail, itemData, index);\n\n if (thumbnail) {\n if (!itemData.thumbCropped) {\n thumbBounds = getBoundsByElement(thumbnail);\n } else {\n thumbBounds = getCroppedBoundsByElement(thumbnail, itemData.width || itemData.w || 0, itemData.height || itemData.h || 0);\n }\n }\n\n return instance.applyFilters('thumbBounds', thumbBounds, itemData, index);\n}\n\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\n\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('../slide/content.js').default} ContentDefault */\n\n/** @typedef {import('../slide/slide.js').default} Slide */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\n\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\n\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<string, any>} Content\r\n */\n\n/** @typedef {{ x?: number; y?: number }} Point */\n\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 | undefined, 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 | undefined, transitionDuration: number | false | undefined }} 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 | undefined, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\n\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource | undefined) => 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 | null | undefined, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thumbnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds | undefined, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the thumbnail bounds from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbbounds\r\n *\r\n * @prop {(srcsetSizesWidth: number, content: Content) => number} srcsetSizesWidth\r\n *\r\n * @prop {(preventPointerEvent: boolean, event: PointerEvent, pointerType: string) => boolean} preventPointerEvent\r\n *\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent<T> : PhotoSwipeEvent<T> & PhotoSwipeEventsMap[T]} AugmentedEvent\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {(event: AugmentedEvent<T>) => void} EventCallback\r\n */\n\n/**\r\n * Base PhotoSwipe event object\r\n *\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n */\nclass PhotoSwipeEvent {\n /**\r\n * @param {T} type\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n */\n constructor(type, details) {\n this.type = type;\n this.defaultPrevented = false;\n\n if (details) {\n Object.assign(this, details);\n }\n }\n\n preventDefault() {\n this.defaultPrevented = true;\n }\n\n}\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 */\n\n\nclass Eventable {\n constructor() {\n /**\r\n * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent<T>) => void)[] }}\r\n */\n this._listeners = {};\n /**\r\n * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter<T>[] }}\r\n */\n\n this._filters = {};\n /** @type {PhotoSwipe | undefined} */\n\n this.pswp = undefined;\n /** @type {PhotoSwipeOptions | undefined} */\n\n this.options = undefined;\n }\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 */\n\n\n addFilter(name, fn, priority = 100) {\n var _this$_filters$name, _this$_filters$name2, _this$pswp;\n\n if (!this._filters[name]) {\n this._filters[name] = [];\n }\n\n (_this$_filters$name = this._filters[name]) === null || _this$_filters$name === void 0 || _this$_filters$name.push({\n fn,\n priority\n });\n (_this$_filters$name2 = this._filters[name]) === null || _this$_filters$name2 === void 0 || _this$_filters$name2.sort((f1, f2) => f1.priority - f2.priority);\n (_this$pswp = this.pswp) === null || _this$pswp === void 0 || _this$pswp.addFilter(name, fn, priority);\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n */\n\n\n removeFilter(name, fn) {\n if (this._filters[name]) {\n // @ts-expect-error\n this._filters[name] = this._filters[name].filter(filter => filter.fn !== fn);\n }\n\n if (this.pswp) {\n this.pswp.removeFilter(name, fn);\n }\n }\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {Parameters<PhotoSwipeFiltersMap[T]>} args\r\n * @returns {Parameters<PhotoSwipeFiltersMap[T]>[0]}\r\n */\n\n\n applyFilters(name, ...args) {\n var _this$_filters$name3;\n\n (_this$_filters$name3 = this._filters[name]) === null || _this$_filters$name3 === void 0 || _this$_filters$name3.forEach(filter => {\n // @ts-expect-error\n args[0] = filter.fn.apply(this, args);\n });\n return args[0];\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback<T>} fn\r\n */\n\n\n on(name, fn) {\n var _this$_listeners$name, _this$pswp2;\n\n if (!this._listeners[name]) {\n this._listeners[name] = [];\n }\n\n (_this$_listeners$name = this._listeners[name]) === null || _this$_listeners$name === void 0 || _this$_listeners$name.push(fn); // When binding events to lightbox,\n // also bind events to PhotoSwipe Core,\n // if it's open.\n\n (_this$pswp2 = this.pswp) === null || _this$pswp2 === void 0 || _this$pswp2.on(name, fn);\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback<T>} fn\r\n */\n\n\n off(name, fn) {\n var _this$pswp3;\n\n if (this._listeners[name]) {\n // @ts-expect-error\n this._listeners[name] = this._listeners[name].filter(listener => fn !== listener);\n }\n\n (_this$pswp3 = this.pswp) === null || _this$pswp3 === void 0 || _this$pswp3.off(name, fn);\n }\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n * @returns {AugmentedEvent<T>}\r\n */\n\n\n dispatch(name, details) {\n var _this$_listeners$name2;\n\n if (this.pswp) {\n return this.pswp.dispatch(name, details);\n }\n\n const event =\n /** @type {AugmentedEvent<T>} */\n new PhotoSwipeEvent(name, details);\n (_this$_listeners$name2 = this._listeners[name]) === null || _this$_listeners$name2 === void 0 || _this$_listeners$name2.forEach(listener => {\n listener.call(this, event);\n });\n return event;\n }\n\n}\n\nclass Placeholder {\n /**\r\n * @param {string | false} imageSrc\r\n * @param {HTMLElement} container\r\n */\n constructor(imageSrc, container) {\n // Create placeholder\n // (stretched thumbnail or simple div behind the main image)\n\n /** @type {HTMLImageElement | HTMLDivElement | null} */\n this.element = createElement('pswp__img pswp__img--placeholder', imageSrc ? 'img' : 'div', container);\n\n if (imageSrc) {\n const imgEl =\n /** @type {HTMLImageElement} */\n this.element;\n imgEl.decoding = 'async';\n imgEl.alt = '';\n imgEl.src = imageSrc;\n imgEl.setAttribute('role', 'presentation');\n }\n\n this.element.setAttribute('aria-hidden', 'true');\n }\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\n\n\n setDisplayedSize(width, height) {\n if (!this.element) {\n return;\n }\n\n if (this.element.tagName === 'IMG') {\n // Use transform scale() to modify img placeholder size\n // (instead of changing width/height directly).\n // This helps with performance, specifically in iOS15 Safari.\n setWidthHeight(this.element, 250, 'auto');\n this.element.style.transformOrigin = '0 0';\n this.element.style.transform = toTransformString(0, 0, width / 250);\n } else {\n setWidthHeight(this.element, width, height);\n }\n }\n\n destroy() {\n var _this$element;\n\n if ((_this$element = this.element) !== null && _this$element !== void 0 && _this$element.parentNode) {\n this.element.remove();\n }\n\n this.element = null;\n }\n\n}\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../util/util.js').LoadState} LoadState */\n\nclass Content {\n /**\r\n * @param {SlideData} itemData Slide data\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n */\n constructor(itemData, instance, index) {\n this.instance = instance;\n this.data = itemData;\n this.index = index;\n /** @type {HTMLImageElement | HTMLDivElement | undefined} */\n\n this.element = undefined;\n /** @type {Placeholder | undefined} */\n\n this.placeholder = undefined;\n /** @type {Slide | undefined} */\n\n this.slide = undefined;\n this.displayedImageWidth = 0;\n this.displayedImageHeight = 0;\n this.width = Number(this.data.w) || Number(this.data.width) || 0;\n this.height = Number(this.data.h) || Number(this.data.height) || 0;\n this.isAttached = false;\n this.hasSlide = false;\n this.isDecoding = false;\n /** @type {LoadState} */\n\n this.state = LOAD_STATE.IDLE;\n\n if (this.data.type) {\n this.type = this.data.type;\n } else if (this.data.src) {\n this.type = 'image';\n } else {\n this.type = 'html';\n }\n\n this.instance.dispatch('contentInit', {\n content: this\n });\n }\n\n removePlaceholder() {\n if (this.placeholder && !this.keepPlaceholder()) {\n // With delay, as image might be loaded, but not rendered\n setTimeout(() => {\n if (this.placeholder) {\n this.placeholder.destroy();\n this.placeholder = undefined;\n }\n }, 1000);\n }\n }\n /**\r\n * Preload content\r\n *\r\n * @param {boolean} isLazy\r\n * @param {boolean} [reload]\r\n */\n\n\n load(isLazy, reload) {\n if (this.slide && this.usePlaceholder()) {\n if (!this.placeholder) {\n const placeholderSrc = this.instance.applyFilters('placeholderSrc', // use image-based placeholder only for the first slide,\n // as rendering (even small stretched thumbnail) is an expensive operation\n this.data.msrc && this.slide.isFirstSlide ? this.data.msrc : false, this);\n this.placeholder = new Placeholder(placeholderSrc, this.slide.container);\n } else {\n const placeholderEl = this.placeholder.element; // Add placeholder to DOM if it was already created\n\n if (placeholderEl && !placeholderEl.parentElement) {\n this.slide.container.prepend(placeholderEl);\n }\n }\n }\n\n if (this.element && !reload) {\n return;\n }\n\n if (this.instance.dispatch('contentLoad', {\n content: this,\n isLazy\n }).defaultPrevented) {\n return;\n }\n\n if (this.isImageContent()) {\n this.element = createElement('pswp__img', 'img'); // Start loading only after width is defined, as sizes might depend on it.\n // Due to Safari feature, we must define sizes before srcset.\n\n if (this.displayedImageWidth) {\n this.loadImage(isLazy);\n }\n } else {\n this.element = createElement('pswp__content', 'div');\n this.element.innerHTML = this.data.html || '';\n }\n\n if (reload && this.slide) {\n this.slide.updateContentSize(true);\n }\n }\n /**\r\n * Preload image\r\n *\r\n * @param {boolean} isLazy\r\n */\n\n\n loadImage(isLazy) {\n var _this$data$src, _this$data$alt;\n\n if (!this.isImageContent() || !this.element || this.instance.dispatch('contentLoadImage', {\n content: this,\n isLazy\n }).defaultPrevented) {\n return;\n }\n\n const imageElement =\n /** @type HTMLImageElement */\n this.element;\n this.updateSrcsetSizes();\n\n if (this.data.srcset) {\n imageElement.srcset = this.data.srcset;\n }\n\n imageElement.src = (_this$data$src = this.data.src) !== null && _this$data$src !== void 0 ? _this$data$src : '';\n imageElement.alt = (_this$data$alt = this.data.alt) !== null && _this$data$alt !== void 0 ? _this$data$alt : '';\n this.state = LOAD_STATE.LOADING;\n\n if (imageElement.complete) {\n this.onLoaded();\n } else {\n imageElement.onload = () => {\n this.onLoaded();\n };\n\n imageElement.onerror = () => {\n this.onError();\n };\n }\n }\n /**\r\n * Assign slide to content\r\n *\r\n * @param {Slide} slide\r\n */\n\n\n setSlide(slide) {\n this.slide = slide;\n this.hasSlide = true;\n this.instance = slide.pswp; // todo: do we need to unset slide?\n }\n /**\r\n * Content load success handler\r\n */\n\n\n onLoaded() {\n this.state = LOAD_STATE.LOADED;\n\n if (this.slide && this.element) {\n this.instance.dispatch('loadComplete', {\n slide: this.slide,\n content: this\n }); // if content is reloaded\n\n if (this.slide.isActive && this.slide.heavyAppended && !this.element.parentNode) {\n this.append();\n this.slide.updateContentSize(true);\n }\n\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n this.removePlaceholder();\n }\n }\n }\n /**\r\n * Content load error handler\r\n */\n\n\n onError() {\n this.state = LOAD_STATE.ERROR;\n\n if (this.slide) {\n this.displayError();\n this.instance.dispatch('loadComplete', {\n slide: this.slide,\n isError: true,\n content: this\n });\n this.instance.dispatch('loadError', {\n slide: this.slide,\n content: this\n });\n }\n }\n /**\r\n * @returns {Boolean} If the content is currently loading\r\n */\n\n\n isLoading() {\n return this.instance.applyFilters('isContentLoading', this.state === LOAD_STATE.LOADING, this);\n }\n /**\r\n * @returns {Boolean} If the content is in error state\r\n */\n\n\n isError() {\n return this.state === LOAD_STATE.ERROR;\n }\n /**\r\n * @returns {boolean} If the content is image\r\n */\n\n\n isImageContent() {\n return this.type === 'image';\n }\n /**\r\n * Update content size\r\n *\r\n * @param {Number} width\r\n * @param {Number} height\r\n */\n\n\n setDisplayedSize(width, height) {\n if (!this.element) {\n return;\n }\n\n if (this.placeholder) {\n this.placeholder.setDisplayedSize(width, height);\n }\n\n if (this.instance.dispatch('contentResize', {\n content: this,\n width,\n height\n }).defaultPrevented) {\n return;\n }\n\n setWidthHeight(this.element, width, height);\n\n if (this.isImageContent() && !this.isError()) {\n const isInitialSizeUpdate = !this.displayedImageWidth && width;\n this.displayedImageWidth = width;\n this.displayedImageHeight = height;\n\n if (isInitialSizeUpdate) {\n this.loadImage(false);\n } else {\n this.updateSrcsetSizes();\n }\n\n if (this.slide) {\n this.instance.dispatch('imageSizeChange', {\n slide: this.slide,\n width,\n height,\n content: this\n });\n }\n }\n }\n /**\r\n * @returns {boolean} If the content can be zoomed\r\n */\n\n\n isZoomable() {\n return this.instance.applyFilters('isContentZoomable', this.isImageContent() && this.state !== LOAD_STATE.ERROR, this);\n }\n /**\r\n * Update image srcset sizes attribute based on width and height\r\n */\n\n\n updateSrcsetSizes() {\n // Handle srcset sizes attribute.\n //\n // Never lower quality, if it was increased previously.\n // Chrome does this automatically, Firefox and Safari do not,\n // so we store largest used size in dataset.\n if (!this.isImageContent() || !this.element || !this.data.srcset) {\n return;\n }\n\n const image =\n /** @type HTMLImageElement */\n this.element;\n const sizesWidth = this.instance.applyFilters('srcsetSizesWidth', this.displayedImageWidth, this);\n\n if (!image.dataset.largestUsedSize || sizesWidth > parseInt(image.dataset.largestUsedSize, 10)) {\n image.sizes = sizesWidth + 'px';\n image.dataset.largestUsedSize = String(sizesWidth);\n }\n }\n /**\r\n * @returns {boolean} If content should use a placeholder (from msrc by default)\r\n */\n\n\n usePlaceholder() {\n return this.instance.applyFilters('useContentPlaceholder', this.isImageContent(), this);\n }\n /**\r\n * Preload content with lazy-loading param\r\n */\n\n\n lazyLoad() {\n if (this.instance.dispatch('contentLazyLoad', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n this.load(true);\n }\n /**\r\n * @returns {boolean} If placeholder should be kept after content is loaded\r\n */\n\n\n keepPlaceholder() {\n return this.instance.applyFilters('isKeepingPlaceholder', this.isLoading(), this);\n }\n /**\r\n * Destroy the content\r\n */\n\n\n destroy() {\n this.hasSlide = false;\n this.slide = undefined;\n\n if (this.instance.dispatch('contentDestroy', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n this.remove();\n\n if (this.placeholder) {\n this.placeholder.destroy();\n this.placeholder = undefined;\n }\n\n if (this.isImageContent() && this.element) {\n this.element.onload = null;\n this.element.onerror = null;\n this.element = undefined;\n }\n }\n /**\r\n * Display error message\r\n */\n\n\n displayError() {\n if (this.slide) {\n var _this$instance$option, _this$instance$option2;\n\n let errorMsgEl = createElement('pswp__error-msg', 'div');\n errorMsgEl.innerText = (_this$instance$option = (_this$instance$option2 = this.instance.options) === null || _this$instance$option2 === void 0 ? void 0 : _this$instance$option2.errorMsg) !== null && _this$instance$option !== void 0 ? _this$instance$option : '';\n errorMsgEl =\n /** @type {HTMLDivElement} */\n this.instance.applyFilters('contentErrorElement', errorMsgEl, this);\n this.element = createElement('pswp__content pswp__error-msg-container', 'div');\n this.element.appendChild(errorMsgEl);\n this.slide.container.innerText = '';\n this.slide.container.appendChild(this.element);\n this.slide.updateContentSize(true);\n this.removePlaceholder();\n }\n }\n /**\r\n * Append the content\r\n */\n\n\n append() {\n if (this.isAttached || !this.element) {\n return;\n }\n\n this.isAttached = true;\n\n if (this.state === LOAD_STATE.ERROR) {\n this.displayError();\n return;\n }\n\n if (this.instance.dispatch('contentAppend', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n const supportsDecode = ('decode' in this.element);\n\n if (this.isImageContent()) {\n // Use decode() on nearby slides\n //\n // Nearby slide images are in DOM and not hidden via display:none.\n // However, they are placed offscreen (to the left and right side).\n //\n // Some browsers do not composite the image until it's actually visible,\n // using decode() helps.\n //\n // You might ask \"why dont you just decode() and then append all images\",\n // that's because I want to show image before it's fully loaded,\n // as browser can render parts of image while it is loading.\n // We do not do this in Safari due to partial loading bug.\n if (supportsDecode && this.slide && (!this.slide.isActive || isSafari())) {\n this.isDecoding = true; // purposefully using finally instead of then,\n // as if srcset sizes changes dynamically - it may cause decode error\n\n /** @type {HTMLImageElement} */\n\n this.element.decode().catch(() => {}).finally(() => {\n this.isDecoding = false;\n this.appendImage();\n });\n } else {\n this.appendImage();\n }\n } else if (this.slide && !this.element.parentNode) {\n this.slide.container.appendChild(this.element);\n }\n }\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 */\n\n\n activate() {\n if (this.instance.dispatch('contentActivate', {\n content: this\n }).defaultPrevented || !this.slide) {\n return;\n }\n\n if (this.isImageContent() && this.isDecoding && !isSafari()) {\n // add image to slide when it becomes active,\n // even if it's not finished decoding\n this.appendImage();\n } else if (this.isError()) {\n this.load(false, true); // try to reload\n }\n\n if (this.slide.holderElement) {\n this.slide.holderElement.setAttribute('aria-hidden', 'false');\n }\n }\n /**\r\n * Deactivate the content\r\n */\n\n\n deactivate() {\n this.instance.dispatch('contentDeactivate', {\n content: this\n });\n\n if (this.slide && this.slide.holderElement) {\n this.slide.holderElement.setAttribute('aria-hidden', 'true');\n }\n }\n /**\r\n * Remove the content from DOM\r\n */\n\n\n remove() {\n this.isAttached = false;\n\n if (this.instance.dispatch('contentRemove', {\n content: this\n }).defaultPrevented) {\n return;\n }\n\n if (this.element && this.element.parentNode) {\n this.element.remove();\n }\n\n if (this.placeholder && this.placeholder.element) {\n this.placeholder.element.remove();\n }\n }\n /**\r\n * Append the image content to slide container\r\n */\n\n\n appendImage() {\n if (!this.isAttached) {\n return;\n }\n\n if (this.instance.dispatch('contentAppendImage', {\n content: this\n }).defaultPrevented) {\n return;\n } // ensure that element exists and is not already appended\n\n\n if (this.slide && this.element && !this.element.parentNode) {\n this.slide.container.appendChild(this.element);\n }\n\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n this.removePlaceholder();\n }\n }\n\n}\n\n/** @typedef {import('./content.js').default} Content */\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\nconst MIN_SLIDES_TO_CACHE = 5;\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 {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\n\nfunction lazyLoadData(itemData, instance, index) {\n const content = instance.createContentFromData(itemData, index);\n /** @type {ZoomLevel | undefined} */\n\n let zoomLevel;\n const {\n options\n } = instance; // We need to know dimensions of the image to preload it,\n // as it might use srcset, and we need to define sizes\n\n if (options) {\n zoomLevel = new ZoomLevel(options, itemData, -1);\n let viewportSize;\n\n if (instance.pswp) {\n viewportSize = instance.pswp.viewportSize;\n } else {\n viewportSize = getViewportSize(options, instance);\n }\n\n const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\n zoomLevel.update(content.width, content.height, panAreaSize);\n }\n\n content.lazyLoad();\n\n if (zoomLevel) {\n content.setDisplayedSize(Math.ceil(content.width * zoomLevel.initial), Math.ceil(content.height * zoomLevel.initial));\n }\n\n return content;\n}\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 {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n * @returns {Content | undefined}\r\n */\n\nfunction lazyLoadSlide(index, instance) {\n const itemData = instance.getItemData(index);\n\n if (instance.dispatch('lazyLoadSlide', {\n index,\n itemData\n }).defaultPrevented) {\n return;\n }\n\n return lazyLoadData(itemData, instance, index);\n}\n\nclass ContentLoader {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp; // Total amount of cached images\n\n this.limit = Math.max(pswp.options.preload[0] + pswp.options.preload[1] + 1, MIN_SLIDES_TO_CACHE);\n /** @type {Content[]} */\n\n this._cachedItems = [];\n }\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 */\n\n\n updateLazy(diff) {\n const {\n pswp\n } = this;\n\n if (pswp.dispatch('lazyLoad').defaultPrevented) {\n return;\n }\n\n const {\n preload\n } = pswp.options;\n const isForward = diff === undefined ? true : diff >= 0;\n let i; // preload[1] - num items to preload in forward direction\n\n for (i = 0; i <= preload[1]; i++) {\n this.loadSlideByIndex(pswp.currIndex + (isForward ? i : -i));\n } // preload[0] - num items to preload in backward direction\n\n\n for (i = 1; i <= preload[0]; i++) {\n this.loadSlideByIndex(pswp.currIndex + (isForward ? -i : i));\n }\n }\n /**\r\n * @param {number} initialIndex\r\n */\n\n\n loadSlideByIndex(initialIndex) {\n const index = this.pswp.getLoopedIndex(initialIndex); // try to get cached content\n\n let content = this.getContentByIndex(index);\n\n if (!content) {\n // no cached content, so try to load from scratch:\n content = lazyLoadSlide(index, this.pswp); // if content can be loaded, add it to cache:\n\n if (content) {\n this.addToCache(content);\n }\n }\n }\n /**\r\n * @param {Slide} slide\r\n * @returns {Content}\r\n */\n\n\n getContentBySlide(slide) {\n let content = this.getContentByIndex(slide.index);\n\n if (!content) {\n // create content if not found in cache\n content = this.pswp.createContentFromData(slide.data, slide.index);\n this.addToCache(content);\n } // assign slide to content\n\n\n content.setSlide(slide);\n return content;\n }\n /**\r\n * @param {Content} content\r\n */\n\n\n addToCache(content) {\n // move to the end of array\n this.removeByIndex(content.index);\n\n this._cachedItems.push(content);\n\n if (this._cachedItems.length > this.limit) {\n // Destroy the first content that's not attached\n const indexToRemove = this._cachedItems.findIndex(item => {\n return !item.isAttached && !item.hasSlide;\n });\n\n if (indexToRemove !== -1) {\n const removedItem = this._cachedItems.splice(indexToRemove, 1)[0];\n\n removedItem.destroy();\n }\n }\n }\n /**\r\n * Removes an image from cache, does not destroy() it, just removes.\r\n *\r\n * @param {number} index\r\n */\n\n\n removeByIndex(index) {\n const indexToRemove = this._cachedItems.findIndex(item => item.index === index);\n\n if (indexToRemove !== -1) {\n this._cachedItems.splice(indexToRemove, 1);\n }\n }\n /**\r\n * @param {number} index\r\n * @returns {Content | undefined}\r\n */\n\n\n getContentByIndex(index) {\n return this._cachedItems.find(content => content.index === index);\n }\n\n destroy() {\n this._cachedItems.forEach(content => content.destroy());\n\n this._cachedItems = [];\n }\n\n}\n\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\n\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\n\n/**\r\n * PhotoSwipe base class that can retrieve data about every slide.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\r\n */\n\nclass PhotoSwipeBase extends Eventable {\n /**\r\n * Get total number of slides\r\n *\r\n * @returns {number}\r\n */\n getNumItems() {\n var _this$options;\n\n let numItems = 0;\n const dataSource = (_this$options = this.options) === null || _this$options === void 0 ? void 0 : _this$options.dataSource;\n\n if (dataSource && 'length' in dataSource) {\n // may be an array or just object with length property\n numItems = dataSource.length;\n } else if (dataSource && 'gallery' in dataSource) {\n // query DOM elements\n if (!dataSource.items) {\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n }\n\n if (dataSource.items) {\n numItems = dataSource.items.length;\n }\n } // legacy event, before filters were introduced\n\n\n const event = this.dispatch('numItems', {\n dataSource,\n numItems\n });\n return this.applyFilters('numItems', event.numItems, dataSource);\n }\n /**\r\n * @param {SlideData} slideData\r\n * @param {number} index\r\n * @returns {Content}\r\n */\n\n\n createContentFromData(slideData, index) {\n return new Content(slideData, this, index);\n }\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 * @returns {SlideData}\r\n */\n\n\n getItemData(index) {\n var _this$options2;\n\n const dataSource = (_this$options2 = this.options) === null || _this$options2 === void 0 ? void 0 : _this$options2.dataSource;\n /** @type {SlideData | HTMLElement} */\n\n let dataSourceItem = {};\n\n if (Array.isArray(dataSource)) {\n // Datasource is an array of elements\n dataSourceItem = dataSource[index];\n } else if (dataSource && 'gallery' in dataSource) {\n // dataSource has gallery property,\n // thus it was created by Lightbox, based on\n // gallery and children options\n // query DOM elements\n if (!dataSource.items) {\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n }\n\n dataSourceItem = dataSource.items[index];\n }\n\n let itemData = dataSourceItem;\n\n if (itemData instanceof Element) {\n itemData = this._domElementToItemData(itemData);\n } // Dispatching the itemData event,\n // it's a legacy verion before filters were introduced\n\n\n const event = this.dispatch('itemData', {\n itemData: itemData || {},\n index\n });\n return this.applyFilters('itemData', event.itemData, index);\n }\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 * @returns {HTMLElement[]}\r\n */\n\n\n _getGalleryDOMElements(galleryElement) {\n var _this$options3, _this$options4;\n\n if ((_this$options3 = this.options) !== null && _this$options3 !== void 0 && _this$options3.children || (_this$options4 = this.options) !== null && _this$options4 !== void 0 && _this$options4.childSelector) {\n return getElementsFromOption(this.options.children, this.options.childSelector, galleryElement) || [];\n }\n\n return [galleryElement];\n }\n /**\r\n * Converts DOM element to item data object.\r\n *\r\n * @param {HTMLElement} element DOM element\r\n * @returns {SlideData}\r\n */\n\n\n _domElementToItemData(element) {\n /** @type {SlideData} */\n const itemData = {\n element\n };\n const linkEl =\n /** @type {HTMLAnchorElement} */\n element.tagName === 'A' ? element : element.querySelector('a');\n\n if (linkEl) {\n // src comes from data-pswp-src attribute,\n // if it's empty link href is used\n itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\n\n if (linkEl.dataset.pswpSrcset) {\n itemData.srcset = linkEl.dataset.pswpSrcset;\n }\n\n itemData.width = linkEl.dataset.pswpWidth ? parseInt(linkEl.dataset.pswpWidth, 10) : 0;\n itemData.height = linkEl.dataset.pswpHeight ? parseInt(linkEl.dataset.pswpHeight, 10) : 0; // support legacy w & h properties\n\n itemData.w = itemData.width;\n itemData.h = itemData.height;\n\n if (linkEl.dataset.pswpType) {\n itemData.type = linkEl.dataset.pswpType;\n }\n\n const thumbnailEl = element.querySelector('img');\n\n if (thumbnailEl) {\n var _thumbnailEl$getAttri;\n\n // msrc is URL to placeholder image that's displayed before large image is loaded\n // by default it's displayed only for the first slide\n itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\n itemData.alt = (_thumbnailEl$getAttri = thumbnailEl.getAttribute('alt')) !== null && _thumbnailEl$getAttri !== void 0 ? _thumbnailEl$getAttri : '';\n }\n\n if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\n itemData.thumbCropped = true;\n }\n }\n\n return this.applyFilters('domItemData', itemData, element, linkEl);\n }\n /**\r\n * Lazy-load by slide data\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\n\n\n lazyLoadData(itemData, index) {\n return lazyLoadData(itemData, this, index);\n }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('./slide/get-thumb-bounds.js').Bounds} Bounds */\n\n/** @typedef {import('./util/animations.js').AnimationProps} AnimationProps */\n// some browsers do not paint\n// elements which opacity is set to 0,\n// since we need to pre-render elements for the animation -\n// we set it to the minimum amount\n\nconst MIN_OPACITY = 0.003;\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 */\n\nclass Opener {\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\n constructor(pswp) {\n this.pswp = pswp;\n this.isClosed = true;\n this.isOpen = false;\n this.isClosing = false;\n this.isOpening = false;\n /**\r\n * @private\r\n * @type {number | false | undefined}\r\n */\n\n this._duration = undefined;\n /** @private */\n\n this._useAnimation = false;\n /** @private */\n\n this._croppedZoom = false;\n /** @private */\n\n this._animateRootOpacity = false;\n /** @private */\n\n this._animateBgOpacity = false;\n /**\r\n * @private\r\n * @type { HTMLDivElement | HTMLImageElement | null | undefined }\r\n */\n\n this._placeholder = undefined;\n /**\r\n * @private\r\n * @type { HTMLDivElement | undefined }\r\n */\n\n this._opacityElement = undefined;\n /**\r\n * @private\r\n * @type { HTMLDivElement | undefined }\r\n */\n\n this._cropContainer1 = undefined;\n /**\r\n * @private\r\n * @type { HTMLElement | null | undefined }\r\n */\n\n this._cropContainer2 = undefined;\n /**\r\n * @private\r\n * @type {Bounds | undefined}\r\n */\n\n this._thumbBounds = undefined;\n this._prepareOpen = this._prepareOpen.bind(this); // Override initial zoom and pan position\n\n pswp.on('firstZoomPan', this._prepareOpen);\n }\n\n open() {\n this._prepareOpen();\n\n this._start();\n }\n\n close() {\n if (this.isClosed || this.isClosing || this.isOpening) {\n // if we close during opening animation\n // for now do nothing,\n // browsers aren't good at changing the direction of the CSS transition\n return;\n }\n\n const slide = this.pswp.currSlide;\n this.isOpen = false;\n this.isOpening = false;\n this.isClosing = true;\n this._duration = this.pswp.options.hideAnimationDuration;\n\n if (slide && slide.currZoomLevel * slide.width >= this.pswp.options.maxWidthToAnimate) {\n this._duration = 0;\n }\n\n this._applyStartProps();\n\n setTimeout(() => {\n this._start();\n }, this._croppedZoom ? 30 : 0);\n }\n /** @private */\n\n\n _prepareOpen() {\n this.pswp.off('firstZoomPan', this._prepareOpen);\n\n if (!this.isOpening) {\n const slide = this.pswp.currSlide;\n this.isOpening = true;\n this.isClosing = false;\n this._duration = this.pswp.options.showAnimationDuration;\n\n if (slide && slide.zoomLevels.initial * slide.width >= this.pswp.options.maxWidthToAnimate) {\n this._duration = 0;\n }\n\n this._applyStartProps();\n }\n }\n /** @private */\n\n\n _applyStartProps() {\n const {\n pswp\n } = this;\n const slide = this.pswp.currSlide;\n const {\n options\n } = pswp;\n\n if (options.showHideAnimationType === 'fade') {\n options.showHideOpacity = true;\n this._thumbBounds = undefined;\n } else if (options.showHideAnimationType === 'none') {\n options.showHideOpacity = false;\n this._duration = 0;\n this._thumbBounds = undefined;\n } else if (this.isOpening && pswp._initialThumbBounds) {\n // Use initial bounds if defined\n this._thumbBounds = pswp._initialThumbBounds;\n } else {\n this._thumbBounds = this.pswp.getThumbBounds();\n }\n\n this._placeholder = slide === null || slide === void 0 ? void 0 : slide.getPlaceholderElement();\n pswp.animations.stopAll(); // Discard animations when duration is less than 50ms\n\n this._useAnimation = Boolean(this._duration && this._duration > 50);\n this._animateZoom = Boolean(this._thumbBounds) && (slide === null || slide === void 0 ? void 0 : slide.content.usePlaceholder()) && (!this.isClosing || !pswp.mainScroll.isShifted());\n\n if (!this._animateZoom) {\n this._animateRootOpacity = true;\n\n if (this.isOpening && slide) {\n slide.zoomAndPanToInitial();\n slide.applyCurrentZoomPan();\n }\n } else {\n var _options$showHideOpac;\n\n this._animateRootOpacity = (_options$showHideOpac = options.showHideOpacity) !== null && _options$showHideOpac !== void 0 ? _options$showHideOpac : false;\n }\n\n this._animateBgOpacity = !this._animateRootOpacity && this.pswp.options.bgOpacity > MIN_OPACITY;\n this._opacityElement = this._animateRootOpacity ? pswp.element : pswp.bg;\n\n if (!this._useAnimation) {\n this._duration = 0;\n this._animateZoom = false;\n this._animateBgOpacity = false;\n this._animateRootOpacity = true;\n\n if (this.isOpening) {\n if (pswp.element) {\n pswp.element.style.opacity = String(MIN_OPACITY);\n }\n\n pswp.applyBgOpacity(1);\n }\n\n return;\n }\n\n if (this._animateZoom && this._thumbBounds && this._thumbBounds.innerRect) {\n var _this$pswp$currSlide;\n\n // Properties are used when animation from cropped thumbnail\n this._croppedZoom = true;\n this._cropContainer1 = this.pswp.container;\n this._cropContainer2 = (_this$pswp$currSlide = this.pswp.currSlide) === null || _this$pswp$currSlide === void 0 ? void 0 : _this$pswp$currSlide.holderElement;\n\n if (pswp.container) {\n pswp.container.style.overflow = 'hidden';\n pswp.container.style.width = pswp.viewportSize.x + 'px';\n }\n } else {\n this._croppedZoom = false;\n }\n\n if (this.isOpening) {\n // Apply styles before opening transition\n if (this._animateRootOpacity) {\n if (pswp.element) {\n pswp.element.style.opacity = String(MIN_OPACITY);\n }\n\n pswp.applyBgOpacity(1);\n } else {\n if (this._animateBgOpacity && pswp.bg) {\n pswp.bg.style.opacity = String(MIN_OPACITY);\n }\n\n if (pswp.element) {\n pswp.element.style.opacity = '1';\n }\n }\n\n if (this._animateZoom) {\n this._setClosedStateZoomPan();\n\n if (this._placeholder) {\n // tell browser that we plan to animate the placeholder\n this._placeholder.style.willChange = 'transform'; // hide placeholder to allow hiding of\n // elements that overlap it (such as icons over the thumbnail)\n\n this._placeholder.style.opacity = String(MIN_OPACITY);\n }\n }\n } else if (this.isClosing) {\n // hide nearby slides to make sure that\n // they are not painted during the transition\n if (pswp.mainScroll.itemHolders[0]) {\n pswp.mainScroll.itemHolders[0].el.style.display = 'none';\n }\n\n if (pswp.mainScroll.itemHolders[2]) {\n pswp.mainScroll.itemHolders[2].el.style.display = 'none';\n }\n\n if (this._croppedZoom) {\n if (pswp.mainScroll.x !== 0) {\n // shift the main scroller to zero position\n pswp.mainScroll.resetPosition();\n pswp.mainScroll.resize();\n }\n }\n }\n }\n /** @private */\n\n\n _start() {\n if (this.isOpening && this._useAnimation && this._placeholder && this._placeholder.tagName === 'IMG') {\n // To ensure smooth animation\n // we wait till the current slide image placeholder is decoded,\n // but no longer than 250ms,\n // and no shorter than 50ms\n // (just using requestanimationframe is not enough in Firefox,\n // for some reason)\n new Promise(resolve => {\n let decoded = false;\n let isDelaying = true;\n decodeImage(\n /** @type {HTMLImageElement} */\n this._placeholder).finally(() => {\n decoded = true;\n\n if (!isDelaying) {\n resolve(true);\n }\n });\n setTimeout(() => {\n isDelaying = false;\n\n if (decoded) {\n resolve(true);\n }\n }, 50);\n setTimeout(resolve, 250);\n }).finally(() => this._initiate());\n } else {\n this._initiate();\n }\n }\n /** @private */\n\n\n _initiate() {\n var _this$pswp$element, _this$pswp$element2;\n\n (_this$pswp$element = this.pswp.element) === null || _this$pswp$element === void 0 || _this$pswp$element.style.setProperty('--pswp-transition-duration', this._duration + 'ms');\n this.pswp.dispatch(this.isOpening ? 'openingAnimationStart' : 'closingAnimationStart'); // legacy event\n\n this.pswp.dispatch(\n /** @type {'initialZoomIn' | 'initialZoomOut'} */\n 'initialZoom' + (this.isOpening ? 'In' : 'Out'));\n (_this$pswp$element2 = this.pswp.element) === null || _this$pswp$element2 === void 0 || _this$pswp$element2.classList.toggle('pswp--ui-visible', this.isOpening);\n\n if (this.isOpening) {\n if (this._placeholder) {\n // unhide the placeholder\n this._placeholder.style.opacity = '1';\n }\n\n this._animateToOpenState();\n } else if (this.isClosing) {\n this._animateToClosedState();\n }\n\n if (!this._useAnimation) {\n this._onAnimationComplete();\n }\n }\n /** @private */\n\n\n _onAnimationComplete() {\n const {\n pswp\n } = this;\n this.isOpen = this.isOpening;\n this.isClosed = this.isClosing;\n this.isOpening = false;\n this.isClosing = false;\n pswp.dispatch(this.isOpen ? 'openingAnimationEnd' : 'closingAnimationEnd'); // legacy event\n\n pswp.dispatch(\n /** @type {'initialZoomInEnd' | 'initialZoomOutEnd'} */\n 'initialZoom' + (this.isOpen ? 'InEnd' : 'OutEnd'));\n\n if (this.isClosed) {\n pswp.destroy();\n } else if (this.isOpen) {\n var _pswp$currSlide;\n\n if (this._animateZoom && pswp.container) {\n pswp.container.style.overflow = 'visible';\n pswp.container.style.width = '100%';\n }\n\n (_pswp$currSlide = pswp.currSlide) === null || _pswp$currSlide === void 0 || _pswp$currSlide.applyCurrentZoomPan();\n }\n }\n /** @private */\n\n\n _animateToOpenState() {\n const {\n pswp\n } = this;\n\n if (this._animateZoom) {\n if (this._croppedZoom && this._cropContainer1 && this._cropContainer2) {\n this._animateTo(this._cropContainer1, 'transform', 'translate3d(0,0,0)');\n\n this._animateTo(this._cropContainer2, 'transform', 'none');\n }\n\n if (pswp.currSlide) {\n pswp.currSlide.zoomAndPanToInitial();\n\n this._animateTo(pswp.currSlide.container, 'transform', pswp.currSlide.getCurrentTransform());\n }\n }\n\n if (this._animateBgOpacity && pswp.bg) {\n this._animateTo(pswp.bg, 'opacity', String(pswp.options.bgOpacity));\n }\n\n if (this._animateRootOpacity && pswp.element) {\n this._animateTo(pswp.element, 'opacity', '1');\n }\n }\n /** @private */\n\n\n _animateToClosedState() {\n const {\n pswp\n } = this;\n\n if (this._animateZoom) {\n this._setClosedStateZoomPan(true);\n } // do not animate opacity if it's already at 0\n\n\n if (this._animateBgOpacity && pswp.bgOpacity > 0.01 && pswp.bg) {\n this._animateTo(pswp.bg, 'opacity', '0');\n }\n\n if (this._animateRootOpacity && pswp.element) {\n this._animateTo(pswp.element, 'opacity', '0');\n }\n }\n /**\r\n * @private\r\n * @param {boolean} [animate]\r\n */\n\n\n _setClosedStateZoomPan(animate) {\n if (!this._thumbBounds) return;\n const {\n pswp\n } = this;\n const {\n innerRect\n } = this._thumbBounds;\n const {\n currSlide,\n viewportSize\n } = pswp;\n\n if (this._croppedZoom && innerRect && this._cropContainer1 && this._cropContainer2) {\n const containerOnePanX = -viewportSize.x + (this._thumbBounds.x - innerRect.x) + innerRect.w;\n const containerOnePanY = -viewportSize.y + (this._thumbBounds.y - innerRect.y) + innerRect.h;\n const containerTwoPanX = viewportSize.x - innerRect.w;\n const containerTwoPanY = viewportSize.y - innerRect.h;\n\n if (animate) {\n this._animateTo(this._cropContainer1, 'transform', toTransformString(containerOnePanX, containerOnePanY));\n\n this._animateTo(this._cropContainer2, 'transform', toTransformString(containerTwoPanX, containerTwoPanY));\n } else {\n setTransform(this._cropContainer1, containerOnePanX, containerOnePanY);\n setTransform(this._cropContainer2, containerTwoPanX, containerTwoPanY);\n }\n }\n\n if (currSlide) {\n equalizePoints(currSlide.pan, innerRect || this._thumbBounds);\n currSlide.currZoomLevel = this._thumbBounds.w / currSlide.width;\n\n if (animate) {\n this._animateTo(currSlide.container, 'transform', currSlide.getCurrentTransform());\n } else {\n currSlide.applyCurrentZoomPan();\n }\n }\n }\n /**\r\n * @private\r\n * @param {HTMLElement} target\r\n * @param {'transform' | 'opacity'} prop\r\n * @param {string} propValue\r\n */\n\n\n _animateTo(target, prop, propValue) {\n if (!this._duration) {\n target.style[prop] = propValue;\n return;\n }\n\n const {\n animations\n } = this.pswp;\n /** @type {AnimationProps} */\n\n const animProps = {\n duration: this._duration,\n easing: this.pswp.options.easing,\n onComplete: () => {\n if (!animations.activeAnimations.length) {\n this._onAnimationComplete();\n }\n },\n target\n };\n animProps[prop] = propValue;\n animations.startTransition(animProps);\n }\n\n}\n\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Type<T>} Type<T>\r\n */\n\n/** @typedef {import('./slide/slide.js').SlideData} SlideData */\n\n/** @typedef {import('./slide/zoom-level.js').ZoomLevelOption} ZoomLevelOption */\n\n/** @typedef {import('./ui/ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('./main-scroll.js').ItemHolder} ItemHolder */\n\n/** @typedef {import('./core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\n\n/** @typedef {import('./core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\n\n/** @typedef {import('./slide/get-thumb-bounds').Bounds} Bounds */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {import('./core/eventable.js').EventCallback<T>} EventCallback<T>\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {import('./core/eventable.js').AugmentedEvent<T>} AugmentedEvent<T>\r\n */\n\n/** @typedef {{ x: number; y: number; id?: string | number }} Point */\n\n/** @typedef {{ top: number; bottom: number; left: number; right: number }} Padding */\n\n/** @typedef {SlideData[]} DataSourceArray */\n\n/** @typedef {{ gallery: HTMLElement; items?: HTMLElement[] }} DataSourceObject */\n\n/** @typedef {DataSourceArray | DataSourceObject} DataSource */\n\n/** @typedef {(point: Point, originalEvent: PointerEvent) => void} ActionFn */\n\n/** @typedef {'close' | 'next' | 'zoom' | 'zoom-or-close' | 'toggle-controls'} ActionType */\n\n/** @typedef {Type<PhotoSwipe> | { default: Type<PhotoSwipe> }} PhotoSwipeModule */\n\n/** @typedef {PhotoSwipeModule | Promise<PhotoSwipeModule> | (() => Promise<PhotoSwipeModule>)} PhotoSwipeModuleOption */\n\n/**\r\n * @typedef {string | NodeListOf<HTMLElement> | HTMLElement[] | HTMLElement} ElementProvider\r\n */\n\n/** @typedef {Partial<PreparedPhotoSwipeOptions>} PhotoSwipeOptions https://photoswipe.com/options/ */\n\n/**\r\n * @typedef {Object} PreparedPhotoSwipeOptions\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: Point, 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} trapFocus\r\n * Trap focus within PhotoSwipe element while it's open.\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: PhotoSwipeBase) => Point} [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<any>} [openPromise]\r\n * @prop {boolean} [preloadFirstSlide]\r\n * @prop {ElementProvider} [gallery]\r\n * @prop {string} [gallerySelector]\r\n * @prop {ElementProvider} [children]\r\n * @prop {string} [childSelector]\r\n * @prop {string | false} [thumbSelector]\r\n */\n\n/** @type {PreparedPhotoSwipeOptions} */\n\nconst defaultOptions = {\n allowPanToNext: true,\n spacing: 0.1,\n loop: true,\n pinchToClose: true,\n closeOnVerticalDrag: true,\n hideAnimationDuration: 333,\n showAnimationDuration: 333,\n zoomAnimationDuration: 333,\n escKey: true,\n arrowKeys: true,\n trapFocus: true,\n returnFocus: true,\n maxWidthToAnimate: 4000,\n clickToCloseNonZoomable: true,\n imageClickAction: 'zoom-or-close',\n bgClickAction: 'close',\n tapAction: 'toggle-controls',\n doubleTapAction: 'zoom',\n indexIndicatorSep: ' / ',\n preloaderDelay: 2000,\n bgOpacity: 0.8,\n index: 0,\n errorMsg: 'The image cannot be loaded',\n preload: [1, 2],\n easing: 'cubic-bezier(.4,0,.22,1)'\n};\n/**\r\n * PhotoSwipe Core\r\n */\n\nclass PhotoSwipe extends PhotoSwipeBase {\n /**\r\n * @param {PhotoSwipeOptions} [options]\r\n */\n constructor(options) {\n super();\n this.options = this._prepareOptions(options || {});\n /**\r\n * offset of viewport relative to document\r\n *\r\n * @type {Point}\r\n */\n\n this.offset = {\n x: 0,\n y: 0\n };\n /**\r\n * @type {Point}\r\n * @private\r\n */\n\n this._prevViewportSize = {\n x: 0,\n y: 0\n };\n /**\r\n * Size of scrollable PhotoSwipe viewport\r\n *\r\n * @type {Point}\r\n */\n\n this.viewportSize = {\n x: 0,\n y: 0\n };\n /**\r\n * background (backdrop) opacity\r\n */\n\n this.bgOpacity = 1;\n this.currIndex = 0;\n this.potentialIndex = 0;\n this.isOpen = false;\n this.isDestroying = false;\n this.hasMouse = false;\n /**\r\n * @private\r\n * @type {SlideData}\r\n */\n\n this._initialItemData = {};\n /** @type {Bounds | undefined} */\n\n this._initialThumbBounds = undefined;\n /** @type {HTMLDivElement | undefined} */\n\n this.topBar = undefined;\n /** @type {HTMLDivElement | undefined} */\n\n this.element = undefined;\n /** @type {HTMLDivElement | undefined} */\n\n this.template = undefined;\n /** @type {HTMLDivElement | undefined} */\n\n this.container = undefined;\n /** @type {HTMLElement | undefined} */\n\n this.scrollWrap = undefined;\n /** @type {Slide | undefined} */\n\n this.currSlide = undefined;\n this.events = new DOMEvents();\n this.animations = new Animations();\n this.mainScroll = new MainScroll(this);\n this.gestures = new Gestures(this);\n this.opener = new Opener(this);\n this.keyboard = new Keyboard(this);\n this.contentLoader = new ContentLoader(this);\n }\n /** @returns {boolean} */\n\n\n init() {\n if (this.isOpen || this.isDestroying) {\n return false;\n }\n\n this.isOpen = true;\n this.dispatch('init'); // legacy\n\n this.dispatch('beforeOpen');\n\n this._createMainStructure(); // add classes to the root element of PhotoSwipe\n\n\n let rootClasses = 'pswp--open';\n\n if (this.gestures.supportsTouch) {\n rootClasses += ' pswp--touch';\n }\n\n if (this.options.mainClass) {\n rootClasses += ' ' + this.options.mainClass;\n }\n\n if (this.element) {\n this.element.className += ' ' + rootClasses;\n }\n\n this.currIndex = this.options.index || 0;\n this.potentialIndex = this.currIndex;\n this.dispatch('firstUpdate'); // starting index can be modified here\n // initialize scroll wheel handler to block the scroll\n\n this.scrollWheel = new ScrollWheel(this); // sanitize index\n\n if (Number.isNaN(this.currIndex) || this.currIndex < 0 || this.currIndex >= this.getNumItems()) {\n this.currIndex = 0;\n }\n\n if (!this.gestures.supportsTouch) {\n // enable mouse features if no touch support detected\n this.mouseDetected();\n } // causes forced synchronous layout\n\n\n this.updateSize();\n this.offset.y = window.pageYOffset;\n this._initialItemData = this.getItemData(this.currIndex);\n this.dispatch('gettingData', {\n index: this.currIndex,\n data: this._initialItemData,\n slide: undefined\n }); // *Layout* - calculate size and position of elements here\n\n this._initialThumbBounds = this.getThumbBounds();\n this.dispatch('initialLayout');\n this.on('openingAnimationEnd', () => {\n const {\n itemHolders\n } = this.mainScroll; // Add content to the previous and next slide\n\n if (itemHolders[0]) {\n itemHolders[0].el.style.display = 'block';\n this.setContent(itemHolders[0], this.currIndex - 1);\n }\n\n if (itemHolders[2]) {\n itemHolders[2].el.style.display = 'block';\n this.setContent(itemHolders[2], this.currIndex + 1);\n }\n\n this.appendHeavy();\n this.contentLoader.updateLazy();\n this.events.add(window, 'resize', this._handlePageResize.bind(this));\n this.events.add(window, 'scroll', this._updatePageScrollOffset.bind(this));\n this.dispatch('bindEvents');\n }); // set content for center slide (first time)\n\n if (this.mainScroll.itemHolders[1]) {\n this.setContent(this.mainScroll.itemHolders[1], this.currIndex);\n }\n\n this.dispatch('change');\n this.opener.open();\n this.dispatch('afterInit');\n return true;\n }\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 * @returns {number}\r\n */\n\n\n getLoopedIndex(index) {\n const numSlides = this.getNumItems();\n\n if (this.options.loop) {\n if (index > numSlides - 1) {\n index -= numSlides;\n }\n\n if (index < 0) {\n index += numSlides;\n }\n }\n\n return clamp(index, 0, numSlides - 1);\n }\n\n appendHeavy() {\n this.mainScroll.itemHolders.forEach(itemHolder => {\n var _itemHolder$slide;\n\n (_itemHolder$slide = itemHolder.slide) === null || _itemHolder$slide === void 0 || _itemHolder$slide.appendHeavy();\n });\n }\n /**\r\n * Change the slide\r\n * @param {number} index New index\r\n */\n\n\n goTo(index) {\n this.mainScroll.moveIndexBy(this.getLoopedIndex(index) - this.potentialIndex);\n }\n /**\r\n * Go to the next slide.\r\n */\n\n\n next() {\n this.goTo(this.potentialIndex + 1);\n }\n /**\r\n * Go to the previous slide.\r\n */\n\n\n prev() {\n this.goTo(this.potentialIndex - 1);\n }\n /**\r\n * @see slide/slide.js zoomTo\r\n *\r\n * @param {Parameters<Slide['zoomTo']>} args\r\n */\n\n\n zoomTo(...args) {\n var _this$currSlide;\n\n (_this$currSlide = this.currSlide) === null || _this$currSlide === void 0 || _this$currSlide.zoomTo(...args);\n }\n /**\r\n * @see slide/slide.js toggleZoom\r\n */\n\n\n toggleZoom() {\n var _this$currSlide2;\n\n (_this$currSlide2 = this.currSlide) === null || _this$currSlide2 === void 0 || _this$currSlide2.toggleZoom();\n }\n /**\r\n * Close the gallery.\r\n * After closing transition ends - destroy it\r\n */\n\n\n close() {\n if (!this.opener.isOpen || this.isDestroying) {\n return;\n }\n\n this.isDestroying = true;\n this.dispatch('close');\n this.events.removeAll();\n this.opener.close();\n }\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 */\n\n\n destroy() {\n var _this$element;\n\n if (!this.isDestroying) {\n this.options.showHideAnimationType = 'none';\n this.close();\n return;\n }\n\n this.dispatch('destroy');\n this._listeners = {};\n\n if (this.scrollWrap) {\n this.scrollWrap.ontouchmove = null;\n this.scrollWrap.ontouchend = null;\n }\n\n (_this$element = this.element) === null || _this$element === void 0 || _this$element.remove();\n this.mainScroll.itemHolders.forEach(itemHolder => {\n var _itemHolder$slide2;\n\n (_itemHolder$slide2 = itemHolder.slide) === null || _itemHolder$slide2 === void 0 || _itemHolder$slide2.destroy();\n });\n this.contentLoader.destroy();\n this.events.removeAll();\n }\n /**\r\n * Refresh/reload content of a slide by its index\r\n *\r\n * @param {number} slideIndex\r\n */\n\n\n refreshSlideContent(slideIndex) {\n this.contentLoader.removeByIndex(slideIndex);\n this.mainScroll.itemHolders.forEach((itemHolder, i) => {\n var _this$currSlide$index, _this$currSlide3;\n\n let potentialHolderIndex = ((_this$currSlide$index = (_this$currSlide3 = this.currSlide) === null || _this$currSlide3 === void 0 ? void 0 : _this$currSlide3.index) !== null && _this$currSlide$index !== void 0 ? _this$currSlide$index : 0) - 1 + i;\n\n if (this.canLoop()) {\n potentialHolderIndex = this.getLoopedIndex(potentialHolderIndex);\n }\n\n if (potentialHolderIndex === slideIndex) {\n // set the new slide content\n this.setContent(itemHolder, slideIndex, true); // activate the new slide if it's current\n\n if (i === 1) {\n var _itemHolder$slide3;\n\n this.currSlide = itemHolder.slide;\n (_itemHolder$slide3 = itemHolder.slide) === null || _itemHolder$slide3 === void 0 || _itemHolder$slide3.setIsActive(true);\n }\n }\n });\n this.dispatch('change');\n }\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 */\n\n\n setContent(holder, index, force) {\n if (this.canLoop()) {\n index = this.getLoopedIndex(index);\n }\n\n if (holder.slide) {\n if (holder.slide.index === index && !force) {\n // exit if holder already contains this slide\n // this could be common when just three slides are used\n return;\n } // destroy previous slide\n\n\n holder.slide.destroy();\n holder.slide = undefined;\n } // exit if no loop and index is out of bounds\n\n\n if (!this.canLoop() && (index < 0 || index >= this.getNumItems())) {\n return;\n }\n\n const itemData = this.getItemData(index);\n holder.slide = new Slide(itemData, index, this); // set current slide\n\n if (index === this.currIndex) {\n this.currSlide = holder.slide;\n }\n\n holder.slide.append(holder.el);\n }\n /** @returns {Point} */\n\n\n getViewportCenterPoint() {\n return {\n x: this.viewportSize.x / 2,\n y: this.viewportSize.y / 2\n };\n }\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 */\n\n\n updateSize(force) {\n // let item;\n // let itemIndex;\n if (this.isDestroying) {\n // exit if PhotoSwipe is closed or closing\n // (to avoid errors, as resize event might be delayed)\n return;\n } //const newWidth = this.scrollWrap.clientWidth;\n //const newHeight = this.scrollWrap.clientHeight;\n\n\n const newViewportSize = getViewportSize(this.options, this);\n\n if (!force && pointsEqual(newViewportSize, this._prevViewportSize)) {\n // Exit if dimensions were not changed\n return;\n } //this._prevViewportSize.x = newWidth;\n //this._prevViewportSize.y = newHeight;\n\n\n equalizePoints(this._prevViewportSize, newViewportSize);\n this.dispatch('beforeResize');\n equalizePoints(this.viewportSize, this._prevViewportSize);\n\n this._updatePageScrollOffset();\n\n this.dispatch('viewportSize'); // Resize slides only after opener animation is finished\n // and don't re-calculate size on inital size update\n\n this.mainScroll.resize(this.opener.isOpen);\n\n if (!this.hasMouse && window.matchMedia('(any-hover: hover)').matches) {\n this.mouseDetected();\n }\n\n this.dispatch('resize');\n }\n /**\r\n * @param {number} opacity\r\n */\n\n\n applyBgOpacity(opacity) {\n this.bgOpacity = Math.max(opacity, 0);\n\n if (this.bg) {\n this.bg.style.opacity = String(this.bgOpacity * this.options.bgOpacity);\n }\n }\n /**\r\n * Whether mouse is detected\r\n */\n\n\n mouseDetected() {\n if (!this.hasMouse) {\n var _this$element2;\n\n this.hasMouse = true;\n (_this$element2 = this.element) === null || _this$element2 === void 0 || _this$element2.classList.add('pswp--has_mouse');\n }\n }\n /**\r\n * Page resize event handler\r\n *\r\n * @private\r\n */\n\n\n _handlePageResize() {\n this.updateSize(); // In iOS webview, if element size depends on document size,\n // it'll be measured incorrectly in resize event\n //\n // https://bugs.webkit.org/show_bug.cgi?id=170595\n // https://hackernoon.com/onresize-event-broken-in-mobile-safari-d8469027bf4d\n\n if (/iPhone|iPad|iPod/i.test(window.navigator.userAgent)) {\n setTimeout(() => {\n this.updateSize();\n }, 500);\n }\n }\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 */\n\n\n _updatePageScrollOffset() {\n this.setScrollOffset(0, window.pageYOffset);\n }\n /**\r\n * @param {number} x\r\n * @param {number} y\r\n */\n\n\n setScrollOffset(x, y) {\n this.offset.x = x;\n this.offset.y = y;\n this.dispatch('updateScrollOffset');\n }\n /**\r\n * Create main HTML structure of PhotoSwipe,\r\n * and add it to DOM\r\n *\r\n * @private\r\n */\n\n\n _createMainStructure() {\n // root DOM element of PhotoSwipe (.pswp)\n this.element = createElement('pswp', 'div');\n this.element.setAttribute('tabindex', '-1');\n this.element.setAttribute('role', 'dialog'); // template is legacy prop\n\n this.template = this.element; // Background is added as a separate element,\n // as animating opacity is faster than animating rgba()\n\n this.bg = createElement('pswp__bg', 'div', this.element);\n this.scrollWrap = createElement('pswp__scroll-wrap', 'section', this.element);\n this.container = createElement('pswp__container', 'div', this.scrollWrap); // aria pattern: carousel\n\n this.scrollWrap.setAttribute('aria-roledescription', 'carousel');\n this.container.setAttribute('aria-live', 'off');\n this.container.setAttribute('id', 'pswp__items');\n this.mainScroll.appendHolders();\n this.ui = new UI(this);\n this.ui.init(); // append to DOM\n\n (this.options.appendToEl || document.body).appendChild(this.element);\n }\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 * @returns {Bounds | undefined}\r\n */\n\n\n getThumbBounds() {\n return getThumbBounds(this.currIndex, this.currSlide ? this.currSlide.data : this._initialItemData, this);\n }\n /**\r\n * If the PhotoSwipe can have continuous loop\r\n * @returns Boolean\r\n */\n\n\n canLoop() {\n return this.options.loop && this.getNumItems() > 2;\n }\n /**\r\n * @private\r\n * @param {PhotoSwipeOptions} options\r\n * @returns {PreparedPhotoSwipeOptions}\r\n */\n\n\n _prepareOptions(options) {\n if (window.matchMedia('(prefers-reduced-motion), (update: slow)').matches) {\n options.showHideAnimationType = 'none';\n options.zoomAnimationDuration = 0;\n }\n /** @type {PreparedPhotoSwipeOptions} */\n\n\n return { ...defaultOptions,\n ...options\n };\n }\n\n}\n\nexport { PhotoSwipe as default };\n//# sourceMappingURL=photoswipe.esm.js.map\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","window.Eventgallery = window.Eventgallery || {};\r\n\r\nrequire('./frontend/js/EventgalleryBehavior.js');\r\n\r\nrequire('./frontend/js/photoswipe/PhotoSwipeGallery.js');\r\nrequire('./frontend/js/photoswipe/PhotoSwipeGallerySlide.js');\r\n\r\nrequire('./frontend/less/eventgallery.less');\r\nrequire('./frontend/less/font-awesome/font-awesome.less');\r\n\r\nrequire('./frontend/js/minicart/index');\r\nrequire('./frontend/js/socialbutton/index');\r\nrequire('./frontend/js/jsgallery/index');\r\n\r\n// Required Core Stylesheet\r\nimport \"@glidejs/glide/src/assets/sass/glide.core.scss\";\r\nimport \"./frontend/sass/glide/glide.theme.scss\";\r\n\r\n"],"names":["removeElement","array","elm","index","indexOf","splice","mergeObjects","defaults","options","key","getElementWidth","el","parseFloat","getComputedStyle","width","replace","getElementHeight","height","calcBorderWidth","elements","properties","sum","i","length","cSSStyleDeclaration","j","value","isNaN","addUrlHashParameter","initialUrl","fragments","removeUrlHashParameter","split","urlpart","hashparts","push","encodeURIComponent","join","getUrlHashParameterValue","url","result","prefix","newHashParts","addUrlParameter","removeUrlParameter","urlparts","pars","setCSSStyle","nodes","style","getOuterHeight","offsetHeight","parseInt","marginTop","marginBottom","getParents","node","parents","parentElement","parent","getParent","query","matches","insertAndExecute","htmlElement","newContent","innerHTML","scripts","Array","prototype","slice","call","getElementsByTagName","src","tag","document","createElement","appendChild","eval","err","console","error","forEach","callback","serializeForm","form","serialized","inputElements","querySelectorAll","field","name","disabled","type","n","selected","checked","Eventgallery","addEventListener","triggerLazyLoading","EventgalleryLazyload","watchImages","container","thumbnails","rowHeightPercentage","imagesetContainer","querySelector","imageset","initComplete","resizeStart","resizeComplete","dispatchEvent","Polyfill","createNewEvent","EventsList","eventgalleryTilesCollection","tilesOptions","tiles","tilesContainer","TilesCollection","calculate","window","EventsTiles","adjustMode","rowHeight","getAttribute","rowHeightJitter","firstImageRowHeight","doFillLastRow","Imagelist","SquareList","lightbox","PhotoSwipeGallery","initPhotoSwipe","e","preventDefault","getElementById","click","contentId","Overlay","openOverlay","GooglePhotosProcessor","sliderElements","_loop","sliderStarter","SliderStarter","timer","start","clearTimeout","setTimeout","links","target","nodeName","stopPropagation","href","currentTarget","location","_Imagelist","newOptions","_classCallCheck","_callSuper","_inherits","_this","this","images","image","Math","ceil","setSize","newHeight","round","newWidth","LOADING_MATCHER","MARKER_IMAGE_IS_IN_PROGRESS_ATTRIBUTE","_createClass","albumUrl","albumsUrl","EventGalleryGooglePhotosConfiguration","imageAddedCallback","processImages","removeEventListener","_e$detail","doReloadLightbox","detail","isOverlay","albums","_groupByAlbum","_collectHTMLElements","_markImagesAsInProgress","_getMainImageDataFromServer","htmlCollection","_toConsumableArray","filter","img","imageSrcSet","dataSrc","foundLinkHTMLElements","concat","a","rel","_step","_iterator","_createForOfIteratorHelper","s","done","_step$value","_slicedToArray","parsedHTMLElement","getHTMLElement","setAttribute","f","htmlElements","_this2","Map","imageHTMLElement","_parseHTMLElement","updateParameters","folder","parameters","get","set","tagName","ParsedImageHTMLElement","ParsedLinkHTMLElement","_step2","_iterator2","_step2$value","foldername","album","_doAlbumRequest","_this3","fetch","then","response","json","data","_processAlbumResult","_replaceImages","albumsWithMainImagesOnly","_filterForAlbumsWithMainImageOnly","size","_doAlbumsRequest","_step3","_iterator3","_step3$value","delete","_getAlbumDataFromServer","_this4","_processAlbumsResult","_step4","_iterator4","_step4$value","_step5","newAlbums","_iterator5","_step5$value","mainImages","isMainImage","serverResult","_window$Eventgallery","undefined","parsedImageHTMLElement","imageUrl","getFile","replaceElementLinks","isOpen","link","getCurrentSlide","thumbEl","_gallery","close","ParsedHTMLElement","attributeNames","Set","parameterString","substring","URLHelper","parseURLParameter","_step6","_iterator6","updateParametersWithUrl","_step7","_iterator7","getImageUrl","getWidth","_ParsedHTMLElement","_this5","_ParsedHTMLElement2","_this6","Image","imageTagContainer","calculatedWidth","calcSize","glueLeft","glueRight","glueTop","glueBottom","ratio","sizeCalculator","SizeCalculator","secret","secret_o","secret_h","secret_k","farm","server","id","getFlickrURL","googleWidth","getSize","adjustImageURL","display","margin","minImageWidth","eventgalleryPageWidth","initialize","item","eventgalleryTimer","new_width","minHeight","processList","rowWidth","computedStyle","boxSizing","paddingLeft","paddingRight","borderLeft","borderLeftWidth","borderRight","borderRightWidth","floor","getRowWidth","imagesToProcess","shift","hide","show","imageHeight","imageWidth","rowHeightForRightSideImages","getImageTagHeight","maxWidth","maxHeight","adjustHeight","generateRows","heightJitter","numberOfRowsToCreate","finalRows","currentRow","Row","add","processRow","isLastRow","elementSelector","classForLoaded","classForLoading","IntersectionObserverEntry","Object","defineProperty","intersectionRatio","imageObserver","IntersectionObserver","entries","imgObserver","entry","isIntersecting","lazyImage","dataset","knownImageUrls","includes","classList","remove","onload","instance","lazyImages","observe","_defineProperty","random","eventgalleryImage","addThisImage","abs","gap","gapToClose","availableSizes","flickrSizes","originalwidth","originalheight","longSideSize","originalLongSideSize","sizeCode","secretString","minSizes","getMinSizes","heightOkay","lastItem","boxWidth","boxHeight","originalWidth","originalHeight","tilesPerRow","tile","visibility","position","float","firstExampleTile","columnWidth","offsetWidth","y","offsetTop","columnHeight","smallestColumn","getSmallestColumn","left","top","getHighestColumn","smallestColumnValue","smallestColumnNumber","columnValue","columnNumber","arguments","body","myDiv","background","onClosed","onLoad","repositionTimer","windowWidth","onResizeOverlay","_setRositionTimer","dataUrl","opacity","closeOverlay","append","reposition","startsWith","_getRemoteData","_addContent","force","content","getElementsByClassName","removeHtmlElementNode","clientWidth","innerHeight","scrollTop","pageYOffset","text","SlideShow","photoSwipe","_window","EventGalleryLightboxConfiguration","doUseSlideshow","_photoSwipe","_SlideShow_Running","_currentTimer","_SlideShow_Delay","slideshowSpeed","_SlideShow_Button","ui","registerElement","order","isButton","html","onInit","_adjustNavigation","onClick","event","toggleSlideShowState","on","_planNextSwitch","_photoSwipeGallery","originalEvent","_stopSlideshow","doUseAutoplay","delay","_startSlideshow","isForTheFirstSwitch","_nextSlide","next","urlParameterString","pairs","pair","splittedPair","urlSring","parts","queryParts","urlString","Glide","Components","Events","Binder","EventsHandler","prevented","Anchors","mount","_a","Html","wrapper","bind","unbind","off","detach","attach","Transition","after","destroy","JSGallery2","galleryElement","thumbs","bigImageContainer","pageContainer","nav","pages","children","running","currentPageNumber","blockKeys","imagesPerFirstPage","imagesPerPage","bigImage","convertThumbs","lastPage","initialIndex","createControls","createGallerySlides","adjustWidth","adjustPageHeight","adjustImageSize","gotoPage","unBlockKeys","selectByIndex","resizePage","thumbnail","eventgalleryAjaxResizeTimer","resetThumbs","slides","thumbContainer","lightboxLinkElement","title","decodeURIComponent","slide","w","h","pswpVideoSources","videoSources","JSON","parse","pswpVideoSrc","videoSrc","prevLink","prevImage","mouseLeaveHandler","focusControl","zoomLink","bigImageClickHandler","nextLink","nextImage","showBigImage","showCartButton","add2cartLink","rebindAdd2CartButtons","showCartConnector","cartConnectorLink","cartConnectorLinkRel","showSocialMediaButton","div","socialmediabutton","firstChild","keyboardHandler","addTouch","touchContainerSelector","control","_Eventgallery$lightbo","keyCode","page","select","selectedContainer","count","convertThumb","forceReload","deselect","history","pushState","targetPage","activeClass","_container$getElement","source","setImage","_this7","currentIndex","openPhotoSwipe","setAfterChangeEventListener","gid","getCurrentIndex","_Eventgallery$lightbo2","newSrc","gotoSlide","titleTarget","pageNumber","selectImage","marginLeft","updateHandles","prevHandle","nextHandle","countHandle","updatePagingBar","currentPage","pageCount","createCountLink","pageSpeed","inline","skipFromRight","skipFromLeft","spaceToRight","child","_this8","myAnchor","innerText","myListItem","require","galleryElements","defaultOptions","videoAttributes","controls","playsinline","preload","autoplay","preventDragOffset","PhotoSwipeVideoPlugin","VideoContentSetup","_objectSpread","isVideoContent","initLightboxEvents","initPswpEvents","onContentLoad","onContentDestroy","onContentActivate","onContentDeactivate","onContentAppend","onContentResize","addFilter","isKeepingPlaceholder","isContentZoomable","useContentPlaceholder","itemData","element","linkEl","pswp","currSlide","origEvent","verticalEnding","currZoomLevel","bounds","center","pointerYPos","pageY","offset","isActive","showHideAnimationType","pauseVideo","_ref","_videoPosterImg","onerror","placeholder","placeholderElStyle","transform","isZoomable","_ref2","playVideo","_ref3","isAttached","appendImage","state","msrc","preloadVideoPoster","sourceEl","complete","onLoaded","play","pause","usePlaceholder","HistoryHandler","browserBackHappened","onClose","_close","replaceState","go","pid","_isOpen","_videoPlugin","doOverlapToolbar","imagePadding","doOverlapImageWithCaption","translations","_translate","_registerClickEvents","hashData","parseHash","getGalleries","closeTitle","KEY_CLOSE","zoomTitle","KEY_ZOOM","arrowPrevTitle","KEY_PREVIOUS","arrowNextTitle","KEY_NEXT","errorMsg","indexIndicatorSep","share","KEY_SHARE","download","KEY_DOWNLOAD","buy","KEY_BUY","KEY_PLAYSLIDESHOW","KEY_PAUSESLIDESHOW","returnValue","eTarget","srcElement","closest","contains","clickedListItem","toUpperCase","getSlideBy","getIndexOfSlide","disableAnimation","fromURL","useHistory","pswpModule","PhotoSwipe","galleryPIDs","bgOpacity","trapFocus","galleryUID","toggle","updateSize","paddingFn","viewportSize","captionHeight","className","max","bottom","right","pinchToClose","add2cartEl","closeOnVerticalDrag","closeOnScroll","navigationFadeDelay","timeToIdle","timeToIdleOutside","showAnimationDuration","dataSource","_this$overlay","overlay","historyHandler","startUrlHistory","adjustUrlHistory","endUrlHistory","_this$overlay2","defaultPrevented","_this$overlay3","_registerUIElements","init","appendTo","currSlideElement","captionHTML","ariaLabel","shareUrl","add2cartUrl","prepareAdd2cartDialogContent","directDownloadButton","_this2$getCurrentSlid","values","gallery","l","onclick","onThumbnailsClick","map","hash","galleries","getThumbnailContainers","parseThumbnailElement","currIndex","afterChangeFunction","goTo","PhotoSwipeGallerySlide","alt","from","tc","thumbElIsAllowed","fn","parentNode","nodeType","shareButton","_window$EventGalleryC","add2cartButton","EventGalleryCartConfiguration","add2cartdialogurl","_parseHashString","params","vars","SliderOptions","assign","slidesElementsSelector","numberOfRowsPerSlide","showNav","_parseOptions","attributes","CamelCaseConverter","toCamelCase","sourceGroupElement","sliderTransformator","sliderOptions","_loadOptions","sourceElementSelector","getSlidesElementsSelector","getAutoPlay","doShowNav","numberOfItemsPerSlide","ElementSize","calclateNumberOfFittingItemsPerSlide","getNumberOfRowsPerSlide","SliderTransformator","rootElement","perView","keyboard","Swipe","Controls","Breakpoints","Autoplay","Anchor","Images","sliderRootSelector","sourceElements","getSourceElements","sliderRoot","sliderMarkup","createRange","createContextualFragment","controlElement","sliderGroupElement","currentSliderElement","domRect","getBoundingClientRect","marginRight","containerElement","numberOfRows","getOuterWidth","str","m","listeners","events","closure","capture","passive","isString","isNodeList","isArray","listener","removeChild","eventName","CustomEvent","createEvent","initEvent","cartProcessor","eventHandler","initializeCartButtons","add2cartButtons","btn","openAdd2CartDialog","Add2CartDialogContent","inputFields","plusButtons","minusButtons","cartButton","CART_BUTTON_QUERY_SELECTOR","q","updateQuantity","p","quantityPlus","quantityMinus","loadCart","updateToCartButton","inputFild","quantity","reference","fieldName","inputField","getElementsByName","currentVal","maxOrderQuantity","String","changeEvent","Event","initializeCartConnectorButtons","cartConnectorButtons","openLink","removeUrl","getCartUrl","urls","CartUrls","add2CartButtonHandler","Add2CartButtonHandler","cartConnectorButtonHandler","CartConnectorButtonHandler","dispatchCartData","reload","cart","MiniCartMode","buttonShowType","emptyCartSelector","cartSelector","cartItemContainerSelector","cartItemsSelector","cartItemSelector","cartCountSelector","buttonDownSelector","buttonUpSelector","cartItemsMinHeight","removeLinkTitle","minicartMode","short","lineItems","MiniCartOptions","globalConfigStore","initUI","updateCartData","updateAdd2CartIcons","cartElement","cartItemsElement","emptyCartElement","buttonToShort","buttonToLong","resizeCartArea","long","_generateId","lineItem","file","miniCartMode","amountOfLines","lineHeight","lastY","cartElements","visibleAmountOfLines","cartItemsHTML","imagetag","lineitemid","newLineItemElements","button","CartProcessor","carts","MiniCart","log","doUseStickyImagetypeSelection","orderimagesHideButton","orderimagesShowButton","orderimagesHelp","makeCartButtonsVisible","closeImageTypeSelection","doShow","cartButtons","DownloadButton","ClickableButton","eventsHandler","leftAction","rightAction","tabAction","bottomAction","hDistance","vDistance","startCoords","endCoords","vSwipe","hSwipe","targetTouches","changedTouches","pageX","NodeList","isPrototypeOf","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","enumerable","apply","_objectSpread2","getOwnPropertyDescriptors","defineProperties","_typeof","obj","Symbol","iterator","constructor","Constructor","TypeError","_defineProperties","props","descriptor","configurable","writable","protoProps","staticProps","_getPrototypeOf","o","setPrototypeOf","getPrototypeOf","__proto__","_setPrototypeOf","_createSuper","Derived","hasNativeReflectConstruct","Reflect","construct","sham","Proxy","Boolean","valueOf","_isNativeReflectConstruct","Super","NewTarget","self","ReferenceError","_assertThisInitialized","_possibleConstructorReturn","_get","property","receiver","base","hasOwnProperty","_superPropBase","desc","startAt","focusAt","hoverpause","bound","swipeThreshold","dragThreshold","perSwipe","touchRatio","touchAngle","animationDuration","rewind","rewindDuration","animationTimingFunc","waitForTransition","throttle","direction","peek","cloningRatio","breakpoints","classes","swipeable","dragging","ltr","rtl","slider","carousel","clone","active","arrow","warn","msg","toInt","isObject","isFunction","isUndefined","define","prop","definition","mergeOptions","settings","EventsBus","hop","handler","context","emit","Glide$1","selector","_c","_t","_e","extensions","glide","components","_name","transformers","pattern","Run","make","distance","disable","Move","interval","_o","_i","_d","status","now","Date","getTime","func","wait","timeout","args","previous","later","leading","throttled","at","remaining","trailing","cancel","MARGIN_TYPE","siblings","matched","nextSibling","toArray","nodeList","EventsBinder","VALID_DIRECTIONS","FLIPED_MOVEMENTS","Rtl","modify","translate","Direction","is","Gap","multiplier","Sizes","slideWidth","Gaps","Grow","Clones","grow","Peeking","Peek","before","Focusing","supportsPassive","opts","supportsPassive$1","START_EVENTS","MOVE_EVENTS","END_EVENTS","MOUSE_EVENTS","swipe","swipeSin","swipeStartX","swipeStartY","bindSwipeStart","touches","bindSwipeMove","bindSwipeEnd","move","_Glide$settings","subExSx","subEySy","powEX","powEY","swipeHypotenuse","sqrt","swipeCathetus","asin","PI","root","end","_Glide$settings2","threshold","swipeDistance","swipeDeg","enable","resolve","unbindSwipeMove","unbindSwipeEnd","_Glide$settings3","unbindSwipeStart","dragstart","anchors","detached","items","draggable","NAV_SELECTOR","CONTROLS_SELECTOR","PREVIOUS_CONTROLS_SELECTOR","NEXT_CONTROLS_SELECTOR","_n","_arrowControls","addBindings","setActive","addClass","removeActive","removeClass","sibling","setArrowState","resetArrowState","disableArrow","_len","lists","_key","list","_len2","_key2","removeBindings","Keyboard","press","code","ArrowRight","ArrowLeft","setInterval","stop","time","clearInterval","sortBreakpoints","points","sort","reduce","r","k","match","matchMedia","point","COMPONENTS","track","collectSlides","_r","t","Translate","TRANSFORMERS","mutate","transformer","mutator","translate3d","mozTransform","webkitTransform","getStartIndex","isOffset","getTravelDistance","travelDistance","isType","movement","startWidth","compose","duration","transition","token","_v","setupSlides","setupWrapper","wrapperSize","reductor","len","collect","cloneCount","reverse","prepend","cloneNode","_clone","unshift","_Components$Html","half","_i2","insertBefore","_i3","Resize","Build","typeClass","removeClasses","_Glide$settings$class","isStart","isEnd","steps","viewSize","calculateForwardIndex","isBound","normalizeForwardIndex","_index","calculateBackwardIndex","normalizeBackwardIndex","_m","step","substr","_Core","subClass","superClass","create","_super","appendToEl","equalizePoints","p1","p2","x","roundPoint","getDistanceBetween","pointsEqual","clamp","val","min","toTransformString","scale","propValue","setTransform","setTransitionStyle","ease","setWidthHeight","LOAD_STATE","isSafari","navigator","vendor","DOMEvents","_pool","_toggleListener","removeAll","poolItem","skipPool","methodName","eType","eventOptions","getViewportSize","getViewportSizeFn","newViewportSize","documentElement","parsePaddingOption","paddingValue","padding","legacyPropName","Number","getPanAreaSize","PanBounds","update","_updateAxis","dispatch","reset","axis","elSize","panAreaSize","correctPan","panOffset","ZoomLevel","elementSize","fit","fill","vFill","initial","secondary","hRatio","vRatio","_getInitial","_getSecondary","_getMax","zoomLevels","slideData","_parseZoomLevelOption","optionPrefix","optionName","optionValue","Slide","currentResolution","pan","isFirstSlide","opener","contentLoader","getContentBySlide","holderElement","heavyAppended","prevDisplayedWidth","prevDisplayedHeight","setIsActive","activate","deactivate","transformOrigin","calculateSize","load","updateContentSize","appendHeavy","zoomAndPanToInitial","applyCurrentZoomPan","mainScroll","isShifted","hasSlide","resize","panTo","scaleMultiplier","sizeChanged","setDisplayedSize","getPlaceholderElement","_this$content$placeho","zoomTo","destZoomLevel","centerPoint","transitionDuration","ignoreBounds","animations","stopAllPan","prevZoomLevel","setZoomLevel","calculateZoomToPanOffset","finishTransition","_setResolution","startTransition","isPan","getCurrentTransform","onComplete","easing","toggleZoom","zoomAnimationDuration","getViewportCenterPoint","zoomFactor","panX","panY","isPannable","_applyZoomTransform","zoom","newResolution","DragHandler","gestures","startPan","stopAll","change","prevP1","dragAxis","isMultitouch","_setPanWithFriction","_getVerticalDragRatio","applyBgOpacity","_panOrMoveMainScroll","velocity","indexDiff","currentSlideVisibilityRatio","getCurrSlideX","moveIndexBy","correctZoomPan","_finishPanGestureForAxis","panPos","restoreBgOpacity","projectedPosition","vDragRatio","projectedVDragRatio","correctedPanPosition","dampingRatio","initialBgOpacity","totalPanDist","startSpring","onUpdate","pos","animationProgressRatio","delta","newMainScrollX","moveTo","newPan","allowPanToNext","currSlideMainScrollX","mainScrollShiftDiff","isLeftToRight","isRightToLeft","_this$pswp$currSlide$","_this$pswp$currSlide","potentialPan","customFriction","getZoomPointsCenter","ZoomHandler","_startPan","_startZoomPoint","_zoomPoint","_wasOverFitZoomLevel","_startZoomLevel","startP1","startP2","minZoomLevel","maxZoomLevel","_calculatePanForZoomLevel","ignoreGesture","destinationZoomLevel","currZoomLevelNeedsChange","initialPan","destinationPan","panNeedsChange","naturalFrequency","newZoomLevel","didTapOnMainContent","TapHandler","targetClassList","isImageClick","isBackgroundClick","_doClickOrTapAction","tap","doubleTap","actionName","_this$gestures$pswp$e","actionFullName","clickToCloseNonZoomable","Gestures","prevP2","_lastStartP1","_intervalP1","_numActivePoints","_ongoingPointers","_touchEventEnabled","_pointerEventEnabled","PointerEvent","supportsTouch","maxTouchPoints","_intervalTime","_velocityCalculated","isDragging","isZooming","raf","_tapTimer","drag","tapHandler","scrollWrap","_onClick","_bindEvents","ontouchmove","ontouchend","pref","down","up","cancelEvent","onPointerDown","onPointerMove","onPointerUp","isMousePointer","pointerType","mouseDetected","_preventPointerEventBehaviour","_updatePoints","_clearTapTimer","_finishDrag","_updateStartPoints","_rafStopLoop","_rafRenderLoop","_calculateDragDirection","_updateVelocity","_finishTap","_updatePrevPoints","requestAnimationFrame","_getVelocity","tapDelay","doubleTapAction","displacement","cancelAnimationFrame","applyFilters","pointerEvent","pointerIndex","findIndex","ongoingPointer","pointerId","_convertEventPosToPoint","touchEvent","diff","axisToCheck","identifier","MainScroll","_currPositionIndex","_prevPositionIndex","_containerShiftIndex","itemHolders","resizeSlides","newSlideWidth","spacing","slideWidthChanged","itemHolder","resetPosition","appendHolders","canBeSwiped","getNumItems","animate","velocityX","newIndex","potentialIndex","numSlides","canLoop","getLoopedIndex","stopMainScroll","destinationX","isMainScroll","updateCurrItem","currDiff","currDistance","_this$itemHolders$","positionDifference","tempHolder","diffAbs","_itemHolder$slide","setContent","pop","updateLazy","newSlideIndexOffset","KeyboardKeyCodesMap","Escape","z","ArrowUp","ArrowDown","Tab","getKeyboardEventKey","isKeySupported","_wasFocused","initialPointerPos","_focusRoot","_onFocusIn","_onKeyDown","lastActiveElement","activeElement","returnFocus","focus","ctrlKey","metaKey","altKey","shiftKey","specialKeyUsed","keydownAction","isForward","escKey","arrowKeys","template","DEFAULT_EASING","CSSAnimation","_props$prop","onFinish","_target","_onComplete","_finished","_onTransitionEnd","_helperTimeout","_finalizeAnimation","SpringEaser","initialVelocity","_dampingRatio","_naturalFrequency","_dampedFrequency","easeFrame","deltaPosition","deltaTime","coeff","naturalDumpingPow","E","dumpedFCos","cos","dumpedFSin","sin","SpringAnimation","_raf","easer","prevTime","animationLoop","Animations","activeAnimations","_start","isSpring","animation","isPanRunning","some","ScrollWheel","_onWheel","deltaX","deltaY","wheelToZoom","deltaMode","clientX","clientY","UIElement","_container","elementHTML","toLowerCase","ariaText","htmlData","isCustomSVG","svgData","out","outlineID","inner","addElementHTML","topBar","initArrowButton","isNextButton","loop","arrowPrev","arrowNext","closeButton","zoomButton","loadingIndicator","indicatorElement","isVisible","delayTimeout","setIndicatorVisibility","visible","updatePreloaderVisibility","_pswp$currSlide","isLoading","_pswp$currSlide2","preloaderDelay","counterIndicator","counterElement","setZoomedIn","isZoomedIn","UI","isRegistered","uiElementsData","_lastUpdatedZoomLevel","b","uiElementData","_pswp$element","_onZoomPanUpdate","elementData","isClosing","currZoomLevelDiff","imageClickAction","PhotoSwipeEvent","details","Eventable","_listeners","_filters","priority","_this$_filters$name","_this$_filters$name2","_this$pswp","f1","f2","removeFilter","_this$_filters$name3","_this$_listeners$name","_this$pswp2","_this$pswp3","_this$_listeners$name2","Placeholder","imageSrc","imgEl","decoding","_this$element","Content","displayedImageWidth","displayedImageHeight","isDecoding","removePlaceholder","keepPlaceholder","isLazy","placeholderEl","placeholderSrc","isImageContent","loadImage","_this$data$src","_this$data$alt","imageElement","updateSrcsetSizes","srcset","onError","setSlide","displayError","isError","isInitialSizeUpdate","sizesWidth","largestUsedSize","sizes","lazyLoad","_this$instance$option","_this$instance$option2","errorMsgEl","supportsDecode","decode","catch","finally","lazyLoadData","createContentFromData","zoomLevel","ContentLoader","limit","_cachedItems","loadSlideByIndex","getContentByIndex","getItemData","lazyLoadSlide","addToCache","removeByIndex","indexToRemove","find","PhotoSwipeBase","_this$options","numItems","_getGalleryDOMElements","_this$options2","dataSourceItem","Element","_domElementToItemData","_this$options3","_this$options4","childSelector","option","legacySelector","getElementsFromOption","pswpSrc","pswpSrcset","pswpWidth","pswpHeight","pswpType","thumbnailEl","_thumbnailEl$getAttri","currentSrc","pswpCropped","cropped","thumbCropped","MIN_OPACITY","Opener","isClosed","isOpening","_duration","_useAnimation","_croppedZoom","_animateRootOpacity","_animateBgOpacity","_placeholder","_opacityElement","_cropContainer1","_cropContainer2","_thumbBounds","_prepareOpen","open","hideAnimationDuration","maxWidthToAnimate","_applyStartProps","_options$showHideOpac","showHideOpacity","_initialThumbBounds","getThumbBounds","_animateZoom","bg","innerRect","overflow","_setClosedStateZoomPan","willChange","Promise","decoded","isDelaying","reject","_initiate","_this$pswp$element","_this$pswp$element2","setProperty","_animateToOpenState","_animateToClosedState","_onAnimationComplete","_animateTo","containerOnePanX","containerOnePanY","containerTwoPanX","containerTwoPanY","animProps","bgClickAction","tapAction","super","_prepareOptions","_prevViewportSize","isDestroying","hasMouse","_initialItemData","_createMainStructure","rootClasses","mainClass","scrollWheel","_handlePageResize","_updatePageScrollOffset","prev","_this$currSlide","_this$currSlide2","_itemHolder$slide2","refreshSlideContent","slideIndex","_this$currSlide$index","_this$currSlide3","potentialHolderIndex","_itemHolder$slide3","holder","_this$element2","test","userAgent","setScrollOffset","thumbBounds","thumbSelector","thumbAreaRect","fillZoomLevel","offsetX","offsetY","getCroppedBoundsByElement","getBoundsByElement","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","d","toStringTag"],"sourceRoot":""}