{"version":3,"sources":["webpack:///./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack:///./node_modules/core-js/modules/es.reflect.construct.js","webpack:///./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack:///./node_modules/@babel/runtime/helpers/esm/inherits.js","webpack:///./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack:///./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack:///./node_modules/core-js/internals/function-bind.js","webpack:///../../../src/js/util/util.js","webpack:///../../../src/js/core/eventable.js","webpack:///../../../src/js/slide/placeholder.js","webpack:///../../../src/js/slide/content.js","webpack:///../../../src/js/util/viewport-size.js","webpack:///../../../src/js/slide/zoom-level.js","webpack:///../../../src/js/slide/loader.js","webpack:///../../../src/js/core/base.js","webpack:///../../../src/js/lightbox/lightbox.js","webpack:///./node_modules/core-js/modules/es.array.fill.js","webpack:///./node_modules/core-js/modules/es.array.find-index.js"],"names":["_getPrototypeOf","o","Object","setPrototypeOf","getPrototypeOf","bind","__proto__","$","getBuiltIn","apply","aConstructor","anObject","isObject","create","fails","nativeConstruct","ObjectPrototype","prototype","push","NEW_TARGET_BUG","F","ARGS_BUG","FORCED","target","stat","forced","sham","construct","Target","args","newTarget","arguments","length","$args","proto","instance","result","_assertThisInitialized","self","ReferenceError","_inherits","subClass","superClass","TypeError","constructor","value","writable","configurable","defineProperty","_possibleConstructorReturn","call","_setPrototypeOf","p","uncurryThis","aCallable","hasOwn","arraySlice","NATIVE_BIND","$Function","Function","concat","join","factories","module","exports","that","this","Prototype","partArgs","boundFunction","C","argsLength","list","i","createElement","className","tagName","appendToEl","el","document","appendChild","setWidthHeight","w","h","style","width","height","LOAD_STATE","getElementsFromOption","option","legacySelector","parent","undefined","elements","Element","NodeList","Array","isArray","from","selector","querySelectorAll","isSafari","navigator","vendor","match","PhotoSwipeEvent","type","details","_classCallCheck","defaultPrevented","assign","_createClass","key","Eventable","_listeners","_filters","pswp","options","name","fn","_this$_filters$name","_this$_filters$name2","_this$pswp","priority","sort","f1","f2","addFilter","filter","removeFilter","_this$_filters$name3","_this","_len","_key","forEach","_this$_listeners$name","_this$pswp2","on","_this$pswp3","listener","off","_this$_listeners$name2","_this2","dispatch","event","Placeholder","imageSrc","container","element","imgEl","decoding","alt","src","setAttribute","y","scale","propValue","transformOrigin","transform","_this$element","parentNode","remove","Content","itemData","index","data","placeholder","slide","displayedImageWidth","displayedImageHeight","Number","isAttached","hasSlide","isDecoding","state","content","_this3","keepPlaceholder","setTimeout","destroy","isLazy","reload","usePlaceholder","placeholderEl","parentElement","prepend","placeholderSrc","applyFilters","msrc","isFirstSlide","isImageContent","loadImage","innerHTML","html","updateContentSize","_this$data$src","_this$data$alt","_this4","imageElement","updateSrcsetSizes","srcset","complete","onLoaded","onload","onerror","onError","isActive","heavyAppended","append","removePlaceholder","displayError","isError","setDisplayedSize","isInitialSizeUpdate","image","sizesWidth","dataset","largestUsedSize","parseInt","sizes","String","load","isLoading","_this$instance$option","_this$instance$option2","errorMsgEl","innerText","errorMsg","_this5","supportsDecode","decode","catch","finally","appendImage","holderElement","parsePaddingOption","prop","viewportSize","paddingValue","paddingFn","padding","legacyPropName","toUpperCase","slice","ZoomLevel","panAreaSize","elementSize","fit","fill","vFill","initial","secondary","max","min","maxWidth","maxHeight","x","hRatio","vRatio","Math","_getInitial","_getSecondary","_getMax","zoomLevels","slideData","optionPrefix","optionName","optionValue","currZoomLevel","_parseZoomLevelOption","lazyLoadData","zoomLevel","createContentFromData","getViewportSizeFn","newViewportSize","documentElement","clientWidth","window","innerHeight","getViewportSize","getPanAreaSize","update","lazyLoad","ceil","PhotoSwipeBase","_Eventable","_super","_createSuper","_this$options","numItems","dataSource","items","_getGalleryDOMElements","gallery","_this$options2","dataSourceItem","_domElementToItemData","galleryElement","_this$options3","_this$options4","children","childSelector","linkEl","querySelector","pswpSrc","href","pswpSrcset","pswpWidth","pswpHeight","pswpType","_thumbnailEl$getAttri","thumbnailEl","currentSrc","getAttribute","pswpCropped","cropped","thumbCropped","PhotoSwipeLightbox","_PhotoSwipeBase","_super2","_this6","_uid","shouldOpen","_preloadedContent","onThumbnailsClick","_this7","gallerySelector","addEventListener","e","button","ctrlKey","metaKey","altKey","shiftKey","specialKeyUsed","onLine","initialPoint","clientX","clientY","clickedIndex","getClickedIndex","currentTarget","preventDefault","loadAndOpen","getClickedIndexFn","clickedTarget","clickedChildIndex","findIndex","child","contains","initialPointerPos","preload","_this8","promiseArray","pswpModuleType","_typeof","pswpModule","goTo","Promise","resolve","Error","openPromise","preloadFirstSlide","getItemData","lazyLoadSlide","uid","all","then","iterableModules","mainModule","_openPhotoswipe","_this9","default","keys","_this9$_listeners$nam","_this9$_filters$name","contentLoader","addToCache","init","_this$pswp4","_this10","removeEventListener","addToUnscopables","$findIndex","FIND_INDEX","SKIPS_HOLES","callbackfn"],"mappings":"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","file":"93fd7e8.js","sourcesContent":["export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","var $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar apply = require('../internals/function-apply');\nvar bind = require('../internals/function-bind');\nvar aConstructor = require('../internals/a-constructor');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar fails = require('../internals/fails');\n\nvar nativeConstruct = getBuiltIn('Reflect', 'construct');\nvar ObjectPrototype = Object.prototype;\nvar push = [].push;\n\n// `Reflect.construct` method\n// https://tc39.es/ecma262/#sec-reflect.construct\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\n\nvar ARGS_BUG = !fails(function () {\n nativeConstruct(function () { /* empty */ });\n});\n\nvar FORCED = NEW_TARGET_BUG || ARGS_BUG;\n\n$({ target: 'Reflect', stat: true, forced: FORCED, sham: FORCED }, {\n construct: function construct(Target, args /* , newTarget */) {\n aConstructor(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aConstructor(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n apply(push, $args, args);\n return new (apply(bind, Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : ObjectPrototype);\n var result = apply(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, \"prototype\", {\n writable: false\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n return assertThisInitialized(self);\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\nvar isObject = require('../internals/is-object');\nvar hasOwn = require('../internals/has-own-property');\nvar arraySlice = require('../internals/array-slice');\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar $Function = Function;\nvar concat = uncurryThis([].concat);\nvar join = uncurryThis([].join);\nvar factories = {};\n\nvar construct = function (C, argsLength, args) {\n if (!hasOwn(factories, argsLength)) {\n for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']';\n factories[argsLength] = $Function('C,a', 'return new C(' + join(list, ',') + ')');\n } return factories[argsLength](C, args);\n};\n\n// `Function.prototype.bind` method implementation\n// https://tc39.es/ecma262/#sec-function.prototype.bind\n// eslint-disable-next-line es/no-function-prototype-bind -- detection\nmodule.exports = NATIVE_BIND ? $Function.bind : function bind(that /* , ...args */) {\n var F = aCallable(this);\n var Prototype = F.prototype;\n var partArgs = arraySlice(arguments, 1);\n var boundFunction = function bound(/* args... */) {\n var args = concat(partArgs, arraySlice(arguments));\n return this instanceof boundFunction ? construct(F, args.length, args) : F.apply(that, args);\n };\n if (isObject(Prototype)) boundFunction.prototype = Prototype;\n return boundFunction;\n};\n","/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n/**\r\n * @template {keyof HTMLElementTagNameMap} T\r\n * @param {string} className\r\n * @param {T} tagName\r\n * @param {Node} [appendToEl]\r\n * @returns {HTMLElementTagNameMap[T]}\r\n */\r\nexport function createElement(className, tagName, appendToEl) {\r\n const el = document.createElement(tagName);\r\n if (className) {\r\n el.className = className;\r\n }\r\n if (appendToEl) {\r\n appendToEl.appendChild(el);\r\n }\r\n return el;\r\n}\r\n\r\n/**\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {Point}\r\n */\r\nexport function equalizePoints(p1, p2) {\r\n p1.x = p2.x;\r\n p1.y = p2.y;\r\n if (p2.id !== undefined) {\r\n p1.id = p2.id;\r\n }\r\n return p1;\r\n}\r\n\r\n/**\r\n * @param {Point} p\r\n */\r\nexport function roundPoint(p) {\r\n p.x = Math.round(p.x);\r\n p.y = Math.round(p.y);\r\n}\r\n\r\n/**\r\n * Returns distance between two points.\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {number}\r\n */\r\nexport function getDistanceBetween(p1, p2) {\r\n const x = Math.abs(p1.x - p2.x);\r\n const y = Math.abs(p1.y - p2.y);\r\n return Math.sqrt((x * x) + (y * y));\r\n}\r\n\r\n/**\r\n * Whether X and Y positions of points are equal\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n * @returns {boolean}\r\n */\r\nexport function pointsEqual(p1, p2) {\r\n return p1.x === p2.x && p1.y === p2.y;\r\n}\r\n\r\n/**\r\n * The float result between the min and max values.\r\n *\r\n * @param {number} val\r\n * @param {number} min\r\n * @param {number} max\r\n * @returns {number}\r\n */\r\nexport function clamp(val, min, max) {\r\n return Math.min(Math.max(val, min), max);\r\n}\r\n\r\n/**\r\n * Get transform string\r\n *\r\n * @param {number} x\r\n * @param {number} [y]\r\n * @param {number} [scale]\r\n * @returns {string}\r\n */\r\nexport function toTransformString(x, y, scale) {\r\n let propValue = `translate3d(${x}px,${y || 0}px,0)`;\r\n\r\n if (scale !== undefined) {\r\n propValue += ` scale3d(${scale},${scale},1)`;\r\n }\r\n\r\n return propValue;\r\n}\r\n\r\n/**\r\n * Apply transform:translate(x, y) scale(scale) to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {number} x\r\n * @param {number} [y]\r\n * @param {number} [scale]\r\n */\r\nexport function setTransform(el, x, y, scale) {\r\n el.style.transform = toTransformString(x, y, scale);\r\n}\r\n\r\nconst defaultCSSEasing = 'cubic-bezier(.4,0,.22,1)';\r\n\r\n/**\r\n * Apply CSS transition to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string} [prop] CSS property to animate\r\n * @param {number} [duration] in ms\r\n * @param {string} [ease] CSS easing function\r\n */\r\nexport function setTransitionStyle(el, prop, duration, ease) {\r\n // inOut: 'cubic-bezier(.4, 0, .22, 1)', // for \"toggle state\" transitions\r\n // out: 'cubic-bezier(0, 0, .22, 1)', // for \"show\" transitions\r\n // in: 'cubic-bezier(.4, 0, 1, 1)'// for \"hide\" transitions\r\n el.style.transition = prop\r\n ? `${prop} ${duration}ms ${ease || defaultCSSEasing}`\r\n : 'none';\r\n}\r\n\r\n/**\r\n * Apply width and height CSS properties to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string | number} w\r\n * @param {string | number} h\r\n */\r\nexport function setWidthHeight(el, w, h) {\r\n el.style.width = (typeof w === 'number') ? `${w}px` : w;\r\n el.style.height = (typeof h === 'number') ? `${h}px` : h;\r\n}\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n */\r\nexport function removeTransitionStyle(el) {\r\n setTransitionStyle(el);\r\n}\r\n\r\n/**\r\n * @param {HTMLImageElement} img\r\n * @returns {Promise}\r\n */\r\nexport function decodeImage(img) {\r\n if ('decode' in img) {\r\n return img.decode().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\nexport const LOAD_STATE = {\r\n IDLE: 'idle',\r\n LOADING: 'loading',\r\n LOADED: 'loaded',\r\n ERROR: 'error',\r\n};\r\n\r\n\r\n/**\r\n * Check if click or keydown event was dispatched\r\n * with a special key or via mouse wheel.\r\n *\r\n * @param {MouseEvent | KeyboardEvent} e\r\n * @returns {boolean}\r\n */\r\nexport function specialKeyUsed(e) {\r\n return ('button' in e && e.button === 1) || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey;\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\nexport function getElementsFromOption(option, legacySelector, parent = document) {\r\n /** @type {HTMLElement[]} */\r\n let elements = [];\r\n\r\n if (option instanceof Element) {\r\n elements = [option];\r\n } else if (option instanceof NodeList || Array.isArray(option)) {\r\n elements = Array.from(option);\r\n } else {\r\n const selector = typeof option === 'string' ? option : legacySelector;\r\n if (selector) {\r\n elements = Array.from(parent.querySelectorAll(selector));\r\n }\r\n }\r\n\r\n return elements;\r\n}\r\n\r\n/**\r\n * Check if variable is PhotoSwipe class\r\n *\r\n * @param {any} fn\r\n * @returns {boolean}\r\n */\r\nexport function isPswpClass(fn) {\r\n return typeof fn === 'function'\r\n && fn.prototype\r\n && fn.prototype.goTo;\r\n}\r\n\r\n/**\r\n * Check if browser is Safari\r\n *\r\n * @returns {boolean}\r\n */\r\nexport function isSafari() {\r\n return !!(navigator.vendor && navigator.vendor.match(/apple/i));\r\n}\r\n\r\n","/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\r\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('../slide/content.js').default} ContentDefault */\r\n/** @typedef {import('../slide/slide.js').default} Slide */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\r\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\r\n\r\n/**\r\n * Allow adding an arbitrary props to the Content\r\n * https://photoswipe.com/custom-content/#using-webp-image-format\r\n * @typedef {ContentDefault & Record} Content\r\n */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\r\n *\r\n *\r\n * https://photoswipe.com/adding-ui-elements/\r\n *\r\n * @prop {undefined} uiRegister\r\n * @prop {{ data: UIElementData }} uiElementCreate\r\n *\r\n *\r\n * https://photoswipe.com/events/#initialization-events\r\n *\r\n * @prop {undefined} beforeOpen\r\n * @prop {undefined} firstUpdate\r\n * @prop {undefined} initialLayout\r\n * @prop {undefined} change\r\n * @prop {undefined} afterInit\r\n * @prop {undefined} bindEvents\r\n *\r\n *\r\n * https://photoswipe.com/events/#opening-or-closing-transition-events\r\n *\r\n * @prop {undefined} openingAnimationStart\r\n * @prop {undefined} openingAnimationEnd\r\n * @prop {undefined} closingAnimationStart\r\n * @prop {undefined} closingAnimationEnd\r\n *\r\n *\r\n * https://photoswipe.com/events/#closing-events\r\n *\r\n * @prop {undefined} close\r\n * @prop {undefined} destroy\r\n *\r\n *\r\n * https://photoswipe.com/events/#pointer-and-gesture-events\r\n *\r\n * @prop {{ originalEvent: PointerEvent }} pointerDown\r\n * @prop {{ originalEvent: PointerEvent }} pointerMove\r\n * @prop {{ originalEvent: PointerEvent }} pointerUp\r\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\r\n * @prop {{ panY: number }} verticalDrag can be default prevented\r\n *\r\n *\r\n * https://photoswipe.com/events/#slide-content-events\r\n *\r\n * @prop {{ content: Content }} contentInit\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\r\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\r\n * @prop {{ content: Content; slide: Slide }} loadError\r\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\r\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\r\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\r\n * @prop {{ content: Content }} contentAppend can be default prevented\r\n * @prop {{ content: Content }} contentActivate can be default prevented\r\n * @prop {{ content: Content }} contentDeactivate can be default prevented\r\n * @prop {{ content: Content }} contentRemove can be default prevented\r\n * @prop {{ content: Content }} contentDestroy can be default prevented\r\n *\r\n *\r\n * undocumented\r\n *\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\r\n *\r\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\r\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\r\n * @prop {{ slide: Slide }} firstZoomPan\r\n * @prop {{ slide: Slide | undefined, data: SlideData, index: number }} gettingData\r\n * @prop {undefined} beforeResize\r\n * @prop {undefined} resize\r\n * @prop {undefined} viewportSize\r\n * @prop {undefined} updateScrollOffset\r\n * @prop {{ slide: Slide }} slideInit\r\n * @prop {{ slide: Slide }} afterSetContent\r\n * @prop {{ slide: Slide }} slideLoad\r\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\r\n * @prop {{ slide: Slide }} appendHeavyContent\r\n * @prop {{ slide: Slide }} slideActivate\r\n * @prop {{ slide: Slide }} slideDeactivate\r\n * @prop {{ slide: Slide }} slideDestroy\r\n * @prop {{ destZoomLevel: number, centerPoint: Point | undefined, transitionDuration: number | false | undefined }} beforeZoomTo\r\n * @prop {{ slide: Slide }} zoomPanUpdate\r\n * @prop {{ slide: Slide }} initialZoomPan\r\n * @prop {{ slide: Slide }} calcSlideSize\r\n * @prop {undefined} resolutionChanged\r\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\r\n * @prop {{ content: Content }} contentAppendImage can be default prevented\r\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\r\n * @prop {undefined} lazyLoad\r\n * @prop {{ slide: Slide }} calcBounds\r\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\r\n *\r\n *\r\n * legacy\r\n *\r\n * @prop {undefined} init\r\n * @prop {undefined} initialZoomIn\r\n * @prop {undefined} initialZoomOut\r\n * @prop {undefined} initialZoomInEnd\r\n * @prop {undefined} initialZoomOutEnd\r\n * @prop {{ dataSource: DataSource | undefined, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource | undefined) => number} numItems\r\n * Modify the total amount of slides. Example on Data sources page.\r\n * https://photoswipe.com/filters/#numitems\r\n *\r\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\r\n * Modify slide item data. Example on Data sources page.\r\n * https://photoswipe.com/filters/#itemdata\r\n *\r\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\r\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\r\n * https://photoswipe.com/filters/#domitemdata\r\n *\r\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\r\n * Modify clicked gallery item index.\r\n * https://photoswipe.com/filters/#clickedindex\r\n *\r\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\r\n * Modify placeholder image source.\r\n * https://photoswipe.com/filters/#placeholdersrc\r\n *\r\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\r\n * Modify if the content is currently loading.\r\n * https://photoswipe.com/filters/#iscontentloading\r\n *\r\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\r\n * Modify if the content can be zoomed.\r\n * https://photoswipe.com/filters/#iscontentzoomable\r\n *\r\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\r\n * Modify if the placeholder should be used for the content.\r\n * https://photoswipe.com/filters/#usecontentplaceholder\r\n *\r\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\r\n * Modify if the placeholder should be kept after the content is loaded.\r\n * https://photoswipe.com/filters/#iskeepingplaceholder\r\n *\r\n *\r\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\r\n * Modify an element when the content has error state (for example, if image cannot be loaded).\r\n * https://photoswipe.com/filters/#contenterrorelement\r\n *\r\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\r\n * Modify a UI element that's being created.\r\n * https://photoswipe.com/filters/#uielement\r\n *\r\n * @prop {(thumbnail: HTMLElement | null | undefined, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thubmnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds | undefined, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the 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 this.defaultPrevented = false;\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 | undefined} */\r\n this.pswp = undefined;\r\n\r\n /** @type {PhotoSwipeOptions | undefined} */\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 this.pswp?.addFilter(name, fn, priority);\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 this._filters[name]?.forEach((filter) => {\r\n // @ts-expect-error\r\n args[0] = filter.fn.apply(this, args);\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 this.pswp?.on(name, fn);\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 this.pswp?.off(name, fn);\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 this._listeners[name]?.forEach((listener) => {\r\n listener.call(this, event);\r\n });\r\n\r\n return event;\r\n }\r\n}\r\n\r\nexport default Eventable;\r\n","import { createElement, setWidthHeight, toTransformString } from '../util/util.js';\r\n\r\nclass Placeholder {\r\n /**\r\n * @param {string | false} imageSrc\r\n * @param {HTMLElement} container\r\n */\r\n constructor(imageSrc, container) {\r\n // Create placeholder\r\n // (stretched thumbnail or simple div behind the main image)\r\n /** @type {HTMLImageElement | HTMLDivElement | null} */\r\n this.element = createElement(\r\n 'pswp__img pswp__img--placeholder',\r\n imageSrc ? 'img' : 'div',\r\n container\r\n );\r\n\r\n if (imageSrc) {\r\n const imgEl = /** @type {HTMLImageElement} */ (this.element);\r\n imgEl.decoding = 'async';\r\n imgEl.alt = '';\r\n imgEl.src = imageSrc;\r\n imgEl.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}\r\n\r\nexport default Placeholder;\r\n","import { createElement, isSafari, LOAD_STATE, setWidthHeight } from '../util/util.js';\r\nimport Placeholder from './placeholder.js';\r\n\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\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 {PhotoSwipeBase} 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 | undefined} */\r\n this.element = undefined;\r\n /** @type {Placeholder | undefined} */\r\n this.placeholder = undefined;\r\n /** @type {Slide | undefined} */\r\n this.slide = 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 this.isDecoding = 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 = undefined;\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', 'div');\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 if (!this.isImageContent()\r\n || !this.element\r\n || this.instance.dispatch('contentLoadImage', { content: this, isLazy }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n const imageElement = /** @type HTMLImageElement */ (this.element);\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 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 && this.element) {\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 /**\r\n * @returns {Boolean} If the content is in error state\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 if (this.instance.dispatch(\r\n 'contentResize',\r\n { content: this, width, height }).defaultPrevented\r\n ) {\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 this.instance.dispatch(\r\n 'imageSizeChange',\r\n { slide: this.slide, width, height, content: this }\r\n );\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 if (!this.isImageContent() || !this.element || !this.data.srcset) {\r\n return;\r\n }\r\n\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 (\r\n !image.dataset.largestUsedSize\r\n || sizesWidth > parseInt(image.dataset.largestUsedSize, 10)\r\n ) {\r\n image.sizes = sizesWidth + 'px';\r\n image.dataset.largestUsedSize = String(sizesWidth);\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 = undefined;\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 = undefined;\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 = undefined;\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 let errorMsgEl = createElement('pswp__error-msg', 'div');\r\n errorMsgEl.innerText = this.instance.options?.errorMsg ?? '';\r\n errorMsgEl = /** @type {HTMLDivElement} */ (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', 'div');\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 || !this.element) {\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.slide && !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 || !this.slide) {\r\n return;\r\n }\r\n\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 * 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}\r\n\r\nexport default Content;\r\n","/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipeBase} pswp\r\n * @returns {Point}\r\n */\r\nexport function getViewportSize(options, pswp) {\r\n if (options.getViewportSizeFn) {\r\n const newViewportSize = options.getViewportSizeFn(options, pswp);\r\n if (newViewportSize) {\r\n return newViewportSize;\r\n }\r\n }\r\n\r\n return {\r\n x: document.documentElement.clientWidth,\r\n\r\n // TODO: height on mobile is very incosistent due to toolbar\r\n // find a way to improve this\r\n //\r\n // document.documentElement.clientHeight - doesn't seem to work well\r\n y: window.innerHeight\r\n };\r\n}\r\n\r\n/**\r\n * Parses padding option.\r\n * Supported formats:\r\n *\r\n * // Object\r\n * padding: {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * }\r\n *\r\n * // A function that returns the object\r\n * paddingFn: (viewportSize, itemData, index) => {\r\n * return {\r\n * top: 0,\r\n * bottom: 0,\r\n * left: 0,\r\n * right: 0\r\n * };\r\n * }\r\n *\r\n * // Legacy variant\r\n * paddingLeft: 0,\r\n * paddingRight: 0,\r\n * paddingTop: 0,\r\n * paddingBottom: 0,\r\n *\r\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {Point} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index Slide index\r\n * @returns {number}\r\n */\r\nexport function parsePaddingOption(prop, options, viewportSize, itemData, index) {\r\n let paddingValue = 0;\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 Number(paddingValue) || 0;\r\n}\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {Point} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n * @returns {Point}\r\n */\r\nexport function getPanAreaSize(options, viewportSize, itemData, index) {\r\n return {\r\n x: viewportSize.x\r\n - parsePaddingOption('left', options, viewportSize, itemData, index)\r\n - parsePaddingOption('right', options, viewportSize, itemData, index),\r\n y: viewportSize.y\r\n - parsePaddingOption('top', options, viewportSize, itemData, index)\r\n - parsePaddingOption('bottom', options, viewportSize, itemData, index)\r\n };\r\n}\r\n","const MAX_IMAGE_WIDTH = 4000;\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').Point} Point */\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 /** @type { Point | null } */\r\n this.panAreaSize = null;\r\n /** @type { Point | null } */\r\n this.elementSize = null;\r\n this.fit = 1;\r\n this.fill = 1;\r\n this.vFill = 1;\r\n this.initial = 1;\r\n this.secondary = 1;\r\n this.max = 1;\r\n this.min = 1;\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 {Point} panAreaSize\r\n */\r\n update(maxWidth, maxHeight, panAreaSize) {\r\n /** @type {Point} */\r\n const elementSize = { x: maxWidth, y: maxHeight };\r\n this.elementSize = elementSize;\r\n this.panAreaSize = panAreaSize;\r\n\r\n const hRatio = panAreaSize.x / elementSize.x;\r\n const vRatio = panAreaSize.y / 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 * @returns { number | undefined }\r\n */\r\n _parseZoomLevelOption(optionPrefix) {\r\n const optionName = /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */ (\r\n optionPrefix + 'ZoomLevel'\r\n );\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 (this.elementSize && 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 // max zoom level is x4 from \"fit state\",\r\n // used for zoom gesture and ctrl/trackpad zoom\r\n return this._parseZoomLevelOption('max') || Math.max(1, this.fit * 4);\r\n }\r\n}\r\n\r\nexport default ZoomLevel;\r\n","import { getViewportSize, getPanAreaSize } from '../util/viewport-size.js';\r\nimport ZoomLevel from './zoom-level.js';\r\n\r\n/** @typedef {import('./content.js').default} Content */\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\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 {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\r\nexport function lazyLoadData(itemData, instance, index) {\r\n const content = instance.createContentFromData(itemData, index);\r\n /** @type {ZoomLevel | undefined} */\r\n let zoomLevel;\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 if (options) {\r\n zoomLevel = new ZoomLevel(options, itemData, -1);\r\n\r\n let viewportSize;\r\n if (instance.pswp) {\r\n viewportSize = instance.pswp.viewportSize;\r\n } else {\r\n viewportSize = getViewportSize(options, instance);\r\n }\r\n\r\n const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\r\n zoomLevel.update(content.width, content.height, panAreaSize);\r\n }\r\n\r\n content.lazyLoad();\r\n\r\n if (zoomLevel) {\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\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 {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n * @returns {Content | undefined}\r\n */\r\nexport function lazyLoadSlide(index, instance) {\r\n const itemData = instance.getItemData(index);\r\n\r\n if (instance.dispatch('lazyLoadSlide', { index, itemData }).defaultPrevented) {\r\n return;\r\n }\r\n\r\n return lazyLoadData(itemData, instance, index);\r\n}\r\n\r\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} initialIndex\r\n */\r\n loadSlideByIndex(initialIndex) {\r\n const index = this.pswp.getLoopedIndex(initialIndex);\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 * @returns {Content}\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 this.addToCache(content);\r\n }\r\n\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 * @returns {Content | undefined}\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 = [];\r\n }\r\n}\r\n\r\nexport default ContentLoader;\r\n","import Eventable from './eventable.js';\r\nimport { getElementsFromOption } from '../util/util.js';\r\nimport Content from '../slide/content.js';\r\nimport { lazyLoadData } from '../slide/loader.js';\r\n\r\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\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 = 0;\r\n const dataSource = this.options?.dataSource;\r\n\r\n if (dataSource && 'length' in dataSource) {\r\n // may be an array or just object with length property\r\n numItems = dataSource.length;\r\n } else if (dataSource && '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 * @returns {Content}\r\n */\r\n createContentFromData(slideData, index) {\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 * @returns {SlideData}\r\n */\r\n getItemData(index) {\r\n const dataSource = this.options?.dataSource;\r\n /** @type {SlideData | HTMLElement} */\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 && 'gallery' in dataSource) {\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 * @returns {HTMLElement[]}\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 * @returns {SlideData}\r\n */\r\n _domElementToItemData(element) {\r\n /** @type {SlideData} */\r\n const itemData = {\r\n element\r\n };\r\n\r\n const linkEl = /** @type {HTMLAnchorElement} */ (\r\n element.tagName === 'A'\r\n ? element\r\n : element.querySelector('a')\r\n );\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 = linkEl.dataset.pswpWidth ? parseInt(linkEl.dataset.pswpWidth, 10) : 0;\r\n itemData.height = linkEl.dataset.pswpHeight ? parseInt(linkEl.dataset.pswpHeight, 10) : 0;\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 {Content} 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}\r\n\r\nexport default PhotoSwipeBase;\r\n","import {\r\n specialKeyUsed,\r\n getElementsFromOption,\r\n isPswpClass\r\n} from '../util/util.js';\r\n\r\nimport PhotoSwipeBase from '../core/base.js';\r\nimport { lazyLoadSlide } from '../slide/loader.js';\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Type} Type\r\n */\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n/** @typedef {import('../slide/content.js').default} Content */\r\n/** @typedef {import('../core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\r\n/** @typedef {import('../core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {import('../core/eventable.js').EventCallback} EventCallback\r\n */\r\n\r\n/**\r\n * PhotoSwipe Lightbox\r\n *\r\n * - If user has unsupported browser it falls back to default browser action (just opens URL)\r\n * - Binds click event to links that should open PhotoSwipe\r\n * - parses DOM strcture for PhotoSwipe (retrieves large image URLs and sizes)\r\n * - Initializes PhotoSwipe\r\n *\r\n *\r\n * Loader options use the same object as PhotoSwipe, and supports such options:\r\n *\r\n * gallery - Element | Element[] | NodeList | string selector for the gallery element\r\n * children - Element | Element[] | NodeList | string selector for the gallery children\r\n *\r\n */\r\nclass PhotoSwipeLightbox extends PhotoSwipeBase {\r\n /**\r\n * @param {PhotoSwipeOptions} [options]\r\n */\r\n constructor(options) {\r\n super();\r\n /** @type {PhotoSwipeOptions} */\r\n this.options = options || {};\r\n this._uid = 0;\r\n this.shouldOpen = false;\r\n /**\r\n * @private\r\n * @type {Content | undefined}\r\n */\r\n this._preloadedContent = undefined;\r\n\r\n this.onThumbnailsClick = this.onThumbnailsClick.bind(this);\r\n }\r\n\r\n /**\r\n * Initialize lightbox, should be called only once.\r\n * It's not included in the main constructor, so you may bind events before it.\r\n */\r\n init() {\r\n // Bind click events to each gallery\r\n getElementsFromOption(this.options.gallery, this.options.gallerySelector)\r\n .forEach((galleryElement) => {\r\n galleryElement.addEventListener('click', this.onThumbnailsClick, false);\r\n });\r\n }\r\n\r\n /**\r\n * @param {MouseEvent} e\r\n */\r\n onThumbnailsClick(e) {\r\n // Exit and allow default browser action if:\r\n if (specialKeyUsed(e) // ... if clicked with a special key (ctrl/cmd...)\r\n || window.pswp // ... if PhotoSwipe is already open\r\n || window.navigator.onLine === false) { // ... if offline\r\n return;\r\n }\r\n\r\n // If both clientX and clientY are 0 or not defined,\r\n // the event is likely triggered by keyboard,\r\n // so we do not pass the initialPoint\r\n //\r\n // Note that some screen readers emulate the mouse position,\r\n // so it's not the ideal way to detect them.\r\n //\r\n /** @type {Point | null} */\r\n let initialPoint = { x: e.clientX, y: e.clientY };\r\n\r\n if (!initialPoint.x && !initialPoint.y) {\r\n initialPoint = null;\r\n }\r\n\r\n let clickedIndex = this.getClickedIndex(e);\r\n clickedIndex = this.applyFilters('clickedIndex', clickedIndex, e, this);\r\n /** @type {DataSource} */\r\n const dataSource = {\r\n gallery: /** @type {HTMLElement} */ (e.currentTarget)\r\n };\r\n\r\n if (clickedIndex >= 0) {\r\n e.preventDefault();\r\n this.loadAndOpen(clickedIndex, dataSource, initialPoint);\r\n }\r\n }\r\n\r\n /**\r\n * Get index of gallery item that was clicked.\r\n *\r\n * @param {MouseEvent} e click event\r\n * @returns {number}\r\n */\r\n getClickedIndex(e) {\r\n // legacy option\r\n if (this.options.getClickedIndexFn) {\r\n return this.options.getClickedIndexFn.call(this, e);\r\n }\r\n\r\n const clickedTarget = /** @type {HTMLElement} */ (e.target);\r\n const childElements = getElementsFromOption(\r\n this.options.children,\r\n this.options.childSelector,\r\n /** @type {HTMLElement} */ (e.currentTarget)\r\n );\r\n const clickedChildIndex = childElements.findIndex(\r\n child => child === clickedTarget || child.contains(clickedTarget)\r\n );\r\n\r\n if (clickedChildIndex !== -1) {\r\n return clickedChildIndex;\r\n } else if (this.options.children || this.options.childSelector) {\r\n // click wasn't on a child element\r\n return -1;\r\n }\r\n\r\n // There is only one item (which is the gallery)\r\n return 0;\r\n }\r\n\r\n /**\r\n * Load and open PhotoSwipe\r\n *\r\n * @param {number} index\r\n * @param {DataSource} dataSource\r\n * @param {Point | null} [initialPoint]\r\n * @returns {boolean}\r\n */\r\n loadAndOpen(index, dataSource, initialPoint) {\r\n // Check if the gallery is already open\r\n if (window.pswp) {\r\n return false;\r\n }\r\n\r\n // set initial index\r\n this.options.index = index;\r\n\r\n // define options for PhotoSwipe constructor\r\n this.options.initialPointerPos = initialPoint;\r\n\r\n this.shouldOpen = true;\r\n this.preload(index, dataSource);\r\n return true;\r\n }\r\n\r\n /**\r\n * Load the main module and the slide content by index\r\n *\r\n * @param {number} index\r\n * @param {DataSource} [dataSource]\r\n */\r\n preload(index, dataSource) {\r\n const { options } = this;\r\n\r\n if (dataSource) {\r\n options.dataSource = dataSource;\r\n }\r\n\r\n // Add the main module\r\n /** @type {Promise>[]} */\r\n const promiseArray = [];\r\n\r\n const pswpModuleType = typeof options.pswpModule;\r\n if (isPswpClass(options.pswpModule)) {\r\n promiseArray.push(Promise.resolve(/** @type {Type} */ (options.pswpModule)));\r\n } else if (pswpModuleType === 'string') {\r\n throw new Error('pswpModule as string is no longer supported');\r\n } else if (pswpModuleType === 'function') {\r\n promiseArray.push(/** @type {() => Promise>} */ (options.pswpModule)());\r\n } else {\r\n throw new Error('pswpModule is not valid');\r\n }\r\n\r\n // Add custom-defined promise, if any\r\n if (typeof options.openPromise === 'function') {\r\n // allow developers to perform some task before opening\r\n promiseArray.push(options.openPromise());\r\n }\r\n\r\n if (options.preloadFirstSlide !== false && index >= 0) {\r\n this._preloadedContent = lazyLoadSlide(index, this);\r\n }\r\n\r\n // Wait till all promises resolve and open PhotoSwipe\r\n const uid = ++this._uid;\r\n Promise.all(promiseArray).then((iterableModules) => {\r\n if (this.shouldOpen) {\r\n const mainModule = iterableModules[0];\r\n this._openPhotoswipe(mainModule, uid);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {Type | { default: Type }} module\r\n * @param {number} uid\r\n */\r\n _openPhotoswipe(module, uid) {\r\n // Cancel opening if UID doesn't match the current one\r\n // (if user clicked on another gallery item before current was loaded).\r\n //\r\n // Or if shouldOpen flag is set to false\r\n // (developer may modify it via public API)\r\n if (uid !== this._uid && this.shouldOpen) {\r\n return;\r\n }\r\n\r\n this.shouldOpen = false;\r\n\r\n // PhotoSwipe is already open\r\n if (window.pswp) {\r\n return;\r\n }\r\n\r\n /**\r\n * Pass data to PhotoSwipe and open init\r\n *\r\n * @type {PhotoSwipe}\r\n */\r\n const pswp = typeof module === 'object'\r\n ? new module.default(this.options) // eslint-disable-line\r\n : new module(this.options); // eslint-disable-line\r\n\r\n this.pswp = pswp;\r\n window.pswp = pswp;\r\n\r\n // map listeners from Lightbox to PhotoSwipe Core\r\n /** @type {(keyof PhotoSwipeEventsMap)[]} */\r\n (Object.keys(this._listeners)).forEach((name) => {\r\n this._listeners[name]?.forEach((fn) => {\r\n pswp.on(name, /** @type {EventCallback} */(fn));\r\n });\r\n });\r\n\r\n // same with filters\r\n /** @type {(keyof PhotoSwipeFiltersMap)[]} */\r\n (Object.keys(this._filters)).forEach((name) => {\r\n this._filters[name]?.forEach((filter) => {\r\n pswp.addFilter(name, filter.fn, filter.priority);\r\n });\r\n });\r\n\r\n if (this._preloadedContent) {\r\n pswp.contentLoader.addToCache(this._preloadedContent);\r\n this._preloadedContent = undefined;\r\n }\r\n\r\n pswp.on('destroy', () => {\r\n // clean up public variables\r\n this.pswp = undefined;\r\n delete window.pswp;\r\n });\r\n\r\n pswp.init();\r\n }\r\n\r\n /**\r\n * Unbinds all events, closes PhotoSwipe if it's open.\r\n */\r\n destroy() {\r\n this.pswp?.destroy();\r\n\r\n this.shouldOpen = false;\r\n this._listeners = {};\r\n\r\n getElementsFromOption(this.options.gallery, this.options.gallerySelector)\r\n .forEach((galleryElement) => {\r\n galleryElement.removeEventListener('click', this.onThumbnailsClick, false);\r\n });\r\n }\r\n}\r\n\r\nexport default PhotoSwipeLightbox;\r\n","var $ = require('../internals/export');\nvar fill = require('../internals/array-fill');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// `Array.prototype.fill` method\n// https://tc39.es/ecma262/#sec-array.prototype.fill\n$({ target: 'Array', proto: true }, {\n fill: fill\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('fill');\n","'use strict';\nvar $ = require('../internals/export');\nvar $findIndex = require('../internals/array-iteration').findIndex;\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\nvar FIND_INDEX = 'findIndex';\nvar SKIPS_HOLES = true;\n\n// Shouldn't skip holes\nif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.findIndex` method\n// https://tc39.es/ecma262/#sec-array.prototype.findindex\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND_INDEX);\n"],"sourceRoot":""}