{"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/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; i1? 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; i1? 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; i0) {\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 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{\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 {\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\r\n\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 []\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}\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}\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\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 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 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 //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 rowWidth = Math.floor(parseFloat(window.getComputedStyle(this.options.imagesetContainer).width)) - 1;\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 picasa 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\r\n // neded for Picasa\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 return 'https://farm' + farm + '.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 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 constructor() {\r\n this.isOpen = false;\r\n this.myDiv = null;\r\n this.background = null;\r\n this.body = document.body;\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 = '';\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.body.append(this.background);\r\n this.body.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(`` + 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 {\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 = window.pageYOffset,\r\n left = 0,\r\n 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}\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 {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 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 };\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 = '';\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 = '';\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 = '';\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\r\n // prepare the add2cart button\r\n if (this.options.showCartButton) {\r\n this.add2cartLink.setAttribute('data-id', source.getAttribute('data-id'));\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 {},\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 {getElementHeight, 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.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 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 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 _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) => {\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}\r\n */\r\n getGalleries() {\r\n let galleries = new Map(),\r\n thumbnails = getThumbnailContainers();\r\n\r\n for(let i=0; i}\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.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-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
\r\n
\r\n
    \r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
`;\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 {\r\n this.listeners[event] = {'closure': closure, 'options': {'capture': capture, 'passive': passive}};\r\n\r\n for (let i=0; i {\r\n for (let i=0; i {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 cartProcessor: CartProcessor;\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 let q = document.getElementsByClassName('eventgallery-cartquantity');\r\n for(let i=0; ithis.updateQuantity(e));\r\n }\r\n\r\n let p = document.getElementsByClassName('eventgallery-qtyplus');\r\n for(let i=0; i this.quantityPlus(e), {capture: true});\r\n }\r\n\r\n let m = document.getElementsByClassName('eventgallery-qtyminus');\r\n for(let i=0; i this.quantityMinus(e), {capture: true});\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 }\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 };\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 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 };\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-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 `
\r\n
\r\n ${this.lineItems[i].count}\r\n ${this.lineItems[i].imagetag}\r\n \r\n \r\n \r\n
\r\n
`;\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 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 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\r\n document.addEventListener(Events.prepareAdd2cartDialogContent, () => {\r\n new Add2CartDialogContent(cartProcessor)\r\n });\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('.eventgallery-add2cart');\r\n for(let i=0; i {\r\n\r\n let elements = document.querySelectorAll('.social-share-button-open');\r\n for (let i=0; i {\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 {\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) 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, options) {\n var timeout, context, args, result;\n var previous = 0;\n if (!options) options = {};\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 * Checks if passed node exist and is a valid element.\n *\n * @param {Element} node\n * @return {Boolean}\n */\n\nfunction exist(node) {\n if (node && node instanceof window.HTMLElement) {\n return true;\n }\n\n return false;\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 (exist(r)) {\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 if (exist(t)) {\n Html._t = t;\n } else {\n warn(\"Could not find track element. Please use \".concat(TRACK_SELECTOR, \" attribute.\"));\n }\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, \" \").concat(this.duration, \"ms \").concat(settings.animationTimingFunc);\n }\n\n return \"\".concat(property, \" 0ms \").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 if (item) {\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 /**\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\n if (item) {\n item.classList.remove(Glide.settings.classes.nav.active);\n }\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\n if (event.code === 'ArrowRight') {\n Components.Run.make(Components.Direction.resolve(\"\".concat(perSwipe, \">\")));\n }\n\n if (event.code === 'ArrowLeft') {\n Components.Run.make(Components.Direction.resolve(\"\".concat(perSwipe, \"<\")));\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.3.4 - https://photoswipe.com\n * (c) 2022 Dmytro Semenov\n */\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n/** @typedef {undefined | null | false | '' | 0} Falsy */\r\n/** @typedef {keyof HTMLElementTagNameMap} HTMLElementTagName */\r\n\r\n/**\r\n * @template {HTMLElementTagName | Falsy} [T=\"div\"]\r\n * @template {Node | undefined} [NodeToAppendElementTo=undefined]\r\n * @param {string=} className\r\n * @param {T=} [tagName]\r\n * @param {NodeToAppendElementTo=} appendToEl\r\n * @returns {T extends HTMLElementTagName ? HTMLElementTagNameMap[T] : HTMLElementTagNameMap['div']}\r\n */\r\nfunction createElement(className, tagName, appendToEl) {\r\n const el = document.createElement(tagName || 'div');\r\n if (className) {\r\n el.className = className;\r\n }\r\n if (appendToEl) {\r\n appendToEl.appendChild(el);\r\n }\r\n // @ts-expect-error\r\n return el;\r\n}\r\n\r\n/**\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nfunction equalizePoints(p1, p2) {\r\n p1.x = p2.x;\r\n p1.y = p2.y;\r\n if (p2.id !== undefined) {\r\n p1.id = p2.id;\r\n }\r\n return p1;\r\n}\r\n\r\n/**\r\n * @param {Point} p\r\n */\r\nfunction roundPoint(p) {\r\n p.x = Math.round(p.x);\r\n p.y = Math.round(p.y);\r\n}\r\n\r\n/**\r\n * Returns distance between two points.\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nfunction getDistanceBetween(p1, p2) {\r\n const x = Math.abs(p1.x - p2.x);\r\n const y = Math.abs(p1.y - p2.y);\r\n return Math.sqrt((x * x) + (y * y));\r\n}\r\n\r\n/**\r\n * Whether X and Y positions of points are qual\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nfunction pointsEqual(p1, p2) {\r\n return p1.x === p2.x && p1.y === p2.y;\r\n}\r\n\r\n/**\r\n * The float result between the min and max values.\r\n *\r\n * @param {number} val\r\n * @param {number} min\r\n * @param {number} max\r\n */\r\nfunction clamp(val, min, max) {\r\n return Math.min(Math.max(val, min), max);\r\n}\r\n\r\n/**\r\n * Get transform string\r\n *\r\n * @param {number} x\r\n * @param {number=} y\r\n * @param {number=} scale\r\n */\r\nfunction toTransformString(x, y, scale) {\r\n let propValue = 'translate3d('\r\n + x + 'px,' + (y || 0) + 'px'\r\n + ',0)';\r\n\r\n if (scale !== undefined) {\r\n propValue += ' scale3d('\r\n + scale + ',' + scale\r\n + ',1)';\r\n }\r\n\r\n return propValue;\r\n}\r\n\r\n/**\r\n * Apply transform:translate(x, y) scale(scale) to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {number} x\r\n * @param {number=} y\r\n * @param {number=} scale\r\n */\r\nfunction setTransform(el, x, y, scale) {\r\n el.style.transform = toTransformString(x, y, scale);\r\n}\r\n\r\nconst defaultCSSEasing = 'cubic-bezier(.4,0,.22,1)';\r\n\r\n/**\r\n * Apply CSS transition to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string=} prop CSS property to animate\r\n * @param {number=} duration in ms\r\n * @param {string=} ease CSS easing function\r\n */\r\nfunction setTransitionStyle(el, prop, duration, ease) {\r\n // inOut: 'cubic-bezier(.4, 0, .22, 1)', // for \"toggle state\" transitions\r\n // out: 'cubic-bezier(0, 0, .22, 1)', // for \"show\" transitions\r\n // in: 'cubic-bezier(.4, 0, 1, 1)'// for \"hide\" transitions\r\n el.style.transition = prop\r\n ? (prop + ' ' + duration + 'ms ' + (ease || defaultCSSEasing))\r\n : 'none';\r\n}\r\n\r\n/**\r\n * Apply width and height CSS properties to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string | number} w\r\n * @param {string | number} h\r\n */\r\nfunction setWidthHeight(el, w, h) {\r\n el.style.width = (typeof w === 'number') ? (w + 'px') : w;\r\n el.style.height = (typeof h === 'number') ? (h + 'px') : h;\r\n}\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n */\r\nfunction removeTransitionStyle(el) {\r\n setTransitionStyle(el);\r\n}\r\n\r\n/**\r\n * @param {HTMLImageElement} img\r\n * @returns {Promise}\r\n */\r\nfunction decodeImage(img) {\r\n if ('decode' in img) {\r\n return img.decode().catch(() => {});\r\n }\r\n\r\n if (img.complete) {\r\n return Promise.resolve(img);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n img.onload = () => resolve(img);\r\n img.onerror = reject;\r\n });\r\n}\r\n\r\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\r\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\r\nconst LOAD_STATE = {\r\n IDLE: 'idle',\r\n LOADING: 'loading',\r\n LOADED: 'loaded',\r\n ERROR: 'error',\r\n};\r\n\r\n\r\n/**\r\n * Check if click or keydown event was dispatched\r\n * with a special key or via mouse wheel.\r\n *\r\n * @param {MouseEvent | KeyboardEvent} e\r\n */\r\nfunction specialKeyUsed(e) {\r\n if (e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Parse `gallery` or `children` options.\r\n *\r\n * @param {import('../photoswipe.js').ElementProvider} option\r\n * @param {string=} legacySelector\r\n * @param {HTMLElement | Document} [parent]\r\n * @returns HTMLElement[]\r\n */\r\nfunction getElementsFromOption(option, legacySelector, parent = document) {\r\n /** @type {HTMLElement[]} */\r\n let elements = [];\r\n\r\n if (option instanceof Element) {\r\n elements = [option];\r\n } else if (option instanceof NodeList || Array.isArray(option)) {\r\n elements = Array.from(option);\r\n } else {\r\n const selector = typeof option === 'string' ? option : legacySelector;\r\n if (selector) {\r\n elements = Array.from(parent.querySelectorAll(selector));\r\n }\r\n }\r\n\r\n return elements;\r\n}\r\n\r\n/**\r\n * Check if browser is Safari\r\n *\r\n * @returns {boolean}\r\n */\r\nfunction isSafari() {\r\n return !!(navigator.vendor && navigator.vendor.match(/apple/i));\r\n}\n\n// Detect passive event listener support\r\nlet supportsPassive = false;\r\n/* eslint-disable */\r\ntry {\r\n window.addEventListener('test', null, Object.defineProperty({}, 'passive', {\r\n get: () => {\r\n supportsPassive = true;\r\n }\r\n }));\r\n} catch (e) {}\r\n/* eslint-enable */\r\n\r\n\r\n/**\r\n * @typedef {Object} PoolItem\r\n * @prop {HTMLElement | Window | Document} target\r\n * @prop {string} type\r\n * @prop {(e: any) => void} listener\r\n * @prop {boolean} passive\r\n */\r\n\r\nclass DOMEvents {\r\n constructor() {\r\n /**\r\n * @type {PoolItem[]}\r\n * @private\r\n */\r\n this._pool = [];\r\n }\r\n\r\n /**\r\n * Adds event listeners\r\n *\r\n * @param {HTMLElement | Window | Document} target\r\n * @param {string} type Can be multiple, separated by space.\r\n * @param {(e: any) => void} listener\r\n * @param {boolean=} passive\r\n */\r\n add(target, type, listener, passive) {\r\n this._toggleListener(target, type, listener, passive);\r\n }\r\n\r\n /**\r\n * Removes event listeners\r\n *\r\n * @param {HTMLElement | Window | Document} target\r\n * @param {string} type\r\n * @param {(e: any) => void} listener\r\n * @param {boolean=} passive\r\n */\r\n remove(target, type, listener, passive) {\r\n this._toggleListener(target, type, listener, passive, true);\r\n }\r\n\r\n /**\r\n * Removes all bound events\r\n */\r\n removeAll() {\r\n this._pool.forEach((poolItem) => {\r\n this._toggleListener(\r\n poolItem.target,\r\n poolItem.type,\r\n poolItem.listener,\r\n poolItem.passive,\r\n true,\r\n true\r\n );\r\n });\r\n this._pool = [];\r\n }\r\n\r\n /**\r\n * Adds or removes event\r\n *\r\n * @param {HTMLElement | Window | Document} target\r\n * @param {string} type\r\n * @param {(e: any) => void} listener\r\n * @param {boolean} passive\r\n * @param {boolean=} unbind Whether the event should be added or removed\r\n * @param {boolean=} skipPool Whether events pool should be skipped\r\n */\r\n _toggleListener(target, type, listener, passive, unbind, skipPool) {\r\n if (!target) {\r\n return;\r\n }\r\n\r\n const methodName = unbind ? 'removeEventListener' : 'addEventListener';\r\n const types = type.split(' ');\r\n types.forEach((eType) => {\r\n if (eType) {\r\n // Events pool is used to easily unbind all events when PhotoSwipe is closed,\r\n // so developer doesn't need to do this manually\r\n if (!skipPool) {\r\n if (unbind) {\r\n // Remove from the events pool\r\n this._pool = this._pool.filter((poolItem) => {\r\n return poolItem.type !== eType\r\n || poolItem.listener !== listener\r\n || poolItem.target !== target;\r\n });\r\n } else {\r\n // Add to the events pool\r\n this._pool.push({\r\n target,\r\n type: eType,\r\n listener,\r\n passive\r\n });\r\n }\r\n }\r\n\r\n\r\n // most PhotoSwipe events call preventDefault,\r\n // and we do not need browser to scroll the page\r\n const eventOptions = supportsPassive ? { passive: (passive || false) } : false;\r\n\r\n target[methodName](\r\n eType,\r\n listener,\r\n eventOptions\r\n );\r\n }\r\n });\r\n }\r\n}\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipe} pswp\r\n */\r\nfunction getViewportSize(options, pswp) {\r\n if (options.getViewportSizeFn) {\r\n const newViewportSize = options.getViewportSizeFn(options, pswp);\r\n if (newViewportSize) {\r\n return newViewportSize;\r\n }\r\n }\r\n\r\n return {\r\n x: document.documentElement.clientWidth,\r\n\r\n // TODO: height on mobile is very incosistent due to toolbar\r\n // find a way to improve this\r\n //\r\n // document.documentElement.clientHeight - doesn't seem to work well\r\n y: window.innerHeight\r\n };\r\n}\r\n\r\n/**\r\n * Parses padding option.\r\n * Supported formats:\r\n *\r\n * // Object\r\n * padding: {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * }\r\n *\r\n * // A function that returns the object\r\n * paddingFn: (viewportSize, itemData, index) => {\r\n * return {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * };\r\n * }\r\n *\r\n * // Legacy variant\r\n * paddingLeft: 0,\r\n * paddingRight: 0,\r\n * paddingTop: 0,\r\n * paddingBottom: 0,\r\n *\r\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {{ x?: number; y?: number }} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index Slide index\r\n * @returns {number}\r\n */\r\nfunction parsePaddingOption(prop, options, viewportSize, itemData, index) {\r\n /** @type {number} */\r\n let paddingValue;\r\n\r\n if (options.paddingFn) {\r\n paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\r\n } else if (options.padding) {\r\n paddingValue = options.padding[prop];\r\n } else {\r\n const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1);\r\n // @ts-expect-error\r\n if (options[legacyPropName]) {\r\n // @ts-expect-error\r\n paddingValue = options[legacyPropName];\r\n }\r\n }\r\n\r\n return paddingValue || 0;\r\n}\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {{ x?: number; y?: number }} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n */\r\nfunction getPanAreaSize(options, viewportSize, itemData, index) {\r\n return {\r\n x: viewportSize.x\r\n - parsePaddingOption('left', options, viewportSize, itemData, index)\r\n - parsePaddingOption('right', options, viewportSize, itemData, index),\r\n y: viewportSize.y\r\n - parsePaddingOption('top', options, viewportSize, itemData, index)\r\n - parsePaddingOption('bottom', options, viewportSize, itemData, index)\r\n };\r\n}\n\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n/** @typedef {'x' | 'y'} Axis */\r\n\r\n/**\r\n * Calculates minimum, maximum and initial (center) bounds of a slide\r\n */\r\nclass PanBounds {\r\n /**\r\n * @param {Slide} slide\r\n */\r\n constructor(slide) {\r\n this.slide = slide;\r\n\r\n this.currZoomLevel = 1;\r\n\r\n /** @type {Point} */\r\n this.center = {};\r\n /** @type {Point} */\r\n this.max = {};\r\n /** @type {Point} */\r\n this.min = {};\r\n\r\n this.reset();\r\n }\r\n\r\n /**\r\n * _getItemBounds\r\n *\r\n * @param {number} currZoomLevel\r\n */\r\n update(currZoomLevel) {\r\n this.currZoomLevel = currZoomLevel;\r\n\r\n if (!this.slide.width) {\r\n this.reset();\r\n } else {\r\n this._updateAxis('x');\r\n this._updateAxis('y');\r\n this.slide.pswp.dispatch('calcBounds', { slide: this.slide });\r\n }\r\n }\r\n\r\n /**\r\n * _calculateItemBoundsForAxis\r\n *\r\n * @param {Axis} axis\r\n */\r\n _updateAxis(axis) {\r\n const { pswp } = this.slide;\r\n const elSize = this.slide[axis === 'x' ? 'width' : 'height'] * this.currZoomLevel;\r\n const paddingProp = axis === 'x' ? 'left' : 'top';\r\n const padding = parsePaddingOption(\r\n paddingProp,\r\n pswp.options,\r\n pswp.viewportSize,\r\n this.slide.data,\r\n this.slide.index\r\n );\r\n\r\n const panAreaSize = this.slide.panAreaSize[axis];\r\n\r\n // Default position of element.\r\n // By defaul it is center of viewport:\r\n this.center[axis] = Math.round((panAreaSize - elSize) / 2) + padding;\r\n\r\n // maximum pan position\r\n this.max[axis] = (elSize > panAreaSize)\r\n ? Math.round(panAreaSize - elSize) + padding\r\n : this.center[axis];\r\n\r\n // minimum pan position\r\n this.min[axis] = (elSize > panAreaSize)\r\n ? padding\r\n : this.center[axis];\r\n }\r\n\r\n // _getZeroBounds\r\n reset() {\r\n this.center.x = 0;\r\n this.center.y = 0;\r\n this.max.x = 0;\r\n this.max.y = 0;\r\n this.min.x = 0;\r\n this.min.y = 0;\r\n }\r\n\r\n /**\r\n * Correct pan position if it's beyond the bounds\r\n *\r\n * @param {Axis} axis x or y\r\n * @param {number} panOffset\r\n */\r\n correctPan(axis, panOffset) { // checkPanBounds\r\n return clamp(panOffset, this.max[axis], this.min[axis]);\r\n }\r\n}\n\nconst MAX_IMAGE_WIDTH = 4000;\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\r\n\r\n/**\r\n * Calculates zoom levels for specific slide.\r\n * Depends on viewport size and image size.\r\n */\r\nclass ZoomLevel {\r\n /**\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {SlideData} itemData Slide data\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe=} pswp PhotoSwipe instance, can be undefined if not initialized yet\r\n */\r\n constructor(options, itemData, index, pswp) {\r\n this.pswp = pswp;\r\n this.options = options;\r\n this.itemData = itemData;\r\n this.index = index;\r\n }\r\n\r\n /**\r\n * Calculate initial, secondary and maximum zoom level for the specified slide.\r\n *\r\n * It should be called when either image or viewport size changes.\r\n *\r\n * @param {number} maxWidth\r\n * @param {number} maxHeight\r\n * @param {{ x?: number; y?: number }} panAreaSize\r\n */\r\n update(maxWidth, maxHeight, panAreaSize) {\r\n this.elementSize = {\r\n x: maxWidth,\r\n y: maxHeight\r\n };\r\n\r\n this.panAreaSize = panAreaSize;\r\n\r\n const hRatio = this.panAreaSize.x / this.elementSize.x;\r\n const vRatio = this.panAreaSize.y / this.elementSize.y;\r\n\r\n this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\r\n this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio);\r\n\r\n // zoom.vFill defines zoom level of the image\r\n // when it has 100% of viewport vertical space (height)\r\n this.vFill = Math.min(1, vRatio);\r\n\r\n this.initial = this._getInitial();\r\n this.secondary = this._getSecondary();\r\n this.max = Math.max(\r\n this.initial,\r\n this.secondary,\r\n this._getMax()\r\n );\r\n\r\n this.min = Math.min(\r\n this.fit,\r\n this.initial,\r\n this.secondary\r\n );\r\n\r\n if (this.pswp) {\r\n this.pswp.dispatch('zoomLevelsUpdate', { zoomLevels: this, slideData: this.itemData });\r\n }\r\n }\r\n\r\n /**\r\n * Parses user-defined zoom option.\r\n *\r\n * @private\r\n * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\r\n */\r\n _parseZoomLevelOption(optionPrefix) {\r\n // eslint-disable-next-line max-len\r\n const optionName = /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */ (optionPrefix + 'ZoomLevel');\r\n const optionValue = this.options[optionName];\r\n\r\n if (!optionValue) {\r\n return;\r\n }\r\n\r\n if (typeof optionValue === 'function') {\r\n return optionValue(this);\r\n }\r\n\r\n if (optionValue === 'fill') {\r\n return this.fill;\r\n }\r\n\r\n if (optionValue === 'fit') {\r\n return this.fit;\r\n }\r\n\r\n return Number(optionValue);\r\n }\r\n\r\n /**\r\n * Get zoom level to which image will be zoomed after double-tap gesture,\r\n * or when user clicks on zoom icon,\r\n * or mouse-click on image itself.\r\n * If you return 1 image will be zoomed to its original size.\r\n *\r\n * @private\r\n * @return {number}\r\n */\r\n _getSecondary() {\r\n let currZoomLevel = this._parseZoomLevelOption('secondary');\r\n\r\n if (currZoomLevel) {\r\n return currZoomLevel;\r\n }\r\n\r\n // 3x of \"fit\" state, but not larger than original\r\n currZoomLevel = Math.min(1, this.fit * 3);\r\n\r\n if (currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\r\n currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\r\n }\r\n\r\n return currZoomLevel;\r\n }\r\n\r\n /**\r\n * Get initial image zoom level.\r\n *\r\n * @private\r\n * @return {number}\r\n */\r\n _getInitial() {\r\n return this._parseZoomLevelOption('initial') || this.fit;\r\n }\r\n\r\n /**\r\n * Maximum zoom level when user zooms\r\n * via zoom/pinch gesture,\r\n * via cmd/ctrl-wheel or via trackpad.\r\n *\r\n * @private\r\n * @return {number}\r\n */\r\n _getMax() {\r\n const currZoomLevel = this._parseZoomLevelOption('max');\r\n\r\n if (currZoomLevel) {\r\n return currZoomLevel;\r\n }\r\n\r\n // max zoom level is x4 from \"fit state\",\r\n // used for zoom gesture and ctrl/trackpad zoom\r\n return Math.max(1, this.fit * 4);\r\n }\r\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * Renders and allows to control a single slide\r\n */\r\nclass Slide {\r\n /**\r\n * @param {SlideData} data\r\n * @param {number} index\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(data, index, pswp) {\r\n this.data = data;\r\n this.index = index;\r\n this.pswp = pswp;\r\n this.isActive = (index === pswp.currIndex);\r\n this.currentResolution = 0;\r\n /** @type {Point} */\r\n this.panAreaSize = {};\r\n\r\n this.isFirstSlide = (this.isActive && !pswp.opener.isOpen);\r\n\r\n this.zoomLevels = new ZoomLevel(pswp.options, data, index, pswp);\r\n\r\n this.pswp.dispatch('gettingData', {\r\n slide: this,\r\n data: this.data,\r\n index\r\n });\r\n\r\n this.pan = {\r\n x: 0,\r\n y: 0\r\n };\r\n\r\n this.content = this.pswp.contentLoader.getContentBySlide(this);\r\n this.container = createElement('pswp__zoom-wrap');\r\n\r\n this.currZoomLevel = 1;\r\n /** @type {number} */\r\n this.width = this.content.width;\r\n /** @type {number} */\r\n this.height = this.content.height;\r\n\r\n this.bounds = new PanBounds(this);\r\n\r\n this.prevDisplayedWidth = -1;\r\n this.prevDisplayedHeight = -1;\r\n\r\n this.pswp.dispatch('slideInit', { slide: this });\r\n }\r\n\r\n /**\r\n * If this slide is active/current/visible\r\n *\r\n * @param {boolean} isActive\r\n */\r\n setIsActive(isActive) {\r\n if (isActive && !this.isActive) {\r\n // slide just became active\r\n this.activate();\r\n } else if (!isActive && this.isActive) {\r\n // slide just became non-active\r\n this.deactivate();\r\n }\r\n }\r\n\r\n /**\r\n * Appends slide content to DOM\r\n *\r\n * @param {HTMLElement} holderElement\r\n */\r\n append(holderElement) {\r\n this.holderElement = holderElement;\r\n\r\n this.container.style.transformOrigin = '0 0';\r\n\r\n // Slide appended to DOM\r\n if (!this.data) {\r\n return;\r\n }\r\n\r\n this.calculateSize();\r\n\r\n this.load();\r\n this.updateContentSize();\r\n this.appendHeavy();\r\n\r\n this.holderElement.appendChild(this.container);\r\n\r\n this.zoomAndPanToInitial();\r\n\r\n this.pswp.dispatch('firstZoomPan', { slide: this });\r\n\r\n this.applyCurrentZoomPan();\r\n\r\n this.pswp.dispatch('afterSetContent', { slide: this });\r\n\r\n if (this.isActive) {\r\n this.activate();\r\n }\r\n }\r\n\r\n load() {\r\n this.content.load();\r\n this.pswp.dispatch('slideLoad', { slide: this });\r\n }\r\n\r\n /**\r\n * Append \"heavy\" DOM elements\r\n *\r\n * This may depend on a type of slide,\r\n * but generally these are large images.\r\n */\r\n appendHeavy() {\r\n const { pswp } = this;\r\n const appendHeavyNearby = true; // todo\r\n\r\n // Avoid appending heavy elements during animations\r\n if (this.heavyAppended\r\n || !pswp.opener.isOpen\r\n || pswp.mainScroll.isShifted()\r\n || (!this.isActive && !appendHeavyNearby)) {\r\n return;\r\n }\r\n\r\n if (this.pswp.dispatch('appendHeavy', { slide: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n this.heavyAppended = true;\r\n\r\n this.content.append();\r\n\r\n this.pswp.dispatch('appendHeavyContent', { slide: this });\r\n }\r\n\r\n /**\r\n * Triggered when this slide is active (selected).\r\n *\r\n * If it's part of opening/closing transition -\r\n * activate() will trigger after the transition is ended.\r\n */\r\n activate() {\r\n this.isActive = true;\r\n this.appendHeavy();\r\n this.content.activate();\r\n this.pswp.dispatch('slideActivate', { slide: this });\r\n }\r\n\r\n /**\r\n * Triggered when this slide becomes inactive.\r\n *\r\n * Slide can become inactive only after it was active.\r\n */\r\n deactivate() {\r\n this.isActive = false;\r\n this.content.deactivate();\r\n\r\n if (this.currZoomLevel !== this.zoomLevels.initial) {\r\n // allow filtering\r\n this.calculateSize();\r\n }\r\n\r\n // reset zoom level\r\n this.currentResolution = 0;\r\n this.zoomAndPanToInitial();\r\n this.applyCurrentZoomPan();\r\n this.updateContentSize();\r\n\r\n this.pswp.dispatch('slideDeactivate', { slide: this });\r\n }\r\n\r\n /**\r\n * The slide should destroy itself, it will never be used again.\r\n * (unbind all events and destroy internal components)\r\n */\r\n destroy() {\r\n this.content.hasSlide = false;\r\n this.content.remove();\r\n this.container.remove();\r\n this.pswp.dispatch('slideDestroy', { slide: this });\r\n }\r\n\r\n resize() {\r\n if (this.currZoomLevel === this.zoomLevels.initial || !this.isActive) {\r\n // Keep initial zoom level if it was before the resize,\r\n // as well as when this slide is not active\r\n\r\n // Reset position and scale to original state\r\n this.calculateSize();\r\n this.currentResolution = 0;\r\n this.zoomAndPanToInitial();\r\n this.applyCurrentZoomPan();\r\n this.updateContentSize();\r\n } else {\r\n // readjust pan position if it's beyond the bounds\r\n this.calculateSize();\r\n this.bounds.update(this.currZoomLevel);\r\n this.panTo(this.pan.x, this.pan.y);\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Apply size to current slide content,\r\n * based on the current resolution and scale.\r\n *\r\n * @param {boolean=} force if size should be updated even if dimensions weren't changed\r\n */\r\n updateContentSize(force) {\r\n // Use initial zoom level\r\n // if resolution is not defined (user didn't zoom yet)\r\n const scaleMultiplier = this.currentResolution || this.zoomLevels.initial;\r\n\r\n if (!scaleMultiplier) {\r\n return;\r\n }\r\n\r\n const width = Math.round(this.width * scaleMultiplier) || this.pswp.viewportSize.x;\r\n const height = Math.round(this.height * scaleMultiplier) || this.pswp.viewportSize.y;\r\n\r\n if (!this.sizeChanged(width, height) && !force) {\r\n return;\r\n }\r\n this.content.setDisplayedSize(width, height);\r\n }\r\n\r\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n sizeChanged(width, height) {\r\n if (width !== this.prevDisplayedWidth\r\n || height !== this.prevDisplayedHeight) {\r\n this.prevDisplayedWidth = width;\r\n this.prevDisplayedHeight = height;\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n getPlaceholderElement() {\r\n if (this.content.placeholder) {\r\n return this.content.placeholder.element;\r\n }\r\n }\r\n\r\n /**\r\n * Zoom current slide image to...\r\n *\r\n * @param {number} destZoomLevel Destination zoom level.\r\n * @param {{ x?: number; y?: number }} centerPoint\r\n * Transform origin center point, or false if viewport center should be used.\r\n * @param {number | false} [transitionDuration] Transition duration, may be set to 0.\r\n * @param {boolean=} ignoreBounds Minimum and maximum zoom levels will be ignored.\r\n * @return {boolean=} Returns true if animated.\r\n */\r\n zoomTo(destZoomLevel, centerPoint, transitionDuration, ignoreBounds) {\r\n const { pswp } = this;\r\n if (!this.isZoomable()\r\n || pswp.mainScroll.isShifted()) {\r\n return;\r\n }\r\n\r\n pswp.dispatch('beforeZoomTo', {\r\n destZoomLevel, centerPoint, transitionDuration\r\n });\r\n\r\n // stop all pan and zoom transitions\r\n pswp.animations.stopAllPan();\r\n\r\n // if (!centerPoint) {\r\n // centerPoint = pswp.getViewportCenterPoint();\r\n // }\r\n\r\n const prevZoomLevel = this.currZoomLevel;\r\n\r\n if (!ignoreBounds) {\r\n destZoomLevel = clamp(destZoomLevel, this.zoomLevels.min, this.zoomLevels.max);\r\n }\r\n\r\n // if (transitionDuration === undefined) {\r\n // transitionDuration = this.pswp.options.zoomAnimationDuration;\r\n // }\r\n\r\n this.setZoomLevel(destZoomLevel);\r\n this.pan.x = this.calculateZoomToPanOffset('x', centerPoint, prevZoomLevel);\r\n this.pan.y = this.calculateZoomToPanOffset('y', centerPoint, prevZoomLevel);\r\n roundPoint(this.pan);\r\n\r\n const finishTransition = () => {\r\n this._setResolution(destZoomLevel);\r\n this.applyCurrentZoomPan();\r\n };\r\n\r\n if (!transitionDuration) {\r\n finishTransition();\r\n } else {\r\n pswp.animations.startTransition({\r\n isPan: true,\r\n name: 'zoomTo',\r\n target: this.container,\r\n transform: this.getCurrentTransform(),\r\n onComplete: finishTransition,\r\n duration: transitionDuration,\r\n easing: pswp.options.easing\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * @param {{ x?: number, y?: number }} [centerPoint]\r\n */\r\n toggleZoom(centerPoint) {\r\n this.zoomTo(\r\n this.currZoomLevel === this.zoomLevels.initial\r\n ? this.zoomLevels.secondary : this.zoomLevels.initial,\r\n centerPoint,\r\n this.pswp.options.zoomAnimationDuration\r\n );\r\n }\r\n\r\n /**\r\n * Updates zoom level property and recalculates new pan bounds,\r\n * unlike zoomTo it does not apply transform (use applyCurrentZoomPan)\r\n *\r\n * @param {number} currZoomLevel\r\n */\r\n setZoomLevel(currZoomLevel) {\r\n this.currZoomLevel = currZoomLevel;\r\n this.bounds.update(this.currZoomLevel);\r\n }\r\n\r\n /**\r\n * Get pan position after zoom at a given `point`.\r\n *\r\n * Always call setZoomLevel(newZoomLevel) beforehand to recalculate\r\n * pan bounds according to the new zoom level.\r\n *\r\n * @param {'x' | 'y'} axis\r\n * @param {{ x?: number; y?: number }} [point]\r\n * point based on which zoom is performed, usually refers to the current mouse position,\r\n * if false - viewport center will be used.\r\n * @param {number=} prevZoomLevel Zoom level before new zoom was applied.\r\n */\r\n calculateZoomToPanOffset(axis, point, prevZoomLevel) {\r\n const totalPanDistance = this.bounds.max[axis] - this.bounds.min[axis];\r\n if (totalPanDistance === 0) {\r\n return this.bounds.center[axis];\r\n }\r\n\r\n if (!point) {\r\n point = this.pswp.getViewportCenterPoint();\r\n }\r\n\r\n const zoomFactor = this.currZoomLevel / prevZoomLevel;\r\n return this.bounds.correctPan(\r\n axis,\r\n (this.pan[axis] - point[axis]) * zoomFactor + point[axis]\r\n );\r\n }\r\n\r\n /**\r\n * Apply pan and keep it within bounds.\r\n *\r\n * @param {number} panX\r\n * @param {number} panY\r\n */\r\n panTo(panX, panY) {\r\n this.pan.x = this.bounds.correctPan('x', panX);\r\n this.pan.y = this.bounds.correctPan('y', panY);\r\n this.applyCurrentZoomPan();\r\n }\r\n\r\n /**\r\n * If the slide in the current state can be panned by the user\r\n */\r\n isPannable() {\r\n return this.width && (this.currZoomLevel > this.zoomLevels.fit);\r\n }\r\n\r\n /**\r\n * If the slide can be zoomed\r\n */\r\n isZoomable() {\r\n return this.width && this.content.isZoomable();\r\n }\r\n\r\n /**\r\n * Apply transform and scale based on\r\n * the current pan position (this.pan) and zoom level (this.currZoomLevel)\r\n */\r\n applyCurrentZoomPan() {\r\n this._applyZoomTransform(this.pan.x, this.pan.y, this.currZoomLevel);\r\n if (this === this.pswp.currSlide) {\r\n this.pswp.dispatch('zoomPanUpdate', { slide: this });\r\n }\r\n }\r\n\r\n zoomAndPanToInitial() {\r\n this.currZoomLevel = this.zoomLevels.initial;\r\n\r\n // pan according to the zoom level\r\n this.bounds.update(this.currZoomLevel);\r\n equalizePoints(this.pan, this.bounds.center);\r\n this.pswp.dispatch('initialZoomPan', { slide: this });\r\n }\r\n\r\n /**\r\n * Set translate and scale based on current resolution\r\n *\r\n * @param {number} x\r\n * @param {number} y\r\n * @param {number} zoom\r\n */\r\n _applyZoomTransform(x, y, zoom) {\r\n zoom /= this.currentResolution || this.zoomLevels.initial;\r\n setTransform(this.container, x, y, zoom);\r\n }\r\n\r\n calculateSize() {\r\n const { pswp } = this;\r\n\r\n equalizePoints(\r\n this.panAreaSize,\r\n getPanAreaSize(pswp.options, pswp.viewportSize, this.data, this.index)\r\n );\r\n\r\n this.zoomLevels.update(this.width, this.height, this.panAreaSize);\r\n\r\n pswp.dispatch('calcSlideSize', {\r\n slide: this\r\n });\r\n }\r\n\r\n getCurrentTransform() {\r\n const scale = this.currZoomLevel / (this.currentResolution || this.zoomLevels.initial);\r\n return toTransformString(this.pan.x, this.pan.y, scale);\r\n }\r\n\r\n /**\r\n * Set resolution and re-render the image.\r\n *\r\n * For example, if the real image size is 2000x1500,\r\n * and resolution is 0.5 - it will be rendered as 1000x750.\r\n *\r\n * Image with zoom level 2 and resolution 0.5 is\r\n * the same as image with zoom level 1 and resolution 1.\r\n *\r\n * Used to optimize animations and make\r\n * sure that browser renders image in highest quality.\r\n * Also used by responsive images to load the correct one.\r\n *\r\n * @param {number} newResolution\r\n */\r\n _setResolution(newResolution) {\r\n if (newResolution === this.currentResolution) {\r\n return;\r\n }\r\n\r\n this.currentResolution = newResolution;\r\n this.updateContentSize();\r\n\r\n this.pswp.dispatch('resolutionChanged');\r\n }\r\n}\n\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n/** @typedef {import('./gestures.js').default} Gestures */\r\n\r\nconst PAN_END_FRICTION = 0.35;\r\nconst VERTICAL_DRAG_FRICTION = 0.6;\r\n\r\n// 1 corresponds to the third of viewport height\r\nconst MIN_RATIO_TO_CLOSE = 0.4;\r\n\r\n// Minimum speed required to navigate\r\n// to next or previous slide\r\nconst MIN_NEXT_SLIDE_SPEED = 0.5;\r\n\r\n/**\r\n * @param {number} initialVelocity\r\n * @param {number} decelerationRate\r\n */\r\nfunction project(initialVelocity, decelerationRate) {\r\n return initialVelocity * decelerationRate / (1 - decelerationRate);\r\n}\r\n\r\n/**\r\n * Handles single pointer dragging\r\n */\r\nclass DragHandler {\r\n /**\r\n * @param {Gestures} gestures\r\n */\r\n constructor(gestures) {\r\n this.gestures = gestures;\r\n this.pswp = gestures.pswp;\r\n /** @type {Point} */\r\n this.startPan = {};\r\n }\r\n\r\n start() {\r\n equalizePoints(this.startPan, this.pswp.currSlide.pan);\r\n this.pswp.animations.stopAll();\r\n }\r\n\r\n change() {\r\n const { p1, prevP1, dragAxis, pswp } = this.gestures;\r\n const { currSlide } = pswp;\r\n\r\n if (dragAxis === 'y'\r\n && pswp.options.closeOnVerticalDrag\r\n && currSlide.currZoomLevel <= currSlide.zoomLevels.fit\r\n && !this.gestures.isMultitouch) {\r\n // Handle vertical drag to close\r\n const panY = currSlide.pan.y + (p1.y - prevP1.y);\r\n if (!pswp.dispatch('verticalDrag', { panY }).defaultPrevented) {\r\n this._setPanWithFriction('y', panY, VERTICAL_DRAG_FRICTION);\r\n const bgOpacity = 1 - Math.abs(this._getVerticalDragRatio(currSlide.pan.y));\r\n pswp.applyBgOpacity(bgOpacity);\r\n currSlide.applyCurrentZoomPan();\r\n }\r\n } else {\r\n const mainScrollChanged = this._panOrMoveMainScroll('x');\r\n if (!mainScrollChanged) {\r\n this._panOrMoveMainScroll('y');\r\n\r\n roundPoint(currSlide.pan);\r\n currSlide.applyCurrentZoomPan();\r\n }\r\n }\r\n }\r\n\r\n end() {\r\n const { pswp, velocity } = this.gestures;\r\n const { mainScroll } = pswp;\r\n let indexDiff = 0;\r\n\r\n pswp.animations.stopAll();\r\n\r\n // Handle main scroll if it's shifted\r\n if (mainScroll.isShifted()) {\r\n // Position of the main scroll relative to the viewport\r\n const mainScrollShiftDiff = mainScroll.x - mainScroll.getCurrSlideX();\r\n\r\n // Ratio between 0 and 1:\r\n // 0 - slide is not visible at all,\r\n // 0.5 - half of the slide is vicible\r\n // 1 - slide is fully visible\r\n const currentSlideVisibilityRatio = (mainScrollShiftDiff / pswp.viewportSize.x);\r\n\r\n // Go next slide.\r\n //\r\n // - if velocity and its direction is matched\r\n // and we see at least tiny part of the next slide\r\n //\r\n // - or if we see less than 50% of the current slide\r\n // and velocity is close to 0\r\n //\r\n if ((velocity.x < -MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio < 0)\r\n || (velocity.x < 0.1 && currentSlideVisibilityRatio < -0.5)) {\r\n // Go to next slide\r\n indexDiff = 1;\r\n velocity.x = Math.min(velocity.x, 0);\r\n } else if ((velocity.x > MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio > 0)\r\n || (velocity.x > -0.1 && currentSlideVisibilityRatio > 0.5)) {\r\n // Go to prev slide\r\n indexDiff = -1;\r\n velocity.x = Math.max(velocity.x, 0);\r\n }\r\n\r\n mainScroll.moveIndexBy(indexDiff, true, velocity.x);\r\n }\r\n\r\n // Restore zoom level\r\n if (pswp.currSlide.currZoomLevel > pswp.currSlide.zoomLevels.max\r\n || this.gestures.isMultitouch) {\r\n this.gestures.zoomLevels.correctZoomPan(true);\r\n } else {\r\n // we run two animations instead of one,\r\n // as each axis has own pan boundaries and thus different spring function\r\n // (correctZoomPan does not have this functionality,\r\n // it animates all properties with single timing function)\r\n this._finishPanGestureForAxis('x');\r\n this._finishPanGestureForAxis('y');\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n */\r\n _finishPanGestureForAxis(axis) {\r\n const { pswp } = this;\r\n const { currSlide } = pswp;\r\n const { velocity } = this.gestures;\r\n const { pan, bounds } = currSlide;\r\n const panPos = pan[axis];\r\n const restoreBgOpacity = (pswp.bgOpacity < 1 && axis === 'y');\r\n\r\n // 0.995 means - scroll view loses 0.5% of its velocity per millisecond\r\n // Inceasing this number will reduce travel distance\r\n const decelerationRate = 0.995; // 0.99\r\n\r\n // Pan position if there is no bounds\r\n const projectedPosition = panPos + project(velocity[axis], decelerationRate);\r\n\r\n if (restoreBgOpacity) {\r\n const vDragRatio = this._getVerticalDragRatio(panPos);\r\n const projectedVDragRatio = this._getVerticalDragRatio(projectedPosition);\r\n\r\n // If we are above and moving upwards,\r\n // or if we are below and moving downwards\r\n if ((vDragRatio < 0 && projectedVDragRatio < -MIN_RATIO_TO_CLOSE)\r\n || (vDragRatio > 0 && projectedVDragRatio > MIN_RATIO_TO_CLOSE)) {\r\n pswp.close();\r\n return;\r\n }\r\n }\r\n\r\n // Pan position with corrected bounds\r\n const correctedPanPosition = bounds.correctPan(axis, projectedPosition);\r\n\r\n // Exit if pan position should not be changed\r\n // or if speed it too low\r\n if (panPos === correctedPanPosition) {\r\n return;\r\n }\r\n\r\n // Overshoot if the final position is out of pan bounds\r\n const dampingRatio = (correctedPanPosition === projectedPosition) ? 1 : 0.82;\r\n\r\n const initialBgOpacity = pswp.bgOpacity;\r\n const totalPanDist = correctedPanPosition - panPos;\r\n\r\n pswp.animations.startSpring({\r\n name: 'panGesture' + axis,\r\n isPan: true,\r\n start: panPos,\r\n end: correctedPanPosition,\r\n velocity: velocity[axis],\r\n dampingRatio,\r\n onUpdate: (pos) => {\r\n // Animate opacity of background relative to Y pan position of an image\r\n if (restoreBgOpacity && pswp.bgOpacity < 1) {\r\n // 0 - start of animation, 1 - end of animation\r\n const animationProgressRatio = 1 - (correctedPanPosition - pos) / totalPanDist;\r\n\r\n // We clamp opacity to keep it between 0 and 1.\r\n // As progress ratio can be larger than 1 due to overshoot,\r\n // and we do not want to bounce opacity.\r\n pswp.applyBgOpacity(clamp(\r\n initialBgOpacity + (1 - initialBgOpacity) * animationProgressRatio,\r\n 0,\r\n 1\r\n ));\r\n }\r\n\r\n pan[axis] = Math.floor(pos);\r\n currSlide.applyCurrentZoomPan();\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Update position of the main scroll,\r\n * or/and update pan position of the current slide.\r\n *\r\n * Should return true if it changes (or can change) main scroll.\r\n *\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n */\r\n _panOrMoveMainScroll(axis) {\r\n const { p1, pswp, dragAxis, prevP1, isMultitouch } = this.gestures;\r\n const { currSlide, mainScroll } = pswp;\r\n const delta = (p1[axis] - prevP1[axis]);\r\n const newMainScrollX = mainScroll.x + delta;\r\n\r\n if (!delta) {\r\n return;\r\n }\r\n\r\n // Always move main scroll if image can not be panned\r\n if (axis === 'x' && !currSlide.isPannable() && !isMultitouch) {\r\n mainScroll.moveTo(newMainScrollX, true);\r\n return true; // changed main scroll\r\n }\r\n\r\n const { bounds } = currSlide;\r\n const newPan = currSlide.pan[axis] + delta;\r\n\r\n if (pswp.options.allowPanToNext\r\n && dragAxis === 'x'\r\n && axis === 'x'\r\n && !isMultitouch) {\r\n const currSlideMainScrollX = mainScroll.getCurrSlideX();\r\n\r\n // Position of the main scroll relative to the viewport\r\n const mainScrollShiftDiff = mainScroll.x - currSlideMainScrollX;\r\n\r\n const isLeftToRight = delta > 0;\r\n const isRightToLeft = !isLeftToRight;\r\n\r\n if (newPan > bounds.min[axis] && isLeftToRight) {\r\n // Panning from left to right, beyond the left edge\r\n\r\n // Wether the image was at minimum pan position (or less)\r\n // when this drag gesture started.\r\n // Minimum pan position refers to the left edge of the image.\r\n const wasAtMinPanPosition = (bounds.min[axis] <= this.startPan[axis]);\r\n\r\n if (wasAtMinPanPosition) {\r\n mainScroll.moveTo(newMainScrollX, true);\r\n return true;\r\n } else {\r\n this._setPanWithFriction(axis, newPan);\r\n //currSlide.pan[axis] = newPan;\r\n }\r\n } else if (newPan < bounds.max[axis] && isRightToLeft) {\r\n // Paning from right to left, beyond the right edge\r\n\r\n // Maximum pan position refers to the right edge of the image.\r\n const wasAtMaxPanPosition = (this.startPan[axis] <= bounds.max[axis]);\r\n\r\n if (wasAtMaxPanPosition) {\r\n mainScroll.moveTo(newMainScrollX, true);\r\n return true;\r\n } else {\r\n this._setPanWithFriction(axis, newPan);\r\n //currSlide.pan[axis] = newPan;\r\n }\r\n } else {\r\n // If main scroll is shifted\r\n if (mainScrollShiftDiff !== 0) {\r\n // If main scroll is shifted right\r\n if (mainScrollShiftDiff > 0 /*&& isRightToLeft*/) {\r\n mainScroll.moveTo(Math.max(newMainScrollX, currSlideMainScrollX), true);\r\n return true;\r\n } else if (mainScrollShiftDiff < 0 /*&& isLeftToRight*/) {\r\n // Main scroll is shifted left (Position is less than 0 comparing to the viewport 0)\r\n mainScroll.moveTo(Math.min(newMainScrollX, currSlideMainScrollX), true);\r\n return true;\r\n }\r\n } else {\r\n // We are within pan bounds, so just pan\r\n this._setPanWithFriction(axis, newPan);\r\n }\r\n }\r\n } else {\r\n if (axis === 'y') {\r\n // Do not pan vertically if main scroll is shifted o\r\n if (!mainScroll.isShifted() && bounds.min.y !== bounds.max.y) {\r\n this._setPanWithFriction(axis, newPan);\r\n }\r\n } else {\r\n this._setPanWithFriction(axis, newPan);\r\n }\r\n }\r\n }\r\n //\r\n // If we move above - the ratio is negative\r\n // If we move below the ratio is positive\r\n\r\n /**\r\n * Relation between pan Y position and third of viewport height.\r\n *\r\n * When we are at initial position (center bounds) - the ratio is 0,\r\n * if position is shifted upwards - the ratio is negative,\r\n * if position is shifted downwards - the ratio is positive.\r\n *\r\n * @private\r\n * @param {number} panY The current pan Y position.\r\n */\r\n _getVerticalDragRatio(panY) {\r\n return (panY - this.pswp.currSlide.bounds.center.y)\r\n / (this.pswp.viewportSize.y / 3);\r\n }\r\n\r\n /**\r\n * Set pan position of the current slide.\r\n * Apply friction if the position is beyond the pan bounds,\r\n * or if custom friction is defined.\r\n *\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @param {number} potentialPan\r\n * @param {number=} customFriction (0.1 - 1)\r\n */\r\n _setPanWithFriction(axis, potentialPan, customFriction) {\r\n const { pan, bounds } = this.pswp.currSlide;\r\n const correctedPan = bounds.correctPan(axis, potentialPan);\r\n // If we are out of pan bounds\r\n if (correctedPan !== potentialPan || customFriction) {\r\n const delta = Math.round(potentialPan - pan[axis]);\r\n pan[axis] += delta * (customFriction || PAN_END_FRICTION);\r\n } else {\r\n pan[axis] = potentialPan;\r\n }\r\n }\r\n}\n\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n/** @typedef {import('./gestures.js').default} Gestures */\r\n\r\nconst UPPER_ZOOM_FRICTION = 0.05;\r\nconst LOWER_ZOOM_FRICTION = 0.15;\r\n\r\n\r\n/**\r\n * Get center point between two points\r\n *\r\n * @param {Point} p\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nfunction getZoomPointsCenter(p, p1, p2) {\r\n p.x = (p1.x + p2.x) / 2;\r\n p.y = (p1.y + p2.y) / 2;\r\n return p;\r\n}\r\n\r\nclass ZoomHandler {\r\n /**\r\n * @param {Gestures} gestures\r\n */\r\n constructor(gestures) {\r\n this.gestures = gestures;\r\n this.pswp = this.gestures.pswp;\r\n /** @type {Point} */\r\n this._startPan = {};\r\n\r\n /** @type {Point} */\r\n this._startZoomPoint = {};\r\n /** @type {Point} */\r\n this._zoomPoint = {};\r\n }\r\n\r\n start() {\r\n this._startZoomLevel = this.pswp.currSlide.currZoomLevel;\r\n equalizePoints(this._startPan, this.pswp.currSlide.pan);\r\n this.pswp.animations.stopAllPan();\r\n this._wasOverFitZoomLevel = false;\r\n }\r\n\r\n change() {\r\n const { p1, startP1, p2, startP2, pswp } = this.gestures;\r\n const { currSlide } = pswp;\r\n const minZoomLevel = currSlide.zoomLevels.min;\r\n const maxZoomLevel = currSlide.zoomLevels.max;\r\n\r\n if (!currSlide.isZoomable() || pswp.mainScroll.isShifted()) {\r\n return;\r\n }\r\n\r\n getZoomPointsCenter(this._startZoomPoint, startP1, startP2);\r\n getZoomPointsCenter(this._zoomPoint, p1, p2);\r\n\r\n let currZoomLevel = (1 / getDistanceBetween(startP1, startP2))\r\n * getDistanceBetween(p1, p2)\r\n * this._startZoomLevel;\r\n\r\n // slightly over the zoom.fit\r\n if (currZoomLevel > currSlide.zoomLevels.initial + (currSlide.zoomLevels.initial / 15)) {\r\n this._wasOverFitZoomLevel = true;\r\n }\r\n\r\n if (currZoomLevel < minZoomLevel) {\r\n if (pswp.options.pinchToClose\r\n && !this._wasOverFitZoomLevel\r\n && this._startZoomLevel <= currSlide.zoomLevels.initial) {\r\n // fade out background if zooming out\r\n const bgOpacity = 1 - ((minZoomLevel - currZoomLevel) / (minZoomLevel / 1.2));\r\n if (!pswp.dispatch('pinchClose', { bgOpacity }).defaultPrevented) {\r\n pswp.applyBgOpacity(bgOpacity);\r\n }\r\n } else {\r\n // Apply the friction if zoom level is below the min\r\n currZoomLevel = minZoomLevel - (minZoomLevel - currZoomLevel) * LOWER_ZOOM_FRICTION;\r\n }\r\n } else if (currZoomLevel > maxZoomLevel) {\r\n // Apply the friction if zoom level is above the max\r\n currZoomLevel = maxZoomLevel + (currZoomLevel - maxZoomLevel) * UPPER_ZOOM_FRICTION;\r\n }\r\n\r\n currSlide.pan.x = this._calculatePanForZoomLevel('x', currZoomLevel);\r\n currSlide.pan.y = this._calculatePanForZoomLevel('y', currZoomLevel);\r\n\r\n currSlide.setZoomLevel(currZoomLevel);\r\n currSlide.applyCurrentZoomPan();\r\n }\r\n\r\n end() {\r\n const { pswp } = this;\r\n const { currSlide } = pswp;\r\n if (currSlide.currZoomLevel < currSlide.zoomLevels.initial\r\n && !this._wasOverFitZoomLevel\r\n && pswp.options.pinchToClose) {\r\n pswp.close();\r\n } else {\r\n this.correctZoomPan();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @param {number} currZoomLevel\r\n */\r\n _calculatePanForZoomLevel(axis, currZoomLevel) {\r\n const zoomFactor = currZoomLevel / this._startZoomLevel;\r\n return this._zoomPoint[axis]\r\n - ((this._startZoomPoint[axis] - this._startPan[axis]) * zoomFactor);\r\n }\r\n\r\n /**\r\n * Correct currZoomLevel and pan if they are\r\n * beyond minimum or maximum values.\r\n * With animation.\r\n *\r\n * @param {boolean=} ignoreGesture\r\n * Wether gesture coordinates should be ignored when calculating destination pan position.\r\n */\r\n correctZoomPan(ignoreGesture) {\r\n const { pswp } = this;\r\n const { currSlide } = pswp;\r\n\r\n if (!currSlide.isZoomable()) {\r\n return;\r\n }\r\n\r\n if (this._zoomPoint.x === undefined) {\r\n ignoreGesture = true;\r\n }\r\n\r\n const prevZoomLevel = currSlide.currZoomLevel;\r\n\r\n /** @type {number} */\r\n let destinationZoomLevel;\r\n let currZoomLevelNeedsChange = true;\r\n\r\n if (prevZoomLevel < currSlide.zoomLevels.initial) {\r\n destinationZoomLevel = currSlide.zoomLevels.initial;\r\n // zoom to min\r\n } else if (prevZoomLevel > currSlide.zoomLevels.max) {\r\n destinationZoomLevel = currSlide.zoomLevels.max;\r\n // zoom to max\r\n } else {\r\n currZoomLevelNeedsChange = false;\r\n destinationZoomLevel = prevZoomLevel;\r\n }\r\n\r\n const initialBgOpacity = pswp.bgOpacity;\r\n const restoreBgOpacity = pswp.bgOpacity < 1;\r\n\r\n const initialPan = equalizePoints({}, currSlide.pan);\r\n let destinationPan = equalizePoints({}, initialPan);\r\n\r\n if (ignoreGesture) {\r\n this._zoomPoint.x = 0;\r\n this._zoomPoint.y = 0;\r\n this._startZoomPoint.x = 0;\r\n this._startZoomPoint.y = 0;\r\n this._startZoomLevel = prevZoomLevel;\r\n equalizePoints(this._startPan, initialPan);\r\n }\r\n\r\n if (currZoomLevelNeedsChange) {\r\n destinationPan = {\r\n x: this._calculatePanForZoomLevel('x', destinationZoomLevel),\r\n y: this._calculatePanForZoomLevel('y', destinationZoomLevel)\r\n };\r\n }\r\n\r\n // set zoom level, so pan bounds are updated according to it\r\n currSlide.setZoomLevel(destinationZoomLevel);\r\n\r\n destinationPan = {\r\n x: currSlide.bounds.correctPan('x', destinationPan.x),\r\n y: currSlide.bounds.correctPan('y', destinationPan.y)\r\n };\r\n\r\n // return zoom level and its bounds to initial\r\n currSlide.setZoomLevel(prevZoomLevel);\r\n\r\n let panNeedsChange = true;\r\n if (pointsEqual(destinationPan, initialPan)) {\r\n panNeedsChange = false;\r\n }\r\n\r\n if (!panNeedsChange && !currZoomLevelNeedsChange && !restoreBgOpacity) {\r\n // update resolution after gesture\r\n currSlide._setResolution(destinationZoomLevel);\r\n currSlide.applyCurrentZoomPan();\r\n\r\n // nothing to animate\r\n return;\r\n }\r\n\r\n pswp.animations.stopAllPan();\r\n\r\n pswp.animations.startSpring({\r\n isPan: true,\r\n start: 0,\r\n end: 1000,\r\n velocity: 0,\r\n dampingRatio: 1,\r\n naturalFrequency: 40,\r\n onUpdate: (now) => {\r\n now /= 1000; // 0 - start, 1 - end\r\n\r\n if (panNeedsChange || currZoomLevelNeedsChange) {\r\n if (panNeedsChange) {\r\n currSlide.pan.x = initialPan.x + (destinationPan.x - initialPan.x) * now;\r\n currSlide.pan.y = initialPan.y + (destinationPan.y - initialPan.y) * now;\r\n }\r\n\r\n if (currZoomLevelNeedsChange) {\r\n const newZoomLevel = prevZoomLevel\r\n + (destinationZoomLevel - prevZoomLevel) * now;\r\n currSlide.setZoomLevel(newZoomLevel);\r\n }\r\n\r\n currSlide.applyCurrentZoomPan();\r\n }\r\n\r\n // Restore background opacity\r\n if (restoreBgOpacity && pswp.bgOpacity < 1) {\r\n // We clamp opacity to keep it between 0 and 1.\r\n // As progress ratio can be larger than 1 due to overshoot,\r\n // and we do not want to bounce opacity.\r\n pswp.applyBgOpacity(clamp(\r\n initialBgOpacity + (1 - initialBgOpacity) * now, 0, 1\r\n ));\r\n }\r\n },\r\n onComplete: () => {\r\n // update resolution after transition ends\r\n currSlide._setResolution(destinationZoomLevel);\r\n currSlide.applyCurrentZoomPan();\r\n }\r\n });\r\n }\r\n}\n\n/**\r\n * @template T\r\n * @template P\r\n * @typedef {import('../types.js').AddPostfix} AddPostfix\r\n */\r\n\r\n/** @typedef {import('./gestures.js').default} Gestures */\r\n\r\n/** @typedef {'imageClick' | 'bgClick' | 'tap' | 'doubleTap'} Actions */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n\r\n/**\r\n * Whether the tap was performed on the main slide\r\n * (rather than controls or caption).\r\n *\r\n * @param {PointerEvent} event\r\n */\r\nfunction didTapOnMainContent(event) {\r\n return !!(/** @type {HTMLElement} */ (event.target).closest('.pswp__container'));\r\n}\r\n\r\n/**\r\n * Tap, double-tap handler.\r\n */\r\nclass TapHandler {\r\n /**\r\n * @param {Gestures} gestures\r\n */\r\n constructor(gestures) {\r\n this.gestures = gestures;\r\n }\r\n\r\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\r\n click(point, originalEvent) {\r\n const targetClassList = /** @type {HTMLElement} */ (originalEvent.target).classList;\r\n const isImageClick = targetClassList.contains('pswp__img');\r\n const isBackgroundClick = targetClassList.contains('pswp__item')\r\n || targetClassList.contains('pswp__zoom-wrap');\r\n\r\n if (isImageClick) {\r\n this._doClickOrTapAction('imageClick', point, originalEvent);\r\n } else if (isBackgroundClick) {\r\n this._doClickOrTapAction('bgClick', point, originalEvent);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\r\n tap(point, originalEvent) {\r\n if (didTapOnMainContent(originalEvent)) {\r\n this._doClickOrTapAction('tap', point, originalEvent);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\r\n doubleTap(point, originalEvent) {\r\n if (didTapOnMainContent(originalEvent)) {\r\n this._doClickOrTapAction('doubleTap', point, originalEvent);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Actions} actionName\r\n * @param {Point} point\r\n * @param {PointerEvent} originalEvent\r\n */\r\n _doClickOrTapAction(actionName, point, originalEvent) {\r\n const { pswp } = this.gestures;\r\n const { currSlide } = pswp;\r\n const actionFullName = /** @type {AddPostfix} */ (actionName + 'Action');\r\n const optionValue = pswp.options[actionFullName];\r\n\r\n if (pswp.dispatch(actionFullName, { point, originalEvent }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (typeof optionValue === 'function') {\r\n optionValue.call(pswp, point, originalEvent);\r\n return;\r\n }\r\n\r\n switch (optionValue) {\r\n case 'close':\r\n case 'next':\r\n pswp[optionValue]();\r\n break;\r\n case 'zoom':\r\n currSlide.toggleZoom(point);\r\n break;\r\n case 'zoom-or-close':\r\n // by default click zooms current image,\r\n // if it can not be zoomed - gallery will be closed\r\n if (currSlide.isZoomable()\r\n && currSlide.zoomLevels.secondary !== currSlide.zoomLevels.initial) {\r\n currSlide.toggleZoom(point);\r\n } else if (pswp.options.clickToCloseNonZoomable) {\r\n pswp.close();\r\n }\r\n break;\r\n case 'toggle-controls':\r\n this.gestures.pswp.element.classList.toggle('pswp--ui-visible');\r\n // if (_controlsVisible) {\r\n // _ui.hideControls();\r\n // } else {\r\n // _ui.showControls();\r\n // }\r\n break;\r\n }\r\n }\r\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n// How far should user should drag\r\n// until we can determine that the gesture is swipe and its direction\r\nconst AXIS_SWIPE_HYSTERISIS = 10;\r\n//const PAN_END_FRICTION = 0.35;\r\n\r\nconst DOUBLE_TAP_DELAY = 300; // ms\r\nconst MIN_TAP_DISTANCE = 25; // px\r\n\r\n/**\r\n * Gestures class bind touch, pointer or mouse events\r\n * and emits drag to drag-handler and zoom events zoom-handler.\r\n *\r\n * Drag and zoom events are emited in requestAnimationFrame,\r\n * and only when one of pointers was actually changed.\r\n */\r\nclass Gestures {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n\r\n /** @type {'x' | 'y'} */\r\n this.dragAxis = undefined;\r\n\r\n // point objects are defined once and reused\r\n // PhotoSwipe keeps track only of two pointers, others are ignored\r\n /** @type {Point} */\r\n this.p1 = {}; // the first pressed pointer\r\n /** @type {Point} */\r\n this.p2 = {}; // the second pressed pointer\r\n /** @type {Point} */\r\n this.prevP1 = {};\r\n /** @type {Point} */\r\n this.prevP2 = {};\r\n /** @type {Point} */\r\n this.startP1 = {};\r\n /** @type {Point} */\r\n this.startP2 = {};\r\n /** @type {Point} */\r\n this.velocity = {};\r\n\r\n /** @type {Point} */\r\n this._lastStartP1 = {};\r\n /** @type {Point} */\r\n this._intervalP1 = {};\r\n this._numActivePoints = 0;\r\n /** @type {Point[]} */\r\n this._ongoingPointers = [];\r\n\r\n this._touchEventEnabled = 'ontouchstart' in window;\r\n this._pointerEventEnabled = !!(window.PointerEvent);\r\n this.supportsTouch = this._touchEventEnabled\r\n || (this._pointerEventEnabled && navigator.maxTouchPoints > 1);\r\n\r\n if (!this.supportsTouch) {\r\n // disable pan to next slide for non-touch devices\r\n pswp.options.allowPanToNext = false;\r\n }\r\n\r\n this.drag = new DragHandler(this);\r\n this.zoomLevels = new ZoomHandler(this);\r\n this.tapHandler = new TapHandler(this);\r\n\r\n pswp.on('bindEvents', () => {\r\n pswp.events.add(pswp.scrollWrap, 'click', e => this._onClick(e));\r\n\r\n if (this._pointerEventEnabled) {\r\n this._bindEvents('pointer', 'down', 'up', 'cancel');\r\n } else if (this._touchEventEnabled) {\r\n this._bindEvents('touch', 'start', 'end', 'cancel');\r\n\r\n // In previous versions we also bound mouse event here,\r\n // in case device supports both touch and mouse events,\r\n // but newer versions of browsers now support PointerEvent.\r\n\r\n // on iOS10 if you bind touchmove/end after touchstart,\r\n // and you don't preventDefault touchstart (which PhotoSwipe does),\r\n // preventDefault will have no effect on touchmove and touchend.\r\n // Unless you bind it previously.\r\n pswp.scrollWrap.ontouchmove = () => {}; // eslint-disable-line\r\n pswp.scrollWrap.ontouchend = () => {}; // eslint-disable-line\r\n } else {\r\n this._bindEvents('mouse', 'down', 'up');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * @param {'mouse' | 'touch' | 'pointer'} pref\r\n * @param {'down' | 'start'} down\r\n * @param {'up' | 'end'} up\r\n * @param {'cancel'} [cancel]\r\n */\r\n _bindEvents(pref, down, up, cancel) {\r\n const { pswp } = this;\r\n const { events } = pswp;\r\n\r\n const cancelEvent = cancel ? pref + cancel : '';\r\n\r\n events.add(pswp.scrollWrap, pref + down, this.onPointerDown.bind(this));\r\n events.add(window, pref + 'move', this.onPointerMove.bind(this));\r\n events.add(window, pref + up, this.onPointerUp.bind(this));\r\n if (cancelEvent) {\r\n events.add(pswp.scrollWrap, cancelEvent, this.onPointerUp.bind(this));\r\n }\r\n }\r\n\r\n /**\r\n * @param {PointerEvent} e\r\n */\r\n onPointerDown(e) {\r\n // We do not call preventDefault for touch events\r\n // to allow browser to show native dialog on longpress\r\n // (the one that allows to save image or open it in new tab).\r\n //\r\n // Desktop Safari allows to drag images when preventDefault isn't called on mousedown,\r\n // even though preventDefault IS called on mousemove. That's why we preventDefault mousedown.\r\n let isMousePointer;\r\n if (e.type === 'mousedown' || e.pointerType === 'mouse') {\r\n isMousePointer = true;\r\n }\r\n\r\n // Allow dragging only via left mouse button.\r\n // http://www.quirksmode.org/js/events_properties.html\r\n // https://developer.mozilla.org/en-US/docs/Web/API/event.button\r\n if (isMousePointer && e.button > 0) {\r\n return;\r\n }\r\n\r\n const { pswp } = this;\r\n\r\n // if PhotoSwipe is opening or closing\r\n if (!pswp.opener.isOpen) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n if (pswp.dispatch('pointerDown', { originalEvent: e }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (isMousePointer) {\r\n pswp.mouseDetected();\r\n\r\n // preventDefault mouse event to prevent\r\n // browser image drag feature\r\n this._preventPointerEventBehaviour(e);\r\n }\r\n\r\n pswp.animations.stopAll();\r\n\r\n this._updatePoints(e, 'down');\r\n\r\n this.pointerDown = true;\r\n\r\n if (this._numActivePoints === 1) {\r\n this.dragAxis = null;\r\n // we need to store initial point to determine the main axis,\r\n // drag is activated only after the axis is determined\r\n equalizePoints(this.startP1, this.p1);\r\n }\r\n\r\n if (this._numActivePoints > 1) {\r\n // Tap or double tap should not trigger if more than one pointer\r\n this._clearTapTimer();\r\n this.isMultitouch = true;\r\n } else {\r\n this.isMultitouch = false;\r\n }\r\n }\r\n\r\n /**\r\n * @param {PointerEvent} e\r\n */\r\n onPointerMove(e) {\r\n e.preventDefault(); // always preventDefault move event\r\n\r\n if (!this._numActivePoints) {\r\n return;\r\n }\r\n\r\n this._updatePoints(e, 'move');\r\n\r\n if (this.pswp.dispatch('pointerMove', { originalEvent: e }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this._numActivePoints === 1 && !this.isDragging) {\r\n if (!this.dragAxis) {\r\n this._calculateDragDirection();\r\n }\r\n\r\n // Drag axis was detected, emit drag.start\r\n if (this.dragAxis && !this.isDragging) {\r\n if (this.isZooming) {\r\n this.isZooming = false;\r\n this.zoomLevels.end();\r\n }\r\n\r\n this.isDragging = true;\r\n this._clearTapTimer(); // Tap can not trigger after drag\r\n\r\n // Adjust starting point\r\n this._updateStartPoints();\r\n this._intervalTime = Date.now();\r\n //this._startTime = this._intervalTime;\r\n this._velocityCalculated = false;\r\n equalizePoints(this._intervalP1, this.p1);\r\n this.velocity.x = 0;\r\n this.velocity.y = 0;\r\n this.drag.start();\r\n\r\n this._rafStopLoop();\r\n this._rafRenderLoop();\r\n }\r\n } else if (this._numActivePoints > 1 && !this.isZooming) {\r\n this._finishDrag();\r\n\r\n this.isZooming = true;\r\n\r\n // Adjust starting points\r\n this._updateStartPoints();\r\n\r\n this.zoomLevels.start();\r\n\r\n this._rafStopLoop();\r\n this._rafRenderLoop();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _finishDrag() {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n\r\n // Try to calculate velocity,\r\n // if it wasn't calculated yet in drag.change\r\n if (!this._velocityCalculated) {\r\n this._updateVelocity(true);\r\n }\r\n\r\n this.drag.end();\r\n this.dragAxis = null;\r\n }\r\n }\r\n\r\n /**\r\n * @param {PointerEvent} e\r\n */\r\n onPointerUp(e) {\r\n if (!this._numActivePoints) {\r\n return;\r\n }\r\n\r\n this._updatePoints(e, 'up');\r\n\r\n if (this.pswp.dispatch('pointerUp', { originalEvent: e }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this._numActivePoints === 0) {\r\n this.pointerDown = false;\r\n this._rafStopLoop();\r\n\r\n if (this.isDragging) {\r\n this._finishDrag();\r\n } else if (!this.isZooming && !this.isMultitouch) {\r\n //this.zoomLevels.correctZoomPan();\r\n this._finishTap(e);\r\n }\r\n }\r\n\r\n if (this._numActivePoints < 2 && this.isZooming) {\r\n this.isZooming = false;\r\n this.zoomLevels.end();\r\n\r\n if (this._numActivePoints === 1) {\r\n // Since we have 1 point left, we need to reinitiate drag\r\n this.dragAxis = null;\r\n this._updateStartPoints();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _rafRenderLoop() {\r\n if (this.isDragging || this.isZooming) {\r\n this._updateVelocity();\r\n\r\n if (this.isDragging) {\r\n // make sure that pointer moved since the last update\r\n if (!pointsEqual(this.p1, this.prevP1)) {\r\n this.drag.change();\r\n }\r\n } else /* if (this.isZooming) */ {\r\n if (!pointsEqual(this.p1, this.prevP1)\r\n || !pointsEqual(this.p2, this.prevP2)) {\r\n this.zoomLevels.change();\r\n }\r\n }\r\n\r\n this._updatePrevPoints();\r\n this.raf = requestAnimationFrame(this._rafRenderLoop.bind(this));\r\n }\r\n }\r\n\r\n /**\r\n * Update velocity at 50ms interval\r\n *\r\n * @param {boolean=} force\r\n */\r\n _updateVelocity(force) {\r\n const time = Date.now();\r\n const duration = time - this._intervalTime;\r\n\r\n if (duration < 50 && !force) {\r\n return;\r\n }\r\n\r\n\r\n this.velocity.x = this._getVelocity('x', duration);\r\n this.velocity.y = this._getVelocity('y', duration);\r\n\r\n this._intervalTime = time;\r\n equalizePoints(this._intervalP1, this.p1);\r\n this._velocityCalculated = true;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n */\r\n _finishTap(e) {\r\n const { mainScroll } = this.pswp;\r\n\r\n // Do not trigger tap events if main scroll is shifted\r\n if (mainScroll.isShifted()) {\r\n // restore main scroll position\r\n // (usually happens if stopped in the middle of animation)\r\n mainScroll.moveIndexBy(0, true);\r\n return;\r\n }\r\n\r\n // Do not trigger tap for touchcancel or pointercancel\r\n if (e.type.indexOf('cancel') > 0) {\r\n return;\r\n }\r\n\r\n // Trigger click instead of tap for mouse events\r\n if (e.type === 'mouseup' || e.pointerType === 'mouse') {\r\n this.tapHandler.click(this.startP1, e);\r\n return;\r\n }\r\n\r\n // Disable delay if there is no doubleTapAction\r\n const tapDelay = this.pswp.options.doubleTapAction ? DOUBLE_TAP_DELAY : 0;\r\n\r\n // If tapTimer is defined - we tapped recently,\r\n // check if the current tap is close to the previous one,\r\n // if yes - trigger double tap\r\n if (this._tapTimer) {\r\n this._clearTapTimer();\r\n // Check if two taps were more or less on the same place\r\n if (getDistanceBetween(this._lastStartP1, this.startP1) < MIN_TAP_DISTANCE) {\r\n this.tapHandler.doubleTap(this.startP1, e);\r\n }\r\n } else {\r\n equalizePoints(this._lastStartP1, this.startP1);\r\n this._tapTimer = setTimeout(() => {\r\n this.tapHandler.tap(this.startP1, e);\r\n this._clearTapTimer();\r\n }, tapDelay);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _clearTapTimer() {\r\n if (this._tapTimer) {\r\n clearTimeout(this._tapTimer);\r\n this._tapTimer = null;\r\n }\r\n }\r\n\r\n /**\r\n * Get velocity for axis\r\n *\r\n * @private\r\n * @param {'x' | 'y'} axis\r\n * @param {number} duration\r\n */\r\n _getVelocity(axis, duration) {\r\n // displacement is like distance, but can be negative.\r\n const displacement = this.p1[axis] - this._intervalP1[axis];\r\n\r\n if (Math.abs(displacement) > 1 && duration > 5) {\r\n return displacement / duration;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _rafStopLoop() {\r\n if (this.raf) {\r\n cancelAnimationFrame(this.raf);\r\n this.raf = null;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n */\r\n _preventPointerEventBehaviour(e) {\r\n // TODO find a way to disable e.preventDefault on some elements\r\n // via event or some class or something\r\n e.preventDefault();\r\n return true;\r\n }\r\n\r\n /**\r\n * Parses and normalizes points from the touch, mouse or pointer event.\r\n * Updates p1 and p2.\r\n *\r\n * @private\r\n * @param {PointerEvent | TouchEvent} e\r\n * @param {'up' | 'down' | 'move'} pointerType Normalized pointer type\r\n */\r\n _updatePoints(e, pointerType) {\r\n if (this._pointerEventEnabled) {\r\n const pointerEvent = /** @type {PointerEvent} */ (e);\r\n // Try to find the current pointer in ongoing pointers by its ID\r\n const pointerIndex = this._ongoingPointers.findIndex((ongoingPoiner) => {\r\n return ongoingPoiner.id === pointerEvent.pointerId;\r\n });\r\n\r\n if (pointerType === 'up' && pointerIndex > -1) {\r\n // release the pointer - remove it from ongoing\r\n this._ongoingPointers.splice(pointerIndex, 1);\r\n } else if (pointerType === 'down' && pointerIndex === -1) {\r\n // add new pointer\r\n this._ongoingPointers.push(this._convertEventPosToPoint(pointerEvent, {}));\r\n } else if (pointerIndex > -1) {\r\n // update existing pointer\r\n this._convertEventPosToPoint(pointerEvent, this._ongoingPointers[pointerIndex]);\r\n }\r\n\r\n this._numActivePoints = this._ongoingPointers.length;\r\n\r\n // update points that PhotoSwipe uses\r\n // to calculate position and scale\r\n if (this._numActivePoints > 0) {\r\n equalizePoints(this.p1, this._ongoingPointers[0]);\r\n }\r\n\r\n if (this._numActivePoints > 1) {\r\n equalizePoints(this.p2, this._ongoingPointers[1]);\r\n }\r\n } else {\r\n const touchEvent = /** @type {TouchEvent} */ (e);\r\n\r\n this._numActivePoints = 0;\r\n if (touchEvent.type.indexOf('touch') > -1) {\r\n // Touch Event\r\n // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\r\n if (touchEvent.touches && touchEvent.touches.length > 0) {\r\n this._convertEventPosToPoint(touchEvent.touches[0], this.p1);\r\n this._numActivePoints++;\r\n if (touchEvent.touches.length > 1) {\r\n this._convertEventPosToPoint(touchEvent.touches[1], this.p2);\r\n this._numActivePoints++;\r\n }\r\n }\r\n } else {\r\n // Mouse Event\r\n this._convertEventPosToPoint(/** @type {PointerEvent} */ (e), this.p1);\r\n if (pointerType === 'up') {\r\n // clear all points on mouseup\r\n this._numActivePoints = 0;\r\n } else {\r\n this._numActivePoints++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // update points that were used during previous rAF tick\r\n _updatePrevPoints() {\r\n equalizePoints(this.prevP1, this.p1);\r\n equalizePoints(this.prevP2, this.p2);\r\n }\r\n\r\n // update points at the start of gesture\r\n _updateStartPoints() {\r\n equalizePoints(this.startP1, this.p1);\r\n equalizePoints(this.startP2, this.p2);\r\n this._updatePrevPoints();\r\n }\r\n\r\n _calculateDragDirection() {\r\n if (this.pswp.mainScroll.isShifted()) {\r\n // if main scroll position is shifted – direction is always horizontal\r\n this.dragAxis = 'x';\r\n } else {\r\n // calculate delta of the last touchmove tick\r\n const diff = Math.abs(this.p1.x - this.startP1.x) - Math.abs(this.p1.y - this.startP1.y);\r\n\r\n if (diff !== 0) {\r\n // check if pointer was shifted horizontally or vertically\r\n const axisToCheck = diff > 0 ? 'x' : 'y';\r\n\r\n if (Math.abs(this.p1[axisToCheck] - this.startP1[axisToCheck]) >= AXIS_SWIPE_HYSTERISIS) {\r\n this.dragAxis = axisToCheck;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Converts touch, pointer or mouse event\r\n * to PhotoSwipe point.\r\n *\r\n * @private\r\n * @param {Touch | PointerEvent} e\r\n * @param {Point} p\r\n */\r\n _convertEventPosToPoint(e, p) {\r\n p.x = e.pageX - this.pswp.offset.x;\r\n p.y = e.pageY - this.pswp.offset.y;\r\n\r\n if ('pointerId' in e) {\r\n p.id = e.pointerId;\r\n } else if (e.identifier !== undefined) {\r\n p.id = e.identifier;\r\n }\r\n\r\n return p;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {PointerEvent} e\r\n */\r\n _onClick(e) {\r\n // Do not allow click event to pass through after drag\r\n if (this.pswp.mainScroll.isShifted()) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n }\r\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('./slide/slide.js').default} Slide */\r\n\r\n/** @typedef {{ el: HTMLDivElement; slide?: Slide }} ItemHolder */\r\n\r\nconst MAIN_SCROLL_END_FRICTION = 0.35;\r\n\r\n\r\n// const MIN_SWIPE_TRANSITION_DURATION = 250;\r\n// const MAX_SWIPE_TRABSITION_DURATION = 500;\r\n// const DEFAULT_SWIPE_TRANSITION_DURATION = 333;\r\n\r\n/**\r\n * Handles movement of the main scrolling container\r\n * (for example, it repositions when user swipes left or right).\r\n *\r\n * Also stores its state.\r\n */\r\nclass MainScroll {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n this.x = 0;\r\n\r\n /** @type {number} */\r\n this.slideWidth = undefined;\r\n\r\n /** @type {ItemHolder[]} */\r\n this.itemHolders = undefined;\r\n\r\n this.resetPosition();\r\n }\r\n\r\n /**\r\n * Position the scroller and slide containers\r\n * according to viewport size.\r\n *\r\n * @param {boolean=} resizeSlides Whether slides content should resized\r\n */\r\n resize(resizeSlides) {\r\n const { pswp } = this;\r\n const newSlideWidth = Math.round(\r\n pswp.viewportSize.x + pswp.viewportSize.x * pswp.options.spacing\r\n );\r\n // Mobile browsers might trigger a resize event during a gesture.\r\n // (due to toolbar appearing or hiding).\r\n // Avoid re-adjusting main scroll position if width wasn't changed\r\n const slideWidthChanged = (newSlideWidth !== this.slideWidth);\r\n\r\n if (slideWidthChanged) {\r\n this.slideWidth = newSlideWidth;\r\n this.moveTo(this.getCurrSlideX());\r\n }\r\n\r\n this.itemHolders.forEach((itemHolder, index) => {\r\n if (slideWidthChanged) {\r\n setTransform(itemHolder.el, (index + this._containerShiftIndex)\r\n * this.slideWidth);\r\n }\r\n\r\n if (resizeSlides && itemHolder.slide) {\r\n itemHolder.slide.resize();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Reset X position of the main scroller to zero\r\n */\r\n resetPosition() {\r\n // Position on the main scroller (offset)\r\n // it is independent from slide index\r\n this._currPositionIndex = 0;\r\n this._prevPositionIndex = 0;\r\n\r\n // This will force recalculation of size on next resize()\r\n this.slideWidth = 0;\r\n\r\n // _containerShiftIndex*viewportSize will give you amount of transform of the current slide\r\n this._containerShiftIndex = -1;\r\n }\r\n\r\n /**\r\n * Create and append array of three items\r\n * that hold data about slides in DOM\r\n */\r\n appendHolders() {\r\n this.itemHolders = [];\r\n\r\n // append our three slide holders -\r\n // previous, current, and next\r\n for (let i = 0; i < 3; i++) {\r\n const el = createElement('pswp__item', false, this.pswp.container);\r\n el.setAttribute('role', 'group');\r\n el.setAttribute('aria-roledescription', 'slide');\r\n el.setAttribute('aria-hidden', 'true');\r\n\r\n // hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\r\n el.style.display = (i === 1) ? 'block' : 'none';\r\n\r\n this.itemHolders.push({\r\n el,\r\n //index: -1\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Whether the main scroll can be horizontally swiped to the next or previous slide.\r\n */\r\n canBeSwiped() {\r\n return this.pswp.getNumItems() > 1;\r\n }\r\n\r\n /**\r\n * Move main scroll by X amount of slides.\r\n * For example:\r\n * `-1` will move to the previous slide,\r\n * `0` will reset the scroll position of the current slide,\r\n * `3` will move three slides forward\r\n *\r\n * If loop option is enabled - index will be automatically looped too,\r\n * (for example `-1` will move to the last slide of the gallery).\r\n *\r\n * @param {number} diff\r\n * @param {boolean=} animate\r\n * @param {number=} velocityX\r\n * @returns {boolean} whether index was changed or not\r\n */\r\n moveIndexBy(diff, animate, velocityX) {\r\n const { pswp } = this;\r\n let newIndex = pswp.potentialIndex + diff;\r\n const numSlides = pswp.getNumItems();\r\n\r\n if (pswp.canLoop()) {\r\n newIndex = pswp.getLoopedIndex(newIndex);\r\n const distance = (diff + numSlides) % numSlides;\r\n if (distance <= numSlides / 2) {\r\n // go forward\r\n diff = distance;\r\n } else {\r\n // go backwards\r\n diff = distance - numSlides;\r\n }\r\n } else {\r\n if (newIndex < 0) {\r\n newIndex = 0;\r\n } else if (newIndex >= numSlides) {\r\n newIndex = numSlides - 1;\r\n }\r\n diff = newIndex - pswp.potentialIndex;\r\n }\r\n\r\n pswp.potentialIndex = newIndex;\r\n this._currPositionIndex -= diff;\r\n\r\n pswp.animations.stopMainScroll();\r\n\r\n const destinationX = this.getCurrSlideX();\r\n if (!animate) {\r\n this.moveTo(destinationX);\r\n this.updateCurrItem();\r\n } else {\r\n pswp.animations.startSpring({\r\n isMainScroll: true,\r\n start: this.x,\r\n end: destinationX,\r\n velocity: velocityX || 0,\r\n naturalFrequency: 30,\r\n dampingRatio: 1, //0.7,\r\n onUpdate: (x) => {\r\n this.moveTo(x);\r\n },\r\n onComplete: () => {\r\n this.updateCurrItem();\r\n pswp.appendHeavy();\r\n }\r\n });\r\n\r\n let currDiff = pswp.potentialIndex - pswp.currIndex;\r\n if (pswp.canLoop()) {\r\n const currDistance = (currDiff + numSlides) % numSlides;\r\n if (currDistance <= numSlides / 2) {\r\n // go forward\r\n currDiff = currDistance;\r\n } else {\r\n // go backwards\r\n currDiff = currDistance - numSlides;\r\n }\r\n }\r\n\r\n // Force-append new slides during transition\r\n // if difference between slides is more than 1\r\n if (Math.abs(currDiff) > 1) {\r\n this.updateCurrItem();\r\n }\r\n }\r\n\r\n if (diff) {\r\n return true;\r\n }\r\n }\r\n\r\n /**\r\n * X position of the main scroll for the current slide\r\n * (ignores position during dragging)\r\n */\r\n getCurrSlideX() {\r\n return this.slideWidth * this._currPositionIndex;\r\n }\r\n\r\n /**\r\n * Whether scroll position is shifted.\r\n * For example, it will return true if the scroll is being dragged or animated.\r\n */\r\n isShifted() {\r\n return this.x !== this.getCurrSlideX();\r\n }\r\n\r\n /**\r\n * Update slides X positions and set their content\r\n */\r\n updateCurrItem() {\r\n const { pswp } = this;\r\n const positionDifference = this._prevPositionIndex - this._currPositionIndex;\r\n\r\n if (!positionDifference) {\r\n return;\r\n }\r\n\r\n this._prevPositionIndex = this._currPositionIndex;\r\n\r\n pswp.currIndex = pswp.potentialIndex;\r\n\r\n let diffAbs = Math.abs(positionDifference);\r\n let tempHolder;\r\n\r\n if (diffAbs >= 3) {\r\n this._containerShiftIndex += positionDifference + (positionDifference > 0 ? -3 : 3);\r\n diffAbs = 3;\r\n }\r\n\r\n for (let i = 0; i < diffAbs; i++) {\r\n if (positionDifference > 0) {\r\n tempHolder = this.itemHolders.shift();\r\n this.itemHolders[2] = tempHolder; // move first to last\r\n\r\n this._containerShiftIndex++;\r\n\r\n setTransform(tempHolder.el, (this._containerShiftIndex + 2) * this.slideWidth);\r\n\r\n pswp.setContent(tempHolder, (pswp.currIndex - diffAbs) + i + 2);\r\n } else {\r\n tempHolder = this.itemHolders.pop();\r\n this.itemHolders.unshift(tempHolder); // move last to first\r\n\r\n this._containerShiftIndex--;\r\n\r\n setTransform(tempHolder.el, this._containerShiftIndex * this.slideWidth);\r\n\r\n pswp.setContent(tempHolder, (pswp.currIndex + diffAbs) - i - 2);\r\n }\r\n }\r\n\r\n // Reset transfrom every 50ish navigations in one direction.\r\n //\r\n // Otherwise transform will keep growing indefinitely,\r\n // which might cause issues as browsers have a maximum transform limit.\r\n // I wasn't able to reach it, but just to be safe.\r\n // This should not cause noticable lag.\r\n if (Math.abs(this._containerShiftIndex) > 50 && !this.isShifted()) {\r\n this.resetPosition();\r\n this.resize();\r\n }\r\n\r\n // Pan transition might be running (and consntantly updating pan position)\r\n pswp.animations.stopAllPan();\r\n\r\n this.itemHolders.forEach((itemHolder, i) => {\r\n if (itemHolder.slide) {\r\n // Slide in the 2nd holder is always active\r\n itemHolder.slide.setIsActive(i === 1);\r\n }\r\n });\r\n\r\n pswp.currSlide = this.itemHolders[1].slide;\r\n pswp.contentLoader.updateLazy(positionDifference);\r\n\r\n if (pswp.currSlide) {\r\n pswp.currSlide.applyCurrentZoomPan();\r\n }\r\n\r\n pswp.dispatch('change');\r\n }\r\n\r\n /**\r\n * Move the X position of the main scroll container\r\n *\r\n * @param {number} x\r\n * @param {boolean=} dragging\r\n */\r\n moveTo(x, dragging) {\r\n /** @type {number} */\r\n let newSlideIndexOffset;\r\n /** @type {number} */\r\n let delta;\r\n\r\n if (!this.pswp.canLoop() && dragging) {\r\n // Apply friction\r\n newSlideIndexOffset = ((this.slideWidth * this._currPositionIndex) - x) / this.slideWidth;\r\n newSlideIndexOffset += this.pswp.currIndex;\r\n delta = Math.round(x - this.x);\r\n\r\n if ((newSlideIndexOffset < 0 && delta > 0)\r\n || (newSlideIndexOffset >= this.pswp.getNumItems() - 1 && delta < 0)) {\r\n x = this.x + (delta * MAIN_SCROLL_END_FRICTION);\r\n }\r\n }\r\n\r\n this.x = x;\r\n setTransform(this.pswp.container, x);\r\n\r\n this.pswp.dispatch('moveMainScroll', { x, dragging });\r\n }\r\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Methods} Methods\r\n */\r\n\r\n/**\r\n * - Manages keyboard shortcuts.\r\n * - Heps trap focus within photoswipe.\r\n */\r\nclass Keyboard {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n\r\n pswp.on('bindEvents', () => {\r\n // Dialog was likely opened by keyboard if initial point is not defined\r\n if (!pswp.options.initialPointerPos) {\r\n // focus causes layout,\r\n // which causes lag during the animation,\r\n // that's why we delay it until the opener transition ends\r\n this._focusRoot();\r\n }\r\n\r\n pswp.events.add(document, 'focusin', this._onFocusIn.bind(this));\r\n pswp.events.add(document, 'keydown', this._onKeyDown.bind(this));\r\n });\r\n\r\n const lastActiveElement = /** @type {HTMLElement} */ (document.activeElement);\r\n pswp.on('destroy', () => {\r\n if (pswp.options.returnFocus\r\n && lastActiveElement\r\n && this._wasFocused) {\r\n lastActiveElement.focus();\r\n }\r\n });\r\n }\r\n\r\n _focusRoot() {\r\n if (!this._wasFocused) {\r\n this.pswp.element.focus();\r\n this._wasFocused = true;\r\n }\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} e\r\n */\r\n _onKeyDown(e) {\r\n const { pswp } = this;\r\n\r\n if (pswp.dispatch('keydown', { originalEvent: e }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (specialKeyUsed(e)) {\r\n // don't do anything if special key pressed\r\n // to prevent from overriding default browser actions\r\n // for example, in Chrome on Mac cmd+arrow-left returns to previous page\r\n return;\r\n }\r\n\r\n /** @type {Methods} */\r\n let keydownAction;\r\n /** @type {'x' | 'y'} */\r\n let axis;\r\n let isForward;\r\n\r\n switch (e.keyCode) {\r\n case 27: // esc\r\n if (pswp.options.escKey) {\r\n keydownAction = 'close';\r\n }\r\n break;\r\n case 90: // z key\r\n keydownAction = 'toggleZoom';\r\n break;\r\n case 37: // left\r\n axis = 'x';\r\n break;\r\n case 38: // top\r\n axis = 'y';\r\n break;\r\n case 39: // right\r\n axis = 'x';\r\n isForward = true;\r\n break;\r\n case 40: // bottom\r\n isForward = true;\r\n axis = 'y';\r\n break;\r\n case 9: // tab\r\n this._focusRoot();\r\n break;\r\n }\r\n\r\n // if left/right/top/bottom key\r\n if (axis) {\r\n // prevent page scroll\r\n e.preventDefault();\r\n\r\n const { currSlide } = pswp;\r\n\r\n if (pswp.options.arrowKeys\r\n && axis === 'x'\r\n && pswp.getNumItems() > 1) {\r\n keydownAction = isForward ? 'next' : 'prev';\r\n } else if (currSlide && currSlide.currZoomLevel > currSlide.zoomLevels.fit) {\r\n // up/down arrow keys pan the image vertically\r\n // left/right arrow keys pan horizontally.\r\n // Unless there is only one image,\r\n // or arrowKeys option is disabled\r\n currSlide.pan[axis] += isForward ? -80 : 80;\r\n currSlide.panTo(currSlide.pan.x, currSlide.pan.y);\r\n }\r\n }\r\n\r\n if (keydownAction) {\r\n e.preventDefault();\r\n pswp[keydownAction]();\r\n }\r\n }\r\n\r\n /**\r\n * Trap focus inside photoswipe\r\n *\r\n * @param {FocusEvent} e\r\n */\r\n _onFocusIn(e) {\r\n const { template } = this.pswp;\r\n if (document !== e.target\r\n && template !== e.target\r\n && !template.contains(/** @type {Node} */ (e.target))) {\r\n // focus root element\r\n template.focus();\r\n }\r\n }\r\n}\n\nconst DEFAULT_EASING = 'cubic-bezier(.4,0,.22,1)';\r\n\r\n/** @typedef {import('./animations.js').AnimationProps} AnimationProps */\r\n\r\n/**\r\n * Runs CSS transition.\r\n */\r\nclass CSSAnimation {\r\n /**\r\n * onComplete can be unpredictable, be careful about current state\r\n *\r\n * @param {AnimationProps} props\r\n */\r\n constructor(props) {\r\n this.props = props;\r\n const {\r\n target,\r\n onComplete,\r\n transform,\r\n onFinish\r\n // opacity\r\n } = props;\r\n\r\n let {\r\n duration,\r\n easing,\r\n } = props;\r\n\r\n /** @type {() => void} */\r\n this.onFinish = onFinish;\r\n\r\n // support only transform and opacity\r\n const prop = transform ? 'transform' : 'opacity';\r\n const propValue = props[prop];\r\n\r\n /** @private */\r\n this._target = target;\r\n /** @private */\r\n this._onComplete = onComplete;\r\n\r\n duration = duration || 333;\r\n easing = easing || DEFAULT_EASING;\r\n\r\n /** @private */\r\n this._onTransitionEnd = this._onTransitionEnd.bind(this);\r\n\r\n // Using timeout hack to make sure that animation\r\n // starts even if the animated property was changed recently,\r\n // otherwise transitionend might not fire or transiton won't start.\r\n // https://drafts.csswg.org/css-transitions/#starting\r\n //\r\n // ¯\\_(ツ)_/¯\r\n /** @private */\r\n this._helperTimeout = setTimeout(() => {\r\n setTransitionStyle(target, prop, duration, easing);\r\n this._helperTimeout = setTimeout(() => {\r\n target.addEventListener('transitionend', this._onTransitionEnd, false);\r\n target.addEventListener('transitioncancel', this._onTransitionEnd, false);\r\n\r\n // Safari occasionally does not emit transitionend event\r\n // if element propery was modified during the transition,\r\n // which may be caused by resize or third party component,\r\n // using timeout as a safety fallback\r\n this._helperTimeout = setTimeout(() => {\r\n this._finalizeAnimation();\r\n }, duration + 500);\r\n target.style[prop] = propValue;\r\n }, 30); // Do not reduce this number\r\n }, 0);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {TransitionEvent} e\r\n */\r\n _onTransitionEnd(e) {\r\n if (e.target === this._target) {\r\n this._finalizeAnimation();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _finalizeAnimation() {\r\n if (!this._finished) {\r\n this._finished = true;\r\n this.onFinish();\r\n if (this._onComplete) {\r\n this._onComplete();\r\n }\r\n }\r\n }\r\n\r\n // Destroy is called automatically onFinish\r\n destroy() {\r\n if (this._helperTimeout) {\r\n clearTimeout(this._helperTimeout);\r\n }\r\n removeTransitionStyle(this._target);\r\n this._target.removeEventListener('transitionend', this._onTransitionEnd, false);\r\n this._target.removeEventListener('transitioncancel', this._onTransitionEnd, false);\r\n if (!this._finished) {\r\n this._finalizeAnimation();\r\n }\r\n }\r\n}\n\nconst DEFAULT_NATURAL_FREQUENCY = 12;\r\nconst DEFAULT_DAMPING_RATIO = 0.75;\r\n\r\n/**\r\n * Spring easing helper\r\n */\r\nclass SpringEaser {\r\n /**\r\n * @param {number} initialVelocity Initial velocity, px per ms.\r\n *\r\n * @param {number} dampingRatio\r\n * Determines how bouncy animation will be.\r\n * From 0 to 1, 0 - always overshoot, 1 - do not overshoot.\r\n * \"overshoot\" refers to part of animation that\r\n * goes beyond the final value.\r\n *\r\n * @param {number} naturalFrequency\r\n * Determines how fast animation will slow down.\r\n * The higher value - the stiffer the transition will be,\r\n * and the faster it will slow down.\r\n * Recommended value from 10 to 50\r\n */\r\n constructor(initialVelocity, dampingRatio, naturalFrequency) {\r\n this.velocity = initialVelocity * 1000; // convert to \"pixels per second\"\r\n\r\n // https://en.wikipedia.org/wiki/Damping_ratio\r\n this._dampingRatio = dampingRatio || DEFAULT_DAMPING_RATIO;\r\n\r\n // https://en.wikipedia.org/wiki/Natural_frequency\r\n this._naturalFrequency = naturalFrequency || DEFAULT_NATURAL_FREQUENCY;\r\n\r\n if (this._dampingRatio < 1) {\r\n this._dampedFrequency = this._naturalFrequency\r\n * Math.sqrt(1 - this._dampingRatio * this._dampingRatio);\r\n }\r\n }\r\n\r\n /**\r\n * @param {number} deltaPosition Difference between current and end position of the animation\r\n * @param {number} deltaTime Frame duration in milliseconds\r\n *\r\n * @returns {number} Displacement, relative to the end position.\r\n */\r\n easeFrame(deltaPosition, deltaTime) {\r\n // Inspired by Apple Webkit and Android spring function implementation\r\n // https://en.wikipedia.org/wiki/Oscillation\r\n // https://en.wikipedia.org/wiki/Damping_ratio\r\n // we ignore mass (assume that it's 1kg)\r\n\r\n let displacement = 0;\r\n let coeff;\r\n\r\n deltaTime /= 1000;\r\n\r\n const naturalDumpingPow = Math.E ** (-this._dampingRatio * this._naturalFrequency * deltaTime);\r\n\r\n if (this._dampingRatio === 1) {\r\n coeff = this.velocity + this._naturalFrequency * deltaPosition;\r\n\r\n displacement = (deltaPosition + coeff * deltaTime) * naturalDumpingPow;\r\n\r\n this.velocity = displacement\r\n * (-this._naturalFrequency) + coeff\r\n * naturalDumpingPow;\r\n } else if (this._dampingRatio < 1) {\r\n coeff = (1 / this._dampedFrequency)\r\n * (this._dampingRatio * this._naturalFrequency * deltaPosition + this.velocity);\r\n\r\n const dumpedFCos = Math.cos(this._dampedFrequency * deltaTime);\r\n const dumpedFSin = Math.sin(this._dampedFrequency * deltaTime);\r\n\r\n displacement = naturalDumpingPow\r\n * (deltaPosition * dumpedFCos + coeff * dumpedFSin);\r\n\r\n this.velocity = displacement\r\n * (-this._naturalFrequency)\r\n * this._dampingRatio\r\n + naturalDumpingPow\r\n * (-this._dampedFrequency * deltaPosition * dumpedFSin\r\n + this._dampedFrequency * coeff * dumpedFCos);\r\n }\r\n\r\n // Overdamped (>1) damping ratio is not supported\r\n\r\n return displacement;\r\n }\r\n}\n\n/** @typedef {import('./animations.js').AnimationProps} AnimationProps */\r\n\r\nclass SpringAnimation {\r\n /**\r\n * @param {AnimationProps} props\r\n */\r\n constructor(props) {\r\n this.props = props;\r\n\r\n const {\r\n start,\r\n end,\r\n velocity,\r\n onUpdate,\r\n onComplete,\r\n onFinish,\r\n dampingRatio,\r\n naturalFrequency\r\n } = props;\r\n\r\n /** @type {() => void} */\r\n this.onFinish = onFinish;\r\n\r\n const easer = new SpringEaser(velocity, dampingRatio, naturalFrequency);\r\n let prevTime = Date.now();\r\n let deltaPosition = start - end;\r\n\r\n const animationLoop = () => {\r\n if (this._raf) {\r\n deltaPosition = easer.easeFrame(deltaPosition, Date.now() - prevTime);\r\n\r\n // Stop the animation if velocity is low and position is close to end\r\n if (Math.abs(deltaPosition) < 1 && Math.abs(easer.velocity) < 50) {\r\n // Finalize the animation\r\n onUpdate(end);\r\n if (onComplete) {\r\n onComplete();\r\n }\r\n this.onFinish();\r\n } else {\r\n prevTime = Date.now();\r\n onUpdate(deltaPosition + end);\r\n this._raf = requestAnimationFrame(animationLoop);\r\n }\r\n }\r\n };\r\n\r\n this._raf = requestAnimationFrame(animationLoop);\r\n }\r\n\r\n // Destroy is called automatically onFinish\r\n destroy() {\r\n if (this._raf >= 0) {\r\n cancelAnimationFrame(this._raf);\r\n }\r\n this._raf = null;\r\n }\r\n}\n\n/** @typedef {SpringAnimation | CSSAnimation} Animation */\r\n\r\n/**\r\n * @typedef {Object} AnimationProps\r\n *\r\n * @prop {HTMLElement=} target\r\n *\r\n * @prop {string=} name\r\n *\r\n * @prop {number=} start\r\n * @prop {number=} end\r\n * @prop {number=} duration\r\n * @prop {number=} velocity\r\n * @prop {number=} dampingRatio\r\n * @prop {number=} naturalFrequency\r\n *\r\n * @prop {(end: number) => void} [onUpdate]\r\n * @prop {() => void} [onComplete]\r\n * @prop {() => void} [onFinish]\r\n *\r\n * @prop {string=} transform\r\n * @prop {string=} opacity\r\n * @prop {string=} easing\r\n *\r\n * @prop {boolean=} isPan\r\n * @prop {boolean=} isMainScroll\r\n */\r\n\r\n/**\r\n * Manages animations\r\n */\r\nclass Animations {\r\n constructor() {\r\n /** @type {Animation[]} */\r\n this.activeAnimations = [];\r\n }\r\n\r\n /**\r\n * @param {AnimationProps} props\r\n */\r\n startSpring(props) {\r\n this._start(props, true);\r\n }\r\n\r\n /**\r\n * @param {AnimationProps} props\r\n */\r\n startTransition(props) {\r\n this._start(props);\r\n }\r\n\r\n /**\r\n * @param {AnimationProps} props\r\n * @param {boolean=} isSpring\r\n */\r\n _start(props, isSpring) {\r\n /** @type {Animation} */\r\n let animation;\r\n if (isSpring) {\r\n animation = new SpringAnimation(props);\r\n } else {\r\n animation = new CSSAnimation(props);\r\n }\r\n\r\n this.activeAnimations.push(animation);\r\n animation.onFinish = () => this.stop(animation);\r\n\r\n return animation;\r\n }\r\n\r\n /**\r\n * @param {Animation} animation\r\n */\r\n stop(animation) {\r\n animation.destroy();\r\n const index = this.activeAnimations.indexOf(animation);\r\n if (index > -1) {\r\n this.activeAnimations.splice(index, 1);\r\n }\r\n }\r\n\r\n stopAll() { // _stopAllAnimations\r\n this.activeAnimations.forEach((animation) => {\r\n animation.destroy();\r\n });\r\n this.activeAnimations = [];\r\n }\r\n\r\n /**\r\n * Stop all pan or zoom transitions\r\n */\r\n stopAllPan() {\r\n this.activeAnimations = this.activeAnimations.filter((animation) => {\r\n if (animation.props.isPan) {\r\n animation.destroy();\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n }\r\n\r\n stopMainScroll() {\r\n this.activeAnimations = this.activeAnimations.filter((animation) => {\r\n if (animation.props.isMainScroll) {\r\n animation.destroy();\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n }\r\n\r\n /**\r\n * Returns true if main scroll transition is running\r\n */\r\n // isMainScrollRunning() {\r\n // return this.activeAnimations.some((animation) => {\r\n // return animation.props.isMainScroll;\r\n // });\r\n // }\r\n\r\n /**\r\n * Returns true if any pan or zoom transition is running\r\n */\r\n isPanRunning() {\r\n return this.activeAnimations.some((animation) => {\r\n return animation.props.isPan;\r\n });\r\n }\r\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * Handles scroll wheel.\r\n * Can pan and zoom current slide image.\r\n */\r\nclass ScrollWheel {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n pswp.events.add(pswp.element, 'wheel', this._onWheel.bind(this));\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {WheelEvent} e\r\n */\r\n _onWheel(e) {\r\n e.preventDefault();\r\n const { currSlide } = this.pswp;\r\n let { deltaX, deltaY } = e;\r\n\r\n if (!currSlide) {\r\n return;\r\n }\r\n\r\n if (this.pswp.dispatch('wheel', { originalEvent: e }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (e.ctrlKey || this.pswp.options.wheelToZoom) {\r\n // zoom\r\n if (currSlide.isZoomable()) {\r\n let zoomFactor = -deltaY;\r\n if (e.deltaMode === 1 /* DOM_DELTA_LINE */) {\r\n zoomFactor *= 0.05;\r\n } else {\r\n zoomFactor *= e.deltaMode ? 1 : 0.002;\r\n }\r\n zoomFactor = 2 ** zoomFactor;\r\n\r\n const destZoomLevel = currSlide.currZoomLevel * zoomFactor;\r\n currSlide.zoomTo(destZoomLevel, {\r\n x: e.clientX,\r\n y: e.clientY\r\n });\r\n }\r\n } else {\r\n // pan\r\n if (currSlide.isPannable()) {\r\n if (e.deltaMode === 1 /* DOM_DELTA_LINE */) {\r\n // 18 - average line height\r\n deltaX *= 18;\r\n deltaY *= 18;\r\n }\r\n\r\n currSlide.panTo(\r\n currSlide.pan.x - deltaX,\r\n currSlide.pan.y - deltaY\r\n );\r\n }\r\n }\r\n }\r\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Methods} Methods\r\n */\r\n\r\n/**\r\n * @typedef {Object} UIElementMarkupProps\r\n * @prop {boolean=} isCustomSVG\r\n * @prop {string} inner\r\n * @prop {string=} outlineID\r\n * @prop {number | string} [size]\r\n */\r\n\r\n/**\r\n * @typedef {Object} UIElementData\r\n * @prop {DefaultUIElements | string} [name]\r\n * @prop {string=} className\r\n * @prop {UIElementMarkup=} html\r\n * @prop {boolean=} isButton\r\n * @prop {keyof HTMLElementTagNameMap} [tagName]\r\n * @prop {string=} title\r\n * @prop {string=} ariaLabel\r\n * @prop {(element: HTMLElement, pswp: PhotoSwipe) => void} [onInit]\r\n * @prop {Methods | ((e: MouseEvent, element: HTMLElement, pswp: PhotoSwipe) => void)} [onClick]\r\n * @prop {'bar' | 'wrapper' | 'root'} [appendTo]\r\n * @prop {number=} order\r\n */\r\n\r\n/** @typedef {'arrowPrev' | 'arrowNext' | 'close' | 'zoom' | 'counter'} DefaultUIElements */\r\n\r\n/** @typedef {string | UIElementMarkupProps} UIElementMarkup */\r\n\r\n/**\r\n * @param {UIElementMarkup} [htmlData]\r\n */\r\nfunction addElementHTML(htmlData) {\r\n if (typeof htmlData === 'string') {\r\n // Allow developers to provide full svg,\r\n // For example:\r\n // \r\n // \r\n // \r\n // \r\n // Can also be any HTML string.\r\n return htmlData;\r\n }\r\n\r\n if (!htmlData || !htmlData.isCustomSVG) {\r\n return '';\r\n }\r\n\r\n const svgData = htmlData;\r\n let out = '';\r\n // replace all %d with size\r\n out = out.split('%d').join(/** @type {string} */ (svgData.size || 32));\r\n\r\n // Icons may contain outline/shadow,\r\n // to make it we \"clone\" base icon shape and add border to it.\r\n // Icon itself and border are styled via CSS.\r\n //\r\n // Property shadowID defines ID of element that should be cloned.\r\n if (svgData.outlineID) {\r\n out += '';\r\n }\r\n\r\n out += svgData.inner;\r\n\r\n out += '';\r\n\r\n return out;\r\n}\r\n\r\nclass UIElement {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n * @param {UIElementData} data\r\n */\r\n constructor(pswp, data) {\r\n const name = data.name || data.className;\r\n let elementHTML = data.html;\r\n\r\n // @ts-expect-error lookup only by `data.name` maybe?\r\n if (pswp.options[name] === false) {\r\n // exit if element is disabled from options\r\n return;\r\n }\r\n\r\n // Allow to override SVG icons from options\r\n // @ts-expect-error lookup only by `data.name` maybe?\r\n if (typeof pswp.options[name + 'SVG'] === 'string') {\r\n // arrowPrevSVG\r\n // arrowNextSVG\r\n // closeSVG\r\n // zoomSVG\r\n // @ts-expect-error lookup only by `data.name` maybe?\r\n elementHTML = pswp.options[name + 'SVG'];\r\n }\r\n\r\n pswp.dispatch('uiElementCreate', { data });\r\n\r\n let className = '';\r\n if (data.isButton) {\r\n className += 'pswp__button ';\r\n className += (data.className || `pswp__button--${data.name}`);\r\n } else {\r\n className += (data.className || `pswp__${data.name}`);\r\n }\r\n\r\n /** @type {HTMLElement} */\r\n let element;\r\n let tagName = data.isButton ? (data.tagName || 'button') : (data.tagName || 'div');\r\n tagName = /** @type {keyof HTMLElementTagNameMap} */ (tagName.toLowerCase());\r\n element = createElement(className, tagName);\r\n\r\n if (data.isButton) {\r\n // create button element\r\n element = createElement(className, tagName);\r\n if (tagName === 'button') {\r\n /** @type {HTMLButtonElement} */ (element).type = 'button';\r\n }\r\n\r\n let { title } = data;\r\n const { ariaLabel } = data;\r\n\r\n // @ts-expect-error lookup only by `data.name` maybe?\r\n if (typeof pswp.options[name + 'Title'] === 'string') {\r\n // @ts-expect-error lookup only by `data.name` maybe?\r\n title = pswp.options[name + 'Title'];\r\n }\r\n\r\n if (title) {\r\n element.title = title;\r\n }\r\n\r\n if (ariaLabel || title) {\r\n /** @type {HTMLElement} */ (element).setAttribute('aria-label', ariaLabel || title);\r\n }\r\n }\r\n\r\n element.innerHTML = addElementHTML(elementHTML);\r\n\r\n if (data.onInit) {\r\n data.onInit(element, pswp);\r\n }\r\n\r\n if (data.onClick) {\r\n element.onclick = (e) => {\r\n if (typeof data.onClick === 'string') {\r\n pswp[data.onClick]();\r\n } else {\r\n data.onClick(e, element, pswp);\r\n }\r\n };\r\n }\r\n\r\n // Top bar is default position\r\n const appendTo = data.appendTo || 'bar';\r\n let container;\r\n if (appendTo === 'bar') {\r\n if (!pswp.topBar) {\r\n pswp.topBar = createElement('pswp__top-bar pswp__hide-on-close', 'div', pswp.scrollWrap);\r\n }\r\n container = pswp.topBar;\r\n } else {\r\n // element outside of top bar gets a secondary class\r\n // that makes element fade out on close\r\n element.classList.add('pswp__hide-on-close');\r\n\r\n if (appendTo === 'wrapper') {\r\n container = pswp.scrollWrap;\r\n } else {\r\n // root element\r\n container = pswp.element;\r\n }\r\n }\r\n\r\n container.appendChild(pswp.applyFilters('uiElement', element, data));\r\n }\r\n}\n\n/*\r\n Backward and forward arrow buttons\r\n */\r\n\r\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n *\r\n * @param {HTMLElement} element\r\n * @param {PhotoSwipe} pswp\r\n * @param {boolean=} isNextButton\r\n */\r\nfunction initArrowButton(element, pswp, isNextButton) {\r\n element.classList.add('pswp__button--arrow');\r\n // TODO: this should point to a unique id for this instance\r\n element.setAttribute('aria-controls', 'pswp__items');\r\n pswp.on('change', () => {\r\n if (!pswp.options.loop) {\r\n if (isNextButton) {\r\n /** @type {HTMLButtonElement} */\r\n (element).disabled = !(pswp.currIndex < pswp.getNumItems() - 1);\r\n } else {\r\n /** @type {HTMLButtonElement} */\r\n (element).disabled = !(pswp.currIndex > 0);\r\n }\r\n }\r\n });\r\n}\r\n\r\n/** @type {UIElementData} */\r\nconst arrowPrev = {\r\n name: 'arrowPrev',\r\n className: 'pswp__button--arrow--prev',\r\n title: 'Previous',\r\n order: 10,\r\n isButton: true,\r\n appendTo: 'wrapper',\r\n html: {\r\n isCustomSVG: true,\r\n size: 60,\r\n inner: '',\r\n outlineID: 'pswp__icn-arrow'\r\n },\r\n onClick: 'prev',\r\n onInit: initArrowButton\r\n};\r\n\r\n/** @type {UIElementData} */\r\nconst arrowNext = {\r\n name: 'arrowNext',\r\n className: 'pswp__button--arrow--next',\r\n title: 'Next',\r\n order: 11,\r\n isButton: true,\r\n appendTo: 'wrapper',\r\n html: {\r\n isCustomSVG: true,\r\n size: 60,\r\n inner: '',\r\n outlineID: 'pswp__icn-arrow'\r\n },\r\n onClick: 'next',\r\n onInit: (el, pswp) => {\r\n initArrowButton(el, pswp, true);\r\n }\r\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nconst closeButton = {\r\n name: 'close',\r\n title: 'Close',\r\n order: 20,\r\n isButton: true,\r\n html: {\r\n isCustomSVG: true,\r\n inner: '',\r\n outlineID: 'pswp__icn-close'\r\n },\r\n onClick: 'close'\r\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nconst zoomButton = {\r\n name: 'zoom',\r\n title: 'Zoom',\r\n order: 10,\r\n isButton: true,\r\n html: {\r\n isCustomSVG: true,\r\n // eslint-disable-next-line max-len\r\n inner: ''\r\n + ''\r\n + '',\r\n outlineID: 'pswp__icn-zoom'\r\n },\r\n onClick: 'toggleZoom'\r\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nconst loadingIndicator = {\r\n name: 'preloader',\r\n appendTo: 'bar',\r\n order: 7,\r\n html: {\r\n isCustomSVG: true,\r\n // eslint-disable-next-line max-len\r\n inner: '',\r\n outlineID: 'pswp__icn-loading'\r\n },\r\n onInit: (indicatorElement, pswp) => {\r\n /** @type {boolean} */\r\n let isVisible;\r\n /** @type {NodeJS.Timeout} */\r\n let delayTimeout;\r\n\r\n /**\r\n * @param {string} className\r\n * @param {boolean} add\r\n */\r\n const toggleIndicatorClass = (className, add) => {\r\n indicatorElement.classList[add ? 'add' : 'remove']('pswp__preloader--' + className);\r\n };\r\n\r\n /**\r\n * @param {boolean} visible\r\n */\r\n const setIndicatorVisibility = (visible) => {\r\n if (isVisible !== visible) {\r\n isVisible = visible;\r\n toggleIndicatorClass('active', visible);\r\n }\r\n };\r\n\r\n const updatePreloaderVisibility = () => {\r\n if (!pswp.currSlide.content.isLoading()) {\r\n setIndicatorVisibility(false);\r\n if (delayTimeout) {\r\n clearTimeout(delayTimeout);\r\n delayTimeout = null;\r\n }\r\n return;\r\n }\r\n\r\n if (!delayTimeout) {\r\n // display loading indicator with delay\r\n delayTimeout = setTimeout(() => {\r\n setIndicatorVisibility(pswp.currSlide.content.isLoading());\r\n delayTimeout = null;\r\n }, pswp.options.preloaderDelay);\r\n }\r\n };\r\n\r\n pswp.on('change', updatePreloaderVisibility);\r\n\r\n pswp.on('loadComplete', (e) => {\r\n if (pswp.currSlide === e.slide) {\r\n updatePreloaderVisibility();\r\n }\r\n });\r\n\r\n // expose the method\r\n pswp.ui.updatePreloaderVisibility = updatePreloaderVisibility;\r\n }\r\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nconst counterIndicator = {\r\n name: 'counter',\r\n order: 5,\r\n onInit: (counterElement, pswp) => {\r\n pswp.on('change', () => {\r\n counterElement.innerText = (pswp.currIndex + 1)\r\n + pswp.options.indexIndicatorSep\r\n + pswp.getNumItems();\r\n });\r\n }\r\n};\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\r\n\r\n/**\r\n * Set special class on element when image is zoomed.\r\n *\r\n * By default it is used to adjust\r\n * zoom icon and zoom cursor via CSS.\r\n *\r\n * @param {HTMLElement} el\r\n * @param {boolean} isZoomedIn\r\n */\r\nfunction setZoomedIn(el, isZoomedIn) {\r\n el.classList[isZoomedIn ? 'add' : 'remove']('pswp--zoomed-in');\r\n}\r\n\r\nclass UI {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n\r\n /** @type {() => void} */\r\n this.updatePreloaderVisibility = undefined;\r\n\r\n /** @type {number} */\r\n this._lastUpdatedZoomLevel = undefined;\r\n }\r\n\r\n init() {\r\n const { pswp } = this;\r\n this.isRegistered = false;\r\n /** @type {UIElementData[]} */\r\n this.uiElementsData = [\r\n closeButton,\r\n arrowPrev,\r\n arrowNext,\r\n zoomButton,\r\n loadingIndicator,\r\n counterIndicator\r\n ];\r\n\r\n pswp.dispatch('uiRegister');\r\n\r\n // sort by order\r\n this.uiElementsData.sort((a, b) => {\r\n // default order is 0\r\n return (a.order || 0) - (b.order || 0);\r\n });\r\n\r\n /** @type {(UIElement | UIElementData)[]} */\r\n this.items = [];\r\n\r\n this.isRegistered = true;\r\n this.uiElementsData.forEach((uiElementData) => {\r\n this.registerElement(uiElementData);\r\n });\r\n\r\n pswp.on('change', () => {\r\n pswp.element.classList[pswp.getNumItems() === 1 ? 'add' : 'remove']('pswp--one-slide');\r\n });\r\n\r\n pswp.on('zoomPanUpdate', () => this._onZoomPanUpdate());\r\n }\r\n\r\n /**\r\n * @param {UIElementData} elementData\r\n */\r\n registerElement(elementData) {\r\n if (this.isRegistered) {\r\n this.items.push(\r\n new UIElement(this.pswp, elementData)\r\n );\r\n } else {\r\n this.uiElementsData.push(elementData);\r\n }\r\n }\r\n\r\n /**\r\n * Fired each time zoom or pan position is changed.\r\n * Update classes that control visibility of zoom button and cursor icon.\r\n */\r\n _onZoomPanUpdate() {\r\n const { template, currSlide, options } = this.pswp;\r\n let { currZoomLevel } = currSlide;\r\n\r\n if (this.pswp.opener.isClosing) {\r\n return;\r\n }\r\n\r\n // if not open yet - check against initial zoom level\r\n if (!this.pswp.opener.isOpen) {\r\n currZoomLevel = currSlide.zoomLevels.initial;\r\n }\r\n\r\n if (currZoomLevel === this._lastUpdatedZoomLevel) {\r\n return;\r\n }\r\n this._lastUpdatedZoomLevel = currZoomLevel;\r\n\r\n const currZoomLevelDiff = currSlide.zoomLevels.initial - currSlide.zoomLevels.secondary;\r\n\r\n // Initial and secondary zoom levels are almost equal\r\n if (Math.abs(currZoomLevelDiff) < 0.01 || !currSlide.isZoomable()) {\r\n // disable zoom\r\n setZoomedIn(template, false);\r\n template.classList.remove('pswp--zoom-allowed');\r\n return;\r\n }\r\n\r\n template.classList.add('pswp--zoom-allowed');\r\n\r\n const potentialZoomLevel = currZoomLevel === currSlide.zoomLevels.initial\r\n ? currSlide.zoomLevels.secondary : currSlide.zoomLevels.initial;\r\n\r\n setZoomedIn(template, potentialZoomLevel <= currZoomLevel);\r\n\r\n if (options.imageClickAction === 'zoom'\r\n || options.imageClickAction === 'zoom-or-close') {\r\n template.classList.add('pswp--click-to-zoom');\r\n }\r\n }\r\n}\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/** @typedef {{ x: number; y: number; w: number; innerRect?: { w: number; h: number; x: number; y: number } }} Bounds */\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n */\r\nfunction getBoundsByElement(el) {\r\n const thumbAreaRect = el.getBoundingClientRect();\r\n return {\r\n x: thumbAreaRect.left,\r\n y: thumbAreaRect.top,\r\n w: thumbAreaRect.width\r\n };\r\n}\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n * @param {number} imageWidth\r\n * @param {number} imageHeight\r\n */\r\nfunction getCroppedBoundsByElement(el, imageWidth, imageHeight) {\r\n const thumbAreaRect = el.getBoundingClientRect();\r\n\r\n // fill image into the area\r\n // (do they same as object-fit:cover does to retrieve coordinates)\r\n const hRatio = thumbAreaRect.width / imageWidth;\r\n const vRatio = thumbAreaRect.height / imageHeight;\r\n const fillZoomLevel = hRatio > vRatio ? hRatio : vRatio;\r\n\r\n const offsetX = (thumbAreaRect.width - imageWidth * fillZoomLevel) / 2;\r\n const offsetY = (thumbAreaRect.height - imageHeight * fillZoomLevel) / 2;\r\n\r\n /**\r\n * Coordinates of the image,\r\n * as if it was not cropped,\r\n * height is calculated automatically\r\n *\r\n * @type {Bounds}\r\n */\r\n const bounds = {\r\n x: thumbAreaRect.left + offsetX,\r\n y: thumbAreaRect.top + offsetY,\r\n w: imageWidth * fillZoomLevel\r\n };\r\n\r\n // Coordinates of inner crop area\r\n // relative to the image\r\n bounds.innerRect = {\r\n w: thumbAreaRect.width,\r\n h: thumbAreaRect.height,\r\n x: offsetX,\r\n y: offsetY\r\n };\r\n\r\n return bounds;\r\n}\r\n\r\n/**\r\n * Get dimensions of thumbnail image\r\n * (click on which opens photoswipe or closes photoswipe to)\r\n *\r\n * @param {number} index\r\n * @param {SlideData} itemData\r\n * @param {PhotoSwipe} instance PhotoSwipe instance\r\n * @returns {Bounds | undefined}\r\n */\r\nfunction getThumbBounds(index, itemData, instance) {\r\n // legacy event, before filters were introduced\r\n const event = instance.dispatch('thumbBounds', {\r\n index,\r\n itemData,\r\n instance\r\n });\r\n // @ts-expect-error\r\n if (event.thumbBounds) {\r\n // @ts-expect-error\r\n return event.thumbBounds;\r\n }\r\n\r\n const { element } = itemData;\r\n let thumbBounds;\r\n /** @type {HTMLElement} */\r\n let thumbnail;\r\n\r\n if (element && instance.options.thumbSelector !== false) {\r\n const thumbSelector = instance.options.thumbSelector || 'img';\r\n thumbnail = element.matches(thumbSelector)\r\n ? element : element.querySelector(thumbSelector);\r\n }\r\n\r\n thumbnail = instance.applyFilters('thumbEl', thumbnail, itemData, index);\r\n\r\n if (thumbnail) {\r\n if (!itemData.thumbCropped) {\r\n thumbBounds = getBoundsByElement(thumbnail);\r\n } else {\r\n thumbBounds = getCroppedBoundsByElement(\r\n thumbnail,\r\n itemData.width || itemData.w,\r\n itemData.height || itemData.h\r\n );\r\n }\r\n }\r\n\r\n return instance.applyFilters('thumbBounds', thumbBounds, itemData, index);\r\n}\n\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\r\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('../slide/content.js').default} ContentDefault */\r\n/** @typedef {import('../slide/slide.js').default} Slide */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\r\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\r\n\r\n/**\r\n * Allow adding an arbitrary props to the Content\r\n * https://photoswipe.com/custom-content/#using-webp-image-format\r\n * @typedef {ContentDefault & Record} Content\r\n */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\r\n *\r\n *\r\n * https://photoswipe.com/adding-ui-elements/\r\n *\r\n * @prop {undefined} uiRegister\r\n * @prop {{ data: UIElementData }} uiElementCreate\r\n *\r\n *\r\n * https://photoswipe.com/events/#initialization-events\r\n *\r\n * @prop {undefined} beforeOpen\r\n * @prop {undefined} firstUpdate\r\n * @prop {undefined} initialLayout\r\n * @prop {undefined} change\r\n * @prop {undefined} afterInit\r\n * @prop {undefined} bindEvents\r\n *\r\n *\r\n * https://photoswipe.com/events/#opening-or-closing-transition-events\r\n *\r\n * @prop {undefined} openingAnimationStart\r\n * @prop {undefined} openingAnimationEnd\r\n * @prop {undefined} closingAnimationStart\r\n * @prop {undefined} closingAnimationEnd\r\n *\r\n *\r\n * https://photoswipe.com/events/#closing-events\r\n *\r\n * @prop {undefined} close\r\n * @prop {undefined} destroy\r\n *\r\n *\r\n * https://photoswipe.com/events/#pointer-and-gesture-events\r\n *\r\n * @prop {{ originalEvent: PointerEvent }} pointerDown\r\n * @prop {{ originalEvent: PointerEvent }} pointerMove\r\n * @prop {{ originalEvent: PointerEvent }} pointerUp\r\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\r\n * @prop {{ panY: number }} verticalDrag can be default prevented\r\n *\r\n *\r\n * https://photoswipe.com/events/#slide-content-events\r\n *\r\n * @prop {{ content: Content }} contentInit\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\r\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\r\n * @prop {{ content: Content; slide: Slide }} loadError\r\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\r\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\r\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\r\n * @prop {{ content: Content }} contentAppend can be default prevented\r\n * @prop {{ content: Content }} contentActivate can be default prevented\r\n * @prop {{ content: Content }} contentDeactivate can be default prevented\r\n * @prop {{ content: Content }} contentRemove can be default prevented\r\n * @prop {{ content: Content }} contentDestroy can be default prevented\r\n *\r\n *\r\n * undocumented\r\n *\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\r\n *\r\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\r\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\r\n * @prop {{ slide: Slide }} firstZoomPan\r\n * @prop {{ slide: Slide, data: SlideData, index: number }} gettingData\r\n * @prop {undefined} beforeResize\r\n * @prop {undefined} resize\r\n * @prop {undefined} viewportSize\r\n * @prop {undefined} updateScrollOffset\r\n * @prop {{ slide: Slide }} slideInit\r\n * @prop {{ slide: Slide }} afterSetContent\r\n * @prop {{ slide: Slide }} slideLoad\r\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\r\n * @prop {{ slide: Slide }} appendHeavyContent\r\n * @prop {{ slide: Slide }} slideActivate\r\n * @prop {{ slide: Slide }} slideDeactivate\r\n * @prop {{ slide: Slide }} slideDestroy\r\n * @prop {{ destZoomLevel: number, centerPoint: Point, transitionDuration: number | false }} beforeZoomTo\r\n * @prop {{ slide: Slide }} zoomPanUpdate\r\n * @prop {{ slide: Slide }} initialZoomPan\r\n * @prop {{ slide: Slide }} calcSlideSize\r\n * @prop {undefined} resolutionChanged\r\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\r\n * @prop {{ content: Content }} contentAppendImage can be default prevented\r\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\r\n * @prop {undefined} lazyLoad\r\n * @prop {{ slide: Slide }} calcBounds\r\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\r\n *\r\n *\r\n * legacy\r\n *\r\n * @prop {undefined} init\r\n * @prop {undefined} initialZoomIn\r\n * @prop {undefined} initialZoomOut\r\n * @prop {undefined} initialZoomInEnd\r\n * @prop {undefined} initialZoomOutEnd\r\n * @prop {{ dataSource: DataSource, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource) => number} numItems\r\n * Modify the total amount of slides. Example on Data sources page.\r\n * https://photoswipe.com/filters/#numitems\r\n *\r\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\r\n * Modify slide item data. Example on Data sources page.\r\n * https://photoswipe.com/filters/#itemdata\r\n *\r\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\r\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\r\n * https://photoswipe.com/filters/#domitemdata\r\n *\r\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\r\n * Modify clicked gallery item index.\r\n * https://photoswipe.com/filters/#clickedindex\r\n *\r\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\r\n * Modify placeholder image source.\r\n * https://photoswipe.com/filters/#placeholdersrc\r\n *\r\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\r\n * Modify if the content is currently loading.\r\n * https://photoswipe.com/filters/#iscontentloading\r\n *\r\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\r\n * Modify if the content can be zoomed.\r\n * https://photoswipe.com/filters/#iscontentzoomable\r\n *\r\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\r\n * Modify if the placeholder should be used for the content.\r\n * https://photoswipe.com/filters/#usecontentplaceholder\r\n *\r\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\r\n * Modify if the placeholder should be kept after the content is loaded.\r\n * https://photoswipe.com/filters/#iskeepingplaceholder\r\n *\r\n *\r\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\r\n * Modify an element when the content has error state (for example, if image cannot be loaded).\r\n * https://photoswipe.com/filters/#contenterrorelement\r\n *\r\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\r\n * Modify a UI element that's being created.\r\n * https://photoswipe.com/filters/#uielement\r\n *\r\n * @prop {(thumbnail: HTMLElement, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thubmnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the thubmnail bounds from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbbounds\r\n *\r\n * @prop {(srcsetSizesWidth: number, content: Content) => number} srcsetSizesWidth\r\n *\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent : PhotoSwipeEvent & PhotoSwipeEventsMap[T]} AugmentedEvent\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {(event: AugmentedEvent) => void} EventCallback\r\n */\r\n\r\n/**\r\n * Base PhotoSwipe event object\r\n *\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n */\r\nclass PhotoSwipeEvent {\r\n /**\r\n * @param {T} type\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n */\r\n constructor(type, details) {\r\n this.type = type;\r\n if (details) {\r\n Object.assign(this, details);\r\n }\r\n }\r\n\r\n preventDefault() {\r\n this.defaultPrevented = true;\r\n }\r\n}\r\n\r\n/**\r\n * PhotoSwipe base class that can listen and dispatch for events.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\r\n */\r\nclass Eventable {\r\n constructor() {\r\n /**\r\n * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent) => void)[] }}\r\n */\r\n this._listeners = {};\r\n\r\n /**\r\n * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter[] }}\r\n */\r\n this._filters = {};\r\n\r\n /** @type {PhotoSwipe=} */\r\n this.pswp = undefined;\r\n\r\n /** @type {PhotoSwipeOptions} */\r\n this.options = undefined;\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n * @param {number} priority\r\n */\r\n addFilter(name, fn, priority = 100) {\r\n if (!this._filters[name]) {\r\n this._filters[name] = [];\r\n }\r\n\r\n this._filters[name].push({ fn, priority });\r\n this._filters[name].sort((f1, f2) => f1.priority - f2.priority);\r\n\r\n if (this.pswp) {\r\n this.pswp.addFilter(name, fn, priority);\r\n }\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeFiltersMap[T]} fn\r\n */\r\n removeFilter(name, fn) {\r\n if (this._filters[name]) {\r\n // @ts-expect-error\r\n this._filters[name] = this._filters[name].filter(filter => (filter.fn !== fn));\r\n }\r\n\r\n if (this.pswp) {\r\n this.pswp.removeFilter(name, fn);\r\n }\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @param {T} name\r\n * @param {Parameters} args\r\n * @returns {Parameters[0]}\r\n */\r\n applyFilters(name, ...args) {\r\n if (this._filters[name]) {\r\n this._filters[name].forEach((filter) => {\r\n // @ts-expect-error\r\n args[0] = filter.fn.apply(this, args);\r\n });\r\n }\r\n return args[0];\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback} fn\r\n */\r\n on(name, fn) {\r\n if (!this._listeners[name]) {\r\n this._listeners[name] = [];\r\n }\r\n this._listeners[name].push(fn);\r\n\r\n // When binding events to lightbox,\r\n // also bind events to PhotoSwipe Core,\r\n // if it's open.\r\n if (this.pswp) {\r\n this.pswp.on(name, fn);\r\n }\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {EventCallback} fn\r\n */\r\n off(name, fn) {\r\n if (this._listeners[name]) {\r\n // @ts-expect-error\r\n this._listeners[name] = this._listeners[name].filter(listener => (fn !== listener));\r\n }\r\n\r\n if (this.pswp) {\r\n this.pswp.off(name, fn);\r\n }\r\n }\r\n\r\n /**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @param {T} name\r\n * @param {PhotoSwipeEventsMap[T]} [details]\r\n * @returns {AugmentedEvent}\r\n */\r\n dispatch(name, details) {\r\n if (this.pswp) {\r\n return this.pswp.dispatch(name, details);\r\n }\r\n\r\n const event = /** @type {AugmentedEvent} */ (new PhotoSwipeEvent(name, details));\r\n\r\n if (!this._listeners) {\r\n return event;\r\n }\r\n\r\n if (this._listeners[name]) {\r\n this._listeners[name].forEach((listener) => {\r\n listener.call(this, event);\r\n });\r\n }\r\n\r\n return event;\r\n }\r\n}\n\nclass Placeholder {\r\n /**\r\n * @param {string | false} imageSrc\r\n * @param {HTMLElement} container\r\n */\r\n constructor(imageSrc, container) {\r\n // Create placeholder\r\n // (stretched thumbnail or simple div behind the main image)\r\n this.element = createElement(\r\n 'pswp__img pswp__img--placeholder',\r\n imageSrc ? 'img' : '',\r\n container\r\n );\r\n\r\n if (imageSrc) {\r\n /** @type {HTMLImageElement} */\r\n (this.element).decoding = 'async';\r\n /** @type {HTMLImageElement} */\r\n (this.element).alt = '';\r\n /** @type {HTMLImageElement} */\r\n (this.element).src = imageSrc;\r\n this.element.setAttribute('role', 'presentation');\r\n }\r\n\r\n this.element.setAttribute('aria-hidden', 'true');\r\n }\r\n\r\n /**\r\n * @param {number} width\r\n * @param {number} height\r\n */\r\n setDisplayedSize(width, height) {\r\n if (!this.element) {\r\n return;\r\n }\r\n\r\n if (this.element.tagName === 'IMG') {\r\n // Use transform scale() to modify img placeholder size\r\n // (instead of changing width/height directly).\r\n // This helps with performance, specifically in iOS15 Safari.\r\n setWidthHeight(this.element, 250, 'auto');\r\n this.element.style.transformOrigin = '0 0';\r\n this.element.style.transform = toTransformString(0, 0, width / 250);\r\n } else {\r\n setWidthHeight(this.element, width, height);\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this.element.parentNode) {\r\n this.element.remove();\r\n }\r\n this.element = null;\r\n }\r\n}\n\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../util/util.js').LoadState} LoadState */\r\n\r\nclass Content {\r\n /**\r\n * @param {SlideData} itemData Slide data\r\n * @param {PhotoSwipe} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n */\r\n constructor(itemData, instance, index) {\r\n this.instance = instance;\r\n this.data = itemData;\r\n this.index = index;\r\n\r\n /** @type {HTMLImageElement | HTMLDivElement} */\r\n this.element = undefined;\r\n\r\n this.displayedImageWidth = 0;\r\n this.displayedImageHeight = 0;\r\n\r\n this.width = Number(this.data.w) || Number(this.data.width) || 0;\r\n this.height = Number(this.data.h) || Number(this.data.height) || 0;\r\n\r\n this.isAttached = false;\r\n this.hasSlide = false;\r\n /** @type {LoadState} */\r\n this.state = LOAD_STATE.IDLE;\r\n\r\n if (this.data.type) {\r\n this.type = this.data.type;\r\n } else if (this.data.src) {\r\n this.type = 'image';\r\n } else {\r\n this.type = 'html';\r\n }\r\n\r\n this.instance.dispatch('contentInit', { content: this });\r\n }\r\n\r\n removePlaceholder() {\r\n if (this.placeholder && !this.keepPlaceholder()) {\r\n // With delay, as image might be loaded, but not rendered\r\n setTimeout(() => {\r\n if (this.placeholder) {\r\n this.placeholder.destroy();\r\n this.placeholder = null;\r\n }\r\n }, 1000);\r\n }\r\n }\r\n\r\n /**\r\n * Preload content\r\n *\r\n * @param {boolean=} isLazy\r\n * @param {boolean=} reload\r\n */\r\n load(isLazy, reload) {\r\n if (this.slide && this.usePlaceholder()) {\r\n if (!this.placeholder) {\r\n const placeholderSrc = this.instance.applyFilters(\r\n 'placeholderSrc',\r\n // use image-based placeholder only for the first slide,\r\n // as rendering (even small stretched thumbnail) is an expensive operation\r\n (this.data.msrc && this.slide.isFirstSlide) ? this.data.msrc : false,\r\n this\r\n );\r\n this.placeholder = new Placeholder(\r\n placeholderSrc,\r\n this.slide.container\r\n );\r\n } else {\r\n const placeholderEl = this.placeholder.element;\r\n // Add placeholder to DOM if it was already created\r\n if (placeholderEl && !placeholderEl.parentElement) {\r\n this.slide.container.prepend(placeholderEl);\r\n }\r\n }\r\n }\r\n\r\n if (this.element && !reload) {\r\n return;\r\n }\r\n\r\n if (this.instance.dispatch('contentLoad', { content: this, isLazy }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.isImageContent()) {\r\n this.element = createElement('pswp__img', 'img');\r\n // Start loading only after width is defined, as sizes might depend on it.\r\n // Due to Safari feature, we must define sizes before srcset.\r\n if (this.displayedImageWidth) {\r\n this.loadImage(isLazy);\r\n }\r\n } else {\r\n this.element = createElement('pswp__content');\r\n this.element.innerHTML = this.data.html || '';\r\n }\r\n\r\n if (reload && this.slide) {\r\n this.slide.updateContentSize(true);\r\n }\r\n }\r\n\r\n /**\r\n * Preload image\r\n *\r\n * @param {boolean} isLazy\r\n */\r\n loadImage(isLazy) {\r\n const imageElement = /** @type HTMLImageElement */ (this.element);\r\n\r\n if (this.instance.dispatch('contentLoadImage', { content: this, isLazy }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n this.updateSrcsetSizes();\r\n\r\n if (this.data.srcset) {\r\n imageElement.srcset = this.data.srcset;\r\n }\r\n\r\n imageElement.src = this.data.src;\r\n\r\n imageElement.alt = this.data.alt || '';\r\n\r\n this.state = LOAD_STATE.LOADING;\r\n\r\n if (imageElement.complete) {\r\n this.onLoaded();\r\n } else {\r\n imageElement.onload = () => {\r\n this.onLoaded();\r\n };\r\n\r\n imageElement.onerror = () => {\r\n this.onError();\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Assign slide to content\r\n *\r\n * @param {Slide} slide\r\n */\r\n setSlide(slide) {\r\n this.slide = slide;\r\n this.hasSlide = true;\r\n this.instance = slide.pswp;\r\n\r\n // todo: do we need to unset slide?\r\n }\r\n\r\n /**\r\n * Content load success handler\r\n */\r\n onLoaded() {\r\n this.state = LOAD_STATE.LOADED;\r\n\r\n if (this.slide) {\r\n this.instance.dispatch('loadComplete', { slide: this.slide, content: this });\r\n\r\n // if content is reloaded\r\n if (this.slide.isActive\r\n && this.slide.heavyAppended\r\n && !this.element.parentNode) {\r\n this.append();\r\n this.slide.updateContentSize(true);\r\n }\r\n\r\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\r\n this.removePlaceholder();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Content load error handler\r\n */\r\n onError() {\r\n this.state = LOAD_STATE.ERROR;\r\n\r\n if (this.slide) {\r\n this.displayError();\r\n this.instance.dispatch('loadComplete', { slide: this.slide, isError: true, content: this });\r\n this.instance.dispatch('loadError', { slide: this.slide, content: this });\r\n }\r\n }\r\n\r\n /**\r\n * @returns {Boolean} If the content is currently loading\r\n */\r\n isLoading() {\r\n return this.instance.applyFilters(\r\n 'isContentLoading',\r\n this.state === LOAD_STATE.LOADING,\r\n this\r\n );\r\n }\r\n\r\n isError() {\r\n return this.state === LOAD_STATE.ERROR;\r\n }\r\n\r\n /**\r\n * @returns {boolean} If the content is image\r\n */\r\n isImageContent() {\r\n return this.type === 'image';\r\n }\r\n\r\n /**\r\n * Update content size\r\n *\r\n * @param {Number} width\r\n * @param {Number} height\r\n */\r\n setDisplayedSize(width, height) {\r\n if (!this.element) {\r\n return;\r\n }\r\n\r\n if (this.placeholder) {\r\n this.placeholder.setDisplayedSize(width, height);\r\n }\r\n\r\n // eslint-disable-next-line max-len\r\n if (this.instance.dispatch('contentResize', { content: this, width, height }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n setWidthHeight(this.element, width, height);\r\n\r\n if (this.isImageContent() && !this.isError()) {\r\n const isInitialSizeUpdate = (!this.displayedImageWidth && width);\r\n\r\n this.displayedImageWidth = width;\r\n this.displayedImageHeight = height;\r\n\r\n if (isInitialSizeUpdate) {\r\n this.loadImage(false);\r\n } else {\r\n this.updateSrcsetSizes();\r\n }\r\n\r\n if (this.slide) {\r\n // eslint-disable-next-line max-len\r\n this.instance.dispatch('imageSizeChange', { slide: this.slide, width, height, content: this });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @returns {boolean} If the content can be zoomed\r\n */\r\n isZoomable() {\r\n return this.instance.applyFilters(\r\n 'isContentZoomable',\r\n this.isImageContent() && (this.state !== LOAD_STATE.ERROR),\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * Update image srcset sizes attribute based on width and height\r\n */\r\n updateSrcsetSizes() {\r\n // Handle srcset sizes attribute.\r\n //\r\n // Never lower quality, if it was increased previously.\r\n // Chrome does this automatically, Firefox and Safari do not,\r\n // so we store largest used size in dataset.\r\n // Handle srcset sizes attribute.\r\n //\r\n // Never lower quality, if it was increased previously.\r\n // Chrome does this automatically, Firefox and Safari do not,\r\n // so we store largest used size in dataset.\r\n if (this.data.srcset) {\r\n const image = /** @type HTMLImageElement */ (this.element);\r\n const sizesWidth = this.instance.applyFilters(\r\n 'srcsetSizesWidth',\r\n this.displayedImageWidth,\r\n this\r\n );\r\n\r\n if (!image.dataset.largestUsedSize\r\n || sizesWidth > parseInt(image.dataset.largestUsedSize, 10)) {\r\n image.sizes = sizesWidth + 'px';\r\n image.dataset.largestUsedSize = String(sizesWidth);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @returns {boolean} If content should use a placeholder (from msrc by default)\r\n */\r\n usePlaceholder() {\r\n return this.instance.applyFilters(\r\n 'useContentPlaceholder',\r\n this.isImageContent(),\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * Preload content with lazy-loading param\r\n */\r\n lazyLoad() {\r\n if (this.instance.dispatch('contentLazyLoad', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n this.load(true);\r\n }\r\n\r\n /**\r\n * @returns {boolean} If placeholder should be kept after content is loaded\r\n */\r\n keepPlaceholder() {\r\n return this.instance.applyFilters(\r\n 'isKeepingPlaceholder',\r\n this.isLoading(),\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * Destroy the content\r\n */\r\n destroy() {\r\n this.hasSlide = false;\r\n this.slide = null;\r\n\r\n if (this.instance.dispatch('contentDestroy', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n this.remove();\r\n\r\n if (this.placeholder) {\r\n this.placeholder.destroy();\r\n this.placeholder = null;\r\n }\r\n\r\n if (this.isImageContent() && this.element) {\r\n this.element.onload = null;\r\n this.element.onerror = null;\r\n this.element = null;\r\n }\r\n }\r\n\r\n /**\r\n * Display error message\r\n */\r\n displayError() {\r\n if (this.slide) {\r\n /** @type {HTMLElement} */\r\n let errorMsgEl = createElement('pswp__error-msg');\r\n errorMsgEl.innerText = this.instance.options.errorMsg;\r\n errorMsgEl = this.instance.applyFilters(\r\n 'contentErrorElement',\r\n errorMsgEl,\r\n this\r\n );\r\n this.element = createElement('pswp__content pswp__error-msg-container');\r\n this.element.appendChild(errorMsgEl);\r\n this.slide.container.innerText = '';\r\n this.slide.container.appendChild(this.element);\r\n this.slide.updateContentSize(true);\r\n this.removePlaceholder();\r\n }\r\n }\r\n\r\n /**\r\n * Append the content\r\n */\r\n append() {\r\n if (this.isAttached) {\r\n return;\r\n }\r\n\r\n this.isAttached = true;\r\n\r\n if (this.state === LOAD_STATE.ERROR) {\r\n this.displayError();\r\n return;\r\n }\r\n\r\n if (this.instance.dispatch('contentAppend', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n const supportsDecode = ('decode' in this.element);\r\n\r\n if (this.isImageContent()) {\r\n // Use decode() on nearby slides\r\n //\r\n // Nearby slide images are in DOM and not hidden via display:none.\r\n // However, they are placed offscreen (to the left and right side).\r\n //\r\n // Some browsers do not composite the image until it's actually visible,\r\n // using decode() helps.\r\n //\r\n // You might ask \"why dont you just decode() and then append all images\",\r\n // that's because I want to show image before it's fully loaded,\r\n // as browser can render parts of image while it is loading.\r\n // We do not do this in Safari due to partial loading bug.\r\n if (supportsDecode && this.slide && (!this.slide.isActive || isSafari())) {\r\n this.isDecoding = true;\r\n // purposefully using finally instead of then,\r\n // as if srcset sizes changes dynamically - it may cause decode error\r\n /** @type {HTMLImageElement} */\r\n (this.element).decode().catch(() => {}).finally(() => {\r\n this.isDecoding = false;\r\n this.appendImage();\r\n });\r\n } else {\r\n this.appendImage();\r\n }\r\n } else if (this.element && !this.element.parentNode) {\r\n this.slide.container.appendChild(this.element);\r\n }\r\n }\r\n\r\n /**\r\n * Activate the slide,\r\n * active slide is generally the current one,\r\n * meaning the user can see it.\r\n */\r\n activate() {\r\n if (this.instance.dispatch('contentActivate', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.slide) {\r\n if (this.isImageContent() && this.isDecoding && !isSafari()) {\r\n // add image to slide when it becomes active,\r\n // even if it's not finished decoding\r\n this.appendImage();\r\n } else if (this.isError()) {\r\n this.load(false, true); // try to reload\r\n }\r\n\r\n if (this.slide.holderElement) {\r\n this.slide.holderElement.setAttribute('aria-hidden', 'false');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Deactivate the content\r\n */\r\n deactivate() {\r\n this.instance.dispatch('contentDeactivate', { content: this });\r\n if (this.slide && this.slide.holderElement) {\r\n this.slide.holderElement.setAttribute('aria-hidden', 'true');\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Remove the content from DOM\r\n */\r\n remove() {\r\n this.isAttached = false;\r\n\r\n if (this.instance.dispatch('contentRemove', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n if (this.element && this.element.parentNode) {\r\n this.element.remove();\r\n }\r\n\r\n if (this.placeholder && this.placeholder.element) {\r\n this.placeholder.element.remove();\r\n }\r\n }\r\n\r\n /**\r\n * Append the image content to slide container\r\n */\r\n appendImage() {\r\n if (!this.isAttached) {\r\n return;\r\n }\r\n\r\n if (this.instance.dispatch('contentAppendImage', { content: this }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n // ensure that element exists and is not already appended\r\n if (this.slide && this.element && !this.element.parentNode) {\r\n this.slide.container.appendChild(this.element);\r\n }\r\n\r\n if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\r\n this.removePlaceholder();\r\n }\r\n }\r\n}\n\n/** @typedef {import('./content.js').default} Content */\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n\r\nconst MIN_SLIDES_TO_CACHE = 5;\r\n\r\n/**\r\n * Lazy-load an image\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {PhotoSwipe | PhotoSwipeLightbox | PhotoSwipeBase} instance PhotoSwipe instance\r\n * @param {number} index\r\n * @returns Image that is being decoded or false.\r\n */\r\nfunction lazyLoadData(itemData, instance, index) {\r\n // src/slide/content/content.js\r\n const content = instance.createContentFromData(itemData, index);\r\n\r\n if (!content || !content.lazyLoad) {\r\n return;\r\n }\r\n\r\n const { options } = instance;\r\n\r\n // We need to know dimensions of the image to preload it,\r\n // as it might use srcset and we need to define sizes\r\n // @ts-expect-error should provide pswp instance?\r\n const viewportSize = instance.viewportSize || getViewportSize(options, instance);\r\n const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\r\n\r\n const zoomLevel = new ZoomLevel(options, itemData, -1);\r\n zoomLevel.update(content.width, content.height, panAreaSize);\r\n\r\n content.lazyLoad();\r\n content.setDisplayedSize(\r\n Math.ceil(content.width * zoomLevel.initial),\r\n Math.ceil(content.height * zoomLevel.initial)\r\n );\r\n\r\n return content;\r\n}\r\n\r\n\r\n/**\r\n * Lazy-loads specific slide.\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * By default it loads image based on viewport size and initial zoom level.\r\n *\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe | PhotoSwipeLightbox} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n */\r\nfunction lazyLoadSlide(index, instance) {\r\n const itemData = instance.getItemData(index);\r\n\r\n if (instance.dispatch('lazyLoadSlide', { index, itemData }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n return lazyLoadData(itemData, instance, index);\r\n}\r\n\r\n\r\nclass ContentLoader {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n // Total amount of cached images\r\n this.limit = Math.max(\r\n pswp.options.preload[0] + pswp.options.preload[1] + 1,\r\n MIN_SLIDES_TO_CACHE\r\n );\r\n /** @type {Content[]} */\r\n this._cachedItems = [];\r\n }\r\n\r\n /**\r\n * Lazy load nearby slides based on `preload` option.\r\n *\r\n * @param {number=} diff Difference between slide indexes that was changed recently, or 0.\r\n */\r\n updateLazy(diff) {\r\n const { pswp } = this;\r\n\r\n if (pswp.dispatch('lazyLoad').defaultPrevented) {\r\n return;\r\n }\r\n\r\n const { preload } = pswp.options;\r\n const isForward = diff === undefined ? true : (diff >= 0);\r\n let i;\r\n\r\n // preload[1] - num items to preload in forward direction\r\n for (i = 0; i <= preload[1]; i++) {\r\n this.loadSlideByIndex(pswp.currIndex + (isForward ? i : (-i)));\r\n }\r\n\r\n // preload[0] - num items to preload in backward direction\r\n for (i = 1; i <= preload[0]; i++) {\r\n this.loadSlideByIndex(pswp.currIndex + (isForward ? (-i) : i));\r\n }\r\n }\r\n\r\n /**\r\n * @param {number} index\r\n */\r\n loadSlideByIndex(index) {\r\n index = this.pswp.getLoopedIndex(index);\r\n // try to get cached content\r\n let content = this.getContentByIndex(index);\r\n if (!content) {\r\n // no cached content, so try to load from scratch:\r\n content = lazyLoadSlide(index, this.pswp);\r\n // if content can be loaded, add it to cache:\r\n if (content) {\r\n this.addToCache(content);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @param {Slide} slide\r\n */\r\n getContentBySlide(slide) {\r\n let content = this.getContentByIndex(slide.index);\r\n if (!content) {\r\n // create content if not found in cache\r\n content = this.pswp.createContentFromData(slide.data, slide.index);\r\n if (content) {\r\n this.addToCache(content);\r\n }\r\n }\r\n\r\n if (content) {\r\n // assign slide to content\r\n content.setSlide(slide);\r\n }\r\n return content;\r\n }\r\n\r\n /**\r\n * @param {Content} content\r\n */\r\n addToCache(content) {\r\n // move to the end of array\r\n this.removeByIndex(content.index);\r\n this._cachedItems.push(content);\r\n\r\n if (this._cachedItems.length > this.limit) {\r\n // Destroy the first content that's not attached\r\n const indexToRemove = this._cachedItems.findIndex((item) => {\r\n return !item.isAttached && !item.hasSlide;\r\n });\r\n if (indexToRemove !== -1) {\r\n const removedItem = this._cachedItems.splice(indexToRemove, 1)[0];\r\n removedItem.destroy();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Removes an image from cache, does not destroy() it, just removes.\r\n *\r\n * @param {number} index\r\n */\r\n removeByIndex(index) {\r\n const indexToRemove = this._cachedItems.findIndex(item => item.index === index);\r\n if (indexToRemove !== -1) {\r\n this._cachedItems.splice(indexToRemove, 1);\r\n }\r\n }\r\n\r\n /**\r\n * @param {number} index\r\n */\r\n getContentByIndex(index) {\r\n return this._cachedItems.find(content => content.index === index);\r\n }\r\n\r\n destroy() {\r\n this._cachedItems.forEach(content => content.destroy());\r\n this._cachedItems = null;\r\n }\r\n}\n\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\r\n/** @typedef {import(\"../photoswipe.js\").PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\r\n\r\n/**\r\n * PhotoSwipe base class that can retrieve data about every slide.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\r\n */\r\nclass PhotoSwipeBase extends Eventable {\r\n /**\r\n * Get total number of slides\r\n *\r\n * @returns {number}\r\n */\r\n getNumItems() {\r\n let numItems;\r\n const { dataSource } = this.options;\r\n if (!dataSource) {\r\n numItems = 0;\r\n } else if ('length' in dataSource) {\r\n // may be an array or just object with length property\r\n numItems = dataSource.length;\r\n } else if ('gallery' in dataSource) {\r\n // query DOM elements\r\n if (!dataSource.items) {\r\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n }\r\n\r\n if (dataSource.items) {\r\n numItems = dataSource.items.length;\r\n }\r\n }\r\n\r\n // legacy event, before filters were introduced\r\n const event = this.dispatch('numItems', {\r\n dataSource,\r\n numItems\r\n });\r\n return this.applyFilters('numItems', event.numItems, dataSource);\r\n }\r\n\r\n /**\r\n * @param {SlideData} slideData\r\n * @param {number} index\r\n */\r\n createContentFromData(slideData, index) {\r\n // @ts-expect-error\r\n return new Content(slideData, this, index);\r\n }\r\n\r\n /**\r\n * Get item data by index.\r\n *\r\n * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\r\n * For example, it may contain properties like\r\n * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\r\n *\r\n * @param {number} index\r\n */\r\n getItemData(index) {\r\n const { dataSource } = this.options;\r\n let dataSourceItem;\r\n if (Array.isArray(dataSource)) {\r\n // Datasource is an array of elements\r\n dataSourceItem = dataSource[index];\r\n } else if (dataSource && dataSource.gallery) {\r\n // dataSource has gallery property,\r\n // thus it was created by Lightbox, based on\r\n // gallery and children options\r\n\r\n // query DOM elements\r\n if (!dataSource.items) {\r\n dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n }\r\n\r\n dataSourceItem = dataSource.items[index];\r\n }\r\n\r\n let itemData = dataSourceItem;\r\n\r\n if (itemData instanceof Element) {\r\n itemData = this._domElementToItemData(itemData);\r\n }\r\n\r\n // Dispatching the itemData event,\r\n // it's a legacy verion before filters were introduced\r\n const event = this.dispatch('itemData', {\r\n itemData: itemData || {},\r\n index\r\n });\r\n\r\n return this.applyFilters('itemData', event.itemData, index);\r\n }\r\n\r\n /**\r\n * Get array of gallery DOM elements,\r\n * based on childSelector and gallery element.\r\n *\r\n * @param {HTMLElement} galleryElement\r\n */\r\n _getGalleryDOMElements(galleryElement) {\r\n if (this.options.children || this.options.childSelector) {\r\n return getElementsFromOption(\r\n this.options.children,\r\n this.options.childSelector,\r\n galleryElement\r\n ) || [];\r\n }\r\n\r\n return [galleryElement];\r\n }\r\n\r\n /**\r\n * Converts DOM element to item data object.\r\n *\r\n * @param {HTMLElement} element DOM element\r\n */\r\n // eslint-disable-next-line class-methods-use-this\r\n _domElementToItemData(element) {\r\n /** @type {SlideData} */\r\n const itemData = {\r\n element\r\n };\r\n\r\n // eslint-disable-next-line max-len\r\n const linkEl = /** @type {HTMLAnchorElement} */ (element.tagName === 'A' ? element : element.querySelector('a'));\r\n\r\n if (linkEl) {\r\n // src comes from data-pswp-src attribute,\r\n // if it's empty link href is used\r\n itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\r\n\r\n if (linkEl.dataset.pswpSrcset) {\r\n itemData.srcset = linkEl.dataset.pswpSrcset;\r\n }\r\n\r\n itemData.width = parseInt(linkEl.dataset.pswpWidth, 10);\r\n itemData.height = parseInt(linkEl.dataset.pswpHeight, 10);\r\n\r\n // support legacy w & h properties\r\n itemData.w = itemData.width;\r\n itemData.h = itemData.height;\r\n\r\n if (linkEl.dataset.pswpType) {\r\n itemData.type = linkEl.dataset.pswpType;\r\n }\r\n\r\n const thumbnailEl = element.querySelector('img');\r\n\r\n if (thumbnailEl) {\r\n // msrc is URL to placeholder image that's displayed before large image is loaded\r\n // by default it's displayed only for the first slide\r\n itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\r\n itemData.alt = thumbnailEl.getAttribute('alt');\r\n }\r\n\r\n if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\r\n itemData.thumbCropped = true;\r\n }\r\n }\r\n\r\n return this.applyFilters('domItemData', itemData, element, linkEl);\r\n }\r\n\r\n /**\r\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 Image that is being decoded or false.\r\n */\r\n lazyLoadData(itemData, index) {\r\n return lazyLoadData(itemData, this, index);\r\n }\r\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('./slide/get-thumb-bounds.js').Bounds} Bounds */\r\n/** @typedef {import('./util/animations.js').AnimationProps} AnimationProps */\r\n\r\n// some browsers do not paint\r\n// elements which opacity is set to 0,\r\n// since we need to pre-render elements for the animation -\r\n// we set it to the minimum amount\r\nconst MIN_OPACITY = 0.003;\r\n\r\n/**\r\n * Manages opening and closing transitions of the PhotoSwipe.\r\n *\r\n * It can perform zoom, fade or no transition.\r\n */\r\nclass Opener {\r\n /**\r\n * @param {PhotoSwipe} pswp\r\n */\r\n constructor(pswp) {\r\n this.pswp = pswp;\r\n this.isClosed = true;\r\n this._prepareOpen = this._prepareOpen.bind(this);\r\n\r\n /** @type {false | Bounds} */\r\n this._thumbBounds = undefined;\r\n\r\n // Override initial zoom and pan position\r\n pswp.on('firstZoomPan', this._prepareOpen);\r\n }\r\n\r\n open() {\r\n this._prepareOpen();\r\n this._start();\r\n }\r\n\r\n close() {\r\n if (this.isClosed || this.isClosing || this.isOpening) {\r\n // if we close during opening animation\r\n // for now do nothing,\r\n // browsers aren't good at changing the direction of the CSS transition\r\n return false;\r\n }\r\n\r\n const slide = this.pswp.currSlide;\r\n\r\n this.isOpen = false;\r\n this.isOpening = false;\r\n this.isClosing = true;\r\n this._duration = this.pswp.options.hideAnimationDuration;\r\n\r\n if (slide && slide.currZoomLevel * slide.width >= this.pswp.options.maxWidthToAnimate) {\r\n this._duration = 0;\r\n }\r\n\r\n this._applyStartProps();\r\n setTimeout(() => {\r\n this._start();\r\n }, this._croppedZoom ? 30 : 0);\r\n\r\n return true;\r\n }\r\n\r\n _prepareOpen() {\r\n this.pswp.off('firstZoomPan', this._prepareOpen);\r\n if (!this.isOpening) {\r\n const slide = this.pswp.currSlide;\r\n this.isOpening = true;\r\n this.isClosing = false;\r\n this._duration = this.pswp.options.showAnimationDuration;\r\n if (slide && slide.zoomLevels.initial * slide.width >= this.pswp.options.maxWidthToAnimate) {\r\n this._duration = 0;\r\n }\r\n this._applyStartProps();\r\n }\r\n }\r\n\r\n _applyStartProps() {\r\n const { pswp } = this;\r\n const slide = this.pswp.currSlide;\r\n const { options } = pswp;\r\n\r\n if (options.showHideAnimationType === 'fade') {\r\n options.showHideOpacity = true;\r\n this._thumbBounds = false;\r\n } else if (options.showHideAnimationType === 'none') {\r\n options.showHideOpacity = false;\r\n this._duration = 0;\r\n this._thumbBounds = false;\r\n } else if (this.isOpening && pswp._initialThumbBounds) {\r\n // Use initial bounds if defined\r\n this._thumbBounds = pswp._initialThumbBounds;\r\n } else {\r\n this._thumbBounds = this.pswp.getThumbBounds();\r\n }\r\n\r\n this._placeholder = slide.getPlaceholderElement();\r\n\r\n pswp.animations.stopAll();\r\n\r\n // Discard animations when duration is less than 50ms\r\n this._useAnimation = (this._duration > 50);\r\n this._animateZoom = Boolean(this._thumbBounds)\r\n && (slide.content && slide.content.usePlaceholder())\r\n && (!this.isClosing || !pswp.mainScroll.isShifted());\r\n if (!this._animateZoom) {\r\n this._animateRootOpacity = true;\r\n\r\n if (this.isOpening) {\r\n slide.zoomAndPanToInitial();\r\n slide.applyCurrentZoomPan();\r\n }\r\n } else {\r\n this._animateRootOpacity = options.showHideOpacity;\r\n }\r\n this._animateBgOpacity = !this._animateRootOpacity && this.pswp.options.bgOpacity > MIN_OPACITY;\r\n this._opacityElement = this._animateRootOpacity ? pswp.element : pswp.bg;\r\n\r\n if (!this._useAnimation) {\r\n this._duration = 0;\r\n this._animateZoom = false;\r\n this._animateBgOpacity = false;\r\n this._animateRootOpacity = true;\r\n if (this.isOpening) {\r\n pswp.element.style.opacity = String(MIN_OPACITY);\r\n pswp.applyBgOpacity(1);\r\n }\r\n return;\r\n }\r\n\r\n if (this._animateZoom && this._thumbBounds && this._thumbBounds.innerRect) {\r\n // Properties are used when animation from cropped thumbnail\r\n this._croppedZoom = true;\r\n this._cropContainer1 = this.pswp.container;\r\n this._cropContainer2 = this.pswp.currSlide.holderElement;\r\n\r\n pswp.container.style.overflow = 'hidden';\r\n pswp.container.style.width = pswp.viewportSize.x + 'px';\r\n } else {\r\n this._croppedZoom = false;\r\n }\r\n\r\n if (this.isOpening) {\r\n // Apply styles before opening transition\r\n if (this._animateRootOpacity) {\r\n pswp.element.style.opacity = String(MIN_OPACITY);\r\n pswp.applyBgOpacity(1);\r\n } else {\r\n if (this._animateBgOpacity) {\r\n pswp.bg.style.opacity = String(MIN_OPACITY);\r\n }\r\n pswp.element.style.opacity = '1';\r\n }\r\n\r\n if (this._animateZoom) {\r\n this._setClosedStateZoomPan();\r\n if (this._placeholder) {\r\n // tell browser that we plan to animate the placeholder\r\n this._placeholder.style.willChange = 'transform';\r\n\r\n // hide placeholder to allow hiding of\r\n // elements that overlap it (such as icons over the thumbnail)\r\n this._placeholder.style.opacity = String(MIN_OPACITY);\r\n }\r\n }\r\n } else if (this.isClosing) {\r\n // hide nearby slides to make sure that\r\n // they are not painted during the transition\r\n pswp.mainScroll.itemHolders[0].el.style.display = 'none';\r\n pswp.mainScroll.itemHolders[2].el.style.display = 'none';\r\n\r\n if (this._croppedZoom) {\r\n if (pswp.mainScroll.x !== 0) {\r\n // shift the main scroller to zero position\r\n pswp.mainScroll.resetPosition();\r\n pswp.mainScroll.resize();\r\n }\r\n }\r\n }\r\n }\r\n\r\n _start() {\r\n if (this.isOpening\r\n && this._useAnimation\r\n && this._placeholder\r\n && this._placeholder.tagName === 'IMG') {\r\n // To ensure smooth animation\r\n // we wait till the current slide image placeholder is decoded,\r\n // but no longer than 250ms,\r\n // and no shorter than 50ms\r\n // (just using requestanimationframe is not enough in Firefox,\r\n // for some reason)\r\n new Promise((resolve) => {\r\n let decoded = false;\r\n let isDelaying = true;\r\n decodeImage(/** @type {HTMLImageElement} */ (this._placeholder)).finally(() => {\r\n decoded = true;\r\n if (!isDelaying) {\r\n resolve();\r\n }\r\n });\r\n setTimeout(() => {\r\n isDelaying = false;\r\n if (decoded) {\r\n resolve();\r\n }\r\n }, 50);\r\n setTimeout(resolve, 250);\r\n }).finally(() => this._initiate());\r\n } else {\r\n this._initiate();\r\n }\r\n }\r\n\r\n _initiate() {\r\n this.pswp.element.style.setProperty('--pswp-transition-duration', this._duration + 'ms');\r\n\r\n this.pswp.dispatch(\r\n this.isOpening ? 'openingAnimationStart' : 'closingAnimationStart'\r\n );\r\n\r\n // legacy event\r\n this.pswp.dispatch(\r\n /** @type {'initialZoomIn' | 'initialZoomOut'} */\r\n ('initialZoom' + (this.isOpening ? 'In' : 'Out'))\r\n );\r\n\r\n this.pswp.element.classList[this.isOpening ? 'add' : 'remove']('pswp--ui-visible');\r\n\r\n if (this.isOpening) {\r\n if (this._placeholder) {\r\n // unhide the placeholder\r\n this._placeholder.style.opacity = '1';\r\n }\r\n this._animateToOpenState();\r\n } else if (this.isClosing) {\r\n this._animateToClosedState();\r\n }\r\n\r\n if (!this._useAnimation) {\r\n this._onAnimationComplete();\r\n }\r\n }\r\n\r\n _onAnimationComplete() {\r\n const { pswp } = this;\r\n this.isOpen = this.isOpening;\r\n this.isClosed = this.isClosing;\r\n this.isOpening = false;\r\n this.isClosing = false;\r\n\r\n pswp.dispatch(\r\n this.isOpen ? 'openingAnimationEnd' : 'closingAnimationEnd'\r\n );\r\n\r\n // legacy event\r\n pswp.dispatch(\r\n /** @type {'initialZoomInEnd' | 'initialZoomOutEnd'} */\r\n ('initialZoom' + (this.isOpen ? 'InEnd' : 'OutEnd'))\r\n );\r\n\r\n if (this.isClosed) {\r\n pswp.destroy();\r\n } else if (this.isOpen) {\r\n if (this._animateZoom) {\r\n pswp.container.style.overflow = 'visible';\r\n pswp.container.style.width = '100%';\r\n }\r\n pswp.currSlide.applyCurrentZoomPan();\r\n }\r\n }\r\n\r\n _animateToOpenState() {\r\n const { pswp } = this;\r\n if (this._animateZoom) {\r\n if (this._croppedZoom) {\r\n this._animateTo(this._cropContainer1, 'transform', 'translate3d(0,0,0)');\r\n this._animateTo(this._cropContainer2, 'transform', 'none');\r\n }\r\n\r\n pswp.currSlide.zoomAndPanToInitial();\r\n this._animateTo(\r\n pswp.currSlide.container,\r\n 'transform',\r\n pswp.currSlide.getCurrentTransform()\r\n );\r\n }\r\n\r\n if (this._animateBgOpacity) {\r\n this._animateTo(pswp.bg, 'opacity', String(pswp.options.bgOpacity));\r\n }\r\n\r\n if (this._animateRootOpacity) {\r\n this._animateTo(pswp.element, 'opacity', '1');\r\n }\r\n }\r\n\r\n _animateToClosedState() {\r\n const { pswp } = this;\r\n\r\n if (this._animateZoom) {\r\n this._setClosedStateZoomPan(true);\r\n }\r\n\r\n if (this._animateBgOpacity\r\n && pswp.bgOpacity > 0.01) { // do not animate opacity if it's already at 0\r\n this._animateTo(pswp.bg, 'opacity', '0');\r\n }\r\n\r\n if (this._animateRootOpacity) {\r\n this._animateTo(pswp.element, 'opacity', '0');\r\n }\r\n }\r\n\r\n /**\r\n * @param {boolean=} animate\r\n */\r\n _setClosedStateZoomPan(animate) {\r\n if (!this._thumbBounds) return;\r\n\r\n const { pswp } = this;\r\n const { innerRect } = this._thumbBounds;\r\n const { currSlide, viewportSize } = pswp;\r\n\r\n if (this._croppedZoom) {\r\n const containerOnePanX = -viewportSize.x + (this._thumbBounds.x - innerRect.x) + innerRect.w;\r\n const containerOnePanY = -viewportSize.y + (this._thumbBounds.y - innerRect.y) + innerRect.h;\r\n const containerTwoPanX = viewportSize.x - innerRect.w;\r\n const containerTwoPanY = viewportSize.y - innerRect.h;\r\n\r\n\r\n if (animate) {\r\n this._animateTo(\r\n this._cropContainer1,\r\n 'transform',\r\n toTransformString(containerOnePanX, containerOnePanY)\r\n );\r\n\r\n this._animateTo(\r\n this._cropContainer2,\r\n 'transform',\r\n toTransformString(containerTwoPanX, containerTwoPanY)\r\n );\r\n } else {\r\n setTransform(this._cropContainer1, containerOnePanX, containerOnePanY);\r\n setTransform(this._cropContainer2, containerTwoPanX, containerTwoPanY);\r\n }\r\n }\r\n\r\n equalizePoints(currSlide.pan, innerRect || this._thumbBounds);\r\n currSlide.currZoomLevel = this._thumbBounds.w / currSlide.width;\r\n\r\n if (animate) {\r\n this._animateTo(currSlide.container, 'transform', currSlide.getCurrentTransform());\r\n } else {\r\n currSlide.applyCurrentZoomPan();\r\n }\r\n }\r\n\r\n /**\r\n * @param {HTMLElement} target\r\n * @param {'transform' | 'opacity'} prop\r\n * @param {string} propValue\r\n */\r\n _animateTo(target, prop, propValue) {\r\n if (!this._duration) {\r\n target.style[prop] = propValue;\r\n return;\r\n }\r\n\r\n const { animations } = this.pswp;\r\n /** @type {AnimationProps} */\r\n const animProps = {\r\n duration: this._duration,\r\n easing: this.pswp.options.easing,\r\n onComplete: () => {\r\n if (!animations.activeAnimations.length) {\r\n this._onAnimationComplete();\r\n }\r\n },\r\n target,\r\n };\r\n animProps[prop] = propValue;\r\n animations.startTransition(animProps);\r\n }\r\n}\n\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Type} Type\r\n */\r\n\r\n/** @typedef {import('./slide/slide.js').SlideData} SlideData */\r\n/** @typedef {import('./slide/zoom-level.js').ZoomLevelOption} ZoomLevelOption */\r\n/** @typedef {import('./ui/ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('./main-scroll.js').ItemHolder} ItemHolder */\r\n/** @typedef {import('./core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\r\n/** @typedef {import('./core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\r\n/**\r\n * @template T\r\n * @typedef {import('./core/eventable.js').EventCallback} EventCallback\r\n */\r\n/**\r\n * @template T\r\n * @typedef {import('./core/eventable.js').AugmentedEvent} AugmentedEvent\r\n */\r\n\r\n/** @typedef {{ x?: number; y?: number; id?: string | number }} Point */\r\n/** @typedef {{ x?: number; y?: number }} Size */\r\n/** @typedef {{ top: number; bottom: number; left: number; right: number }} Padding */\r\n/** @typedef {SlideData[]} DataSourceArray */\r\n/** @typedef {{ gallery: HTMLElement; items?: HTMLElement[] }} DataSourceObject */\r\n/** @typedef {DataSourceArray | DataSourceObject} DataSource */\r\n/** @typedef {(point: Point, originalEvent: PointerEvent) => void} ActionFn */\r\n/** @typedef {'close' | 'next' | 'zoom' | 'zoom-or-close' | 'toggle-controls'} ActionType */\r\n/** @typedef {Type | { default: Type }} PhotoSwipeModule */\r\n/** @typedef {PhotoSwipeModule | Promise | (() => Promise)} PhotoSwipeModuleOption */\r\n\r\n/**\r\n * @typedef {string | NodeListOf | HTMLElement[] | HTMLElement} ElementProvider\r\n */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeOptions https://photoswipe.com/options/\r\n *\r\n * @prop {DataSource=} dataSource\r\n * Pass an array of any items via dataSource option. Its length will determine amount of slides\r\n * (which may be modified further from numItems event).\r\n *\r\n * Each item should contain data that you need to generate slide\r\n * (for image slide it would be src (image URL), width (image width), height, srcset, alt).\r\n *\r\n * If these properties are not present in your initial array, you may \"pre-parse\" each item from itemData filter.\r\n *\r\n * @prop {number=} bgOpacity\r\n * Background backdrop opacity, always define it via this option and not via CSS rgba color.\r\n *\r\n * @prop {number=} spacing\r\n * Spacing between slides. Defined as ratio relative to the viewport width (0.1 = 10% of viewport).\r\n *\r\n * @prop {boolean=} allowPanToNext\r\n * Allow swipe navigation to the next slide when the current slide is zoomed. Does not apply to mouse events.\r\n *\r\n * @prop {boolean=} loop\r\n * If set to true you'll be able to swipe from the last to the first image.\r\n * Option is always false when there are less than 3 slides.\r\n *\r\n * @prop {boolean=} wheelToZoom\r\n * By default PhotoSwipe zooms image with ctrl-wheel, if you enable this option - image will zoom just via wheel.\r\n *\r\n * @prop {boolean=} pinchToClose\r\n * Pinch touch gesture to close the gallery.\r\n *\r\n * @prop {boolean=} closeOnVerticalDrag\r\n * Vertical drag gesture to close the PhotoSwipe.\r\n *\r\n * @prop {Padding=} padding\r\n * Slide area padding (in pixels).\r\n *\r\n * @prop {(viewportSize: Size, itemData: SlideData, index: number) => Padding} [paddingFn]\r\n * The option is checked frequently, so make sure it's performant. Overrides padding option if defined. For example:\r\n *\r\n * @prop {number | false} [hideAnimationDuration]\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {number | false} [showAnimationDuration]\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {number | false} [zoomAnimationDuration]\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {string=} easing\r\n * String, 'cubic-bezier(.4,0,.22,1)'. CSS easing function for open/close/zoom transitions.\r\n *\r\n * @prop {boolean=} escKey\r\n * Esc key to close.\r\n *\r\n * @prop {boolean=} arrowKeys\r\n * Left/right arrow keys for navigation.\r\n *\r\n * @prop {boolean=} returnFocus\r\n * Restore focus the last active element after PhotoSwipe is closed.\r\n *\r\n * @prop {boolean=} clickToCloseNonZoomable\r\n * If image is not zoomable (for example, smaller than viewport) it can be closed by clicking on it.\r\n *\r\n * @prop {ActionType | ActionFn | false} [imageClickAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} [bgClickAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} [tapAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} [doubleTapAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {number=} preloaderDelay\r\n * Delay before the loading indicator will be displayed,\r\n * if image is loaded during it - the indicator will not be displayed at all. Can be zero.\r\n *\r\n * @prop {string=} indexIndicatorSep\r\n * Used for slide count indicator (\"1 of 10 \").\r\n *\r\n * @prop {(options: PhotoSwipeOptions, pswp: PhotoSwipe) => { x: number; y: number }} [getViewportSizeFn]\r\n * A function that should return slide viewport width and height, in format {x: 100, y: 100}.\r\n *\r\n * @prop {string=} errorMsg\r\n * Message to display when the image wasn't able to load. If you need to display HTML - use contentErrorElement filter.\r\n *\r\n * @prop {[number, number]=} preload\r\n * Lazy loading of nearby slides based on direction of movement. Should be an array with two integers,\r\n * first one - number of items to preload before the current image, second one - after the current image.\r\n * Two nearby images are always loaded.\r\n *\r\n * @prop {string=} mainClass\r\n * Class that will be added to the root element of PhotoSwipe, may contain multiple separated by space.\r\n * Example on Styling page.\r\n *\r\n * @prop {HTMLElement=} appendToEl\r\n * Element to which PhotoSwipe dialog will be appended when it opens.\r\n *\r\n * @prop {number=} maxWidthToAnimate\r\n * Maximum width of image to animate, if initial rendered image width\r\n * is larger than this value - the opening/closing transition will be automatically disabled.\r\n *\r\n * @prop {string=} closeTitle\r\n * Translating\r\n *\r\n * @prop {string=} zoomTitle\r\n * Translating\r\n *\r\n * @prop {string=} arrowPrevTitle\r\n * Translating\r\n *\r\n * @prop {string=} arrowNextTitle\r\n * Translating\r\n *\r\n * @prop {'zoom' | 'fade' | 'none'} [showHideAnimationType]\r\n * To adjust opening or closing transition type use lightbox option `showHideAnimationType` (`String`).\r\n * It supports three values - `zoom` (default), `fade` (default if there is no thumbnail) and `none`.\r\n *\r\n * Animations are automatically disabled if user `(prefers-reduced-motion: reduce)`.\r\n *\r\n * @prop {number=} index\r\n * Defines start slide index.\r\n *\r\n * @prop {(e: MouseEvent) => number} [getClickedIndexFn]\r\n *\r\n * @prop {boolean=} arrowPrev\r\n * @prop {boolean=} arrowNext\r\n * @prop {boolean=} zoom\r\n * @prop {boolean=} close\r\n * @prop {boolean=} counter\r\n *\r\n * @prop {string=} arrowPrevSVG\r\n * @prop {string=} arrowNextSVG\r\n * @prop {string=} zoomSVG\r\n * @prop {string=} closeSVG\r\n * @prop {string=} counterSVG\r\n *\r\n * @prop {string=} arrowPrevTitle\r\n * @prop {string=} arrowNextTitle\r\n * @prop {string=} zoomTitle\r\n * @prop {string=} closeTitle\r\n * @prop {string=} counterTitle\r\n *\r\n * @prop {ZoomLevelOption=} initialZoomLevel\r\n * @prop {ZoomLevelOption=} secondaryZoomLevel\r\n * @prop {ZoomLevelOption=} maxZoomLevel\r\n *\r\n * @prop {boolean=} mouseMovePan\r\n * @prop {Point | null} [initialPointerPos]\r\n * @prop {boolean=} showHideOpacity\r\n *\r\n * @prop {PhotoSwipeModuleOption} [pswpModule]\r\n * @prop {() => Promise} [openPromise]\r\n * @prop {boolean=} preloadFirstSlide\r\n * @prop {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 */\r\n\r\n/** @type {PhotoSwipeOptions} */\r\nconst defaultOptions = {\r\n allowPanToNext: true,\r\n spacing: 0.1,\r\n loop: true,\r\n pinchToClose: true,\r\n closeOnVerticalDrag: true,\r\n hideAnimationDuration: 333,\r\n showAnimationDuration: 333,\r\n zoomAnimationDuration: 333,\r\n escKey: true,\r\n arrowKeys: true,\r\n returnFocus: true,\r\n maxWidthToAnimate: 4000,\r\n clickToCloseNonZoomable: true,\r\n imageClickAction: 'zoom-or-close',\r\n bgClickAction: 'close',\r\n tapAction: 'toggle-controls',\r\n doubleTapAction: 'zoom',\r\n indexIndicatorSep: ' / ',\r\n preloaderDelay: 2000,\r\n bgOpacity: 0.8,\r\n\r\n index: 0,\r\n errorMsg: 'The image cannot be loaded',\r\n preload: [1, 2],\r\n easing: 'cubic-bezier(.4,0,.22,1)'\r\n};\r\n\r\n/**\r\n * PhotoSwipe Core\r\n */\r\nclass PhotoSwipe extends PhotoSwipeBase {\r\n /**\r\n * @param {PhotoSwipeOptions} options\r\n */\r\n constructor(options) {\r\n super();\r\n\r\n this._prepareOptions(options);\r\n\r\n /**\r\n * offset of viewport relative to document\r\n *\r\n * @type {{ x?: number; y?: number }}\r\n */\r\n this.offset = {};\r\n\r\n /**\r\n * @type {{ x?: number; y?: number }}\r\n * @private\r\n */\r\n this._prevViewportSize = {};\r\n\r\n /**\r\n * Size of scrollable PhotoSwipe viewport\r\n *\r\n * @type {{ x?: number; y?: number }}\r\n */\r\n this.viewportSize = {};\r\n\r\n /**\r\n * background (backdrop) opacity\r\n *\r\n * @type {number}\r\n */\r\n this.bgOpacity = 1;\r\n\r\n /** @type {HTMLDivElement} */\r\n this.topBar = undefined;\r\n\r\n this.events = new DOMEvents();\r\n\r\n /** @type {Animations} */\r\n this.animations = new Animations();\r\n\r\n this.mainScroll = new MainScroll(this);\r\n this.gestures = new Gestures(this);\r\n this.opener = new Opener(this);\r\n this.keyboard = new Keyboard(this);\r\n this.contentLoader = new ContentLoader(this);\r\n }\r\n\r\n init() {\r\n if (this.isOpen || this.isDestroying) {\r\n return;\r\n }\r\n\r\n this.isOpen = true;\r\n this.dispatch('init'); // legacy\r\n this.dispatch('beforeOpen');\r\n\r\n this._createMainStructure();\r\n\r\n // add classes to the root element of PhotoSwipe\r\n let rootClasses = 'pswp--open';\r\n if (this.gestures.supportsTouch) {\r\n rootClasses += ' pswp--touch';\r\n }\r\n if (this.options.mainClass) {\r\n rootClasses += ' ' + this.options.mainClass;\r\n }\r\n this.element.className += ' ' + rootClasses;\r\n\r\n this.currIndex = this.options.index || 0;\r\n this.potentialIndex = this.currIndex;\r\n this.dispatch('firstUpdate'); // starting index can be modified here\r\n\r\n // initialize scroll wheel handler to block the scroll\r\n this.scrollWheel = new ScrollWheel(this);\r\n\r\n // sanitize index\r\n if (Number.isNaN(this.currIndex)\r\n || this.currIndex < 0\r\n || this.currIndex >= this.getNumItems()) {\r\n this.currIndex = 0;\r\n }\r\n\r\n if (!this.gestures.supportsTouch) {\r\n // enable mouse features if no touch support detected\r\n this.mouseDetected();\r\n }\r\n\r\n // causes forced synchronous layout\r\n this.updateSize();\r\n\r\n this.offset.y = window.pageYOffset;\r\n\r\n this._initialItemData = this.getItemData(this.currIndex);\r\n this.dispatch('gettingData', {\r\n index: this.currIndex,\r\n data: this._initialItemData,\r\n slide: undefined\r\n });\r\n\r\n // *Layout* - calculate size and position of elements here\r\n this._initialThumbBounds = this.getThumbBounds();\r\n this.dispatch('initialLayout');\r\n\r\n this.on('openingAnimationEnd', () => {\r\n this.mainScroll.itemHolders[0].el.style.display = 'block';\r\n this.mainScroll.itemHolders[2].el.style.display = 'block';\r\n\r\n // Add content to the previous and next slide\r\n this.setContent(this.mainScroll.itemHolders[0], this.currIndex - 1);\r\n this.setContent(this.mainScroll.itemHolders[2], this.currIndex + 1);\r\n\r\n this.appendHeavy();\r\n\r\n this.contentLoader.updateLazy();\r\n\r\n this.events.add(window, 'resize', this._handlePageResize.bind(this));\r\n this.events.add(window, 'scroll', this._updatePageScrollOffset.bind(this));\r\n this.dispatch('bindEvents');\r\n });\r\n\r\n // set content for center slide (first time)\r\n this.setContent(this.mainScroll.itemHolders[1], this.currIndex);\r\n this.dispatch('change');\r\n\r\n this.opener.open();\r\n\r\n this.dispatch('afterInit');\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Get looped slide index\r\n * (for example, -1 will return the last slide)\r\n *\r\n * @param {number} index\r\n */\r\n getLoopedIndex(index) {\r\n const numSlides = this.getNumItems();\r\n\r\n if (this.options.loop) {\r\n if (index > numSlides - 1) {\r\n index -= numSlides;\r\n }\r\n\r\n if (index < 0) {\r\n index += numSlides;\r\n }\r\n }\r\n\r\n index = clamp(index, 0, numSlides - 1);\r\n\r\n return index;\r\n }\r\n\r\n appendHeavy() {\r\n this.mainScroll.itemHolders.forEach((itemHolder) => {\r\n if (itemHolder.slide) {\r\n itemHolder.slide.appendHeavy();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Change the slide\r\n * @param {number} index New index\r\n */\r\n goTo(index) {\r\n this.mainScroll.moveIndexBy(\r\n this.getLoopedIndex(index) - this.potentialIndex\r\n );\r\n }\r\n\r\n /**\r\n * Go to the next slide.\r\n */\r\n next() {\r\n this.goTo(this.potentialIndex + 1);\r\n }\r\n\r\n /**\r\n * Go to the previous slide.\r\n */\r\n prev() {\r\n this.goTo(this.potentialIndex - 1);\r\n }\r\n\r\n /**\r\n * @see slide/slide.js zoomTo\r\n *\r\n * @param {Parameters} args\r\n */\r\n zoomTo(...args) {\r\n this.currSlide.zoomTo(...args);\r\n }\r\n\r\n /**\r\n * @see slide/slide.js toggleZoom\r\n */\r\n toggleZoom() {\r\n this.currSlide.toggleZoom();\r\n }\r\n\r\n /**\r\n * Close the gallery.\r\n * After closing transition ends - destroy it\r\n */\r\n close() {\r\n if (!this.opener.isOpen || this.isDestroying) {\r\n return;\r\n }\r\n\r\n this.isDestroying = true;\r\n\r\n this.dispatch('close');\r\n\r\n this.events.removeAll();\r\n this.opener.close();\r\n }\r\n\r\n /**\r\n * Destroys the gallery:\r\n * - instantly closes the gallery\r\n * - unbinds events,\r\n * - cleans intervals and timeouts\r\n * - removes elements from DOM\r\n */\r\n destroy() {\r\n if (!this.isDestroying) {\r\n this.options.showHideAnimationType = 'none';\r\n this.close();\r\n return;\r\n }\r\n\r\n this.dispatch('destroy');\r\n\r\n this.listeners = null;\r\n\r\n this.scrollWrap.ontouchmove = null;\r\n this.scrollWrap.ontouchend = null;\r\n\r\n this.element.remove();\r\n\r\n this.mainScroll.itemHolders.forEach((itemHolder) => {\r\n if (itemHolder.slide) {\r\n itemHolder.slide.destroy();\r\n }\r\n });\r\n\r\n this.contentLoader.destroy();\r\n this.events.removeAll();\r\n }\r\n\r\n /**\r\n * Refresh/reload content of a slide by its index\r\n *\r\n * @param {number} slideIndex\r\n */\r\n refreshSlideContent(slideIndex) {\r\n this.contentLoader.removeByIndex(slideIndex);\r\n this.mainScroll.itemHolders.forEach((itemHolder, i) => {\r\n let potentialHolderIndex = this.currSlide.index - 1 + i;\r\n if (this.canLoop()) {\r\n potentialHolderIndex = this.getLoopedIndex(potentialHolderIndex);\r\n }\r\n if (potentialHolderIndex === slideIndex) {\r\n // set the new slide content\r\n this.setContent(itemHolder, slideIndex, true);\r\n\r\n // activate the new slide if it's current\r\n if (i === 1) {\r\n /** @type {Slide} */\r\n this.currSlide = itemHolder.slide;\r\n itemHolder.slide.setIsActive(true);\r\n }\r\n }\r\n });\r\n\r\n this.dispatch('change');\r\n }\r\n\r\n\r\n /**\r\n * Set slide content\r\n *\r\n * @param {ItemHolder} holder mainScroll.itemHolders array item\r\n * @param {number} index Slide index\r\n * @param {boolean=} force If content should be set even if index wasn't changed\r\n */\r\n setContent(holder, index, force) {\r\n if (this.canLoop()) {\r\n index = this.getLoopedIndex(index);\r\n }\r\n\r\n if (holder.slide) {\r\n if (holder.slide.index === index && !force) {\r\n // exit if holder already contains this slide\r\n // this could be common when just three slides are used\r\n return;\r\n }\r\n\r\n // destroy previous slide\r\n holder.slide.destroy();\r\n holder.slide = null;\r\n }\r\n\r\n // exit if no loop and index is out of bounds\r\n if (!this.canLoop() && (index < 0 || index >= this.getNumItems())) {\r\n return;\r\n }\r\n\r\n const itemData = this.getItemData(index);\r\n holder.slide = new Slide(itemData, index, this);\r\n\r\n // set current slide\r\n if (index === this.currIndex) {\r\n this.currSlide = holder.slide;\r\n }\r\n\r\n holder.slide.append(holder.el);\r\n }\r\n\r\n getViewportCenterPoint() {\r\n return {\r\n x: this.viewportSize.x / 2,\r\n y: this.viewportSize.y / 2\r\n };\r\n }\r\n\r\n /**\r\n * Update size of all elements.\r\n * Executed on init and on page resize.\r\n *\r\n * @param {boolean=} force Update size even if size of viewport was not changed.\r\n */\r\n updateSize(force) {\r\n // let item;\r\n // let itemIndex;\r\n\r\n if (this.isDestroying) {\r\n // exit if PhotoSwipe is closed or closing\r\n // (to avoid errors, as resize event might be delayed)\r\n return;\r\n }\r\n\r\n //const newWidth = this.scrollWrap.clientWidth;\r\n //const newHeight = this.scrollWrap.clientHeight;\r\n\r\n const newViewportSize = getViewportSize(this.options, this);\r\n\r\n if (!force && pointsEqual(newViewportSize, this._prevViewportSize)) {\r\n // Exit if dimensions were not changed\r\n return;\r\n }\r\n\r\n //this._prevViewportSize.x = newWidth;\r\n //this._prevViewportSize.y = newHeight;\r\n equalizePoints(this._prevViewportSize, newViewportSize);\r\n\r\n this.dispatch('beforeResize');\r\n\r\n equalizePoints(this.viewportSize, this._prevViewportSize);\r\n\r\n this._updatePageScrollOffset();\r\n\r\n this.dispatch('viewportSize');\r\n\r\n // Resize slides only after opener animation is finished\r\n // and don't re-calculate size on inital size update\r\n this.mainScroll.resize(this.opener.isOpen);\r\n\r\n if (!this.hasMouse && window.matchMedia('(any-hover: hover)').matches) {\r\n this.mouseDetected();\r\n }\r\n\r\n this.dispatch('resize');\r\n }\r\n\r\n /**\r\n * @param {number} opacity\r\n */\r\n applyBgOpacity(opacity) {\r\n this.bgOpacity = Math.max(opacity, 0);\r\n this.bg.style.opacity = String(this.bgOpacity * this.options.bgOpacity);\r\n }\r\n\r\n /**\r\n * Whether mouse is detected\r\n */\r\n mouseDetected() {\r\n if (!this.hasMouse) {\r\n this.hasMouse = true;\r\n this.element.classList.add('pswp--has_mouse');\r\n }\r\n }\r\n\r\n /**\r\n * Page resize event handler\r\n *\r\n * @private\r\n */\r\n _handlePageResize() {\r\n this.updateSize();\r\n\r\n // In iOS webview, if element size depends on document size,\r\n // it'll be measured incorrectly in resize event\r\n //\r\n // https://bugs.webkit.org/show_bug.cgi?id=170595\r\n // https://hackernoon.com/onresize-event-broken-in-mobile-safari-d8469027bf4d\r\n if (/iPhone|iPad|iPod/i.test(window.navigator.userAgent)) {\r\n setTimeout(() => {\r\n this.updateSize();\r\n }, 500);\r\n }\r\n }\r\n\r\n /**\r\n * Page scroll offset is used\r\n * to get correct coordinates\r\n * relative to PhotoSwipe viewport.\r\n *\r\n * @private\r\n */\r\n _updatePageScrollOffset() {\r\n this.setScrollOffset(0, window.pageYOffset);\r\n }\r\n\r\n /**\r\n * @param {number} x\r\n * @param {number} y\r\n */\r\n setScrollOffset(x, y) {\r\n this.offset.x = x;\r\n this.offset.y = y;\r\n this.dispatch('updateScrollOffset');\r\n }\r\n\r\n /**\r\n * Create main HTML structure of PhotoSwipe,\r\n * and add it to DOM\r\n *\r\n * @private\r\n */\r\n _createMainStructure() {\r\n // root DOM element of PhotoSwipe (.pswp)\r\n this.element = createElement('pswp');\r\n this.element.setAttribute('tabindex', '-1');\r\n this.element.setAttribute('role', 'dialog');\r\n\r\n // template is legacy prop\r\n this.template = this.element;\r\n\r\n // Background is added as a separate element,\r\n // as animating opacity is faster than animating rgba()\r\n this.bg = createElement('pswp__bg', false, this.element);\r\n this.scrollWrap = createElement('pswp__scroll-wrap', 'section', this.element);\r\n this.container = createElement('pswp__container', false, this.scrollWrap);\r\n\r\n // aria pattern: carousel\r\n this.scrollWrap.setAttribute('aria-roledescription', 'carousel');\r\n this.container.setAttribute('aria-live', 'off');\r\n this.container.setAttribute('id', 'pswp__items');\r\n\r\n this.mainScroll.appendHolders();\r\n\r\n this.ui = new UI(this);\r\n this.ui.init();\r\n\r\n // append to DOM\r\n (this.options.appendToEl || document.body).appendChild(this.element);\r\n }\r\n\r\n\r\n /**\r\n * Get position and dimensions of small thumbnail\r\n * {x:,y:,w:}\r\n *\r\n * Height is optional (calculated based on the large image)\r\n */\r\n getThumbBounds() {\r\n return getThumbBounds(\r\n this.currIndex,\r\n this.currSlide ? this.currSlide.data : this._initialItemData,\r\n this\r\n );\r\n }\r\n\r\n /**\r\n * If the PhotoSwipe can have continious loop\r\n * @returns Boolean\r\n */\r\n canLoop() {\r\n return (this.options.loop && this.getNumItems() > 2);\r\n }\r\n\r\n /**\r\n * @param {PhotoSwipeOptions} options\r\n * @private\r\n */\r\n _prepareOptions(options) {\r\n if (window.matchMedia('(prefers-reduced-motion), (update: slow)').matches) {\r\n options.showHideAnimationType = 'none';\r\n options.zoomAnimationDuration = 0;\r\n }\r\n\r\n /** @type {PhotoSwipeOptions}*/\r\n this.options = {\r\n ...defaultOptions,\r\n ...options\r\n };\r\n }\r\n}\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","container","thumbnails","rowHeightPercentage","imagesetContainer","querySelector","imageset","initComplete","resizeStart","resizeComplete","dispatchEvent","Polyfill","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","sliderStarter","SliderStarter","timer","start","clearTimeout","setTimeout","newOptions","this","images","image","Math","ceil","setSize","newHeight","round","newWidth","LOADING_MATCHER","MARKER_IMAGE_IS_IN_PROGRESS_ATTRIBUTE","albumUrl","albumsUrl","EventGalleryGooglePhotosConfiguration","imageAddedCallback","processImages","removeEventListener","doReloadLightbox","detail","isOverlay","albums","_groupByAlbum","_collectHTMLElements","_markImagesAsInProgress","_getMainImageDataFromServer","htmlCollection","filter","img","imageSrcSet","dataSrc","foundLinkHTMLElements","concat","a","rel","href","parsedHTMLElement","getHTMLElement","setAttribute","htmlElements","Map","imageHTMLElement","_parseHTMLElement","updateParameters","folder","parameters","get","set","tagName","ParsedImageHTMLElement","ParsedLinkHTMLElement","foldername","album","_doAlbumRequest","fetch","then","response","json","data","_processAlbumResult","_replaceImages","albumsWithMainImagesOnly","_filterForAlbumsWithMainImageOnly","size","_doAlbumsRequest","delete","_getAlbumDataFromServer","_processAlbumsResult","newAlbums","mainImages","isMainImage","serverResult","undefined","parsedImageHTMLElement","imageUrl","getFile","replaceElementLinks","isOpen","link","getCurrentSlide","thumbEl","_gallery","close","ParsedHTMLElement","attributeNames","Set","parameterString","substring","URLHelper","updateParametersWithUrl","getImageUrl","getWidth","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","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","target","dataset","knownImageUrls","includes","classList","remove","onload","instance","lazyImages","observe","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","myDiv","background","body","onClosed","onLoad","repositionTimer","windowWidth","onResizeOverlay","_setRositionTimer","text","dataUrl","opacity","closeOverlay","append","reposition","startsWith","_getRemoteData","_addContent","force","content","getElementsByClassName","clientWidth","innerHeight","scrollTop","pageYOffset","SlideShow","photoSwipe","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","parseURLParameter","urlString","Glide","Components","Events","Binder","EventsHandler","prevented","Anchors","mount","_a","Html","wrapper","bind","unbind","off","stopPropagation","detach","attach","Transition","after","destroy","JSGallery2","galleryElement","thumbs","bigImageContainer","pageContainer","nav","pages","children","running","currentPageNumber","blockKeys","imagesPerFirstPage","imagesPerPage","bigImage","convertThumbs","lastPage","location","initialIndex","createControls","createGallerySlides","adjustWidth","adjustPageHeight","adjustImageSize","gotoPage","unBlockKeys","selectByIndex","resizePage","thumbnail","eventgalleryAjaxResizeTimer","resetThumbs","slides","thumbContainer","lightboxLinkElement","title","decodeURIComponent","slide","w","h","prevLink","prevImage","mouseLeaveHandler","focusControl","zoomLink","bigImageClickHandler","nextLink","nextImage","showBigImage","showCartButton","add2cartLink","showCartConnector","cartConnectorLink","cartConnectorLinkRel","showSocialMediaButton","div","socialmediabutton","firstChild","keyboardHandler","addTouch","touchContainerSelector","control","keyCode","page","select","selectedContainer","count","convertThumb","forceReload","deselect","history","pushState","targetPage","activeClass","source","setImage","currentIndex","openPhotoSwipe","setAfterChangeEventListener","gid","getCurrentIndex","newSrc","gotoSlide","titleTarget","pageNumber","selectImage","marginLeft","updateHandles","prevHandle","nextHandle","countHandle","updatePagingBar","currentPage","pageCount","createCountLink","pageSpeed","inline","skipFromRight","skipFromLeft","spaceToRight","child","myAnchor","innerText","myListItem","require","galleryElements","HistoryHandler","browserBackHappened","onClose","_close","replaceState","go","pid","_isOpen","doOverlapToolbar","imagePadding","doOverlapImageWithCaption","showHideAnimationType","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","pause","KEY_PAUSESLIDESHOW","returnValue","eTarget","srcElement","closest","contains","clickedListItem","toUpperCase","getSlideBy","getIndexOfSlide","disableAnimation","fromURL","useHistory","pswpModule","PhotoSwipe","galleryPIDs","bgOpacity","galleryUID","element","toggle","updateSize","paddingFn","viewportSize","itemData","captionHeight","className","max","bottom","right","pinchToClose","add2cartEl","closeOnVerticalDrag","closeOnScroll","navigationFadeDelay","timeToIdle","timeToIdleOutside","showAnimationDuration","dataSource","addFilter","overlay","historyHandler","startUrlHistory","adjustUrlHistory","endUrlHistory","defaultPrevented","_registerUIElements","init","appendTo","pswp","currSlideElement","captionHTML","ariaLabel","shareUrl","add2cartUrl","directDownloadButton","values","gallery","l","onclick","onThumbnailsClick","map","hash","galleries","getThumbnailContainers","parseThumbnailElement","currSlide","currIndex","afterChangeFunction","goTo","PhotoSwipeGallerySlide","alt","msrc","from","tc","thumbElIsAllowed","fn","parentNode","nodeType","shareButton","add2cartButton","EventGalleryCartConfiguration","add2cartdialogurl","_parseHashString","params","vars","SliderOptions","assign","autoplay","slidesElementsSelector","numberOfRowsPerSlide","showNav","_parseOptions","attributes","CamelCaseConverter","sourceGroupElement","sliderTransformator","sliderOptions","_loadOptions","sourceElementSelector","getSlidesElementsSelector","getAutoPlay","doShowNav","numberOfItemsPerSlide","ElementSize","getNumberOfRowsPerSlide","SliderTransformator","rootElement","transform","perView","keyboard","Swipe","Controls","Breakpoints","Autoplay","Anchor","Images","sliderRootSelector","sourceElements","getSourceElements","sliderRoot","sliderMarkup","createRange","createContextualFragment","controlElement","sliderGroupElement","currentSliderElement","domRect","getBoundingClientRect","computedStyle","marginRight","containerElement","numberOfRows","getOuterWidth","str","m","listeners","events","closure","capture","passive","isString","isNodeList","isArray","listener","removeHtmlElementNode","removeChild","createNewEvent","eventName","CustomEvent","createEvent","initEvent","cartProcessor","eventHandler","initializeCartButtons","add2cartButtons","btn","openAdd2CartDialog","Add2CartDialogContent","q","updateQuantity","p","quantityPlus","quantityMinus","loadCart","inputFild","quantity","reference","fieldName","inputField","getElementsByName","currentVal","maxOrderQuantity","String","changeEvent","Event","initializeCartConnectorButtons","cartConnectorButtons","openLink","removeUrl","getCartUrl","urls","CartUrls","add2CartButtonHandler","Add2CartButtonHandler","cartConnectorButtonHandler","CartConnectorButtonHandler","dispatchCartData","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","reload","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","pageY","pageX","NodeList","isPrototypeOf","_typeof","obj","Symbol","iterator","constructor","_classCallCheck","Constructor","TypeError","_defineProperties","props","descriptor","enumerable","configurable","writable","_createClass","protoProps","staticProps","_getPrototypeOf","o","setPrototypeOf","getPrototypeOf","__proto__","_setPrototypeOf","_possibleConstructorReturn","self","ReferenceError","_assertThisInitialized","_superPropBase","object","property","hasOwnProperty","_get","Reflect","receiver","base","desc","getOwnPropertyDescriptor","arguments","apply","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","glide","extensions","components","_name","define","prop","definition","mergeOptions","settings","EventsBus","hop","handler","context","emit","Glide$1","selector","_c","_t","_e","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","exist","HTMLElement","toArray","nodeList","TRACK_SELECTOR","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","_this","_Glide$settings3","unbindSwipeStart","_this2","_this3","dragstart","anchors","detached","items","draggable","CONTROLS_SELECTOR","PREVIOUS_CONTROLS_SELECTOR","NEXT_CONTROLS_SELECTOR","controls","_n","_arrowControls","addBindings","setActive","addClass","removeActive","removeClass","sibling","setArrowState","resetArrowState","disableArrow","_len","lists","_key","list","_len2","_key2","removeBindings","currentTarget","Keyboard","press","code","setInterval","stop","time","clearInterval","sortBreakpoints","points","keys","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","offset","token","_v","setupSlides","setupWrapper","wrapperSize","reductor","len","collect","peekIncrementer","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","_inherits","Derived","hasNativeReflectConstruct","_super","construct","sham","Proxy","Boolean","valueOf","_isNativeReflectConstruct","Super","NewTarget","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","getPanAreaSize","PanBounds","currZoomLevel","center","reset","update","_updateAxis","dispatch","axis","elSize","panAreaSize","correctPan","panOffset","ZoomLevel","elementSize","hRatio","vRatio","fit","fill","vFill","initial","_getInitial","secondary","_getSecondary","_getMax","zoomLevels","slideData","_parseZoomLevelOption","optionPrefix","optionName","optionValue","Number","Slide","isActive","currentResolution","isFirstSlide","opener","pan","contentLoader","getContentBySlide","bounds","prevDisplayedWidth","prevDisplayedHeight","setIsActive","activate","deactivate","holderElement","transformOrigin","calculateSize","load","updateContentSize","appendHeavy","zoomAndPanToInitial","applyCurrentZoomPan","heavyAppended","mainScroll","isShifted","hasSlide","resize","panTo","scaleMultiplier","sizeChanged","setDisplayedSize","getPlaceholderElement","placeholder","zoomTo","destZoomLevel","centerPoint","transitionDuration","ignoreBounds","isZoomable","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","potentialPan","customFriction","getZoomPointsCenter","ZoomHandler","_startPan","_startZoomPoint","_zoomPoint","_startZoomLevel","_wasOverFitZoomLevel","startP1","startP2","minZoomLevel","maxZoomLevel","_calculatePanForZoomLevel","ignoreGesture","destinationZoomLevel","currZoomLevelNeedsChange","initialPan","destinationPan","panNeedsChange","naturalFrequency","newZoomLevel","didTapOnMainContent","TapHandler","targetClassList","isImageClick","isBackgroundClick","_doClickOrTapAction","tap","doubleTap","actionName","actionFullName","clickToCloseNonZoomable","Gestures","prevP2","_lastStartP1","_intervalP1","_numActivePoints","_ongoingPointers","_touchEventEnabled","_pointerEventEnabled","supportsTouch","maxTouchPoints","drag","tapHandler","scrollWrap","_onClick","_bindEvents","ontouchmove","ontouchend","pref","down","up","cancelEvent","onPointerDown","onPointerMove","onPointerUp","isMousePointer","pointerType","mouseDetected","_preventPointerEventBehaviour","_updatePoints","pointerDown","_clearTapTimer","isDragging","isZooming","_finishDrag","_updateStartPoints","_rafStopLoop","_rafRenderLoop","_calculateDragDirection","_intervalTime","_velocityCalculated","_updateVelocity","_finishTap","_updatePrevPoints","raf","requestAnimationFrame","_getVelocity","tapDelay","doubleTapAction","_tapTimer","displacement","cancelAnimationFrame","pointerEvent","pointerIndex","findIndex","ongoingPoiner","pointerId","_convertEventPosToPoint","touchEvent","diff","axisToCheck","identifier","MainScroll","itemHolders","resetPosition","resizeSlides","newSlideWidth","spacing","slideWidthChanged","itemHolder","_containerShiftIndex","_currPositionIndex","_prevPositionIndex","appendHolders","canBeSwiped","getNumItems","animate","velocityX","newIndex","potentialIndex","numSlides","canLoop","getLoopedIndex","stopMainScroll","destinationX","isMainScroll","updateCurrItem","currDiff","currDistance","positionDifference","tempHolder","diffAbs","setContent","pop","updateLazy","newSlideIndexOffset","initialPointerPos","_focusRoot","_onFocusIn","_onKeyDown","lastActiveElement","returnFocus","_wasFocused","focus","which","ctrlKey","metaKey","altKey","shiftKey","specialKeyUsed","keydownAction","isForward","escKey","arrowKeys","template","CSSAnimation","onFinish","_target","_onComplete","_onTransitionEnd","_helperTimeout","_finalizeAnimation","_finished","SpringEaser","initialVelocity","_dampingRatio","_naturalFrequency","_dampedFrequency","easeFrame","deltaPosition","deltaTime","coeff","naturalDumpingPow","E","dumpedFCos","cos","dumpedFSin","sin","SpringAnimation","easer","prevTime","animationLoop","_raf","Animations","activeAnimations","_start","isSpring","animation","isPanRunning","some","ScrollWheel","_onWheel","deltaX","deltaY","wheelToZoom","deltaMode","clientX","clientY","UIElement","elementHTML","toLowerCase","htmlData","isCustomSVG","svgData","out","outlineID","inner","addElementHTML","topBar","applyFilters","initArrowButton","isNextButton","loop","arrowPrev","arrowNext","closeButton","zoomButton","loadingIndicator","indicatorElement","isVisible","delayTimeout","setIndicatorVisibility","visible","updatePreloaderVisibility","isLoading","preloaderDelay","counterIndicator","counterElement","setZoomedIn","isZoomedIn","UI","_lastUpdatedZoomLevel","isRegistered","uiElementsData","b","uiElementData","_onZoomPanUpdate","elementData","isClosing","currZoomLevelDiff","imageClickAction","PhotoSwipeEvent","details","Eventable","_listeners","_filters","priority","f1","f2","removeFilter","Placeholder","imageSrc","decoding","Content","displayedImageWidth","displayedImageHeight","isAttached","state","removePlaceholder","keepPlaceholder","isLazy","usePlaceholder","placeholderEl","placeholderSrc","isImageContent","loadImage","imageElement","updateSrcsetSizes","srcset","complete","onLoaded","onerror","onError","setSlide","displayError","isError","isInitialSizeUpdate","sizesWidth","largestUsedSize","sizes","lazyLoad","errorMsgEl","supportsDecode","isDecoding","decode","catch","finally","appendImage","lazyLoadData","createContentFromData","zoomLevel","ContentLoader","limit","preload","_cachedItems","loadSlideByIndex","getContentByIndex","getItemData","lazyLoadSlide","addToCache","removeByIndex","indexToRemove","find","PhotoSwipeBase","numItems","_getGalleryDOMElements","dataSourceItem","Element","_domElementToItemData","childSelector","option","legacySelector","getElementsFromOption","linkEl","pswpSrc","pswpSrcset","pswpWidth","pswpHeight","pswpType","thumbnailEl","currentSrc","pswpCropped","cropped","thumbCropped","MIN_OPACITY","Opener","isClosed","_prepareOpen","_thumbBounds","open","isOpening","_duration","hideAnimationDuration","maxWidthToAnimate","_applyStartProps","_croppedZoom","showHideOpacity","_initialThumbBounds","getThumbBounds","_placeholder","_useAnimation","_animateZoom","_animateRootOpacity","_animateBgOpacity","_opacityElement","bg","innerRect","_cropContainer1","_cropContainer2","overflow","_setClosedStateZoomPan","willChange","Promise","decoded","isDelaying","reject","_initiate","setProperty","_animateToOpenState","_animateToClosedState","_onAnimationComplete","_animateTo","containerOnePanX","containerOnePanY","containerTwoPanX","containerTwoPanY","animProps","defaultOptions","bgClickAction","tapAction","super","_prepareOptions","_prevViewportSize","isDestroying","_createMainStructure","rootClasses","mainClass","scrollWheel","_initialItemData","_handlePageResize","_updatePageScrollOffset","prev","refreshSlideContent","slideIndex","potentialHolderIndex","holder","hasMouse","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":""}