{"version":3,"file":"shared/chunks/2834.0c17c9ff4f173468262a.js","mappings":"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","sources":["webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/isPlainObject.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/extend.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/canUseDOM.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/setFocusOn.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/Base/Base.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/resolve.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/round.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/isScrollable.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/ResizeObserver.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/PointerTracker.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/getTextNodeFromPoint.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Panzoom/Panzoom.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/getDimensions.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Panzoom/plugins/index.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/throttle.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Carousel/plugins/Navigation/Navigation.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Carousel/plugins/Sync/Sync.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Carousel/plugins/index.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Carousel/plugins/Dots/Dots.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Carousel/Carousel.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Carousel/l10n/en.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Fancybox/plugins/Thumbs/Thumbs.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Fancybox/plugins/Html/Html.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Fancybox/plugins/Image/Image.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Fancybox/plugins/Hash/Hash.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/Fullscreen.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/shared/utils/Slideshow.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Fancybox/plugins/Toolbar/Toolbar.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Fancybox/plugins/index.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Fancybox/plugins/ScrollLock/ScrollLock.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Fancybox/Fancybox.js","webpack://dsposal.web/./node_modules/@fancyapps/ui/src/Fancybox/l10n/en.js"],"sourcesContent":["/**\n * Check to see if an object is a plain object (created using \"{}\" or \"new Object\").\n * @param {*} obj Variable of any type\n * @returns {Boolean}\n */\nexport const isPlainObject = (obj) => {\n return (\n // separate from primitives\n typeof obj === \"object\" &&\n // is obvious\n obj !== null &&\n // separate instances (Array, DOM, ...)\n obj.constructor === Object &&\n // separate build-in like Math\n Object.prototype.toString.call(obj) === \"[object Object]\"\n );\n};\n","import { isPlainObject } from \"./isPlainObject.js\";\n\n/**\n * Merge the contents of two or more objects together into the first object.\n * If passing \"true\" for first argument, the merge becomes recursive (aka. deep copy).\n * @param {...any} args\n * @returns {Object}\n */\nexport const extend = (...args) => {\n let deep = false;\n\n if (typeof args[0] == \"boolean\") {\n deep = args.shift();\n }\n\n let result = args[0];\n\n if (!result || typeof result !== \"object\") {\n throw new Error(\"extendee must be an object\");\n }\n\n const extenders = args.slice(1);\n const len = extenders.length;\n\n for (let i = 0; i < len; i++) {\n const extender = extenders[i];\n\n for (let key in extender) {\n if (extender.hasOwnProperty(key)) {\n const value = extender[key];\n\n if (deep && (Array.isArray(value) || isPlainObject(value))) {\n const base = Array.isArray(value) ? [] : {};\n\n result[key] = extend(true, result.hasOwnProperty(key) ? result[key] : base, value);\n } else {\n result[key] = value;\n }\n }\n }\n }\n\n return result;\n};\n","/**\r\n * Detect if rendering from the client or the server\r\n */\r\nexport const canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\r\n","import { canUseDOM } from \"./canUseDOM.js\";\r\n\r\nlet preventScrollSupported = null;\r\n\r\nexport const FOCUSABLE_ELEMENTS = [\r\n \"a[href]\",\r\n \"area[href]\",\r\n 'input:not([disabled]):not([type=\"hidden\"]):not([aria-hidden])',\r\n \"select:not([disabled]):not([aria-hidden])\",\r\n \"textarea:not([disabled]):not([aria-hidden])\",\r\n \"button:not([disabled]):not([aria-hidden])\",\r\n \"iframe\",\r\n \"object\",\r\n \"embed\",\r\n \"video\",\r\n \"audio\",\r\n \"[contenteditable]\",\r\n '[tabindex]:not([tabindex^=\"-\"]):not([disabled]):not([aria-hidden])',\r\n];\r\n\r\nexport const setFocusOn = (node) => {\r\n if (!node || !canUseDOM) {\r\n return;\r\n }\r\n\r\n if (preventScrollSupported === null) {\r\n document.createElement(\"div\").focus({\r\n get preventScroll() {\r\n preventScrollSupported = true;\r\n\r\n return false;\r\n },\r\n });\r\n }\r\n\r\n try {\r\n if (node.setActive) {\r\n // IE/Edge\r\n node.setActive();\r\n } else if (preventScrollSupported) {\r\n // Modern browsers\r\n node.focus({ preventScroll: true });\r\n } else {\r\n // Safari does not support `preventScroll` option\r\n // https://bugs.webkit.org/show_bug.cgi?id=178583\r\n\r\n // Save position\r\n const scrollTop = window.pageXOffset || document.body.scrollTop;\r\n const scrollLeft = window.pageYOffset || document.body.scrollLeft;\r\n\r\n node.focus();\r\n\r\n document.body.scrollTo({\r\n top: scrollTop,\r\n left: scrollLeft,\r\n behavior: \"auto\",\r\n });\r\n }\r\n } catch (e) {}\r\n};\r\n","import { extend } from \"../utils/extend.js\";\nimport { resolve } from \"../utils/resolve.js\";\nimport { isPlainObject } from \"../utils/isPlainObject.js\";\n\n/**\n * Base class, all components inherit from this class\n */\nexport class Base {\n /**\n * Base constructor\n * @param {Object} [options] - Options as `key: value` pairs\n */\n constructor(options = {}) {\n this.options = extend(true, {}, options);\n\n this.plugins = [];\n this.events = {};\n\n // * Prefill with initial events\n for (const type of [\"on\", \"once\"]) {\n for (const args of Object.entries(this.options[type] || {})) {\n this[type](...args);\n }\n }\n }\n\n /**\n * Retrieve option value by key, supports subkeys\n * @param {String} key Option name\n * @param {*} [fallback] Fallback value for non-existing key\n * @returns {*}\n */\n option(key, fallback, ...rest) {\n // Make sure it is string\n key = String(key);\n\n let value = resolve(key, this.options);\n\n // Allow to have functions as options\n if (typeof value === \"function\") {\n value = value.call(this, this, ...rest);\n }\n\n return value === undefined ? fallback : value;\n }\n\n /**\n * Simple l10n support - replaces object keys\n * found in template with corresponding values\n * @param {String} str String containing values to localize\n * @param {Array} params Substitute parameters\n * @returns {String}\n */\n localize(str, params = []) {\n str = String(str).replace(/\\{\\{(\\w+).?(\\w+)?\\}\\}/g, (match, key, subkey) => {\n let rez = \"\";\n\n // Plugins have `Plugin.l10n.KEY`\n if (subkey) {\n rez = this.option(`${key[0] + key.toLowerCase().substring(1)}.l10n.${subkey}`);\n } else if (key) {\n rez = this.option(`l10n.${key}`);\n }\n\n if (!rez) {\n rez = match;\n }\n\n for (let index = 0; index < params.length; index++) {\n rez = rez.split(params[index][0]).join(params[index][1]);\n }\n\n return rez;\n });\n\n str = str.replace(/\\{\\{(.*)\\}\\}/, (match, key) => {\n return key;\n });\n\n return str;\n }\n\n /**\n * Subscribe to an event\n * @param {String} name\n * @param {Function} callback\n * @returns {Object}\n */\n on(name, callback) {\n if (isPlainObject(name)) {\n for (const args of Object.entries(name)) {\n this.on(...args);\n }\n\n return this;\n }\n\n String(name)\n .split(\" \")\n .forEach((item) => {\n const listeners = (this.events[item] = this.events[item] || []);\n\n if (listeners.indexOf(callback) == -1) {\n listeners.push(callback);\n }\n });\n\n return this;\n }\n\n /**\n * Subscribe to an event only once\n * @param {String} name\n * @param {Function} callback\n * @returns {Object}\n */\n once(name, callback) {\n if (isPlainObject(name)) {\n for (const args of Object.entries(name)) {\n this.once(...args);\n }\n\n return this;\n }\n\n String(name)\n .split(\" \")\n .forEach((item) => {\n const listener = (...details) => {\n this.off(item, listener);\n callback.call(this, this, ...details);\n };\n\n listener._ = callback;\n\n this.on(item, listener);\n });\n\n return this;\n }\n\n /**\n * Unsubscribe event with name and callback\n * @param {String} name\n * @param {Function} callback\n * @returns {Object}\n */\n off(name, callback) {\n if (isPlainObject(name)) {\n for (const args of Object.entries(name)) {\n this.off(...args);\n }\n\n return;\n }\n\n name.split(\" \").forEach((item) => {\n const listeners = this.events[item];\n\n if (!listeners || !listeners.length) {\n return this;\n }\n\n let index = -1;\n\n for (let i = 0, len = listeners.length; i < len; i++) {\n const listener = listeners[i];\n\n if (listener && (listener === callback || listener._ === callback)) {\n index = i;\n break;\n }\n }\n\n if (index != -1) {\n listeners.splice(index, 1);\n }\n });\n\n return this;\n }\n\n /**\n * Emit an event.\n * If present, `\"*\"` handlers are invoked after name-matched handlers.\n * @param {String} name\n * @param {...any} details\n * @returns {Boolean}\n */\n trigger(name, ...details) {\n for (const listener of [...(this.events[name] || [])].slice()) {\n if (listener && listener.call(this, this, ...details) === false) {\n return false;\n }\n }\n\n // A wildcard \"*\" event type\n for (const listener of [...(this.events[\"*\"] || [])].slice()) {\n if (listener && listener.call(this, name, this, ...details) === false) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Add given plugins to this instance,\n * this will end up calling `attach` method of each plugin\n * @param {Object} Plugins\n * @returns {Object}\n */\n attachPlugins(plugins) {\n const newPlugins = {};\n\n for (const [key, Plugin] of Object.entries(plugins || {})) {\n // Check if this plugin is not disabled by option\n if (this.options[key] !== false && !this.plugins[key]) {\n // Populate options with defaults from the plugin\n this.options[key] = extend({}, Plugin.defaults || {}, this.options[key]);\n\n // Initialise plugin\n newPlugins[key] = new Plugin(this);\n }\n }\n\n for (const [key, plugin] of Object.entries(newPlugins)) {\n plugin.attach(this);\n }\n\n this.plugins = Object.assign({}, this.plugins, newPlugins);\n\n return this;\n }\n\n /**\n * Remove all plugin instances from this instance,\n * this will end up calling `detach` method of each plugin\n * @returns {Object}\n */\n detachPlugins() {\n for (const key in this.plugins) {\n let plugin;\n\n if ((plugin = this.plugins[key]) && typeof plugin.detach === \"function\") {\n plugin.detach(this);\n }\n }\n\n this.plugins = {};\n\n return this;\n }\n}\n","/**\n * Access nested JavaScript objects by string path.\n * Example: `resolve(\"a.b.c\", {a:{b:{c:\"d\"}})` would return `d`\n * @param {String} path\n * @param {Object} obj\n * @returns {*}\n */\nexport const resolve = function (path, obj) {\n return path.split(\".\").reduce(function (prev, curr) {\n return prev && prev[curr];\n }, obj);\n};\n","/**\n * Round half up; to be more specific and to ensure things like 1.005 round correctly\n * @param {Float} value\n * @param {Integer} precision\n * @returns {Float}\n */\nexport const round = (value, precision = 10000) => {\n value = parseFloat(value) || 0;\n\n return Math.round((value + Number.EPSILON) * precision) / precision;\n};\n","/**\n * Check if element has scrollable content\n * @param {Node} node\n * @returns {Boolean}\n */\nexport const hasScrollbars = function (node) {\n const overflowY = getComputedStyle(node)[\"overflow-y\"],\n overflowX = getComputedStyle(node)[\"overflow-x\"],\n vertical = (overflowY === \"scroll\" || overflowY === \"auto\") && Math.abs(node.scrollHeight - node.clientHeight) > 1,\n horizontal = (overflowX === \"scroll\" || overflowX === \"auto\") && Math.abs(node.scrollWidth - node.clientWidth) > 1;\n\n return vertical || horizontal;\n};\n\n/**\n * Check if element or one of the parents is scrollable\n * @param {Node} node DOM Node element\n * @returns {Boolean}\n */\nexport const isScrollable = function (node) {\n if (!node || !(typeof node === \"object\" && node instanceof Element) || node === document.body) {\n return false;\n }\n\n if (node.__Panzoom) {\n return false;\n }\n\n if (hasScrollbars(node)) {\n return node;\n }\n\n return isScrollable(node.parentNode);\n};\n","/**\n * ResizeObserver Polyfill\n */\nexport const ResizeObserver =\n (typeof window !== \"undefined\" && window.ResizeObserver) ||\n class {\n constructor(callback) {\n this.observables = [];\n // Array of observed elements that looks like this:\n // [{\n // el: domNode,\n // size: {height: x, width: y}\n // }]\n this.boundCheck = this.check.bind(this);\n this.boundCheck();\n this.callback = callback;\n }\n\n observe(el) {\n if (this.observables.some((observable) => observable.el === el)) {\n return;\n }\n\n const newObservable = {\n el: el,\n size: {\n height: el.clientHeight,\n width: el.clientWidth,\n },\n };\n\n this.observables.push(newObservable);\n }\n\n unobserve(el) {\n this.observables = this.observables.filter((obj) => obj.el !== el);\n }\n\n disconnect() {\n this.observables = [];\n }\n\n check() {\n const changedEntries = this.observables\n .filter((obj) => {\n const currentHeight = obj.el.clientHeight;\n const currentWidth = obj.el.clientWidth;\n if (obj.size.height !== currentHeight || obj.size.width !== currentWidth) {\n obj.size.height = currentHeight;\n obj.size.width = currentWidth;\n return true;\n }\n })\n .map((obj) => obj.el);\n\n if (changedEntries.length > 0) {\n this.callback(changedEntries);\n }\n\n window.requestAnimationFrame(this.boundCheck);\n }\n };\n","class Pointer {\r\n constructor(nativePointer) {\r\n this.id = self.Touch && nativePointer instanceof Touch ? nativePointer.identifier : -1;\r\n\r\n this.pageX = nativePointer.pageX;\r\n this.pageY = nativePointer.pageY;\r\n\r\n this.clientX = nativePointer.clientX;\r\n this.clientY = nativePointer.clientY;\r\n }\r\n}\r\n\r\nconst getDistance = (a, b) => {\r\n if (!b) {\r\n return 0;\r\n }\r\n\r\n return Math.sqrt((b.clientX - a.clientX) ** 2 + (b.clientY - a.clientY) ** 2);\r\n};\r\n\r\nconst getMidpoint = (a, b) => {\r\n if (!b) {\r\n return a;\r\n }\r\n\r\n return {\r\n clientX: (a.clientX + b.clientX) / 2,\r\n clientY: (a.clientY + b.clientY) / 2,\r\n };\r\n};\r\n\r\nconst isTouchEvent = (event) => \"changedTouches\" in event;\r\n\r\nclass PointerTracker {\r\n constructor(_element, { start = () => true, move = () => {}, end = () => {} } = {}) {\r\n this._element = _element;\r\n\r\n this.startPointers = [];\r\n this.currentPointers = [];\r\n\r\n this._pointerStart = (event) => {\r\n if (event.buttons > 0 && event.button !== 0) {\r\n return;\r\n }\r\n\r\n const pointer = new Pointer(event);\r\n\r\n if (this.currentPointers.some((p) => p.id === pointer.id)) {\r\n return;\r\n }\r\n\r\n if (!this._triggerPointerStart(pointer, event)) {\r\n return;\r\n }\r\n\r\n window.addEventListener(\"mousemove\", this._move);\r\n window.addEventListener(\"mouseup\", this._pointerEnd);\r\n };\r\n\r\n this._touchStart = (event) => {\r\n for (const touch of Array.from(event.changedTouches || [])) {\r\n this._triggerPointerStart(new Pointer(touch), event);\r\n }\r\n };\r\n\r\n this._move = (event) => {\r\n const previousPointers = this.currentPointers.slice();\r\n const changedPointers = isTouchEvent(event)\r\n ? Array.from(event.changedTouches).map((t) => new Pointer(t))\r\n : [new Pointer(event)];\r\n\r\n const trackedChangedPointers = [];\r\n\r\n for (const pointer of changedPointers) {\r\n const index = this.currentPointers.findIndex((p) => p.id === pointer.id);\r\n\r\n if (index < 0) {\r\n continue;\r\n }\r\n\r\n trackedChangedPointers.push(pointer);\r\n\r\n this.currentPointers[index] = pointer;\r\n }\r\n\r\n this._moveCallback(previousPointers, this.currentPointers.slice(), event);\r\n };\r\n\r\n this._triggerPointerEnd = (pointer, event) => {\r\n const index = this.currentPointers.findIndex((p) => p.id === pointer.id);\r\n\r\n if (index < 0) {\r\n return false;\r\n }\r\n\r\n this.currentPointers.splice(index, 1);\r\n this.startPointers.splice(index, 1);\r\n\r\n this._endCallback(pointer, event);\r\n\r\n return true;\r\n };\r\n\r\n this._pointerEnd = (event) => {\r\n if (event.buttons > 0 && event.button !== 0) {\r\n return;\r\n }\r\n\r\n if (!this._triggerPointerEnd(new Pointer(event), event)) {\r\n return;\r\n }\r\n\r\n window.removeEventListener(\"mousemove\", this._move, { passive: false });\r\n window.removeEventListener(\"mouseup\", this._pointerEnd, { passive: false });\r\n };\r\n\r\n this._touchEnd = (event) => {\r\n for (const touch of Array.from(event.changedTouches || [])) {\r\n this._triggerPointerEnd(new Pointer(touch), event);\r\n }\r\n };\r\n\r\n this._startCallback = start;\r\n this._moveCallback = move;\r\n this._endCallback = end;\r\n\r\n this._element.addEventListener(\"mousedown\", this._pointerStart, { passive: false });\r\n this._element.addEventListener(\"touchstart\", this._touchStart, { passive: false });\r\n this._element.addEventListener(\"touchmove\", this._move, { passive: false });\r\n this._element.addEventListener(\"touchend\", this._touchEnd);\r\n this._element.addEventListener(\"touchcancel\", this._touchEnd);\r\n }\r\n\r\n stop() {\r\n this._element.removeEventListener(\"mousedown\", this._pointerStart, { passive: false });\r\n this._element.removeEventListener(\"touchstart\", this._touchStart, { passive: false });\r\n this._element.removeEventListener(\"touchmove\", this._move, { passive: false });\r\n this._element.removeEventListener(\"touchend\", this._touchEnd);\r\n this._element.removeEventListener(\"touchcancel\", this._touchEnd);\r\n\r\n window.removeEventListener(\"mousemove\", this._move);\r\n window.removeEventListener(\"mouseup\", this._pointerEnd);\r\n }\r\n\r\n _triggerPointerStart(pointer, event) {\r\n if (!this._startCallback(pointer, event)) {\r\n return false;\r\n }\r\n\r\n this.currentPointers.push(pointer);\r\n this.startPointers.push(pointer);\r\n\r\n return true;\r\n }\r\n}\r\n\r\nexport { PointerTracker, getDistance, getMidpoint };\r\n","/**\n * Get element child node at the given coordinates\n * @param {Element} HTML element\n * @param {Float|Integer} x\n * @param {Float|Integer} y\n * @returns {Node|Boolean}}\n */\nexport const getTextNodeFromPoint = (element, x, y) => {\n const nodes = element.childNodes;\n const range = document.createRange();\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node.nodeType !== Node.TEXT_NODE) {\n continue;\n }\n\n range.selectNodeContents(node);\n\n const rect = range.getBoundingClientRect();\n\n if (x >= rect.left && y >= rect.top && x <= rect.right && y <= rect.bottom) {\n return node;\n }\n }\n\n return false;\n};\n","import { extend } from \"../shared/utils/extend.js\";\nimport { round } from \"../shared/utils/round.js\";\nimport { isScrollable } from \"../shared/utils/isScrollable.js\";\n\nimport { ResizeObserver } from \"../shared/utils/ResizeObserver.js\";\nimport { PointerTracker, getMidpoint, getDistance } from \"../shared/utils/PointerTracker.js\";\n\nimport { getTextNodeFromPoint } from \"../shared/utils/getTextNodeFromPoint.js\";\n\nimport { getFullWidth, getFullHeight, calculateAspectRatioFit } from \"../shared/utils/getDimensions.js\";\n\nimport { Base } from \"../shared/Base/Base.js\";\n\nimport { Plugins } from \"./plugins/index.js\";\n\nconst defaults = {\n // Enable touch guestures\n touch: true,\n\n // Enable zooming\n zoom: true,\n\n // Enable pinch gesture to zoom in/out using two fingers\n pinchToZoom: true,\n\n // Disable dragging if scale level is equal to value of `baseScale` option\n panOnlyZoomed: false,\n\n // Lock axis while dragging,\n // possible values: false | \"x\" | \"y\" | \"xy\"\n lockAxis: false,\n\n // * All friction values are inside [0, 1) interval,\n // * where 0 would change instantly, but 0.99 would update extremely slowly\n\n // Friction while panning/dragging\n friction: 0.64,\n\n // Friction while decelerating after drag end\n decelFriction: 0.88,\n\n // Friction while scaling\n zoomFriction: 0.74,\n\n // Bounciness after hitting the edge\n bounceForce: 0.2,\n\n // Initial scale level\n baseScale: 1,\n\n // Minimum scale level\n minScale: 1,\n\n // Maximum scale level\n maxScale: 2,\n\n // Default scale step while zooming\n step: 0.5,\n\n // Allow to select text,\n // if enabled, dragging will be disabled when text selection is detected\n textSelection: false,\n\n // Add `click` event listener,\n // possible values: true | false | function | \"toggleZoom\"\n click: \"toggleZoom\",\n\n // Add `wheel` event listener,\n // possible values: true | false | function | \"zoom\"\n wheel: \"zoom\",\n\n // Value for zoom on mouse wheel\n wheelFactor: 42,\n\n // Number of wheel events after which it should stop preventing default behaviour of mouse wheel\n wheelLimit: 5,\n\n // Class name added to `$viewport` element to indicate if content is draggable\n draggableClass: \"is-draggable\",\n\n // Class name added to `$viewport` element to indicate that user is currently dragging\n draggingClass: \"is-dragging\",\n\n // Content will be scaled by this number,\n // this can also be a function which should return a number, for example:\n // ratio: function() { return 1 / (window.devicePixelRatio || 1) }\n ratio: 1,\n};\n\nexport class Panzoom extends Base {\n /**\n * Panzoom constructor\n * @constructs Panzoom\n * @param {HTMLElement} $viewport Panzoom container\n * @param {Object} [options] Options for Panzoom\n */\n constructor($container, options = {}) {\n super(extend(true, {}, defaults, options));\n\n this.state = \"init\";\n\n this.$container = $container;\n\n // Bind event handlers for referencability\n for (const methodName of [\"onLoad\", \"onWheel\", \"onClick\"]) {\n this[methodName] = this[methodName].bind(this);\n }\n\n this.initLayout();\n\n this.resetValues();\n\n this.attachPlugins(Panzoom.Plugins);\n\n this.trigger(\"init\");\n\n this.updateMetrics();\n\n this.attachEvents();\n\n this.trigger(\"ready\");\n\n if (this.option(\"centerOnStart\") === false) {\n this.state = \"ready\";\n } else {\n this.panTo({\n friction: 0,\n });\n }\n\n $container.__Panzoom = this;\n }\n\n /**\n * Create references to container, viewport and content elements\n */\n initLayout() {\n const $container = this.$container;\n\n // Make sure content element exists\n if (!($container instanceof HTMLElement)) {\n throw new Error(\"Panzoom: Container not found\");\n }\n\n const $content = this.option(\"content\") || $container.querySelector(\".panzoom__content\");\n\n // Make sure content element exists\n if (!$content) {\n throw new Error(\"Panzoom: Content not found\");\n }\n\n this.$content = $content;\n\n let $viewport = this.option(\"viewport\") || $container.querySelector(\".panzoom__viewport\");\n\n if (!$viewport && this.option(\"wrapInner\") !== false) {\n $viewport = document.createElement(\"div\");\n $viewport.classList.add(\"panzoom__viewport\");\n\n $viewport.append(...$container.childNodes);\n\n $container.appendChild($viewport);\n }\n\n this.$viewport = $viewport || $content.parentNode;\n }\n\n /**\n * Restore instance variables to default values\n */\n resetValues() {\n this.updateRate = this.option(\"updateRate\", /iPhone|iPad|iPod|Android/i.test(navigator.userAgent) ? 250 : 24);\n\n this.container = {\n width: 0,\n height: 0,\n };\n\n this.viewport = {\n width: 0,\n height: 0,\n };\n\n this.content = {\n // Full content dimensions (naturalWidth/naturalHeight for images)\n origWidth: 0,\n origHeight: 0,\n\n // Current dimensions of the content\n width: 0,\n height: 0,\n\n // Current position; these values reflect CSS `transform` value\n x: this.option(\"x\", 0),\n y: this.option(\"y\", 0),\n\n // Current scale; does not reflect CSS `transform` value\n scale: this.option(\"baseScale\"),\n };\n\n // End values of current pan / zoom animation\n this.transform = {\n x: 0,\n y: 0,\n scale: 1,\n };\n\n this.resetDragPosition();\n }\n\n /**\n * Handle `load` event\n * @param {Event} event\n */\n onLoad(event) {\n this.updateMetrics();\n\n this.panTo({ scale: this.option(\"baseScale\"), friction: 0 });\n\n this.trigger(\"load\", event);\n }\n\n /**\n * Handle `click` event\n * @param {Event} event\n */\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n\n if (document.activeElement && document.activeElement.closest(\"[contenteditable]\")) {\n return;\n }\n\n // Skip if text is selected\n if (\n this.option(\"textSelection\") &&\n window.getSelection().toString().length &&\n !(event.target && event.target.hasAttribute(\"data-fancybox-close\"))\n ) {\n event.stopPropagation();\n return;\n }\n\n const rect = this.$content.getClientRects()[0];\n\n // Check if container has changed position (for example, when current instance is inside another one)\n if (this.state !== \"ready\") {\n if (\n this.dragPosition.midPoint ||\n Math.abs(rect.top - this.dragStart.rect.top) > 1 ||\n Math.abs(rect.left - this.dragStart.rect.left) > 1\n ) {\n event.preventDefault();\n event.stopPropagation();\n\n return;\n }\n }\n\n if (this.trigger(\"click\", event) === false) {\n return;\n }\n\n if (this.option(\"zoom\") && this.option(\"click\") === \"toggleZoom\") {\n event.preventDefault();\n event.stopPropagation();\n\n this.zoomWithClick(event);\n }\n }\n\n /**\n * Handle `wheel` event\n * @param {Event} event\n */\n onWheel(event) {\n if (this.trigger(\"wheel\", event) === false) {\n return;\n }\n\n if (this.option(\"zoom\") && this.option(\"wheel\")) {\n this.zoomWithWheel(event);\n }\n }\n\n /**\n * Change zoom level depending on scroll direction\n * @param {Event} event `wheel` event\n */\n zoomWithWheel(event) {\n if (this.changedDelta === undefined) {\n this.changedDelta = 0;\n }\n\n const delta = Math.max(-1, Math.min(1, -event.deltaY || -event.deltaX || event.wheelDelta || -event.detail));\n const scale = this.content.scale;\n\n let newScale = (scale * (100 + delta * this.option(\"wheelFactor\"))) / 100;\n\n if (\n (delta < 0 && Math.abs(scale - this.option(\"minScale\")) < 0.01) ||\n (delta > 0 && Math.abs(scale - this.option(\"maxScale\")) < 0.01)\n ) {\n this.changedDelta += Math.abs(delta);\n newScale = scale;\n } else {\n this.changedDelta = 0;\n newScale = Math.max(Math.min(newScale, this.option(\"maxScale\")), this.option(\"minScale\"));\n }\n\n if (this.changedDelta > this.option(\"wheelLimit\")) {\n return;\n }\n\n event.preventDefault();\n\n if (newScale === scale) {\n return;\n }\n\n const rect = this.$content.getBoundingClientRect();\n\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n this.zoomTo(newScale, { x, y });\n }\n\n /**\n * Change zoom level depending on click coordinates\n * @param {Event} event `click` event\n */\n zoomWithClick(event) {\n const rect = this.$content.getClientRects()[0];\n\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n this.toggleZoom({ x, y });\n }\n\n /**\n * Attach load, wheel and click event listeners, initialize `resizeObserver` and `PointerTracker`\n */\n attachEvents() {\n this.$content.addEventListener(\"load\", this.onLoad);\n\n this.$container.addEventListener(\"wheel\", this.onWheel, { passive: false });\n this.$container.addEventListener(\"click\", this.onClick, { passive: false });\n\n this.initObserver();\n\n const pointerTracker = new PointerTracker(this.$container, {\n start: (pointer, event) => {\n if (!this.option(\"touch\")) {\n return false;\n }\n\n if (this.velocity.scale < 0) {\n return false;\n }\n\n const target = event.composedPath()[0];\n\n if (!pointerTracker.currentPointers.length) {\n const ignoreClickedElement =\n [\"BUTTON\", \"TEXTAREA\", \"OPTION\", \"INPUT\", \"SELECT\", \"VIDEO\"].indexOf(target.nodeName) !== -1;\n\n if (ignoreClickedElement) {\n return false;\n }\n\n // Allow text selection\n if (this.option(\"textSelection\") && getTextNodeFromPoint(target, pointer.clientX, pointer.clientY)) {\n return false;\n }\n }\n\n if (isScrollable(target)) {\n return false;\n }\n\n if (this.trigger(\"touchStart\", event) === false) {\n return false;\n }\n\n if (event.type === \"mousedown\") {\n event.preventDefault();\n }\n\n this.state = \"pointerdown\";\n\n this.resetDragPosition();\n\n this.dragPosition.midPoint = null;\n this.dragPosition.time = Date.now();\n\n return true;\n },\n move: (previousPointers, currentPointers, event) => {\n if (this.state !== \"pointerdown\") {\n return;\n }\n\n if (this.trigger(\"touchMove\", event) === false) {\n event.preventDefault();\n return;\n }\n\n // Disable touch action if current zoom level is below base level\n if (\n currentPointers.length < 2 &&\n this.option(\"panOnlyZoomed\") === true &&\n this.content.width <= this.viewport.width &&\n this.content.height <= this.viewport.height &&\n this.transform.scale <= this.option(\"baseScale\")\n ) {\n return;\n }\n\n if (currentPointers.length > 1 && (!this.option(\"zoom\") || this.option(\"pinchToZoom\") === false)) {\n return;\n }\n\n const prevMidpoint = getMidpoint(previousPointers[0], previousPointers[1]);\n const newMidpoint = getMidpoint(currentPointers[0], currentPointers[1]);\n\n const panX = newMidpoint.clientX - prevMidpoint.clientX;\n const panY = newMidpoint.clientY - prevMidpoint.clientY;\n\n const prevDistance = getDistance(previousPointers[0], previousPointers[1]);\n const newDistance = getDistance(currentPointers[0], currentPointers[1]);\n\n const scaleDiff = prevDistance && newDistance ? newDistance / prevDistance : 1;\n\n this.dragOffset.x += panX;\n this.dragOffset.y += panY;\n\n this.dragOffset.scale *= scaleDiff;\n\n this.dragOffset.time = Date.now() - this.dragPosition.time;\n\n const axisToLock = this.dragStart.scale === 1 && this.option(\"lockAxis\");\n\n if (axisToLock && !this.lockAxis) {\n if (Math.abs(this.dragOffset.x) < 6 && Math.abs(this.dragOffset.y) < 6) {\n event.preventDefault();\n return;\n }\n\n const angle = Math.abs((Math.atan2(this.dragOffset.y, this.dragOffset.x) * 180) / Math.PI);\n\n this.lockAxis = angle > 45 && angle < 135 ? \"y\" : \"x\";\n }\n\n if (axisToLock !== \"xy\" && this.lockAxis === \"y\") {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n event.stopImmediatePropagation();\n\n if (this.lockAxis) {\n this.dragOffset[this.lockAxis === \"x\" ? \"y\" : \"x\"] = 0;\n }\n\n this.$container.classList.add(this.option(\"draggingClass\"));\n\n if (!(this.transform.scale === this.option(\"baseScale\") && this.lockAxis === \"y\")) {\n this.dragPosition.x = this.dragStart.x + this.dragOffset.x;\n }\n\n if (!(this.transform.scale === this.option(\"baseScale\") && this.lockAxis === \"x\")) {\n this.dragPosition.y = this.dragStart.y + this.dragOffset.y;\n }\n\n this.dragPosition.scale = this.dragStart.scale * this.dragOffset.scale;\n\n if (currentPointers.length > 1) {\n const startPoint = getMidpoint(pointerTracker.startPointers[0], pointerTracker.startPointers[1]);\n\n const xPos = startPoint.clientX - this.dragStart.rect.x;\n const yPos = startPoint.clientY - this.dragStart.rect.y;\n\n const { deltaX, deltaY } = this.getZoomDelta(this.content.scale * this.dragOffset.scale, xPos, yPos);\n\n this.dragPosition.x -= deltaX;\n this.dragPosition.y -= deltaY;\n\n this.dragPosition.midPoint = newMidpoint;\n } else {\n this.setDragResistance();\n }\n\n // Update final position\n this.transform = {\n x: this.dragPosition.x,\n y: this.dragPosition.y,\n scale: this.dragPosition.scale,\n };\n\n this.startAnimation();\n },\n end: (pointer, event) => {\n if (this.state !== \"pointerdown\") {\n return;\n }\n\n this._dragOffset = { ...this.dragOffset };\n\n if (pointerTracker.currentPointers.length) {\n this.resetDragPosition();\n\n return;\n }\n\n this.state = \"decel\";\n this.friction = this.option(\"decelFriction\");\n\n this.recalculateTransform();\n\n this.$container.classList.remove(this.option(\"draggingClass\"));\n\n if (this.trigger(\"touchEnd\", event) === false) {\n return;\n }\n\n if (this.state !== \"decel\") {\n return;\n }\n\n // * Check if scaled content past limits\n\n // Below minimum\n const minScale = this.option(\"minScale\");\n\n if (this.transform.scale < minScale) {\n this.zoomTo(minScale, { friction: 0.64 });\n\n return;\n }\n\n // Exceed maximum\n const maxScale = this.option(\"maxScale\");\n\n if (this.transform.scale - maxScale > 0.01) {\n const last = this.dragPosition.midPoint || pointer;\n const rect = this.$content.getClientRects()[0];\n\n this.zoomTo(maxScale, {\n friction: 0.64,\n x: last.clientX - rect.left,\n y: last.clientY - rect.top,\n });\n\n return;\n }\n },\n });\n\n this.pointerTracker = pointerTracker;\n }\n\n initObserver() {\n if (this.resizeObserver) {\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n if (this.updateTimer) {\n return;\n }\n\n this.updateTimer = setTimeout(() => {\n const rect = this.$container.getBoundingClientRect();\n\n if (!(rect.width && rect.height)) {\n this.updateTimer = null;\n return;\n }\n\n // Check to see if there are any changes\n if (Math.abs(rect.width - this.container.width) > 1 || Math.abs(rect.height - this.container.height) > 1) {\n if (this.isAnimating()) {\n this.endAnimation(true);\n }\n\n this.updateMetrics();\n\n this.panTo({\n x: this.content.x,\n y: this.content.y,\n scale: this.option(\"baseScale\"),\n friction: 0,\n });\n }\n\n this.updateTimer = null;\n }, this.updateRate);\n });\n\n this.resizeObserver.observe(this.$container);\n }\n\n /**\n * Restore drag related variables to default values\n */\n resetDragPosition() {\n this.lockAxis = null;\n this.friction = this.option(\"friction\");\n\n this.velocity = {\n x: 0,\n y: 0,\n scale: 0,\n };\n\n const { x, y, scale } = this.content;\n\n this.dragStart = {\n rect: this.$content.getBoundingClientRect(),\n x,\n y,\n scale,\n };\n\n this.dragPosition = {\n ...this.dragPosition,\n x,\n y,\n scale,\n };\n\n this.dragOffset = {\n x: 0,\n y: 0,\n scale: 1,\n time: 0,\n };\n }\n\n /**\n * Trigger update events before/after resizing content and viewport\n * @param {Boolean} silently Should trigger `afterUpdate` event at the end\n */\n updateMetrics(silently) {\n if (silently !== true) {\n this.trigger(\"beforeUpdate\");\n }\n\n const $container = this.$container;\n const $content = this.$content;\n const $viewport = this.$viewport;\n\n const contentIsImage = $content instanceof HTMLImageElement;\n const contentIsZoomable = this.option(\"zoom\");\n const shouldResizeParent = this.option(\"resizeParent\", contentIsZoomable);\n\n let width = this.option(\"width\");\n let height = this.option(\"height\");\n\n let origWidth = width || getFullWidth($content);\n let origHeight = height || getFullHeight($content);\n\n Object.assign($content.style, {\n width: width ? `${width}px` : \"\",\n height: height ? `${height}px` : \"\",\n maxWidth: \"\",\n maxHeight: \"\",\n });\n\n if (shouldResizeParent) {\n Object.assign($viewport.style, { width: \"\", height: \"\" });\n }\n\n const ratio = this.option(\"ratio\");\n\n origWidth = round(origWidth * ratio);\n origHeight = round(origHeight * ratio);\n\n width = origWidth;\n height = origHeight;\n\n const contentRect = $content.getBoundingClientRect();\n const viewportRect = $viewport.getBoundingClientRect();\n\n const containerRect = $viewport == $container ? viewportRect : $container.getBoundingClientRect();\n\n let viewportWidth = Math.max($viewport.offsetWidth, round(viewportRect.width));\n let viewportHeight = Math.max($viewport.offsetHeight, round(viewportRect.height));\n\n let viewportStyles = window.getComputedStyle($viewport);\n viewportWidth -= parseFloat(viewportStyles.paddingLeft) + parseFloat(viewportStyles.paddingRight);\n viewportHeight -= parseFloat(viewportStyles.paddingTop) + parseFloat(viewportStyles.paddingBottom);\n\n this.viewport.width = viewportWidth;\n this.viewport.height = viewportHeight;\n\n if (contentIsZoomable) {\n if (Math.abs(origWidth - contentRect.width) > 0.1 || Math.abs(origHeight - contentRect.height) > 0.1) {\n const rez = calculateAspectRatioFit(\n origWidth,\n origHeight,\n Math.min(origWidth, contentRect.width),\n Math.min(origHeight, contentRect.height)\n );\n\n width = round(rez.width);\n height = round(rez.height);\n }\n\n Object.assign($content.style, {\n width: `${width}px`,\n height: `${height}px`,\n transform: \"\",\n });\n }\n\n if (shouldResizeParent) {\n Object.assign($viewport.style, { width: `${width}px`, height: `${height}px` });\n\n this.viewport = { ...this.viewport, width, height };\n }\n\n if (contentIsImage && contentIsZoomable && typeof this.options.maxScale !== \"function\") {\n const maxScale = this.option(\"maxScale\");\n\n this.options.maxScale = function () {\n return this.content.origWidth > 0 && this.content.fitWidth > 0\n ? this.content.origWidth / this.content.fitWidth\n : maxScale;\n };\n }\n\n this.content = {\n ...this.content,\n origWidth,\n origHeight,\n fitWidth: width,\n fitHeight: height,\n width,\n height,\n scale: 1,\n isZoomable: contentIsZoomable,\n };\n\n this.container = { width: containerRect.width, height: containerRect.height };\n\n if (silently !== true) {\n this.trigger(\"afterUpdate\");\n }\n }\n\n /**\n * Increase zoom level\n * @param {Number} [step] Zoom ratio; `0.5` would increase scale from 1 to 1.5\n */\n zoomIn(step) {\n this.zoomTo(this.content.scale + (step || this.option(\"step\")));\n }\n\n /**\n * Decrease zoom level\n * @param {Number} [step] Zoom ratio; `0.5` would decrease scale from 1.5 to 1\n */\n zoomOut(step) {\n this.zoomTo(this.content.scale - (step || this.option(\"step\")));\n }\n\n /**\n * Toggles zoom level between max and base levels\n * @param {Object} [options] Additional options\n */\n toggleZoom(props = {}) {\n const maxScale = this.option(\"maxScale\");\n const baseScale = this.option(\"baseScale\");\n\n const scale = this.content.scale > baseScale + (maxScale - baseScale) * 0.5 ? baseScale : maxScale;\n\n this.zoomTo(scale, props);\n }\n\n /**\n * Animate to given zoom level\n * @param {Number} scale New zoom level\n * @param {Object} [options] Additional options\n */\n zoomTo(scale = this.option(\"baseScale\"), { x = null, y = null } = {}) {\n scale = Math.max(Math.min(scale, this.option(\"maxScale\")), this.option(\"minScale\"));\n\n // Adjust zoom position\n const currentScale = round(this.content.scale / (this.content.width / this.content.fitWidth), 10000000);\n\n if (x === null) {\n x = this.content.width * currentScale * 0.5;\n }\n\n if (y === null) {\n y = this.content.height * currentScale * 0.5;\n }\n\n const { deltaX, deltaY } = this.getZoomDelta(scale, x, y);\n\n x = this.content.x - deltaX;\n y = this.content.y - deltaY;\n\n this.panTo({ x, y, scale, friction: this.option(\"zoomFriction\") });\n }\n\n /**\n * Calculate difference for top/left values if content would scale at given coordinates\n * @param {Number} scale\n * @param {Number} x\n * @param {Number} y\n * @returns {Object}\n */\n getZoomDelta(scale, x = 0, y = 0) {\n const currentWidth = this.content.fitWidth * this.content.scale;\n const currentHeight = this.content.fitHeight * this.content.scale;\n\n const percentXInCurrentBox = x > 0 && currentWidth ? x / currentWidth : 0;\n const percentYInCurrentBox = y > 0 && currentHeight ? y / currentHeight : 0;\n\n const nextWidth = this.content.fitWidth * scale;\n const nextHeight = this.content.fitHeight * scale;\n\n const deltaX = (nextWidth - currentWidth) * percentXInCurrentBox;\n const deltaY = (nextHeight - currentHeight) * percentYInCurrentBox;\n\n return { deltaX, deltaY };\n }\n\n /**\n * Animate to given positon and/or zoom level\n * @param {Object} [options] Additional options\n */\n panTo({\n x = this.content.x,\n y = this.content.y,\n scale,\n friction = this.option(\"friction\"),\n ignoreBounds = false,\n } = {}) {\n scale = scale || this.content.scale || 1;\n\n if (!ignoreBounds) {\n const { boundX, boundY } = this.getBounds(scale);\n\n if (boundX) {\n x = Math.max(Math.min(x, boundX.to), boundX.from);\n }\n\n if (boundY) {\n y = Math.max(Math.min(y, boundY.to), boundY.from);\n }\n }\n\n this.friction = friction;\n\n this.transform = {\n ...this.transform,\n x,\n y,\n scale,\n };\n\n if (friction) {\n this.state = \"panning\";\n\n this.velocity = {\n x: (1 / this.friction - 1) * (x - this.content.x),\n y: (1 / this.friction - 1) * (y - this.content.y),\n scale: (1 / this.friction - 1) * (scale - this.content.scale),\n };\n\n this.startAnimation();\n } else {\n this.endAnimation();\n }\n }\n\n /**\n * Start animation loop\n */\n startAnimation() {\n if (!this.rAF) {\n this.trigger(\"startAnimation\");\n } else {\n cancelAnimationFrame(this.rAF);\n }\n\n this.rAF = requestAnimationFrame(() => this.animate());\n }\n\n /**\n * Process animation frame\n */\n animate() {\n this.setEdgeForce();\n this.setDragForce();\n\n this.velocity.x *= this.friction;\n this.velocity.y *= this.friction;\n\n this.velocity.scale *= this.friction;\n\n this.content.x += this.velocity.x;\n this.content.y += this.velocity.y;\n\n this.content.scale += this.velocity.scale;\n\n if (this.isAnimating()) {\n this.setTransform();\n } else if (this.state !== \"pointerdown\") {\n this.endAnimation();\n\n return;\n }\n\n this.rAF = requestAnimationFrame(() => this.animate());\n }\n\n /**\n * Calculate boundaries\n */\n getBounds(scale) {\n let boundX = this.boundX;\n let boundY = this.boundY;\n\n if (boundX !== undefined && boundY !== undefined) {\n return { boundX, boundY };\n }\n\n boundX = { from: 0, to: 0 };\n boundY = { from: 0, to: 0 };\n\n scale = scale || this.transform.scale;\n\n const width = this.content.fitWidth * scale;\n const height = this.content.fitHeight * scale;\n\n const viewportWidth = this.viewport.width;\n const viewportHeight = this.viewport.height;\n\n if (width < viewportWidth) {\n const deltaX = round((viewportWidth - width) * 0.5);\n\n boundX.from = deltaX;\n boundX.to = deltaX;\n } else {\n boundX.from = round(viewportWidth - width);\n }\n\n if (height < viewportHeight) {\n const deltaY = (viewportHeight - height) * 0.5;\n\n boundY.from = deltaY;\n boundY.to = deltaY;\n } else {\n boundY.from = round(viewportHeight - height);\n }\n\n return { boundX, boundY };\n }\n\n /**\n * Change animation velocity if boundary is reached\n */\n setEdgeForce() {\n if (this.state !== \"decel\") {\n return;\n }\n\n const bounceForce = this.option(\"bounceForce\");\n\n const { boundX, boundY } = this.getBounds(Math.max(this.transform.scale, this.content.scale));\n\n let pastLeft, pastRight, pastTop, pastBottom;\n\n if (boundX) {\n pastLeft = this.content.x < boundX.from;\n pastRight = this.content.x > boundX.to;\n }\n\n if (boundY) {\n pastTop = this.content.y < boundY.from;\n pastBottom = this.content.y > boundY.to;\n }\n\n if (pastLeft || pastRight) {\n const bound = pastLeft ? boundX.from : boundX.to;\n const distance = bound - this.content.x;\n\n let force = distance * bounceForce;\n\n const restX = this.content.x + (this.velocity.x + force) / this.friction;\n\n if (restX >= boundX.from && restX <= boundX.to) {\n force += this.velocity.x;\n }\n\n this.velocity.x = force;\n\n this.recalculateTransform();\n }\n\n if (pastTop || pastBottom) {\n const bound = pastTop ? boundY.from : boundY.to;\n const distance = bound - this.content.y;\n\n let force = distance * bounceForce;\n\n const restY = this.content.y + (force + this.velocity.y) / this.friction;\n\n if (restY >= boundY.from && restY <= boundY.to) {\n force += this.velocity.y;\n }\n\n this.velocity.y = force;\n\n this.recalculateTransform();\n }\n }\n\n /**\n * Change dragging position if boundary is reached\n */\n setDragResistance() {\n if (this.state !== \"pointerdown\") {\n return;\n }\n\n const { boundX, boundY } = this.getBounds(this.dragPosition.scale);\n\n let pastLeft, pastRight, pastTop, pastBottom;\n\n if (boundX) {\n pastLeft = this.dragPosition.x < boundX.from;\n pastRight = this.dragPosition.x > boundX.to;\n }\n\n if (boundY) {\n pastTop = this.dragPosition.y < boundY.from;\n pastBottom = this.dragPosition.y > boundY.to;\n }\n\n if ((pastLeft || pastRight) && !(pastLeft && pastRight)) {\n const bound = pastLeft ? boundX.from : boundX.to;\n const distance = bound - this.dragPosition.x;\n\n this.dragPosition.x = bound - distance * 0.3;\n }\n\n if ((pastTop || pastBottom) && !(pastTop && pastBottom)) {\n const bound = pastTop ? boundY.from : boundY.to;\n const distance = bound - this.dragPosition.y;\n\n this.dragPosition.y = bound - distance * 0.3;\n }\n }\n\n /**\n * Set velocity to move content to drag position\n */\n setDragForce() {\n if (this.state === \"pointerdown\") {\n this.velocity.x = this.dragPosition.x - this.content.x;\n this.velocity.y = this.dragPosition.y - this.content.y;\n this.velocity.scale = this.dragPosition.scale - this.content.scale;\n }\n }\n\n /**\n * Update end values based on current velocity and friction;\n */\n recalculateTransform() {\n this.transform.x = this.content.x + this.velocity.x / (1 / this.friction - 1);\n this.transform.y = this.content.y + this.velocity.y / (1 / this.friction - 1);\n this.transform.scale = this.content.scale + this.velocity.scale / (1 / this.friction - 1);\n }\n\n /**\n * Check if content is currently animating\n * @returns {Boolean}\n */\n isAnimating() {\n return !!(\n this.friction &&\n (Math.abs(this.velocity.x) > 0.05 || Math.abs(this.velocity.y) > 0.05 || Math.abs(this.velocity.scale) > 0.05)\n );\n }\n\n /**\n * Set content `style.transform` value based on current animation frame\n */\n setTransform(final) {\n let x, y, scale;\n\n if (final) {\n x = round(this.transform.x);\n y = round(this.transform.y);\n\n scale = this.transform.scale;\n\n this.content = { ...this.content, x, y, scale };\n } else {\n x = round(this.content.x);\n y = round(this.content.y);\n\n scale = this.content.scale / (this.content.width / this.content.fitWidth);\n\n this.content = { ...this.content, x, y };\n }\n\n this.trigger(\"beforeTransform\");\n\n x = round(this.content.x);\n y = round(this.content.y);\n\n if (final && this.option(\"zoom\")) {\n let width;\n let height;\n\n width = round(this.content.fitWidth * scale);\n height = round(this.content.fitHeight * scale);\n\n this.content.width = width;\n this.content.height = height;\n\n this.transform = { ...this.transform, width, height, scale };\n\n Object.assign(this.$content.style, {\n width: `${width}px`,\n height: `${height}px`,\n maxWidth: \"none\",\n maxHeight: \"none\",\n transform: `translate3d(${x}px, ${y}px, 0) scale(1)`,\n });\n } else {\n this.$content.style.transform = `translate3d(${x}px, ${y}px, 0) scale(${scale})`;\n }\n\n this.trigger(\"afterTransform\");\n }\n\n /**\n * Stop animation loop\n */\n endAnimation(silently) {\n cancelAnimationFrame(this.rAF);\n this.rAF = null;\n\n this.velocity = {\n x: 0,\n y: 0,\n scale: 0,\n };\n\n this.setTransform(true);\n\n this.state = \"ready\";\n\n this.handleCursor();\n\n if (silently !== true) {\n this.trigger(\"endAnimation\");\n }\n }\n\n /**\n * Update the class name depending on whether the content is scaled\n */\n handleCursor() {\n const draggableClass = this.option(\"draggableClass\");\n\n if (!draggableClass || !this.option(\"touch\")) {\n return;\n }\n\n if (\n this.option(\"panOnlyZoomed\") == true &&\n this.content.width <= this.viewport.width &&\n this.content.height <= this.viewport.height &&\n this.transform.scale <= this.option(\"baseScale\")\n ) {\n this.$container.classList.remove(draggableClass);\n } else {\n this.$container.classList.add(draggableClass);\n }\n }\n\n /**\n * Remove observation and detach event listeners\n */\n detachEvents() {\n this.$content.removeEventListener(\"load\", this.onLoad);\n\n this.$container.removeEventListener(\"wheel\", this.onWheel, { passive: false });\n this.$container.removeEventListener(\"click\", this.onClick, { passive: false });\n\n if (this.pointerTracker) {\n this.pointerTracker.stop();\n this.pointerTracker = null;\n }\n\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n /**\n * Clean up\n */\n destroy() {\n if (this.state === \"destroy\") {\n return;\n }\n\n this.state = \"destroy\";\n\n clearTimeout(this.updateTimer);\n this.updateTimer = null;\n\n cancelAnimationFrame(this.rAF);\n this.rAF = null;\n\n this.detachEvents();\n\n this.detachPlugins();\n\n this.resetDragPosition();\n }\n}\n\n// Expose version\nPanzoom.version = \"__VERSION__\";\n\n// Static properties are a recent addition that dont work in all browsers yet\nPanzoom.Plugins = Plugins;\n","/**\n * Get actual width of the element, regardless of how much of content is currently visible\n * @param {Element} elem\n * @returns {Integer}\n */\nexport const getFullWidth = (elem) => {\n return Math.max(\n parseFloat(elem.naturalWidth || 0),\n parseFloat((elem.width && elem.width.baseVal && elem.width.baseVal.value) || 0),\n parseFloat(elem.offsetWidth || 0),\n parseFloat(elem.scrollWidth || 0)\n );\n};\n\n/**\n * Get actual height of the element, regardless of how much of content is currently visible\n * @param {Element} elem\n * @returns {Integer}\n */\nexport const getFullHeight = (elem) => {\n return Math.max(\n parseFloat(elem.naturalHeight || 0),\n parseFloat((elem.height && elem.height.baseVal && elem.height.baseVal.value) || 0),\n parseFloat(elem.offsetHeight || 0),\n parseFloat(elem.scrollHeight || 0)\n );\n};\n\n/**\n * Calculate bounding size to fit dimensions while preserving aspect ratio\n * @param {Number} srcWidth\n * @param {Number} srcHeight\n * @param {Number} maxWidth\n * @param {Number} maxHeight\n * @returns {Object}\n */\nexport const calculateAspectRatioFit = (srcWidth, srcHeight, maxWidth, maxHeight) => {\n const ratio = Math.min(maxWidth / srcWidth || 0, maxHeight / srcHeight);\n\n return { width: srcWidth * ratio || 0, height: srcHeight * ratio || 0 };\n};\n","export const Plugins = {};\n","/**\n * Throttling enforces a maximum number of times a function can be called over time\n * @param {Function} func Callback function\n * @param {Integer} limit Milliseconds\n * @returns {Function}\n */\nexport const throttle = (func, limit) => {\n let lastCall = 0;\n\n return function (...args) {\n const now = new Date().getTime();\n\n if (now - lastCall < limit) {\n return;\n }\n\n lastCall = now;\n\n return func(...args);\n };\n};\n","const defaults = {\n prevTpl: '',\n nextTpl: '',\n\n classNames: {\n main: \"carousel__nav\",\n button: \"carousel__button\",\n\n next: \"is-next\",\n prev: \"is-prev\",\n },\n};\n\nexport class Navigation {\n constructor(carousel) {\n this.$container = null;\n\n this.$prev = null;\n this.$next = null;\n\n this.carousel = carousel;\n\n this.onRefresh = this.onRefresh.bind(this);\n }\n\n /**\n * Shortcut to get option for this plugin\n * @param {String} name option name\n * @returns option value\n */\n option(name) {\n return this.carousel.option(`Navigation.${name}`);\n }\n\n /**\n * Creates and returns new button element with default class names and click event\n * @param {String} type\n */\n createButton(type) {\n const $btn = document.createElement(\"button\");\n\n $btn.setAttribute(\"title\", this.carousel.localize(`{{${type.toUpperCase()}}}`));\n\n const classNames = this.option(\"classNames.button\") + \" \" + this.option(`classNames.${type}`);\n\n $btn.classList.add(...classNames.split(\" \"));\n $btn.setAttribute(\"tabindex\", \"0\");\n $btn.innerHTML = this.carousel.localize(this.option(`${type}Tpl`));\n\n $btn.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.carousel[`slide${type === \"next\" ? \"Next\" : \"Prev\"}`]();\n });\n\n return $btn;\n }\n\n /**\n * Build necessary DOM elements\n */\n build() {\n if (!this.$container) {\n this.$container = document.createElement(\"div\");\n this.$container.classList.add(...this.option(\"classNames.main\").split(\" \"));\n\n this.carousel.$container.appendChild(this.$container);\n }\n\n if (!this.$next) {\n this.$next = this.createButton(\"next\");\n\n this.$container.appendChild(this.$next);\n }\n\n if (!this.$prev) {\n this.$prev = this.createButton(\"prev\");\n\n this.$container.appendChild(this.$prev);\n }\n }\n\n /**\n * Process carousel `refresh` and `change` events to enable/disable buttons if needed\n */\n onRefresh() {\n const pageCount = this.carousel.pages.length;\n\n if (\n pageCount <= 1 ||\n (pageCount > 1 &&\n this.carousel.elemDimWidth < this.carousel.wrapDimWidth &&\n !Number.isInteger(this.carousel.option(\"slidesPerPage\")))\n ) {\n this.cleanup();\n\n return;\n }\n\n this.build();\n\n this.$prev.removeAttribute(\"disabled\");\n this.$next.removeAttribute(\"disabled\");\n\n if (this.carousel.option(\"infiniteX\", this.carousel.option(\"infinite\"))) {\n return;\n }\n\n if (this.carousel.page <= 0) {\n this.$prev.setAttribute(\"disabled\", \"\");\n }\n\n if (this.carousel.page >= pageCount - 1) {\n this.$next.setAttribute(\"disabled\", \"\");\n }\n }\n\n cleanup() {\n if (this.$prev) {\n this.$prev.remove();\n }\n\n this.$prev = null;\n\n if (this.$next) {\n this.$next.remove();\n }\n\n this.$next = null;\n\n if (this.$container) {\n this.$container.remove();\n }\n\n this.$container = null;\n }\n\n attach() {\n this.carousel.on(\"refresh change\", this.onRefresh);\n }\n\n detach() {\n this.carousel.off(\"refresh change\", this.onRefresh);\n\n this.cleanup();\n }\n}\n\n// Expose defaults\nNavigation.defaults = defaults;\n","const defaults = {\n friction: 0.92,\n};\n\nexport class Sync {\n constructor(carousel) {\n this.carousel = carousel;\n\n this.selectedIndex = null;\n this.friction = 0;\n\n this.onNavReady = this.onNavReady.bind(this);\n this.onNavClick = this.onNavClick.bind(this);\n this.onNavCreateSlide = this.onNavCreateSlide.bind(this);\n\n this.onTargetChange = this.onTargetChange.bind(this);\n }\n\n /**\n * Make this one as main carousel and selected carousel as navigation\n * @param {Object} nav Carousel\n */\n addAsTargetFor(nav) {\n this.target = this.carousel;\n this.nav = nav;\n\n this.attachEvents();\n }\n\n /**\n * Make this one as navigation carousel for selected carousel\n * @param {Object} target\n */\n addAsNavFor(target) {\n this.target = target;\n this.nav = this.carousel;\n\n this.attachEvents();\n }\n\n /**\n * Attach event listeners on both carousels\n */\n attachEvents() {\n this.nav.options.initialSlide = this.target.options.initialPage;\n\n this.nav.on(\"ready\", this.onNavReady);\n this.nav.on(\"createSlide\", this.onNavCreateSlide);\n this.nav.on(\"Panzoom.click\", this.onNavClick);\n\n this.target.on(\"change\", this.onTargetChange);\n this.target.on(\"Panzoom.afterUpdate\", this.onTargetChange);\n }\n\n /**\n * Process main carousel `ready` event; bind events and set initial page\n */\n onNavReady() {\n this.onTargetChange(true);\n }\n\n /**\n * Process main carousel `click` event\n * @param {Object} panzoom\n * @param {Object} event\n */\n onNavClick(carousel, panzoom, event) {\n const clickedNavSlide = event.target.closest(\".carousel__slide\");\n\n if (!clickedNavSlide) {\n return;\n }\n\n event.stopPropagation();\n\n const selectedNavIndex = parseInt(clickedNavSlide.dataset.index, 10);\n const selectedSyncPage = this.target.findPageForSlide(selectedNavIndex);\n\n if (this.target.page !== selectedSyncPage) {\n this.target.slideTo(selectedSyncPage, { friction: this.friction });\n }\n\n this.markSelectedSlide(selectedNavIndex);\n }\n\n /**\n * Process main carousel `createSlide` event\n * @param {Object} carousel\n * @param {Object} slide\n */\n onNavCreateSlide(carousel, slide) {\n if (slide.index === this.selectedIndex) {\n this.markSelectedSlide(slide.index);\n }\n }\n\n /**\n * Process target carousel `change` event\n * @param {Object} target\n */\n onTargetChange() {\n const targetIndex = this.target.pages[this.target.page].indexes[0];\n const selectedNavPage = this.nav.findPageForSlide(targetIndex);\n\n this.nav.slideTo(selectedNavPage);\n\n this.markSelectedSlide(targetIndex);\n }\n\n /**\n * Toggle classname for slides that marks currently selected slides\n * @param {Number} selectedIndex\n */\n markSelectedSlide(selectedIndex) {\n this.selectedIndex = selectedIndex;\n\n [...this.nav.slides].filter((slide) => slide.$el && slide.$el.classList.remove(\"is-nav-selected\"));\n\n const slide = this.nav.slides[selectedIndex];\n\n if (slide && slide.$el) slide.$el.classList.add(\"is-nav-selected\");\n }\n\n attach(carousel) {\n const sync = carousel.options.Sync;\n\n if (!sync.target && !sync.nav) {\n return;\n }\n\n if (sync.target) {\n this.addAsNavFor(sync.target);\n } else if (sync.nav) {\n this.addAsTargetFor(sync.nav);\n }\n\n this.friction = sync.friction;\n }\n\n detach() {\n if (this.nav) {\n this.nav.off(\"ready\", this.onNavReady);\n this.nav.off(\"Panzoom.click\", this.onNavClick);\n this.nav.off(\"createSlide\", this.onNavCreateSlide);\n }\n\n if (this.target) {\n this.target.off(\"Panzoom.afterUpdate\", this.onTargetChange);\n this.target.off(\"change\", this.onTargetChange);\n }\n }\n}\n\n// Expose defaults\nSync.defaults = defaults;\n","import { Navigation } from \"./Navigation/Navigation.js\";\nimport { Dots } from \"./Dots/Dots.js\";\nimport { Sync } from \"./Sync/Sync.js\";\n\nexport const Plugins = { Navigation, Dots, Sync };\n","const defaults = {\n // The minimum number of slides to display dots\n minSlideCount: 2,\n};\n\nexport class Dots {\n constructor(carousel) {\n this.carousel = carousel;\n\n this.$list = null;\n\n this.events = {\n change: this.onChange.bind(this),\n refresh: this.onRefresh.bind(this),\n };\n }\n\n /**\n * Build wrapping DOM element containing all dots\n */\n buildList() {\n if (this.carousel.pages.length < this.carousel.option(\"Dots.minSlideCount\")) {\n return;\n }\n\n const $list = document.createElement(\"ol\");\n\n $list.classList.add(\"carousel__dots\");\n\n $list.addEventListener(\"click\", (e) => {\n if (!(\"page\" in e.target.dataset)) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const page = parseInt(e.target.dataset.page, 10);\n const carousel = this.carousel;\n\n if (page === carousel.page) {\n return;\n }\n\n if (carousel.pages.length < 3 && carousel.option(\"infinite\")) {\n carousel[page == 0 ? \"slidePrev\" : \"slideNext\"]();\n } else {\n carousel.slideTo(page);\n }\n });\n\n this.$list = $list;\n\n this.carousel.$container.appendChild($list);\n this.carousel.$container.classList.add(\"has-dots\");\n\n return $list;\n }\n\n /**\n * Remove wrapping DOM element\n */\n removeList() {\n if (this.$list) {\n this.$list.parentNode.removeChild(this.$list);\n this.$list = null;\n }\n\n this.carousel.$container.classList.remove(\"has-dots\");\n }\n\n /**\n * Remove existing dots and create fresh ones\n */\n rebuildDots() {\n let $list = this.$list;\n\n const listExists = !!$list;\n const pagesCount = this.carousel.pages.length;\n\n if (pagesCount < 2) {\n if (listExists) {\n this.removeList();\n }\n\n return;\n }\n\n if (!listExists) {\n $list = this.buildList();\n }\n\n // Remove existing dots\n const dotCount = this.$list.children.length;\n\n if (dotCount > pagesCount) {\n for (let i = pagesCount; i < dotCount; i++) {\n this.$list.removeChild(this.$list.lastChild);\n }\n\n return;\n }\n\n // Create fresh DOM elements (dots) for each page\n for (let index = dotCount; index < pagesCount; index++) {\n const $dot = document.createElement(\"li\");\n\n $dot.classList.add(\"carousel__dot\");\n $dot.dataset.page = index;\n\n $dot.setAttribute(\"role\", \"button\");\n $dot.setAttribute(\"tabindex\", \"0\");\n $dot.setAttribute(\"title\", this.carousel.localize(\"{{GOTO}}\", [[\"%d\", index + 1]]));\n\n $dot.addEventListener(\"keydown\", (event) => {\n const code = event.code;\n\n let $el;\n\n if (code === \"Enter\" || code === \"NumpadEnter\") {\n $el = $dot;\n } else if (code === \"ArrowRight\") {\n $el = $dot.nextSibling;\n } else if (code === \"ArrowLeft\") {\n $el = $dot.previousSibling;\n }\n\n $el && $el.click();\n });\n\n this.$list.appendChild($dot);\n }\n\n this.setActiveDot();\n }\n\n /**\n * Mark active dot by toggling class name\n */\n setActiveDot() {\n if (!this.$list) {\n return;\n }\n\n this.$list.childNodes.forEach(($dot) => {\n $dot.classList.remove(\"is-selected\");\n });\n\n const $activeDot = this.$list.childNodes[this.carousel.page];\n\n if ($activeDot) {\n $activeDot.classList.add(\"is-selected\");\n }\n }\n\n /**\n * Process carousel `change` event\n */\n onChange() {\n this.setActiveDot();\n }\n\n /**\n * Process carousel `refresh` event\n */\n onRefresh() {\n this.rebuildDots();\n }\n\n attach() {\n this.carousel.on(this.events);\n }\n\n detach() {\n this.removeList();\n\n this.carousel.off(this.events);\n this.carousel = null;\n }\n}\n","import { Base } from \"../shared/Base/Base.js\";\r\nimport { Panzoom } from \"../Panzoom/Panzoom.js\";\r\n\r\nimport { extend } from \"../shared/utils/extend.js\";\r\nimport { round } from \"../shared/utils/round.js\";\r\nimport { throttle } from \"../shared/utils/throttle.js\";\r\n\r\nimport { Plugins } from \"./plugins/index.js\";\r\n\r\n// Default language\r\nimport en from \"./l10n/en.js\";\r\n\r\nconst defaults = {\r\n // Virtual slides. Each object should have at least `html` property that will be used to set content,\r\n // example: `slides: [{html: 'First slide'}, {html: 'Second slide'}]`\r\n slides: [],\r\n\r\n // Number of slides to preload before/after visible slides\r\n preload: 0,\r\n\r\n // Number of slides to group into the page,\r\n // if `auto` - group all slides that fit into the viewport\r\n slidesPerPage: \"auto\",\r\n\r\n // Index of initial page\r\n initialPage: null,\r\n\r\n // Index of initial slide\r\n initialSlide: null,\r\n\r\n // Panzoom friction while changing page\r\n friction: 0.92,\r\n\r\n // Should center active page\r\n center: true,\r\n\r\n // Should carousel scroll infinitely\r\n infinite: true,\r\n\r\n // Should the gap be filled before first and after last slide if `infinite: false`\r\n fill: true,\r\n\r\n // Should Carousel settle at any position after a swipe.\r\n dragFree: false,\r\n\r\n // Prefix for CSS classes, must be the same as the SCSS `$carousel-prefix` variable\r\n prefix: \"\",\r\n\r\n // Class names for DOM elements (without prefix)\r\n classNames: {\r\n viewport: \"carousel__viewport\",\r\n track: \"carousel__track\",\r\n slide: \"carousel__slide\",\r\n\r\n // Classname toggled for slides inside current page\r\n slideSelected: \"is-selected\",\r\n },\r\n\r\n // Localization of strings\r\n l10n: en,\r\n};\r\n\r\nexport class Carousel extends Base {\r\n /**\r\n * Carousel constructor\r\n * @constructs Carousel\r\n * @param {HTMLElement} $container - Carousel container\r\n * @param {Object} [options] - Options for Carousel\r\n */\r\n constructor($container, options = {}) {\r\n options = extend(true, {}, defaults, options);\r\n\r\n super(options);\r\n\r\n this.state = \"init\";\r\n\r\n this.$container = $container;\r\n\r\n if (!(this.$container instanceof HTMLElement)) {\r\n throw new Error(\"No root element provided\");\r\n }\r\n\r\n this.slideNext = throttle(this.slideNext.bind(this), 250, true);\r\n this.slidePrev = throttle(this.slidePrev.bind(this), 250, true);\r\n\r\n this.init();\r\n\r\n $container.__Carousel = this;\r\n }\r\n\r\n /**\r\n * Perform initialization\r\n */\r\n init() {\r\n this.pages = [];\r\n this.page = this.pageIndex = null;\r\n this.prevPage = this.prevPageIndex = null;\r\n\r\n this.attachPlugins(Carousel.Plugins);\r\n\r\n this.trigger(\"init\");\r\n\r\n this.initLayout();\r\n\r\n this.initSlides();\r\n\r\n this.updateMetrics();\r\n\r\n if (this.$track && this.pages.length) {\r\n this.$track.style.transform = `translate3d(${this.pages[this.page].left * -1}px, 0px, 0) scale(1)`;\r\n }\r\n\r\n this.manageSlideVisiblity();\r\n\r\n this.initPanzoom();\r\n\r\n this.state = \"ready\";\r\n\r\n this.trigger(\"ready\");\r\n }\r\n\r\n /**\r\n * Initialize layout; create necessary elements\r\n */\r\n initLayout() {\r\n const prefix = this.option(\"prefix\");\r\n const classNames = this.option(\"classNames\");\r\n\r\n this.$viewport = this.option(\"viewport\") || this.$container.querySelector(`.${prefix}${classNames.viewport}`);\r\n\r\n if (!this.$viewport) {\r\n this.$viewport = document.createElement(\"div\");\r\n this.$viewport.classList.add(...(prefix + classNames.viewport).split(\" \"));\r\n\r\n this.$viewport.append(...this.$container.childNodes);\r\n\r\n this.$container.appendChild(this.$viewport);\r\n }\r\n\r\n this.$track = this.option(\"track\") || this.$container.querySelector(`.${prefix}${classNames.track}`);\r\n\r\n if (!this.$track) {\r\n this.$track = document.createElement(\"div\");\r\n this.$track.classList.add(...(prefix + classNames.track).split(\" \"));\r\n\r\n this.$track.append(...this.$viewport.childNodes);\r\n\r\n this.$viewport.appendChild(this.$track);\r\n }\r\n }\r\n\r\n /**\r\n * Fill `slides` array with objects from existing nodes and/or `slides` option\r\n */\r\n initSlides() {\r\n this.slides = [];\r\n\r\n // Get existing slides from the DOM\r\n const elems = this.$viewport.querySelectorAll(`.${this.option(\"prefix\")}${this.option(\"classNames.slide\")}`);\r\n\r\n elems.forEach((el) => {\r\n const slide = {\r\n $el: el,\r\n isDom: true,\r\n };\r\n\r\n this.slides.push(slide);\r\n\r\n this.trigger(\"createSlide\", slide, this.slides.length);\r\n });\r\n\r\n // Add virtual slides, but do not create DOM elements yet,\r\n // because they will be created dynamically based on current carousel position\r\n if (Array.isArray(this.options.slides)) {\r\n this.slides = extend(true, [...this.slides], this.options.slides);\r\n }\r\n }\r\n\r\n /**\r\n * Do all calculations related to slide size and paging\r\n */\r\n updateMetrics() {\r\n // Calculate content width, viewport width\r\n // ===\r\n let contentWidth = 0;\r\n let indexes = [];\r\n let lastSlideWidth;\r\n\r\n this.slides.forEach((slide, index) => {\r\n const $el = slide.$el;\r\n const slideWidth = slide.isDom || !lastSlideWidth ? this.getSlideMetrics($el) : lastSlideWidth;\r\n\r\n slide.index = index;\r\n slide.width = slideWidth;\r\n slide.left = contentWidth;\r\n\r\n lastSlideWidth = slideWidth;\r\n contentWidth += slideWidth;\r\n\r\n indexes.push(index);\r\n });\r\n\r\n let viewportWidth = Math.max(this.$track.offsetWidth, round(this.$track.getBoundingClientRect().width));\r\n\r\n let viewportStyles = getComputedStyle(this.$track);\r\n viewportWidth = viewportWidth - (parseFloat(viewportStyles.paddingLeft) + parseFloat(viewportStyles.paddingRight));\r\n\r\n this.contentWidth = contentWidth;\r\n this.viewportWidth = viewportWidth;\r\n\r\n // Split slides into pages\r\n // ===\r\n const pages = [];\r\n const slidesPerPage = this.option(\"slidesPerPage\");\r\n\r\n if (Number.isInteger(slidesPerPage) && contentWidth > viewportWidth) {\r\n // Fixed number of slides in the page\r\n for (let i = 0; i < this.slides.length; i += slidesPerPage) {\r\n pages.push({\r\n indexes: indexes.slice(i, i + slidesPerPage),\r\n slides: this.slides.slice(i, i + slidesPerPage),\r\n });\r\n }\r\n } else {\r\n // Slides that fit inside viewport\r\n let currentPage = 0;\r\n let currentWidth = 0;\r\n\r\n for (let i = 0; i < this.slides.length; i += 1) {\r\n let slide = this.slides[i];\r\n\r\n // Add next page\r\n if (!pages.length || currentWidth + slide.width > viewportWidth) {\r\n pages.push({\r\n indexes: [],\r\n slides: [],\r\n });\r\n\r\n currentPage = pages.length - 1;\r\n currentWidth = 0;\r\n }\r\n\r\n currentWidth += slide.width;\r\n\r\n pages[currentPage].indexes.push(i);\r\n pages[currentPage].slides.push(slide);\r\n }\r\n }\r\n\r\n const shouldCenter = this.option(\"center\");\r\n const shouldFill = this.option(\"fill\");\r\n\r\n // Calculate width and start position for each page\r\n // ===\r\n pages.forEach((page, index) => {\r\n page.index = index;\r\n page.width = page.slides.reduce((sum, slide) => sum + slide.width, 0);\r\n\r\n page.left = page.slides[0].left;\r\n\r\n if (shouldCenter) {\r\n page.left += (viewportWidth - page.width) * 0.5 * -1;\r\n }\r\n\r\n if (shouldFill && !this.option(\"infiniteX\", this.option(\"infinite\")) && contentWidth > viewportWidth) {\r\n page.left = Math.max(page.left, 0);\r\n page.left = Math.min(page.left, contentWidth - viewportWidth);\r\n }\r\n });\r\n\r\n // Merge pages\r\n // ===\r\n const rez = [];\r\n let prevPage;\r\n\r\n pages.forEach((page2) => {\r\n const page = { ...page2 };\r\n\r\n if (prevPage && page.left === prevPage.left) {\r\n prevPage.width += page.width;\r\n\r\n prevPage.slides = [...prevPage.slides, ...page.slides];\r\n prevPage.indexes = [...prevPage.indexes, ...page.indexes];\r\n } else {\r\n page.index = rez.length;\r\n\r\n prevPage = page;\r\n\r\n rez.push(page);\r\n }\r\n });\r\n\r\n this.pages = rez;\r\n\r\n let page = this.page;\r\n\r\n if (page === null) {\r\n const initialSlide = this.option(\"initialSlide\");\r\n\r\n if (initialSlide !== null) {\r\n page = this.findPageForSlide(initialSlide);\r\n } else {\r\n page = parseInt(this.option(\"initialPage\", 0), 10) || 0;\r\n }\r\n\r\n if (!rez[page]) {\r\n page = rez.length && page > rez.length ? rez[rez.length - 1].index : 0;\r\n }\r\n\r\n this.page = page;\r\n this.pageIndex = page;\r\n }\r\n\r\n this.updatePanzoom();\r\n\r\n this.trigger(\"refresh\");\r\n }\r\n\r\n /**\r\n * Calculate slide element width (including left, right margins)\r\n * @param {Object} node\r\n * @returns {Number} Width in px\r\n */\r\n getSlideMetrics(node) {\r\n if (!node) {\r\n const firstSlide = this.slides[0];\r\n\r\n node = document.createElement(\"div\");\r\n\r\n node.dataset.isTestEl = 1;\r\n node.style.visibility = \"hidden\";\r\n node.classList.add(...(this.option(\"prefix\") + this.option(\"classNames.slide\")).split(\" \"));\r\n\r\n // Assume all slides have the same custom class, if any\r\n if (firstSlide.customClass) {\r\n node.classList.add(...firstSlide.customClass.split(\" \"));\r\n }\r\n\r\n this.$track.prepend(node);\r\n }\r\n\r\n let width = Math.max(node.offsetWidth, round(node.getBoundingClientRect().width));\r\n\r\n // Add left/right margin\r\n const style = node.currentStyle || window.getComputedStyle(node);\r\n width = width + (parseFloat(style.marginLeft) || 0) + (parseFloat(style.marginRight) || 0);\r\n\r\n if (node.dataset.isTestEl) {\r\n node.remove();\r\n }\r\n\r\n return width;\r\n }\r\n\r\n /**\r\n *\r\n * @param {Integer} index Index of the slide\r\n * @returns {Integer|null} Index of the page if found, or null\r\n */\r\n findPageForSlide(index) {\r\n index = parseInt(index, 10) || 0;\r\n\r\n const page = this.pages.find((page) => {\r\n return page.indexes.indexOf(index) > -1;\r\n });\r\n\r\n return page ? page.index : null;\r\n }\r\n\r\n /**\r\n * Slide to next page, if possible\r\n */\r\n slideNext() {\r\n this.slideTo(this.pageIndex + 1);\r\n }\r\n\r\n /**\r\n * Slide to previous page, if possible\r\n */\r\n slidePrev() {\r\n this.slideTo(this.pageIndex - 1);\r\n }\r\n\r\n /**\r\n * Slides carousel to given page\r\n * @param {Number} page - New index of active page\r\n * @param {Object} [params] - Additional options\r\n */\r\n slideTo(page, params = {}) {\r\n const { x = this.setPage(page, true) * -1, y = 0, friction = this.option(\"friction\") } = params;\r\n\r\n if (this.Panzoom.content.x === x && !this.Panzoom.velocity.x && friction) {\r\n return;\r\n }\r\n\r\n this.Panzoom.panTo({\r\n x,\r\n y,\r\n friction,\r\n ignoreBounds: true,\r\n });\r\n\r\n if (this.state === \"ready\" && this.Panzoom.state === \"ready\") {\r\n this.trigger(\"settle\");\r\n }\r\n }\r\n\r\n /**\r\n * Initialise main Panzoom instance\r\n */\r\n initPanzoom() {\r\n if (this.Panzoom) {\r\n this.Panzoom.destroy();\r\n }\r\n\r\n // Create fresh object containing options for Pazoom instance\r\n const options = extend(\r\n true,\r\n {},\r\n {\r\n // Track element will be set as Panzoom $content\r\n content: this.$track,\r\n wrapInner: false,\r\n resizeParent: false,\r\n\r\n // Disable any user interaction\r\n zoom: false,\r\n click: false,\r\n\r\n // Right now, only horizontal navigation is supported\r\n lockAxis: \"x\",\r\n\r\n x: this.pages.length ? this.pages[this.page].left * -1 : 0,\r\n centerOnStart: false,\r\n\r\n // Make `textSelection` option more easy to customize\r\n textSelection: () => this.option(\"textSelection\", false),\r\n\r\n // Disable dragging if content (e.g. all slides) fits inside viewport\r\n panOnlyZoomed: function () {\r\n return this.content.width <= this.viewport.width;\r\n },\r\n },\r\n this.option(\"Panzoom\")\r\n );\r\n\r\n // Create new Panzoom instance\r\n this.Panzoom = new Panzoom(this.$container, options);\r\n\r\n this.Panzoom.on({\r\n // Bubble events\r\n \"*\": (name, ...details) => this.trigger(`Panzoom.${name}`, ...details),\r\n // The rest of events to be processed\r\n afterUpdate: () => {\r\n this.updatePage();\r\n },\r\n beforeTransform: this.onBeforeTransform.bind(this),\r\n touchEnd: this.onTouchEnd.bind(this),\r\n endAnimation: () => {\r\n this.trigger(\"settle\");\r\n },\r\n });\r\n\r\n // The contents of the slides may cause the page scroll bar to appear, so the carousel width may change\r\n // and slides have to be repositioned\r\n this.updateMetrics();\r\n this.manageSlideVisiblity();\r\n }\r\n\r\n updatePanzoom() {\r\n if (!this.Panzoom) {\r\n return;\r\n }\r\n\r\n this.Panzoom.content = {\r\n ...this.Panzoom.content,\r\n fitWidth: this.contentWidth,\r\n origWidth: this.contentWidth,\r\n width: this.contentWidth,\r\n };\r\n\r\n if (this.pages.length > 1 && this.option(\"infiniteX\", this.option(\"infinite\"))) {\r\n this.Panzoom.boundX = null;\r\n } else if (this.pages.length) {\r\n this.Panzoom.boundX = {\r\n from: this.pages[this.pages.length - 1].left * -1,\r\n to: this.pages[0].left * -1,\r\n };\r\n }\r\n\r\n if (this.option(\"infiniteY\", this.option(\"infinite\"))) {\r\n this.Panzoom.boundY = null;\r\n } else {\r\n this.Panzoom.boundY = {\r\n from: 0,\r\n to: 0,\r\n };\r\n }\r\n\r\n this.Panzoom.handleCursor();\r\n }\r\n\r\n manageSlideVisiblity() {\r\n const contentWidth = this.contentWidth;\r\n const viewportWidth = this.viewportWidth;\r\n\r\n let currentX = this.Panzoom ? this.Panzoom.content.x * -1 : this.pages.length ? this.pages[this.page].left : 0;\r\n\r\n const preload = this.option(\"preload\");\r\n const infinite = this.option(\"infiniteX\", this.option(\"infinite\"));\r\n\r\n const paddingLeft = parseFloat(getComputedStyle(this.$viewport, null).getPropertyValue(\"padding-left\"));\r\n const paddingRight = parseFloat(getComputedStyle(this.$viewport, null).getPropertyValue(\"padding-right\"));\r\n\r\n // Check visibility of each slide\r\n this.slides.forEach((slide) => {\r\n let leftBoundary, rightBoundary;\r\n\r\n let hasDiff = 0;\r\n\r\n // #1 - slides in current viewport; this does not include infinite items\r\n leftBoundary = currentX - paddingLeft;\r\n rightBoundary = currentX + viewportWidth + paddingRight;\r\n\r\n leftBoundary -= preload * (viewportWidth + paddingLeft + paddingRight);\r\n rightBoundary += preload * (viewportWidth + paddingLeft + paddingRight);\r\n\r\n const insideCurrentInterval = slide.left + slide.width > leftBoundary && slide.left < rightBoundary;\r\n\r\n // #2 - infinite items inside current viewport; from previous interval\r\n leftBoundary = currentX + contentWidth - paddingLeft;\r\n rightBoundary = currentX + contentWidth + viewportWidth + paddingRight;\r\n\r\n // Include slides that have to be preloaded\r\n leftBoundary -= preload * (viewportWidth + paddingLeft + paddingRight);\r\n\r\n const insidePrevInterval = infinite && slide.left + slide.width > leftBoundary && slide.left < rightBoundary;\r\n\r\n // #2 - infinite items inside current viewport; from next interval\r\n leftBoundary = currentX - contentWidth - paddingLeft;\r\n rightBoundary = currentX - contentWidth + viewportWidth + paddingRight;\r\n\r\n // Include slides that have to be preloaded\r\n leftBoundary -= preload * (viewportWidth + paddingLeft + paddingRight);\r\n\r\n const insideNextInterval = infinite && slide.left + slide.width > leftBoundary && slide.left < rightBoundary;\r\n\r\n // Create virtual slides that should be visible or preloaded, remove others\r\n if (insidePrevInterval || insideCurrentInterval || insideNextInterval) {\r\n this.createSlideEl(slide);\r\n\r\n if (insideCurrentInterval) {\r\n hasDiff = 0;\r\n }\r\n\r\n if (insidePrevInterval) {\r\n hasDiff = -1;\r\n }\r\n\r\n if (insideNextInterval) {\r\n hasDiff = 1;\r\n }\r\n\r\n // Bring preloaded slides back to viewport, if needed\r\n if (slide.left + slide.width > currentX && slide.left <= currentX + viewportWidth + paddingRight) {\r\n hasDiff = 0;\r\n }\r\n } else {\r\n this.removeSlideEl(slide);\r\n }\r\n\r\n slide.hasDiff = hasDiff;\r\n });\r\n\r\n // Reposition slides for continuity\r\n let nextIndex = 0;\r\n let nextPos = 0;\r\n\r\n this.slides.forEach((slide, index) => {\r\n let updatedX = 0;\r\n\r\n if (slide.$el) {\r\n if (index !== nextIndex || slide.hasDiff) {\r\n updatedX = nextPos + slide.hasDiff * contentWidth;\r\n } else {\r\n nextPos = 0;\r\n }\r\n\r\n slide.$el.style.left = Math.abs(updatedX) > 0.1 ? `${nextPos + slide.hasDiff * contentWidth}px` : \"\";\r\n\r\n nextIndex++;\r\n } else {\r\n nextPos += slide.width;\r\n }\r\n });\r\n\r\n this.markSelectedSlides();\r\n }\r\n\r\n /**\r\n * Creates main DOM element for virtual slides,\r\n * lazy loads images inside regular slides\r\n * @param {Object} slide\r\n */\r\n createSlideEl(slide) {\r\n if (!slide) {\r\n return;\r\n }\r\n\r\n if (slide.$el) {\r\n let curentIndex = slide.$el.dataset.index;\r\n\r\n if (!curentIndex || parseInt(curentIndex, 10) !== slide.index) {\r\n slide.$el.dataset.index = slide.index;\r\n\r\n // Lazy load images\r\n // ===\r\n slide.$el.querySelectorAll(\"[data-lazy-srcset]\").forEach((node) => {\r\n node.srcset = node.dataset.lazySrcset;\r\n });\r\n\r\n slide.$el.querySelectorAll(\"[data-lazy-src]\").forEach((node) => {\r\n let lazySrc = node.dataset.lazySrc;\r\n\r\n if (node instanceof HTMLImageElement) {\r\n node.src = lazySrc;\r\n } else {\r\n node.style.backgroundImage = `url('${lazySrc}')`;\r\n }\r\n });\r\n\r\n // Lazy load slide background image\r\n // ===\r\n let lazySrc;\r\n\r\n if ((lazySrc = slide.$el.dataset.lazySrc)) {\r\n slide.$el.style.backgroundImage = `url('${lazySrc}')`;\r\n }\r\n\r\n slide.state = \"ready\";\r\n }\r\n\r\n return;\r\n }\r\n\r\n const div = document.createElement(\"div\");\r\n\r\n div.dataset.index = slide.index;\r\n div.classList.add(...(this.option(\"prefix\") + this.option(\"classNames.slide\")).split(\" \"));\r\n\r\n if (slide.customClass) {\r\n div.classList.add(...slide.customClass.split(\" \"));\r\n }\r\n\r\n if (slide.html) {\r\n div.innerHTML = slide.html;\r\n }\r\n\r\n const allElelements = [];\r\n\r\n this.slides.forEach((slide, index) => {\r\n if (slide.$el) {\r\n allElelements.push(index);\r\n }\r\n });\r\n\r\n // Find a place in DOM to insert an element\r\n const goal = slide.index;\r\n let refSlide = null;\r\n\r\n if (allElelements.length) {\r\n let refIndex = allElelements.reduce((prev, curr) =>\r\n Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev\r\n );\r\n refSlide = this.slides[refIndex];\r\n }\r\n\r\n this.$track.insertBefore(\r\n div,\r\n refSlide && refSlide.$el ? (refSlide.index < slide.index ? refSlide.$el.nextSibling : refSlide.$el) : null\r\n );\r\n\r\n slide.$el = div;\r\n\r\n this.trigger(\"createSlide\", slide, goal);\r\n\r\n return slide;\r\n }\r\n\r\n /**\r\n * Removes main DOM element of given slide\r\n * @param {Object} slide\r\n */\r\n removeSlideEl(slide) {\r\n if (slide.$el && !slide.isDom) {\r\n this.trigger(\"removeSlide\", slide);\r\n\r\n slide.$el.remove();\r\n slide.$el = null;\r\n }\r\n }\r\n\r\n /**\r\n * Toggles selected class name and aria-hidden attribute for slides based on visibility\r\n */\r\n markSelectedSlides() {\r\n const selectedClass = this.option(\"classNames.slideSelected\");\r\n const attr = \"aria-hidden\";\r\n\r\n this.slides.forEach((slide, index) => {\r\n const $el = slide.$el;\r\n\r\n if (!$el) {\r\n return;\r\n }\r\n\r\n const page = this.pages[this.page];\r\n\r\n if (page && page.indexes && page.indexes.indexOf(index) > -1) {\r\n if (selectedClass && !$el.classList.contains(selectedClass)) {\r\n $el.classList.add(selectedClass);\r\n this.trigger(\"selectSlide\", slide);\r\n }\r\n\r\n $el.removeAttribute(attr);\r\n } else {\r\n if (selectedClass && $el.classList.contains(selectedClass)) {\r\n $el.classList.remove(selectedClass);\r\n this.trigger(\"unselectSlide\", slide);\r\n }\r\n\r\n $el.setAttribute(attr, true);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Perform all calculations and center current page\r\n */\r\n updatePage() {\r\n this.updateMetrics();\r\n\r\n this.slideTo(this.page, { friction: 0 });\r\n }\r\n\r\n /**\r\n * Process `Panzoom.beforeTransform` event to remove slides moved out of viewport and\r\n * to create necessary ones\r\n */\r\n onBeforeTransform() {\r\n if (this.option(\"infiniteX\", this.option(\"infinite\"))) {\r\n this.manageInfiniteTrack();\r\n }\r\n\r\n this.manageSlideVisiblity();\r\n }\r\n\r\n /**\r\n * Seamlessly flip position of infinite carousel, if needed; this way x position stays low\r\n */\r\n manageInfiniteTrack() {\r\n const contentWidth = this.contentWidth;\r\n const viewportWidth = this.viewportWidth;\r\n\r\n if (!this.option(\"infiniteX\", this.option(\"infinite\")) || this.pages.length < 2 || contentWidth < viewportWidth) {\r\n return;\r\n }\r\n\r\n const panzoom = this.Panzoom;\r\n\r\n let isFlipped = false;\r\n\r\n if (panzoom.content.x < (contentWidth - viewportWidth) * -1) {\r\n panzoom.content.x += contentWidth;\r\n\r\n this.pageIndex = this.pageIndex - this.pages.length;\r\n\r\n isFlipped = true;\r\n }\r\n\r\n if (panzoom.content.x > viewportWidth) {\r\n panzoom.content.x -= contentWidth;\r\n\r\n this.pageIndex = this.pageIndex + this.pages.length;\r\n\r\n isFlipped = true;\r\n }\r\n\r\n if (isFlipped && panzoom.state === \"pointerdown\") {\r\n panzoom.resetDragPosition();\r\n }\r\n\r\n return isFlipped;\r\n }\r\n\r\n /**\r\n * Process `Panzoom.touchEnd` event; slide to next/prev page if needed\r\n * @param {object} panzoom\r\n */\r\n onTouchEnd(panzoom, event) {\r\n const dragFree = this.option(\"dragFree\");\r\n\r\n // If this is a quick horizontal flick, slide to next/prev slide\r\n if (\r\n !dragFree &&\r\n this.pages.length > 1 &&\r\n panzoom.dragOffset.time < 350 &&\r\n Math.abs(panzoom.dragOffset.y) < 1 &&\r\n Math.abs(panzoom.dragOffset.x) > 5\r\n ) {\r\n this[panzoom.dragOffset.x < 0 ? \"slideNext\" : \"slidePrev\"]();\r\n return;\r\n }\r\n\r\n // Set the slide at the end of the animation as the current one,\r\n // or slide to closest page\r\n if (dragFree) {\r\n const [, nextPageIndex] = this.getPageFromPosition(panzoom.transform.x * -1);\r\n this.setPage(nextPageIndex);\r\n } else {\r\n this.slideToClosest();\r\n }\r\n }\r\n\r\n /**\r\n * Slides to the closest page (useful, if carousel is changed manually)\r\n * @param {Object} [params] - Object containing additional options\r\n */\r\n slideToClosest(params = {}) {\r\n let [, nextPageIndex] = this.getPageFromPosition(this.Panzoom.content.x * -1);\r\n\r\n this.slideTo(nextPageIndex, params);\r\n }\r\n\r\n /**\r\n * Returns index of closest page to given x position\r\n * @param {Number} xPos\r\n */\r\n getPageFromPosition(xPos) {\r\n const pageCount = this.pages.length;\r\n const center = this.option(\"center\");\r\n\r\n if (center) {\r\n xPos += this.viewportWidth * 0.5;\r\n }\r\n\r\n const interval = Math.floor(xPos / this.contentWidth);\r\n\r\n xPos -= interval * this.contentWidth;\r\n\r\n let slide = this.slides.find((slide) => slide.left <= xPos && slide.left + slide.width > xPos);\r\n\r\n if (slide) {\r\n let pageIndex = this.findPageForSlide(slide.index);\r\n\r\n return [pageIndex, pageIndex + interval * pageCount];\r\n }\r\n\r\n return [0, 0];\r\n }\r\n\r\n /**\r\n * Changes active page\r\n * @param {Number} page - New index of active page\r\n * @param {Boolean} toClosest - to closest page based on scroll distance (for infinite navigation)\r\n */\r\n setPage(page, toClosest) {\r\n let nextPosition = 0;\r\n let pageIndex = parseInt(page, 10) || 0;\r\n\r\n const prevPage = this.page,\r\n prevPageIndex = this.pageIndex,\r\n pageCount = this.pages.length;\r\n\r\n const contentWidth = this.contentWidth;\r\n const viewportWidth = this.viewportWidth;\r\n\r\n page = ((pageIndex % pageCount) + pageCount) % pageCount;\r\n\r\n if (this.option(\"infiniteX\", this.option(\"infinite\")) && contentWidth > viewportWidth) {\r\n const nextInterval = Math.floor(pageIndex / pageCount) || 0,\r\n elemDimWidth = contentWidth;\r\n\r\n nextPosition = this.pages[page].left + nextInterval * elemDimWidth;\r\n\r\n if (toClosest === true && pageCount > 2) {\r\n let currPosition = this.Panzoom.content.x * -1;\r\n\r\n // * Find closest interval\r\n const decreasedPosition = nextPosition - elemDimWidth,\r\n increasedPosition = nextPosition + elemDimWidth,\r\n diff1 = Math.abs(currPosition - nextPosition),\r\n diff2 = Math.abs(currPosition - decreasedPosition),\r\n diff3 = Math.abs(currPosition - increasedPosition);\r\n\r\n if (diff3 < diff1 && diff3 <= diff2) {\r\n nextPosition = increasedPosition;\r\n pageIndex += pageCount;\r\n } else if (diff2 < diff1 && diff2 < diff3) {\r\n nextPosition = decreasedPosition;\r\n pageIndex -= pageCount;\r\n }\r\n }\r\n } else {\r\n page = pageIndex = Math.max(0, Math.min(pageIndex, pageCount - 1));\r\n\r\n nextPosition = this.pages.length ? this.pages[page].left : 0;\r\n }\r\n\r\n this.page = page;\r\n this.pageIndex = pageIndex;\r\n\r\n if (prevPage !== null && page !== prevPage) {\r\n this.prevPage = prevPage;\r\n this.prevPageIndex = prevPageIndex;\r\n\r\n this.trigger(\"change\", page, prevPage);\r\n }\r\n\r\n return nextPosition;\r\n }\r\n\r\n /**\r\n * Clean up\r\n */\r\n destroy() {\r\n this.state = \"destroy\";\r\n\r\n this.slides.forEach((slide) => {\r\n this.removeSlideEl(slide);\r\n });\r\n\r\n this.slides = [];\r\n\r\n this.Panzoom.destroy();\r\n\r\n this.detachPlugins();\r\n }\r\n}\r\n\r\n// Expose version\r\nCarousel.version = \"__VERSION__\";\r\n\r\n// Static properties are a recent addition that dont work in all browsers yet\r\nCarousel.Plugins = Plugins;\r\n","export default {\r\n NEXT: \"Next slide\",\r\n PREV: \"Previous slide\",\r\n GOTO: \"Go to slide #%d\",\r\n};\r\n","import { extend } from \"../../../shared/utils/extend.js\";\nimport { Carousel } from \"../../../Carousel/Carousel.js\";\n\nconst defaults = {\n // The minimum number of images in the gallery to display thumbnails\n minSlideCount: 2,\n\n // Minimum screen height to display thumbnails\n minScreenHeight: 500,\n\n // Automatically show thumbnails when opened\n autoStart: true,\n\n // Keyboard shortcut to toggle thumbnail container\n key: \"t\",\n\n // Customize Carousel instance\n Carousel: {},\n\n tpl: `
`,\n};\n\nexport class Thumbs {\n constructor(fancybox) {\n this.fancybox = fancybox;\n\n this.$container = null;\n this.state = \"init\";\n\n for (const methodName of [\"onPrepare\", \"onClosing\", \"onKeydown\"]) {\n this[methodName] = this[methodName].bind(this);\n }\n\n this.events = {\n prepare: this.onPrepare,\n closing: this.onClosing,\n keydown: this.onKeydown,\n };\n }\n\n /**\n * Process `prepare` event to build the layout\n */\n onPrepare() {\n // Get slides, skip if the total number is less than the minimum\n const slides = this.getSlides();\n\n if (slides.length < this.fancybox.option(\"Thumbs.minSlideCount\")) {\n this.state = \"disabled\";\n return;\n }\n\n if (\n this.fancybox.option(\"Thumbs.autoStart\") === true &&\n this.fancybox.Carousel.Panzoom.content.height >= this.fancybox.option(\"Thumbs.minScreenHeight\")\n ) {\n this.build();\n }\n }\n\n /**\n * Process `closing` event to disable all events\n */\n onClosing() {\n if (this.Carousel) {\n this.Carousel.Panzoom.detachEvents();\n }\n }\n\n /**\n * Process `keydown` event to enable thumbnail list toggling using keyboard key\n * @param {Object} fancybox\n * @param {String} key\n */\n onKeydown(fancybox, key) {\n if (key === fancybox.option(\"Thumbs.key\")) {\n this.toggle();\n }\n }\n\n /**\n * Build layout and init thumbnail Carousel\n */\n build() {\n if (this.$container) {\n return;\n }\n\n // Create wrapping element and append to layout\n const $container = document.createElement(\"div\");\n\n $container.classList.add(\"fancybox__thumbs\");\n\n this.fancybox.$carousel.parentNode.insertBefore($container, this.fancybox.$carousel.nextSibling);\n\n // Initialise thumbnail carousel with all slides\n this.Carousel = new Carousel(\n $container,\n extend(\n true,\n {\n Dots: false,\n Navigation: false,\n Sync: {\n friction: 0,\n },\n infinite: false,\n center: true,\n fill: true,\n dragFree: true,\n slidesPerPage: 1,\n preload: 1,\n },\n this.fancybox.option(\"Thumbs.Carousel\"),\n {\n Sync: {\n target: this.fancybox.Carousel,\n },\n slides: this.getSlides(),\n }\n )\n );\n\n // Slide carousel on wheel event\n this.Carousel.Panzoom.on(\"wheel\", (panzoom, event) => {\n event.preventDefault();\n\n this.fancybox[event.deltaY < 0 ? \"prev\" : \"next\"]();\n });\n\n this.$container = $container;\n\n this.state = \"visible\";\n }\n\n /**\n * Process all fancybox slides to get all thumbnail images\n */\n getSlides() {\n const slides = [];\n\n for (const slide of this.fancybox.items) {\n const thumb = slide.thumb;\n\n if (thumb) {\n slides.push({\n html: this.fancybox.option(\"Thumbs.tpl\").replace(/\\{\\{src\\}\\}/gi, thumb),\n customClass: `has-thumb has-${slide.type || \"image\"}`,\n });\n }\n }\n\n return slides;\n }\n\n /**\n * Toggle visibility of thumbnail list\n * Tip: you can use `Fancybox.getInstance().plugins.Thumbs.toggle()` from anywhere in your code\n */\n toggle() {\n if (this.state === \"visible\") {\n this.hide();\n } else if (this.state === \"hidden\") {\n this.show();\n } else {\n this.build();\n }\n }\n\n /**\n * Show thumbnail list\n */\n show() {\n if (this.state === \"hidden\") {\n this.$container.style.display = \"\";\n\n this.Carousel.Panzoom.attachEvents();\n\n this.state = \"visible\";\n }\n }\n\n /**\n * Hide thumbnail list\n */\n hide() {\n if (this.state === \"visible\") {\n this.Carousel.Panzoom.detachEvents();\n\n this.$container.style.display = \"none\";\n\n this.state = \"hidden\";\n }\n }\n\n /**\n * Reset the state\n */\n cleanup() {\n if (this.Carousel) {\n this.Carousel.destroy();\n this.Carousel = null;\n }\n\n if (this.$container) {\n this.$container.remove();\n this.$container = null;\n }\n\n this.state = \"init\";\n }\n\n attach() {\n this.fancybox.on(this.events);\n }\n\n detach() {\n this.fancybox.off(this.events);\n\n this.cleanup();\n }\n}\n\n// Expose defaults\nThumbs.defaults = defaults;\n","import { extend } from \"../../../shared/utils/extend.js\";\n\nconst buildURLQuery = (src, obj) => {\n const url = new URL(src);\n const params = new URLSearchParams(url.search);\n\n let rez = new URLSearchParams();\n\n for (const [key, value] of [...params, ...Object.entries(obj)]) {\n // Youtube\n if (key === \"t\") {\n rez.set(\"start\", parseInt(value));\n } else {\n rez.set(key, value);\n }\n }\n\n // Convert to 'foo=1&bar=2&baz=3'\n rez = rez.toString();\n\n // Vimeo\n // https://vimeo.zendesk.com/hc/en-us/articles/360000121668-Starting-playback-at-a-specific-timecode\n let matches = src.match(/#t=((.*)?\\d+s)/);\n\n if (matches) {\n rez += `#t=${matches[1]}`;\n }\n\n return rez;\n};\n\nconst defaults = {\n // General options for any video content (Youtube, Vimeo, HTML5 video)\n video: {\n autoplay: true,\n ratio: 16 / 9,\n },\n // Youtube embed parameters\n youtube: {\n autohide: 1,\n fs: 1,\n rel: 0,\n hd: 1,\n wmode: \"transparent\",\n enablejsapi: 1,\n html5: 1,\n },\n // Vimeo embed parameters\n vimeo: {\n hd: 1,\n show_title: 1,\n show_byline: 1,\n show_portrait: 0,\n fullscreen: 1,\n },\n // HTML5 video parameters\n html5video: {\n tpl: ``,\n format: \"\",\n },\n};\n\nexport class Html {\n constructor(fancybox) {\n this.fancybox = fancybox;\n\n for (const methodName of [\n \"onInit\",\n \"onReady\",\n\n \"onCreateSlide\",\n \"onRemoveSlide\",\n\n \"onSelectSlide\",\n \"onUnselectSlide\",\n\n \"onRefresh\",\n\n // For communication with iframed video (youtube/vimeo)\n \"onMessage\",\n ]) {\n this[methodName] = this[methodName].bind(this);\n }\n\n this.events = {\n init: this.onInit,\n ready: this.onReady,\n\n \"Carousel.createSlide\": this.onCreateSlide,\n \"Carousel.removeSlide\": this.onRemoveSlide,\n\n \"Carousel.selectSlide\": this.onSelectSlide,\n \"Carousel.unselectSlide\": this.onUnselectSlide,\n\n \"Carousel.refresh\": this.onRefresh,\n };\n }\n\n /**\n * Check if each gallery item has type when fancybox starts\n */\n onInit() {\n for (const slide of this.fancybox.items) {\n this.processType(slide);\n }\n }\n\n /**\n * Set content type for the slide\n * @param {Object} slide\n */\n processType(slide) {\n // Add support for `new Fancybox({items : [{html : 'smth'}]});`\n if (slide.html) {\n slide.src = slide.html;\n slide.type = \"html\";\n\n delete slide.html;\n\n return;\n }\n\n const src = slide.src || \"\";\n\n let type = slide.type || this.fancybox.options.type,\n rez = null;\n\n if (src && typeof src !== \"string\") {\n return;\n }\n\n if (\n (rez = src.match(\n /(?:youtube\\.com|youtu\\.be|youtube\\-nocookie\\.com)\\/(?:watch\\?(?:.*&)?v=|v\\/|u\\/|embed\\/?)?(videoseries\\?list=(?:.*)|[\\w-]{11}|\\?listType=(?:.*)&list=(?:.*))(?:.*)/i\n ))\n ) {\n const params = buildURLQuery(src, this.fancybox.option(\"Html.youtube\"));\n const videoId = encodeURIComponent(rez[1]);\n\n slide.videoId = videoId;\n slide.src = `https://www.youtube-nocookie.com/embed/${videoId}?${params}`;\n slide.thumb = slide.thumb || `https://i.ytimg.com/vi/${videoId}/mqdefault.jpg`;\n slide.vendor = \"youtube\";\n\n type = \"video\";\n } else if ((rez = src.match(/^.+vimeo.com\\/(?:\\/)?([\\d]+)(.*)?/))) {\n const params = buildURLQuery(src, this.fancybox.option(\"Html.vimeo\"));\n const videoId = encodeURIComponent(rez[1]);\n\n slide.videoId = videoId;\n slide.src = `https://player.vimeo.com/video/${videoId}?${params}`;\n slide.vendor = \"vimeo\";\n\n type = \"video\";\n } else if (\n (rez = src.match(\n /(?:maps\\.)?google\\.([a-z]{2,3}(?:\\.[a-z]{2})?)\\/(?:(?:(?:maps\\/(?:place\\/(?:.*)\\/)?\\@(.*),(\\d+.?\\d+?)z))|(?:\\?ll=))(.*)?/i\n ))\n ) {\n slide.src = `//maps.google.${rez[1]}/?ll=${(rez[2]\n ? rez[2] + \"&z=\" + Math.floor(rez[3]) + (rez[4] ? rez[4].replace(/^\\//, \"&\") : \"\")\n : rez[4] + \"\"\n ).replace(/\\?/, \"&\")}&output=${rez[4] && rez[4].indexOf(\"layer=c\") > 0 ? \"svembed\" : \"embed\"}`;\n\n type = \"map\";\n } else if ((rez = src.match(/(?:maps\\.)?google\\.([a-z]{2,3}(?:\\.[a-z]{2})?)\\/(?:maps\\/search\\/)(.*)/i))) {\n slide.src = `//maps.google.${rez[1]}/maps?q=${rez[2].replace(\"query=\", \"q=\").replace(\"api=1\", \"\")}&output=embed`;\n\n type = \"map\";\n }\n\n // Guess content type\n if (!type) {\n if (src.charAt(0) === \"#\") {\n type = \"inline\";\n } else if ((rez = src.match(/\\.(mp4|mov|ogv|webm)((\\?|#).*)?$/i))) {\n type = \"html5video\";\n\n slide.format = slide.format || \"video/\" + (rez[1] === \"ogv\" ? \"ogg\" : rez[1]);\n } else if (src.match(/(^data:image\\/[a-z0-9+\\/=]*,)|(\\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\\?|#).*)?$)/i)) {\n type = \"image\";\n } else if (src.match(/\\.(pdf)((\\?|#).*)?$/i)) {\n type = \"pdf\";\n }\n }\n\n slide.type = type || this.fancybox.option(\"defaultType\", \"image\");\n\n if (type === \"html5video\" || type === \"video\") {\n slide.video = extend({}, this.fancybox.option(\"Html.video\"), slide.video);\n\n if (slide._width && slide._height) {\n slide.ratio = parseFloat(slide._width) / parseFloat(slide._height);\n } else {\n slide.ratio = slide.ratio || slide.video.ratio || defaults.video.ratio;\n }\n }\n }\n\n /**\n * Start loading content when Fancybox is ready\n */\n onReady() {\n this.fancybox.Carousel.slides.forEach((slide) => {\n if (slide.$el) {\n this.setContent(slide);\n\n if (slide.index === this.fancybox.getSlide().index) {\n this.playVideo(slide);\n }\n }\n });\n }\n\n /**\n * Process `Carousel.createSlide` event to create image content\n * @param {Object} fancybox\n * @param {Object} carousel\n * @param {Object} slide\n */\n onCreateSlide(fancybox, carousel, slide) {\n if (this.fancybox.state !== \"ready\") {\n return;\n }\n\n this.setContent(slide);\n }\n\n /**\n * Retrieve and set slide content\n * @param {Object} slide\n */\n loadInlineContent(slide) {\n let $content;\n\n if (slide.src instanceof HTMLElement) {\n $content = slide.src;\n } else if (typeof slide.src === \"string\") {\n const tmp = slide.src.split(\"#\", 2);\n const id = tmp.length === 2 && tmp[0] === \"\" ? tmp[1] : tmp[0];\n\n $content = document.getElementById(id);\n }\n\n if ($content) {\n if (slide.type === \"clone\" || $content.$placeHolder) {\n $content = $content.cloneNode(true);\n let attrId = $content.getAttribute(\"id\");\n\n attrId = attrId ? `${attrId}--clone` : `clone-${this.fancybox.id}-${slide.index}`;\n\n $content.setAttribute(\"id\", attrId);\n } else {\n const $placeHolder = document.createElement(\"div\");\n $placeHolder.classList.add(\"fancybox-placeholder\");\n $content.parentNode.insertBefore($placeHolder, $content);\n $content.$placeHolder = $placeHolder;\n }\n\n this.fancybox.setContent(slide, $content);\n } else {\n this.fancybox.setError(slide, \"{{ELEMENT_NOT_FOUND}}\");\n }\n }\n\n /**\n * Makes AJAX request and sets response as slide content\n * @param {Object} slide\n */\n loadAjaxContent(slide) {\n const fancybox = this.fancybox;\n const xhr = new XMLHttpRequest();\n\n fancybox.showLoading(slide);\n\n xhr.onreadystatechange = function () {\n if (xhr.readyState === XMLHttpRequest.DONE) {\n if (fancybox.state === \"ready\") {\n fancybox.hideLoading(slide);\n\n if (xhr.status === 200) {\n fancybox.setContent(slide, xhr.responseText);\n } else {\n fancybox.setError(slide, xhr.status === 404 ? \"{{AJAX_NOT_FOUND}}\" : \"{{AJAX_FORBIDDEN}}\");\n }\n }\n }\n };\n\n const data = slide.ajax || null;\n\n xhr.open(data ? \"POST\" : \"GET\", slide.src);\n xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n xhr.send(data);\n\n slide.xhr = xhr;\n }\n\n /**\n * Creates iframe as slide content, preloads if needed before displaying\n * @param {Object} slide\n */\n loadIframeContent(slide) {\n const fancybox = this.fancybox;\n const $iframe = document.createElement(\"iframe\");\n\n $iframe.className = \"fancybox__iframe\";\n\n $iframe.setAttribute(\"id\", `fancybox__iframe_${fancybox.id}_${slide.index}`);\n\n $iframe.setAttribute(\"allow\", \"autoplay; fullscreen\");\n $iframe.setAttribute(\"scrolling\", \"auto\");\n\n slide.$iframe = $iframe;\n\n if (slide.type !== \"iframe\" || slide.preload === false) {\n $iframe.setAttribute(\"src\", slide.src);\n\n this.fancybox.setContent(slide, $iframe);\n\n this.resizeIframe(slide);\n\n return;\n }\n\n fancybox.showLoading(slide);\n\n const $content = document.createElement(\"div\");\n $content.style.visibility = \"hidden\";\n\n this.fancybox.setContent(slide, $content);\n\n $content.appendChild($iframe);\n\n $iframe.onerror = () => {\n fancybox.setError(slide, \"{{IFRAME_ERROR}}\");\n };\n\n $iframe.onload = () => {\n fancybox.hideLoading(slide);\n\n let isFirstLoad = false;\n\n if (!$iframe.isReady) {\n $iframe.isReady = true;\n isFirstLoad = true;\n }\n\n if (!$iframe.src.length) {\n return;\n }\n\n $iframe.parentNode.style.visibility = \"\";\n\n this.resizeIframe(slide);\n\n if (isFirstLoad) {\n fancybox.revealContent(slide);\n }\n };\n\n $iframe.setAttribute(\"src\", slide.src);\n }\n\n /**\n * Set CSS max/min width/height properties of the content to have the correct aspect ratio\n * @param {Object} slide\n */\n setAspectRatio(slide) {\n const $content = slide.$content;\n const ratio = slide.ratio;\n\n if (!$content) {\n return;\n }\n\n let width = slide._width;\n let height = slide._height;\n\n if (ratio || (width && height)) {\n Object.assign($content.style, {\n width: width && height ? \"100%\" : \"\",\n height: width && height ? \"100%\" : \"\",\n maxWidth: \"\",\n maxHeight: \"\",\n });\n\n let maxWidth = $content.offsetWidth;\n let maxHeight = $content.offsetHeight;\n\n width = width || maxWidth;\n height = height || maxHeight;\n\n // Resize to fit\n if (width > maxWidth || height > maxHeight) {\n let maxRatio = Math.min(maxWidth / width, maxHeight / height);\n\n width = width * maxRatio;\n height = height * maxRatio;\n }\n\n // Recheck ratio\n if (Math.abs(width / height - ratio) > 0.01) {\n if (ratio < width / height) {\n width = height * ratio;\n } else {\n height = width / ratio;\n }\n }\n\n Object.assign($content.style, {\n width: `${width}px`,\n height: `${height}px`,\n });\n }\n }\n\n /**\n * Adjust the width and height of the iframe according to the content dimensions, or defined sizes\n * @param {Object} slide\n */\n resizeIframe(slide) {\n const $iframe = slide.$iframe;\n\n if (!$iframe) {\n return;\n }\n\n let width_ = slide._width || 0;\n let height_ = slide._height || 0;\n\n if (width_ && height_) {\n slide.autoSize = false;\n }\n\n const $parent = $iframe.parentNode;\n const parentStyle = $parent && $parent.style;\n\n if (slide.preload !== false && slide.autoSize !== false && parentStyle) {\n try {\n const compStyles = window.getComputedStyle($parent),\n paddingX = parseFloat(compStyles.paddingLeft) + parseFloat(compStyles.paddingRight),\n paddingY = parseFloat(compStyles.paddingTop) + parseFloat(compStyles.paddingBottom);\n\n const document = $iframe.contentWindow.document,\n $html = document.getElementsByTagName(\"html\")[0],\n $body = document.body;\n\n // Allow content to expand horizontally\n parentStyle.width = \"\";\n\n // Get rid of vertical scrollbar\n $body.style.overflow = \"hidden\";\n\n width_ = width_ || $html.scrollWidth + paddingX;\n\n parentStyle.width = `${width_}px`;\n\n $body.style.overflow = \"\";\n\n parentStyle.flex = \"0 0 auto\";\n parentStyle.height = `${$body.scrollHeight}px`;\n\n height_ = $html.scrollHeight + paddingY;\n } catch (error) {\n //\n }\n }\n\n if (width_ || height_) {\n const newStyle = {\n flex: \"0 1 auto\",\n };\n\n if (width_) {\n newStyle.width = `${width_}px`;\n }\n\n if (height_) {\n newStyle.height = `${height_}px`;\n }\n\n Object.assign(parentStyle, newStyle);\n }\n }\n\n /**\n * Process `Carousel.onRefresh` event,\n * trigger iframe autosizing and set content aspect ratio for each slide\n * @param {Object} fancybox\n * @param {Object} carousel\n */\n onRefresh(fancybox, carousel) {\n carousel.slides.forEach((slide) => {\n if (!slide.$el) {\n return;\n }\n\n if (slide.$iframe) {\n this.resizeIframe(slide);\n }\n\n if (slide.ratio) {\n this.setAspectRatio(slide);\n }\n });\n }\n\n /**\n * Process `Carousel.onCreateSlide` event to set content\n * @param {Object} fancybox\n * @param {Object} carousel\n * @param {Object} slide\n */\n setContent(slide) {\n if (!slide || slide.isDom) {\n return;\n }\n\n switch (slide.type) {\n case \"html\":\n this.fancybox.setContent(slide, slide.src);\n break;\n\n case \"html5video\":\n this.fancybox.setContent(\n slide,\n this.fancybox\n .option(\"Html.html5video.tpl\")\n .replace(/\\{\\{src\\}\\}/gi, slide.src)\n .replace(\"{{format}}\", slide.format || (slide.html5video && slide.html5video.format) || \"\")\n .replace(\"{{poster}}\", slide.poster || slide.thumb || \"\")\n );\n\n break;\n\n case \"inline\":\n case \"clone\":\n this.loadInlineContent(slide);\n break;\n\n case \"ajax\":\n this.loadAjaxContent(slide);\n break;\n\n case \"pdf\":\n case \"video\":\n case \"map\":\n slide.preload = false;\n\n case \"iframe\":\n this.loadIframeContent(slide);\n\n break;\n }\n\n if (slide.ratio) {\n this.setAspectRatio(slide);\n }\n }\n\n /**\n * Process `Carousel.onSelectSlide` event to start video\n * @param {Object} fancybox\n * @param {Object} carousel\n * @param {Object} slide\n */\n onSelectSlide(fancybox, carousel, slide) {\n if (fancybox.state === \"ready\") {\n this.playVideo(slide);\n }\n }\n\n /**\n * Attempts to begin playback of the media\n * @param {Object} slide\n */\n playVideo(slide) {\n if (slide.type === \"html5video\" && slide.video.autoplay) {\n try {\n const $video = slide.$el.querySelector(\"video\");\n\n if ($video) {\n const promise = $video.play();\n\n if (promise !== undefined) {\n promise\n .then(() => {\n // Autoplay started\n })\n .catch((error) => {\n // Autoplay was prevented.\n $video.muted = true;\n $video.play();\n });\n }\n }\n } catch (err) {}\n }\n\n if (slide.type !== \"video\" || !(slide.$iframe && slide.$iframe.contentWindow)) {\n return;\n }\n\n // This function will be repeatedly called to check\n // if video iframe has been loaded to send message to start the video\n const poller = () => {\n if (slide.state === \"done\" && slide.$iframe && slide.$iframe.contentWindow) {\n let command;\n\n if (slide.$iframe.isReady) {\n if (slide.video && slide.video.autoplay) {\n if (slide.vendor == \"youtube\") {\n command = {\n event: \"command\",\n func: \"playVideo\",\n };\n } else {\n command = {\n method: \"play\",\n value: \"true\",\n };\n }\n }\n\n if (command) {\n slide.$iframe.contentWindow.postMessage(JSON.stringify(command), \"*\");\n }\n\n return;\n }\n\n if (slide.vendor === \"youtube\") {\n command = {\n event: \"listening\",\n id: slide.$iframe.getAttribute(\"id\"),\n };\n\n slide.$iframe.contentWindow.postMessage(JSON.stringify(command), \"*\");\n }\n }\n\n slide.poller = setTimeout(poller, 250);\n };\n\n poller();\n }\n\n /**\n * Process `Carousel.onUnselectSlide` event to pause video\n * @param {Object} fancybox\n * @param {Object} carousel\n * @param {Object} slide\n */\n onUnselectSlide(fancybox, carousel, slide) {\n if (slide.type === \"html5video\") {\n try {\n slide.$el.querySelector(\"video\").pause();\n } catch (error) {}\n\n return;\n }\n\n let command = false;\n\n if (slide.vendor == \"vimeo\") {\n command = {\n method: \"pause\",\n value: \"true\",\n };\n } else if (slide.vendor === \"youtube\") {\n command = {\n event: \"command\",\n func: \"pauseVideo\",\n };\n }\n\n if (command && slide.$iframe && slide.$iframe.contentWindow) {\n slide.$iframe.contentWindow.postMessage(JSON.stringify(command), \"*\");\n }\n\n clearTimeout(slide.poller);\n }\n\n /**\n * Process `Carousel.onRemoveSlide` event to do clean up\n * @param {Object} fancybox\n * @param {Object} carousel\n * @param {Object} slide\n */\n onRemoveSlide(fancybox, carousel, slide) {\n // Abort ajax request if exists\n if (slide.xhr) {\n slide.xhr.abort();\n slide.xhr = null;\n }\n\n // Unload iframe content if exists\n if (slide.$iframe) {\n slide.$iframe.onload = slide.$iframe.onerror = null;\n\n slide.$iframe.src = \"//about:blank\";\n slide.$iframe = null;\n }\n\n // Clear inline content\n const $content = slide.$content;\n\n if (slide.type === \"inline\" && $content) {\n $content.classList.remove(\"fancybox__content\");\n\n if ($content.style.display !== \"none\") {\n $content.style.display = \"none\";\n }\n }\n\n if (slide.$closeButton) {\n slide.$closeButton.remove();\n slide.$closeButton = null;\n }\n\n const $placeHolder = $content && $content.$placeHolder;\n\n if ($placeHolder) {\n $placeHolder.parentNode.insertBefore($content, $placeHolder);\n $placeHolder.remove();\n $content.$placeHolder = null;\n }\n }\n\n /**\n * Process `window.message` event to mark video iframe element as `ready`\n * @param {Object} e - Event\n */\n onMessage(e) {\n try {\n let data = JSON.parse(e.data);\n\n if (e.origin === \"https://player.vimeo.com\") {\n if (data.event === \"ready\") {\n for (let $iframe of document.getElementsByClassName(\"fancybox__iframe\")) {\n if ($iframe.contentWindow === e.source) {\n $iframe.isReady = 1;\n }\n }\n }\n } else if (e.origin === \"https://www.youtube-nocookie.com\") {\n if (data.event === \"onReady\") {\n document.getElementById(data.id).isReady = 1;\n }\n }\n } catch (ex) {}\n }\n\n attach() {\n this.fancybox.on(this.events);\n\n window.addEventListener(\"message\", this.onMessage, false);\n }\n\n detach() {\n this.fancybox.off(this.events);\n\n window.removeEventListener(\"message\", this.onMessage, false);\n }\n}\n\n// Expose defaults\nHtml.defaults = defaults;\n","import { extend } from \"../../../shared/utils/extend.js\";\r\n\r\nimport { Panzoom } from \"../../../Panzoom/Panzoom.js\";\r\n\r\nconst defaults = {\r\n // Class name for slide element indicating that content can be zoomed in\r\n canZoomInClass: \"can-zoom_in\",\r\n\r\n // Class name for slide element indicating that content can be zoomed out\r\n canZoomOutClass: \"can-zoom_out\",\r\n\r\n // Do zoom animation from thumbnail image when starting or closing fancybox\r\n zoom: true,\r\n\r\n // Animate opacity while zooming\r\n zoomOpacity: \"auto\", // \"auto\" | true | false,\r\n\r\n // Zoom animation friction\r\n zoomFriction: 0.82,\r\n\r\n // Disable zoom animation if thumbnail is visible only partly\r\n ignoreCoveredThumbnail: false,\r\n\r\n // Enable guestures\r\n touch: true,\r\n\r\n // Action to be performed when user clicks on the image\r\n click: \"toggleZoom\", // \"toggleZoom\" | \"next\" | \"close\" | null\r\n\r\n // Action to be performed when double-click event is detected on the image\r\n doubleClick: null, // \"toggleZoom\" | null\r\n\r\n // Action to be performed when user rotates a wheel button on a pointing device\r\n wheel: \"zoom\", // \"zoom\" | \"slide\" | \"close\" | null\r\n\r\n // How image should be resized to fit its container\r\n fit: \"contain\", // \"contain\" | \"contain-w\" | \"cover\"\r\n\r\n // Should create wrapping element around the image\r\n wrap: false,\r\n\r\n // Custom Panzoom options\r\n Panzoom: {\r\n ratio: 1,\r\n },\r\n};\r\n\r\nexport class Image {\r\n constructor(fancybox) {\r\n this.fancybox = fancybox;\r\n\r\n for (const methodName of [\r\n // Fancybox\r\n \"onReady\",\r\n \"onClosing\",\r\n \"onDone\",\r\n\r\n // Fancybox.Carousel\r\n \"onPageChange\",\r\n \"onCreateSlide\",\r\n \"onRemoveSlide\",\r\n\r\n // Image load/error\r\n \"onImageStatusChange\",\r\n ]) {\r\n this[methodName] = this[methodName].bind(this);\r\n }\r\n\r\n this.events = {\r\n ready: this.onReady,\r\n closing: this.onClosing,\r\n done: this.onDone,\r\n\r\n \"Carousel.change\": this.onPageChange,\r\n \"Carousel.createSlide\": this.onCreateSlide,\r\n \"Carousel.removeSlide\": this.onRemoveSlide,\r\n };\r\n }\r\n\r\n /**\r\n * Handle `ready` event to start loading content\r\n */\r\n onReady() {\r\n this.fancybox.Carousel.slides.forEach((slide) => {\r\n if (slide.$el) {\r\n this.setContent(slide);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handle `done` event to update cursor\r\n * @param {Object} fancybox\r\n * @param {Object} slide\r\n */\r\n onDone(fancybox, slide) {\r\n this.handleCursor(slide);\r\n }\r\n\r\n /**\r\n * Handle `closing` event to clean up all slides and to start zoom-out animation\r\n * @param {Object} fancybox\r\n */\r\n onClosing(fancybox) {\r\n clearTimeout(this.clickTimer);\r\n this.clickTimer = null;\r\n\r\n // Remove events\r\n fancybox.Carousel.slides.forEach((slide) => {\r\n if (slide.$image) {\r\n slide.state = \"destroy\";\r\n }\r\n\r\n if (slide.Panzoom) {\r\n slide.Panzoom.detachEvents();\r\n }\r\n });\r\n\r\n // If possible, start the zoom animation, it will interrupt the default closing process\r\n if (this.fancybox.state === \"closing\" && this.canZoom(fancybox.getSlide())) {\r\n this.zoomOut();\r\n }\r\n }\r\n\r\n /**\r\n * Process `Carousel.createSlide` event to create image content\r\n * @param {Object} fancybox\r\n * @param {Object} carousel\r\n * @param {Object} slide\r\n */\r\n onCreateSlide(fancybox, carousel, slide) {\r\n if (this.fancybox.state !== \"ready\") {\r\n return;\r\n }\r\n\r\n this.setContent(slide);\r\n }\r\n\r\n /**\r\n * Handle `Carousel.removeSlide` event to do clean up the slide\r\n * @param {Object} fancybox\r\n * @param {Object} carousel\r\n * @param {Object} slide\r\n */\r\n onRemoveSlide(fancybox, carousel, slide) {\r\n if (slide.$image) {\r\n slide.$el.classList.remove(fancybox.option(\"Image.canZoomInClass\"));\r\n\r\n slide.$image.remove();\r\n slide.$image = null;\r\n }\r\n\r\n if (slide.Panzoom) {\r\n slide.Panzoom.destroy();\r\n slide.Panzoom = null;\r\n }\r\n\r\n if (slide.$el && slide.$el.dataset) {\r\n delete slide.$el.dataset.imageFit;\r\n }\r\n }\r\n\r\n /**\r\n * Build DOM elements and add event listeners\r\n * @param {Object} slide\r\n */\r\n setContent(slide) {\r\n // Check if this slide should contain an image\r\n if (slide.isDom || slide.html || (slide.type && slide.type !== \"image\")) {\r\n return;\r\n }\r\n\r\n if (slide.$image) {\r\n return;\r\n }\r\n\r\n slide.type = \"image\";\r\n slide.state = \"loading\";\r\n\r\n // * Build layout\r\n // Container\r\n const $content = document.createElement(\"div\");\r\n $content.style.visibility = \"hidden\";\r\n\r\n // Image element\r\n const $image = document.createElement(\"img\");\r\n\r\n $image.addEventListener(\"load\", (event) => {\r\n event.stopImmediatePropagation();\r\n\r\n this.onImageStatusChange(slide);\r\n });\r\n\r\n $image.addEventListener(\"error\", () => {\r\n this.onImageStatusChange(slide);\r\n });\r\n\r\n $image.src = slide.src;\r\n $image.alt = \"\";\r\n $image.draggable = false;\r\n\r\n $image.classList.add(\"fancybox__image\");\r\n\r\n if (slide.srcset) {\r\n $image.setAttribute(\"srcset\", slide.srcset);\r\n }\r\n\r\n if (slide.sizes) {\r\n $image.setAttribute(\"sizes\", slide.sizes);\r\n }\r\n\r\n slide.$image = $image;\r\n\r\n const shouldWrap = this.fancybox.option(\"Image.wrap\");\r\n\r\n if (shouldWrap) {\r\n const $wrap = document.createElement(\"div\");\r\n $wrap.classList.add(typeof shouldWrap === \"string\" ? shouldWrap : \"fancybox__image-wrap\");\r\n\r\n $wrap.appendChild($image);\r\n\r\n $content.appendChild($wrap);\r\n\r\n slide.$wrap = $wrap;\r\n } else {\r\n $content.appendChild($image);\r\n }\r\n\r\n // Set data attribute if other that default\r\n // for example, set `[data-image-fit=\"contain-w\"]`\r\n slide.$el.dataset.imageFit = this.fancybox.option(\"Image.fit\");\r\n\r\n // Append content\r\n this.fancybox.setContent(slide, $content);\r\n\r\n // Display loading icon\r\n if ($image.complete || $image.error) {\r\n this.onImageStatusChange(slide);\r\n } else {\r\n this.fancybox.showLoading(slide);\r\n }\r\n }\r\n\r\n /**\r\n * Handle image state change, display error or start revealing image\r\n * @param {Object} slide\r\n */\r\n onImageStatusChange(slide) {\r\n const $image = slide.$image;\r\n\r\n if (!$image || slide.state !== \"loading\") {\r\n return;\r\n }\r\n\r\n if (!($image.complete && $image.naturalWidth && $image.naturalHeight)) {\r\n this.fancybox.setError(slide, \"{{IMAGE_ERROR}}\");\r\n\r\n return;\r\n }\r\n\r\n this.fancybox.hideLoading(slide);\r\n\r\n if (this.fancybox.option(\"Image.fit\") === \"contain\") {\r\n this.initSlidePanzoom(slide);\r\n }\r\n\r\n // Add `wheel` and `click` event handler\r\n slide.$el.addEventListener(\"wheel\", (event) => this.onWheel(slide, event), { passive: false });\r\n slide.$content.addEventListener(\"click\", (event) => this.onClick(slide, event), { passive: false });\r\n\r\n this.revealContent(slide);\r\n }\r\n\r\n /**\r\n * Make image zoomable and draggable using Panzoom\r\n * @param {Object} slide\r\n */\r\n initSlidePanzoom(slide) {\r\n if (slide.Panzoom) {\r\n return;\r\n }\r\n\r\n //* Initialize Panzoom\r\n slide.Panzoom = new Panzoom(\r\n slide.$el,\r\n extend(true, this.fancybox.option(\"Image.Panzoom\", {}), {\r\n viewport: slide.$wrap,\r\n content: slide.$image,\r\n\r\n width: slide._width,\r\n height: slide._height,\r\n\r\n wrapInner: false,\r\n\r\n // Allow to select caption text\r\n textSelection: true,\r\n\r\n // Toggle gestures\r\n touch: this.fancybox.option(\"Image.touch\"),\r\n\r\n // This will prevent click conflict with fancybox main carousel\r\n panOnlyZoomed: true,\r\n\r\n // Disable default click / wheel events as custom event listeners will replace them,\r\n // because click and wheel events should work without Panzoom\r\n click: false,\r\n wheel: false,\r\n })\r\n );\r\n\r\n slide.Panzoom.on(\"startAnimation\", () => {\r\n this.fancybox.trigger(\"Image.startAnimation\", slide);\r\n });\r\n\r\n slide.Panzoom.on(\"endAnimation\", () => {\r\n if (slide.state === \"zoomIn\") {\r\n this.fancybox.done(slide);\r\n }\r\n\r\n this.handleCursor(slide);\r\n\r\n this.fancybox.trigger(\"Image.endAnimation\", slide);\r\n });\r\n\r\n slide.Panzoom.on(\"afterUpdate\", () => {\r\n this.handleCursor(slide);\r\n\r\n this.fancybox.trigger(\"Image.afterUpdate\", slide);\r\n });\r\n }\r\n\r\n /**\r\n * Start zoom-in animation if possible, or simply reveal content\r\n * @param {Object} slide\r\n */\r\n revealContent(slide) {\r\n // Animate only on first run\r\n if (\r\n this.fancybox.Carousel.prevPage === null &&\r\n slide.index === this.fancybox.options.startIndex &&\r\n this.canZoom(slide)\r\n ) {\r\n this.zoomIn();\r\n } else {\r\n this.fancybox.revealContent(slide);\r\n }\r\n }\r\n\r\n /**\r\n * Get zoom info for selected slide\r\n * @param {Object} slide\r\n */\r\n getZoomInfo(slide) {\r\n const $thumb = slide.$thumb,\r\n thumbRect = $thumb.getBoundingClientRect(),\r\n thumbWidth = thumbRect.width,\r\n thumbHeight = thumbRect.height,\r\n //\r\n contentRect = slide.$content.getBoundingClientRect(),\r\n contentWidth = contentRect.width,\r\n contentHeight = contentRect.height,\r\n //\r\n shiftedTop = contentRect.top - thumbRect.top,\r\n shiftedLeft = contentRect.left - thumbRect.left;\r\n\r\n // Check if need to update opacity\r\n let opacity = this.fancybox.option(\"Image.zoomOpacity\");\r\n\r\n if (opacity === \"auto\") {\r\n opacity = Math.abs(thumbWidth / thumbHeight - contentWidth / contentHeight) > 0.1;\r\n }\r\n\r\n return {\r\n top: shiftedTop,\r\n left: shiftedLeft,\r\n scale: contentWidth && thumbWidth ? thumbWidth / contentWidth : 1,\r\n opacity: opacity,\r\n };\r\n }\r\n\r\n /**\r\n * Determine if it is possible to do zoom-in animation\r\n */\r\n canZoom(slide) {\r\n const fancybox = this.fancybox,\r\n $container = fancybox.$container;\r\n\r\n if (window.visualViewport && window.visualViewport.scale !== 1) {\r\n return false;\r\n }\r\n\r\n if (slide.Panzoom && !slide.Panzoom.content.width) {\r\n return false;\r\n }\r\n\r\n if (!fancybox.option(\"Image.zoom\") || fancybox.option(\"Image.fit\") !== \"contain\") {\r\n return false;\r\n }\r\n\r\n const $thumb = slide.$thumb;\r\n\r\n if (!$thumb || slide.state === \"loading\") {\r\n return false;\r\n }\r\n\r\n // * Check if thumbnail image is really visible\r\n $container.classList.add(\"fancybox__no-click\");\r\n\r\n const rect = $thumb.getBoundingClientRect();\r\n\r\n let rez;\r\n\r\n // Check if thumbnail image is actually visible on the screen\r\n if (this.fancybox.option(\"Image.ignoreCoveredThumbnail\")) {\r\n const visibleTopLeft = document.elementFromPoint(rect.left + 1, rect.top + 1) === $thumb;\r\n const visibleBottomRight = document.elementFromPoint(rect.right - 1, rect.bottom - 1) === $thumb;\r\n\r\n rez = visibleTopLeft && visibleBottomRight;\r\n } else {\r\n rez = document.elementFromPoint(rect.left + rect.width * 0.5, rect.top + rect.height * 0.5) === $thumb;\r\n }\r\n\r\n $container.classList.remove(\"fancybox__no-click\");\r\n\r\n return rez;\r\n }\r\n\r\n /**\r\n * Perform zoom-in animation\r\n */\r\n zoomIn() {\r\n const fancybox = this.fancybox,\r\n slide = fancybox.getSlide(),\r\n Panzoom = slide.Panzoom;\r\n\r\n const { top, left, scale, opacity } = this.getZoomInfo(slide);\r\n\r\n fancybox.trigger(\"reveal\", slide);\r\n\r\n // Scale and move to start position\r\n Panzoom.panTo({\r\n x: left * -1,\r\n y: top * -1,\r\n scale: scale,\r\n friction: 0,\r\n ignoreBounds: true,\r\n });\r\n\r\n slide.$content.style.visibility = \"\";\r\n\r\n slide.state = \"zoomIn\";\r\n\r\n if (opacity === true) {\r\n Panzoom.on(\"afterTransform\", (panzoom) => {\r\n if (slide.state === \"zoomIn\" || slide.state === \"zoomOut\") {\r\n panzoom.$content.style.opacity = Math.min(1, 1 - (1 - panzoom.content.scale) / (1 - scale));\r\n }\r\n });\r\n }\r\n\r\n // Animate back to original position\r\n Panzoom.panTo({\r\n x: 0,\r\n y: 0,\r\n scale: 1,\r\n friction: this.fancybox.option(\"Image.zoomFriction\"),\r\n });\r\n }\r\n\r\n /**\r\n * Perform zoom-out animation\r\n */\r\n zoomOut() {\r\n const fancybox = this.fancybox,\r\n slide = fancybox.getSlide(),\r\n Panzoom = slide.Panzoom;\r\n\r\n if (!Panzoom) {\r\n return;\r\n }\r\n\r\n slide.state = \"zoomOut\";\r\n fancybox.state = \"customClosing\";\r\n\r\n if (slide.$caption) {\r\n slide.$caption.style.visibility = \"hidden\";\r\n }\r\n\r\n let friction = this.fancybox.option(\"Image.zoomFriction\");\r\n\r\n const animatePosition = (event) => {\r\n const { top, left, scale, opacity } = this.getZoomInfo(slide);\r\n\r\n // Increase speed on the first run if opacity is not animated\r\n if (!event && !opacity) {\r\n friction *= 0.82;\r\n }\r\n\r\n Panzoom.panTo({\r\n x: left * -1,\r\n y: top * -1,\r\n scale,\r\n friction,\r\n ignoreBounds: true,\r\n });\r\n\r\n // Gradually increase speed\r\n friction *= 0.98;\r\n };\r\n\r\n // Page scrolling will cause thumbnail to change position on the display,\r\n // therefore animation end position has to be recalculated after each page scroll\r\n window.addEventListener(\"scroll\", animatePosition);\r\n\r\n Panzoom.once(\"endAnimation\", () => {\r\n window.removeEventListener(\"scroll\", animatePosition);\r\n fancybox.destroy();\r\n });\r\n\r\n animatePosition();\r\n }\r\n\r\n /**\r\n * Set the type of mouse cursor to indicate if content is zoomable\r\n * @param {Object} slide\r\n */\r\n handleCursor(slide) {\r\n if (slide.type !== \"image\" || !slide.$el) {\r\n return;\r\n }\r\n\r\n const panzoom = slide.Panzoom;\r\n const clickAction = this.fancybox.option(\"Image.click\", false, slide);\r\n const touchIsEnabled = this.fancybox.option(\"Image.touch\");\r\n\r\n const classList = slide.$el.classList;\r\n\r\n const zoomInClass = this.fancybox.option(\"Image.canZoomInClass\");\r\n const zoomOutClass = this.fancybox.option(\"Image.canZoomOutClass\");\r\n\r\n classList.remove(zoomOutClass);\r\n classList.remove(zoomInClass);\r\n\r\n if (panzoom && clickAction === \"toggleZoom\") {\r\n const canZoomIn =\r\n panzoom && panzoom.content.scale === 1 && panzoom.option(\"maxScale\") - panzoom.content.scale > 0.01;\r\n\r\n if (canZoomIn) {\r\n classList.add(zoomInClass);\r\n } else if (panzoom.content.scale > 1 && !touchIsEnabled) {\r\n classList.add(zoomOutClass);\r\n }\r\n } else if (clickAction === \"close\") {\r\n classList.add(zoomOutClass);\r\n }\r\n }\r\n\r\n /**\r\n * Handle `wheel` event\r\n * @param {Object} slide\r\n * @param {Object} event\r\n */\r\n onWheel(slide, event) {\r\n if (this.fancybox.state !== \"ready\") {\r\n return;\r\n }\r\n\r\n if (this.fancybox.trigger(\"Image.wheel\", event) === false) {\r\n return;\r\n }\r\n\r\n switch (this.fancybox.option(\"Image.wheel\")) {\r\n case \"zoom\":\r\n if (slide.state === \"done\") {\r\n slide.Panzoom && slide.Panzoom.zoomWithWheel(event);\r\n }\r\n\r\n break;\r\n\r\n case \"close\":\r\n this.fancybox.close();\r\n\r\n break;\r\n\r\n case \"slide\":\r\n this.fancybox[event.deltaY < 0 ? \"prev\" : \"next\"]();\r\n\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Handle `click` and `dblclick` events\r\n * @param {Object} slide\r\n * @param {Object} event\r\n */\r\n onClick(slide, event) {\r\n // Check that clicks should be allowed\r\n if (this.fancybox.state !== \"ready\") {\r\n return;\r\n }\r\n\r\n const panzoom = slide.Panzoom;\r\n\r\n if (\r\n panzoom &&\r\n (panzoom.dragPosition.midPoint ||\r\n panzoom.dragOffset.x !== 0 ||\r\n panzoom.dragOffset.y !== 0 ||\r\n panzoom.dragOffset.scale !== 1)\r\n ) {\r\n return;\r\n }\r\n\r\n if (this.fancybox.Carousel.Panzoom.lockAxis) {\r\n return false;\r\n }\r\n\r\n const process = (action) => {\r\n switch (action) {\r\n case \"toggleZoom\":\r\n event.stopPropagation();\r\n\r\n slide.Panzoom && slide.Panzoom.zoomWithClick(event);\r\n\r\n break;\r\n\r\n case \"close\":\r\n this.fancybox.close();\r\n\r\n break;\r\n\r\n case \"next\":\r\n event.stopPropagation();\r\n\r\n this.fancybox.next();\r\n\r\n break;\r\n }\r\n };\r\n\r\n const clickAction = this.fancybox.option(\"Image.click\");\r\n const dblclickAction = this.fancybox.option(\"Image.doubleClick\");\r\n\r\n if (dblclickAction) {\r\n if (this.clickTimer) {\r\n clearTimeout(this.clickTimer);\r\n this.clickTimer = null;\r\n\r\n process(dblclickAction);\r\n } else {\r\n this.clickTimer = setTimeout(() => {\r\n this.clickTimer = null;\r\n process(clickAction);\r\n }, 300);\r\n }\r\n } else {\r\n process(clickAction);\r\n }\r\n }\r\n\r\n /**\r\n * Handle `Carousel.change` event to reset zoom level for any zoomed in/out content\r\n * and to revel content of the current page\r\n * @param {Object} fancybox\r\n * @param {Object} carousel\r\n */\r\n onPageChange(fancybox, carousel) {\r\n const currSlide = fancybox.getSlide();\r\n\r\n carousel.slides.forEach((slide) => {\r\n if (!slide.Panzoom || slide.state !== \"done\") {\r\n return;\r\n }\r\n\r\n if (slide.index !== currSlide.index) {\r\n slide.Panzoom.panTo({\r\n x: 0,\r\n y: 0,\r\n scale: 1,\r\n friction: 0.8,\r\n });\r\n }\r\n });\r\n }\r\n\r\n attach() {\r\n this.fancybox.on(this.events);\r\n }\r\n\r\n detach() {\r\n this.fancybox.off(this.events);\r\n }\r\n}\r\n\r\n// Expose defaults\r\nImage.defaults = defaults;\r\n","import { canUseDOM } from \"../../../shared/utils/canUseDOM.js\";\n\nexport class Hash {\n constructor(fancybox) {\n this.fancybox = fancybox;\n\n for (const methodName of [\"onChange\", \"onClosing\"]) {\n this[methodName] = this[methodName].bind(this);\n }\n\n this.events = {\n initCarousel: this.onChange,\n \"Carousel.change\": this.onChange,\n closing: this.onClosing,\n };\n\n this.hasCreatedHistory = false;\n this.origHash = \"\";\n this.timer = null;\n }\n\n /**\n * Process `Carousel.ready` and `Carousel.change` events to update URL hash\n * @param {Object} fancybox\n * @param {Object} carousel\n */\n onChange(fancybox) {\n const carousel = fancybox.Carousel;\n\n if (this.timer) {\n clearTimeout(this.timer);\n }\n\n const firstRun = carousel.prevPage === null;\n const currentSlide = fancybox.getSlide();\n\n const currentHash = new URL(document.URL).hash;\n\n let newHash = false;\n\n if (currentSlide.slug) {\n newHash = \"#\" + currentSlide.slug;\n } else {\n const dataset = currentSlide.$trigger && currentSlide.$trigger.dataset;\n const slug = fancybox.option(\"slug\") || (dataset && dataset.fancybox);\n\n if (slug && slug.length && slug !== \"true\") {\n newHash = \"#\" + slug + (carousel.slides.length > 1 ? \"-\" + (currentSlide.index + 1) : \"\");\n }\n }\n\n if (firstRun) {\n this.origHash = currentHash !== newHash ? currentHash : \"\";\n }\n\n if (newHash && currentHash !== newHash) {\n this.timer = setTimeout(() => {\n try {\n window.history[firstRun ? \"pushState\" : \"replaceState\"](\n {},\n document.title,\n window.location.pathname + window.location.search + newHash\n );\n\n if (firstRun) {\n this.hasCreatedHistory = true;\n }\n } catch (e) {}\n }, 300);\n }\n }\n\n /**\n * Process `closing` event to clean up\n */\n onClosing() {\n if (this.timer) {\n clearTimeout(this.timer);\n }\n\n // Skip if closing is triggered by pressing browser back button or by changing hash manually\n if (this.hasSilentClose === true) {\n return;\n }\n\n // Restore original url\n try {\n window.history.replaceState(\n {},\n document.title,\n window.location.pathname + window.location.search + (this.origHash || \"\")\n );\n\n return;\n } catch (e) {}\n }\n\n attach(fancybox) {\n fancybox.on(this.events);\n }\n\n detach(fancybox) {\n fancybox.off(this.events);\n }\n\n /**\n * Start fancybox from current URL hash,\n * this will be called on page load OR/AND after changing URL hash\n * @param {Class} Fancybox\n */\n static startFromUrl() {\n const Fancybox = Hash.Fancybox;\n\n if (!Fancybox || Fancybox.getInstance() || Fancybox.defaults.Hash === false) {\n return;\n }\n\n const { hash, slug, index } = Hash.getParsedURL();\n\n if (!slug) {\n return;\n }\n\n // Support custom slug\n // ===\n let selectedElem = document.querySelector(`[data-slug=\"${hash}\"]`);\n\n if (selectedElem) {\n selectedElem.dispatchEvent(new CustomEvent(\"click\", { bubbles: true, cancelable: true }));\n }\n\n if (Fancybox.getInstance()) {\n return;\n }\n\n // If elements are not found by custom slug, use URL hash value as group name\n // ===\n const groupElems = document.querySelectorAll(`[data-fancybox=\"${slug}\"]`);\n\n if (!groupElems.length) {\n return;\n }\n\n if (index === null && groupElems.length === 1) {\n selectedElem = groupElems[0];\n } else if (index) {\n selectedElem = groupElems[index - 1];\n }\n\n if (selectedElem) {\n selectedElem.dispatchEvent(new CustomEvent(\"click\", { bubbles: true, cancelable: true }));\n }\n }\n\n /**\n * Handle `hash` change, change gallery item to current index or start/close current instance\n */\n static onHashChange() {\n const { slug, index } = Hash.getParsedURL();\n\n const Fancybox = Hash.Fancybox;\n const instance = Fancybox && Fancybox.getInstance();\n\n if (instance && instance.plugins.Hash) {\n // Check if hash matches currently active gallery\n if (slug) {\n const carousel = instance.Carousel;\n\n /**\n * Support manually opened gallery\n */\n if (slug === instance.option(\"slug\")) {\n return carousel.slideTo(index - 1);\n }\n\n /**\n * Check if URL hash matches `data-slug` value of active element\n */\n for (let slide of carousel.slides) {\n if (slide.slug && slide.slug === slug) {\n return carousel.slideTo(slide.index);\n }\n }\n\n /**\n * Check if URL hash matches `data-fancybox` value of active element\n */\n const slide = instance.getSlide();\n const dataset = slide.$trigger && slide.$trigger.dataset;\n\n if (dataset && dataset.fancybox === slug) {\n return carousel.slideTo(index - 1);\n }\n }\n\n /**\n * Close if no matching element found\n */\n instance.plugins.Hash.hasSilentClose = true;\n\n instance.close();\n }\n\n /**\n * Attempt to start\n */\n Hash.startFromUrl();\n }\n\n /**\n * Add event bindings that will start new Fancybox instance based in the current URL\n */\n static create(Fancybox) {\n Hash.Fancybox = Fancybox;\n\n function proceed() {\n window.addEventListener(\"hashchange\", Hash.onHashChange, false);\n\n Hash.startFromUrl();\n }\n\n if (canUseDOM) {\n window.requestAnimationFrame(() => {\n if (/complete|interactive|loaded/.test(document.readyState)) {\n proceed();\n } else {\n document.addEventListener(\"DOMContentLoaded\", proceed);\n }\n });\n }\n }\n\n static destroy() {\n window.removeEventListener(\"hashchange\", Hash.onHashChange, false);\n }\n\n /**\n * Helper method to split URL hash into useful pieces\n */\n static getParsedURL() {\n const hash = window.location.hash.substr(1),\n tmp = hash.split(\"-\"),\n index = tmp.length > 1 && /^\\+?\\d+$/.test(tmp[tmp.length - 1]) ? parseInt(tmp.pop(-1), 10) || null : null,\n slug = tmp.join(\"-\");\n\n return {\n hash,\n slug,\n index,\n };\n }\n}\n","export const Fullscreen = {\r\n pageXOffset: 0,\r\n pageYOffset: 0,\r\n\r\n element() {\r\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement;\r\n },\r\n\r\n activate(element) {\r\n Fullscreen.pageXOffset = window.pageXOffset;\r\n Fullscreen.pageYOffset = window.pageYOffset;\r\n\r\n if (element.requestFullscreen) {\r\n element.requestFullscreen(); // W3C spec\r\n } else if (element.mozRequestFullScreen) {\r\n element.mozRequestFullScreen(); // Firefox\r\n } else if (element.webkitRequestFullscreen) {\r\n element.webkitRequestFullscreen(); // Safari\r\n } else if (element.msRequestFullscreen) {\r\n element.msRequestFullscreen(); // IE/Edge\r\n }\r\n },\r\n\r\n deactivate() {\r\n if (document.exitFullscreen) {\r\n document.exitFullscreen();\r\n } else if (document.mozCancelFullScreen) {\r\n document.mozCancelFullScreen();\r\n } else if (document.webkitExitFullscreen) {\r\n document.webkitExitFullscreen();\r\n }\r\n },\r\n};\r\n","export class Slideshow {\r\n constructor(fancybox) {\r\n this.fancybox = fancybox;\r\n this.active = false;\r\n\r\n this.handleVisibilityChange = this.handleVisibilityChange.bind(this);\r\n }\r\n\r\n isActive() {\r\n return this.active;\r\n }\r\n\r\n setTimer() {\r\n if (!this.active || this.timer) {\r\n return;\r\n }\r\n\r\n const delay = this.fancybox.option(\"slideshow.delay\", 3000);\r\n\r\n this.timer = setTimeout(() => {\r\n this.timer = null;\r\n\r\n if (\r\n !this.fancybox.option(\"infinite\") &&\r\n this.fancybox.getSlide().index === this.fancybox.Carousel.slides.length - 1\r\n ) {\r\n this.fancybox.jumpTo(0, { friction: 0 });\r\n } else {\r\n this.fancybox.next();\r\n }\r\n }, delay);\r\n\r\n let $progress = this.$progress;\r\n\r\n if (!$progress) {\r\n $progress = document.createElement(\"div\");\r\n $progress.classList.add(\"fancybox__progress\");\r\n\r\n this.fancybox.$carousel.parentNode.insertBefore($progress, this.fancybox.$carousel);\r\n\r\n this.$progress = $progress;\r\n\r\n $progress.offsetHeight; /* trigger reflow */\r\n }\r\n\r\n $progress.style.transitionDuration = `${delay}ms`;\r\n $progress.style.transform = \"scaleX(1)\";\r\n }\r\n\r\n clearTimer() {\r\n clearTimeout(this.timer);\r\n this.timer = null;\r\n\r\n if (this.$progress) {\r\n this.$progress.style.transitionDuration = \"\";\r\n this.$progress.style.transform = \"\";\r\n\r\n this.$progress.offsetHeight; /* trigger reflow */\r\n }\r\n }\r\n\r\n activate() {\r\n if (this.active) {\r\n return;\r\n }\r\n\r\n this.active = true;\r\n this.fancybox.$container.classList.add(\"has-slideshow\");\r\n\r\n if (this.fancybox.getSlide().state === \"done\") {\r\n this.setTimer();\r\n }\r\n\r\n document.addEventListener(\"visibilitychange\", this.handleVisibilityChange, false);\r\n }\r\n\r\n handleVisibilityChange() {\r\n this.deactivate();\r\n }\r\n\r\n deactivate() {\r\n this.active = false;\r\n\r\n this.clearTimer();\r\n\r\n this.fancybox.$container.classList.remove(\"has-slideshow\");\r\n\r\n document.removeEventListener(\"visibilitychange\", this.handleVisibilityChange, false);\r\n }\r\n\r\n toggle() {\r\n if (this.active) {\r\n this.deactivate();\r\n } else if (this.fancybox.Carousel.slides.length > 1) {\r\n this.activate();\r\n }\r\n }\r\n}\r\n","import { isPlainObject } from \"../../../shared/utils/isPlainObject.js\";\r\nimport { extend } from \"../../../shared/utils/extend.js\";\r\n\r\nimport { Fullscreen } from \"../../../shared/utils/Fullscreen.js\";\r\nimport { Slideshow } from \"../../../shared/utils/Slideshow.js\";\r\n\r\nconst defaults = {\r\n // What toolbar items to display\r\n display: [\r\n \"counter\",\r\n //\"prev\",\r\n //\"next\",\r\n //\"download\",\r\n \"zoom\",\r\n \"slideshow\",\r\n \"fullscreen\",\r\n \"thumbs\",\r\n \"close\",\r\n ],\r\n\r\n // Only create a toolbar item if there is at least one image in the group\r\n autoEnable: true,\r\n\r\n // Toolbar items; can be links, buttons or `div` elements\r\n items: {\r\n counter: {\r\n position: \"left\",\r\n type: \"div\",\r\n class: \"fancybox__counter\",\r\n html: ' / ',\r\n attr: { tabindex: -1 },\r\n },\r\n prev: {\r\n type: \"button\",\r\n class: \"fancybox__button--prev\",\r\n label: \"PREV\",\r\n html: '',\r\n attr: { \"data-fancybox-prev\": \"\" },\r\n },\r\n next: {\r\n type: \"button\",\r\n class: \"fancybox__button--next\",\r\n label: \"NEXT\",\r\n html: '',\r\n attr: { \"data-fancybox-next\": \"\" },\r\n },\r\n fullscreen: {\r\n type: \"button\",\r\n class: \"fancybox__button--fullscreen\",\r\n label: \"TOGGLE_FULLSCREEN\",\r\n html: `\r\n \r\n \r\n `,\r\n click: function (event) {\r\n event.preventDefault();\r\n\r\n if (Fullscreen.element()) {\r\n Fullscreen.deactivate();\r\n } else {\r\n Fullscreen.activate(this.fancybox.$container);\r\n }\r\n },\r\n },\r\n slideshow: {\r\n type: \"button\",\r\n class: \"fancybox__button--slideshow\",\r\n label: \"TOGGLE_SLIDESHOW\",\r\n html: `\r\n \r\n \r\n `,\r\n click: function (event) {\r\n event.preventDefault();\r\n\r\n this.Slideshow.toggle();\r\n },\r\n },\r\n zoom: {\r\n type: \"button\",\r\n class: \"fancybox__button--zoom\",\r\n label: \"TOGGLE_ZOOM\",\r\n html: '',\r\n click: function (event) {\r\n event.preventDefault();\r\n\r\n const panzoom = this.fancybox.getSlide().Panzoom;\r\n\r\n if (panzoom) {\r\n panzoom.toggleZoom();\r\n }\r\n },\r\n },\r\n download: {\r\n type: \"link\",\r\n label: \"DOWNLOAD\",\r\n class: \"fancybox__button--download\",\r\n html: '',\r\n click: function (event) {\r\n event.stopPropagation();\r\n },\r\n },\r\n thumbs: {\r\n type: \"button\",\r\n label: \"TOGGLE_THUMBS\",\r\n class: \"fancybox__button--thumbs\",\r\n html: '',\r\n click: function (event) {\r\n event.stopPropagation();\r\n\r\n const thumbs = this.fancybox.plugins.Thumbs;\r\n\r\n if (thumbs) {\r\n thumbs.toggle();\r\n }\r\n },\r\n },\r\n close: {\r\n type: \"button\",\r\n label: \"CLOSE\",\r\n class: \"fancybox__button--close\",\r\n html: '',\r\n attr: { \"data-fancybox-close\": \"\", tabindex: 0 },\r\n },\r\n },\r\n};\r\n\r\nexport class Toolbar {\r\n constructor(fancybox) {\r\n this.fancybox = fancybox;\r\n\r\n this.$container = null;\r\n this.state = \"init\";\r\n\r\n for (const methodName of [\r\n \"onInit\",\r\n \"onPrepare\",\r\n \"onDone\",\r\n \"onKeydown\",\r\n \"onClosing\",\r\n \"onChange\",\r\n \"onSettle\",\r\n \"onRefresh\",\r\n ]) {\r\n this[methodName] = this[methodName].bind(this);\r\n }\r\n\r\n this.events = {\r\n init: this.onInit,\r\n prepare: this.onPrepare,\r\n done: this.onDone,\r\n keydown: this.onKeydown,\r\n closing: this.onClosing,\r\n\r\n // Clear Slideshow when user strts to change current slide\r\n \"Carousel.change\": this.onChange,\r\n\r\n // Set timer after carousel changes current slide; deactive if last slide is reached\r\n \"Carousel.settle\": this.onSettle,\r\n\r\n // Deactivate Slideshow on user interaction\r\n \"Carousel.Panzoom.touchStart\": () => this.onRefresh(),\r\n\r\n \"Image.startAnimation\": (fancybox, slide) => this.onRefresh(slide),\r\n \"Image.afterUpdate\": (fancybox, slide) => this.onRefresh(slide),\r\n };\r\n }\r\n\r\n onInit() {\r\n // Disable self if current group does not contain at least one image\r\n if (this.fancybox.option(\"Toolbar.autoEnable\")) {\r\n let hasImage = false;\r\n\r\n for (const item of this.fancybox.items) {\r\n if (item.type === \"image\") {\r\n hasImage = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!hasImage) {\r\n this.state = \"disabled\";\r\n return;\r\n }\r\n }\r\n\r\n // Disable the creation of a close button, if one exists in the toolbar\r\n for (const key of this.fancybox.option(\"Toolbar.display\")) {\r\n const id = isPlainObject(key) ? key.id : key;\r\n\r\n if (id === \"close\") {\r\n this.fancybox.options.closeButton = false;\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n onPrepare() {\r\n const fancybox = this.fancybox;\r\n // Skip if disabled\r\n if (this.state !== \"init\") {\r\n return;\r\n }\r\n\r\n this.build();\r\n\r\n this.update();\r\n\r\n this.Slideshow = new Slideshow(fancybox);\r\n\r\n if (!fancybox.Carousel.prevPage) {\r\n if (fancybox.option(\"slideshow.autoStart\")) {\r\n this.Slideshow.activate();\r\n }\r\n\r\n if (fancybox.option(\"fullscreen.autoStart\") && !Fullscreen.element()) {\r\n try {\r\n Fullscreen.activate(fancybox.$container);\r\n } catch (error) {}\r\n }\r\n }\r\n }\r\n\r\n onFsChange() {\r\n window.scrollTo(Fullscreen.pageXOffset, Fullscreen.pageYOffset);\r\n }\r\n\r\n onSettle() {\r\n const fancybox = this.fancybox;\r\n const slideshow = this.Slideshow;\r\n\r\n if (slideshow && slideshow.isActive()) {\r\n if (fancybox.getSlide().index === fancybox.Carousel.slides.length - 1 && !fancybox.option(\"infinite\")) {\r\n slideshow.deactivate();\r\n } else if (fancybox.getSlide().state === \"done\") {\r\n slideshow.setTimer();\r\n }\r\n }\r\n }\r\n\r\n onChange() {\r\n this.update();\r\n\r\n if (this.Slideshow && this.Slideshow.isActive()) {\r\n this.Slideshow.clearTimer();\r\n }\r\n }\r\n\r\n onDone(fancybox, slide) {\r\n const slideshow = this.Slideshow;\r\n\r\n if (slide.index === fancybox.getSlide().index) {\r\n this.update();\r\n\r\n if (slideshow && slideshow.isActive()) {\r\n if (!fancybox.option(\"infinite\") && slide.index === fancybox.Carousel.slides.length - 1) {\r\n slideshow.deactivate();\r\n } else {\r\n slideshow.setTimer();\r\n }\r\n }\r\n }\r\n }\r\n\r\n onRefresh(slide) {\r\n if (!slide || slide.index === this.fancybox.getSlide().index) {\r\n this.update();\r\n\r\n if (this.Slideshow && this.Slideshow.isActive() && (!slide || slide.state === \"done\")) {\r\n this.Slideshow.deactivate();\r\n }\r\n }\r\n }\r\n\r\n onKeydown(fancybox, key, event) {\r\n if (key === \" \" && this.Slideshow) {\r\n this.Slideshow.toggle();\r\n\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n onClosing() {\r\n if (this.Slideshow) {\r\n this.Slideshow.deactivate();\r\n }\r\n\r\n document.removeEventListener(\"fullscreenchange\", this.onFsChange);\r\n }\r\n\r\n /**\r\n * Create link, button or `div` element for the toolbar\r\n * @param {Object} obj\r\n * @returns HTMLElement\r\n */\r\n createElement(obj) {\r\n let $el;\r\n\r\n if (obj.type === \"div\") {\r\n $el = document.createElement(\"div\");\r\n } else {\r\n $el = document.createElement(obj.type === \"link\" ? \"a\" : \"button\");\r\n $el.classList.add(\"carousel__button\");\r\n }\r\n\r\n $el.innerHTML = obj.html;\r\n\r\n $el.setAttribute(\"tabindex\", obj.tabindex || 0);\r\n\r\n if (obj.class) {\r\n $el.classList.add(...obj.class.split(\" \"));\r\n }\r\n\r\n for (const prop in obj.attr) {\r\n $el.setAttribute(prop, obj.attr[prop]);\r\n }\r\n\r\n if (obj.label) {\r\n $el.setAttribute(\"title\", this.fancybox.localize(`{{${obj.label}}}`));\r\n }\r\n\r\n if (obj.click) {\r\n $el.addEventListener(\"click\", obj.click.bind(this));\r\n }\r\n\r\n if (obj.id === \"prev\") {\r\n $el.setAttribute(\"data-fancybox-prev\", \"\");\r\n }\r\n\r\n if (obj.id === \"next\") {\r\n $el.setAttribute(\"data-fancybox-next\", \"\");\r\n }\r\n\r\n const $svg = $el.querySelector(\"svg\");\r\n\r\n if ($svg) {\r\n $svg.setAttribute(\"role\", \"img\");\r\n $svg.setAttribute(\"tabindex\", \"-1\");\r\n $svg.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\r\n }\r\n\r\n return $el;\r\n }\r\n\r\n /**\r\n * Create all DOM elements\r\n */\r\n build() {\r\n this.cleanup();\r\n\r\n const all_items = this.fancybox.option(\"Toolbar.items\");\r\n const all_groups = [\r\n {\r\n position: \"left\",\r\n items: [],\r\n },\r\n {\r\n position: \"center\",\r\n items: [],\r\n },\r\n {\r\n position: \"right\",\r\n items: [],\r\n },\r\n ];\r\n\r\n const thumbs = this.fancybox.plugins.Thumbs;\r\n\r\n // 1st step - group toolbar elements by position\r\n for (const key of this.fancybox.option(\"Toolbar.display\")) {\r\n let id, item;\r\n\r\n if (isPlainObject(key)) {\r\n id = key.id;\r\n item = extend({}, all_items[id], key);\r\n } else {\r\n id = key;\r\n item = all_items[id];\r\n }\r\n\r\n if ([\"counter\", \"next\", \"prev\", \"slideshow\"].includes(id) && this.fancybox.items.length < 2) {\r\n continue;\r\n }\r\n\r\n if (id === \"fullscreen\") {\r\n if (!document.fullscreenEnabled || window.fullScreen) {\r\n continue;\r\n }\r\n\r\n document.addEventListener(\"fullscreenchange\", this.onFsChange);\r\n }\r\n\r\n if (id === \"thumbs\" && (!thumbs || thumbs.state === \"disabled\")) {\r\n continue;\r\n }\r\n\r\n if (!item) {\r\n continue;\r\n }\r\n\r\n let position = item.position || \"right\";\r\n\r\n let group = all_groups.find((obj) => obj.position === position);\r\n\r\n if (group) {\r\n group.items.push(item);\r\n }\r\n }\r\n\r\n // 2st step - create DOM elements\r\n const $container = document.createElement(\"div\");\r\n $container.classList.add(\"fancybox__toolbar\");\r\n\r\n for (const group of all_groups) {\r\n if (group.items.length) {\r\n const $wrap = document.createElement(\"div\");\r\n $wrap.classList.add(\"fancybox__toolbar__items\");\r\n $wrap.classList.add(`fancybox__toolbar__items--${group.position}`);\r\n\r\n for (const obj of group.items) {\r\n $wrap.appendChild(this.createElement(obj));\r\n }\r\n\r\n $container.appendChild($wrap);\r\n }\r\n }\r\n\r\n // Add toolbar container to DOM\r\n this.fancybox.$carousel.parentNode.insertBefore($container, this.fancybox.$carousel);\r\n\r\n this.$container = $container;\r\n }\r\n\r\n /**\r\n * Update element state depending on index of current slide\r\n */\r\n update() {\r\n const slide = this.fancybox.getSlide();\r\n const idx = slide.index;\r\n const cnt = this.fancybox.items.length;\r\n\r\n // Download links\r\n // ====\r\n const src = slide.downloadSrc || (slide.type === \"image\" && !slide.error ? slide.src : null);\r\n\r\n for (const $el of this.fancybox.$container.querySelectorAll(\"a.fancybox__button--download\")) {\r\n if (src) {\r\n $el.removeAttribute(\"disabled\");\r\n $el.removeAttribute(\"tabindex\");\r\n\r\n $el.setAttribute(\"href\", src);\r\n $el.setAttribute(\"download\", src);\r\n $el.setAttribute(\"target\", \"_blank\");\r\n } else {\r\n $el.setAttribute(\"disabled\", \"\");\r\n $el.setAttribute(\"tabindex\", -1);\r\n\r\n $el.removeAttribute(\"href\");\r\n $el.removeAttribute(\"download\");\r\n }\r\n }\r\n\r\n // Zoom button\r\n // ===\r\n const panzoom = slide.Panzoom;\r\n const canZoom = panzoom && panzoom.option(\"maxScale\") > panzoom.option(\"baseScale\");\r\n\r\n for (const $el of this.fancybox.$container.querySelectorAll(\".fancybox__button--zoom\")) {\r\n if (canZoom) {\r\n $el.removeAttribute(\"disabled\");\r\n } else {\r\n $el.setAttribute(\"disabled\", \"\");\r\n }\r\n }\r\n\r\n // Counter\r\n // ====\r\n for (const $el of this.fancybox.$container.querySelectorAll(\"[data-fancybox-index]\")) {\r\n $el.innerHTML = slide.index + 1;\r\n }\r\n\r\n for (const $el of this.fancybox.$container.querySelectorAll(\"[data-fancybox-count]\")) {\r\n $el.innerHTML = cnt;\r\n }\r\n\r\n // Disable previous/next links if gallery is not infinite and has reached start/end\r\n // ===\r\n if (!this.fancybox.option(\"infinite\")) {\r\n for (const $el of this.fancybox.$container.querySelectorAll(\"[data-fancybox-prev]\")) {\r\n if (idx === 0) {\r\n $el.setAttribute(\"disabled\", \"\");\r\n } else {\r\n $el.removeAttribute(\"disabled\");\r\n }\r\n }\r\n\r\n for (const $el of this.fancybox.$container.querySelectorAll(\"[data-fancybox-next]\")) {\r\n if (idx === cnt - 1) {\r\n $el.setAttribute(\"disabled\", \"\");\r\n } else {\r\n $el.removeAttribute(\"disabled\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n cleanup() {\r\n if (this.Slideshow && this.Slideshow.isActive()) {\r\n this.Slideshow.clearTimer();\r\n }\r\n\r\n if (this.$container) {\r\n this.$container.remove();\r\n }\r\n\r\n this.$container = null;\r\n }\r\n\r\n attach() {\r\n this.fancybox.on(this.events);\r\n }\r\n\r\n detach() {\r\n this.fancybox.off(this.events);\r\n\r\n this.cleanup();\r\n }\r\n}\r\n\r\n// Expose defaults\r\nToolbar.defaults = defaults;\r\n","import { ScrollLock } from \"./ScrollLock/ScrollLock.js\";\nimport { Thumbs } from \"./Thumbs/Thumbs.js\";\nimport { Html } from \"./Html/Html.js\";\nimport { Image } from \"./Image/Image.js\";\nimport { Hash } from \"./Hash/Hash.js\";\nimport { Toolbar } from \"./Toolbar/Toolbar.js\";\n\nexport const Plugins = {\n ScrollLock,\n Thumbs,\n Html,\n Toolbar,\n Image,\n Hash,\n};\n","import { isScrollable } from \"../../../../src/shared/utils/isScrollable.js\";\n\nexport class ScrollLock {\n constructor(fancybox) {\n this.fancybox = fancybox;\n this.viewport = null;\n\n this.pendingUpdate = null;\n\n for (const methodName of [\"onReady\", \"onResize\", \"onTouchstart\", \"onTouchmove\"]) {\n this[methodName] = this[methodName].bind(this);\n }\n }\n\n /**\n * Process `initLayout` event to attach event listeners and resize viewport if needed\n */\n onReady() {\n //* Support Visual Viewport API\n // https://developer.mozilla.org/en-US/docs/Web/API/Visual_Viewport_API\n const viewport = window.visualViewport;\n\n if (viewport) {\n this.viewport = viewport;\n this.startY = 0;\n\n viewport.addEventListener(\"resize\", this.onResize);\n\n this.updateViewport();\n }\n\n //* Prevent bouncing while scrolling on mobile devices\n window.addEventListener(\"touchstart\", this.onTouchstart, { passive: false });\n window.addEventListener(\"touchmove\", this.onTouchmove, { passive: false });\n\n //* Prevent window scrolling with mouse wheel\n window.addEventListener(\"wheel\", this.onWheel, { passive: false });\n }\n\n /**\n * Handle `resize` event to call `updateViewport`\n */\n onResize() {\n this.updateViewport();\n }\n\n /**\n * Scale $container proportionally to actually fit inside browser,\n * e.g., disable viewport zooming\n */\n updateViewport() {\n const fancybox = this.fancybox,\n viewport = this.viewport,\n scale = viewport.scale || 1,\n $container = fancybox.$container;\n\n if (!$container) {\n return;\n }\n\n let width = \"\",\n height = \"\",\n transform = \"\";\n\n if (scale - 1 > 0.1) {\n width = `${viewport.width * scale}px`;\n height = `${viewport.height * scale}px`;\n transform = `translate3d(${viewport.offsetLeft}px, ${viewport.offsetTop}px, 0) scale(${1 / scale})`;\n }\n\n $container.style.width = width;\n $container.style.height = height;\n $container.style.transform = transform;\n }\n\n /**\n * Handle `touchstart` event to mark drag start position\n * @param {Object} event\n */\n onTouchstart(event) {\n this.startY = event.touches ? event.touches[0].screenY : event.screenY;\n }\n\n /**\n * Handle `touchmove` event to fix scrolling on mobile devices (iOS)\n * @param {Object} event\n */\n onTouchmove(event) {\n const startY = this.startY;\n const zoom = window.innerWidth / window.document.documentElement.clientWidth;\n\n if (!event.cancelable) {\n return;\n }\n\n if (event.touches.length > 1 || zoom !== 1) {\n return;\n }\n\n const el = isScrollable(event.composedPath()[0]);\n\n if (!el) {\n event.preventDefault();\n return;\n }\n\n const style = window.getComputedStyle(el);\n const height = parseInt(style.getPropertyValue(\"height\"), 10);\n\n const curY = event.touches ? event.touches[0].screenY : event.screenY;\n\n const isAtTop = startY <= curY && el.scrollTop === 0;\n const isAtBottom = startY >= curY && el.scrollHeight - el.scrollTop === height;\n\n if (isAtTop || isAtBottom) {\n event.preventDefault();\n }\n }\n\n /**\n * Handle `wheel` event\n */\n onWheel(event) {\n if (!isScrollable(event.composedPath()[0])) {\n event.preventDefault();\n }\n }\n\n /**\n * Clean everything up\n */\n cleanup() {\n if (this.pendingUpdate) {\n cancelAnimationFrame(this.pendingUpdate);\n this.pendingUpdate = null;\n }\n\n const viewport = this.viewport;\n\n if (viewport) {\n viewport.removeEventListener(\"resize\", this.onResize);\n this.viewport = null;\n }\n\n window.removeEventListener(\"touchstart\", this.onTouchstart, false);\n window.removeEventListener(\"touchmove\", this.onTouchmove, false);\n\n window.removeEventListener(\"wheel\", this.onWheel, { passive: false });\n }\n\n attach() {\n this.fancybox.on(\"initLayout\", this.onReady);\n }\n\n detach() {\n this.fancybox.off(\"initLayout\", this.onReady);\n\n this.cleanup();\n }\n}\n","import { extend } from \"../shared/utils/extend.js\";\nimport { canUseDOM } from \"../shared/utils/canUseDOM.js\";\nimport { FOCUSABLE_ELEMENTS, setFocusOn } from \"../shared/utils/setFocusOn.js\";\n\nimport { Base } from \"../shared/Base/Base.js\";\n\nimport { Carousel } from \"../Carousel/Carousel.js\";\n\nimport { Plugins } from \"./plugins/index.js\";\n\n// Default language\nimport en from \"./l10n/en.js\";\n\n// Default settings\nconst defaults = {\n // Index of active slide on the start\n startIndex: 0,\n\n // Number of slides to preload before and after active slide\n preload: 1,\n\n // Should navigation be infinite\n infinite: true,\n\n // Class name to be applied to the content to reveal it\n showClass: \"fancybox-zoomInUp\", // \"fancybox-fadeIn\" | \"fancybox-zoomInUp\" | false\n\n // Class name to be applied to the content to hide it\n hideClass: \"fancybox-fadeOut\", // \"fancybox-fadeOut\" | \"fancybox-zoomOutDown\" | false\n\n // Should backdrop and UI elements fade in/out on start/close\n animated: true,\n\n // If browser scrollbar should be hidden\n hideScrollbar: true,\n\n // Element containing main structure\n parentEl: null,\n\n // Custom class name or multiple space-separated class names for the container\n mainClass: null,\n\n // Set focus on first focusable element after displaying content\n autoFocus: true,\n\n // Trap focus inside Fancybox\n trapFocus: true,\n\n // Set focus back to trigger element after closing Fancybox\n placeFocusBack: true,\n\n // Action to take when the user clicks on the backdrop\n click: \"close\", // \"close\" | \"next\" | null\n\n // Position of the close button - over the content or at top right corner of viewport\n closeButton: \"inside\", // \"inside\" | \"outside\"\n\n // Allow user to drag content up/down to close instance\n dragToClose: true,\n\n // Enable keyboard navigation\n keyboard: {\n Escape: \"close\",\n Delete: \"close\",\n Backspace: \"close\",\n PageUp: \"next\",\n PageDown: \"prev\",\n ArrowUp: \"next\",\n ArrowDown: \"prev\",\n ArrowRight: \"next\",\n ArrowLeft: \"prev\",\n },\n\n // HTML templates for various elements\n template: {\n // Close button icon\n closeButton:\n '',\n // Loading indicator icon\n spinner:\n '',\n\n // Main container element\n main: null,\n },\n\n /* Note: If the `template.main` option is not provided, the structure is generated as follows by default:\n
\n
\n
\n
\n */\n\n // Localization of strings\n l10n: en,\n};\n\n// Object that contains all active instances of Fancybox\nconst instances = new Map();\n\n// Number of Fancybox instances created, it is used to generate new instance \"id\"\nlet called = 0;\n\nclass Fancybox extends Base {\n /**\n * Fancybox constructor\n * @constructs Fancybox\n * @param {Object} [options] - Options for Fancybox\n */\n constructor(items, options = {}) {\n // Quick hack to fix variable naming collision\n items = items.map((item) => {\n if (item.width) item._width = item.width;\n if (item.height) item._height = item.height;\n\n return item;\n });\n\n super(extend(true, {}, defaults, options));\n\n this.bindHandlers();\n\n this.state = \"init\";\n\n this.setItems(items);\n\n this.attachPlugins(Fancybox.Plugins);\n\n // \"init\" event marks the start of initialization and is available to plugins\n this.trigger(\"init\");\n\n if (this.option(\"hideScrollbar\") === true) {\n this.hideScrollbar();\n }\n\n this.initLayout();\n\n this.initCarousel();\n\n this.attachEvents();\n\n instances.set(this.id, this);\n\n // \"prepare\" event will trigger the creation of additional layout elements, such as thumbnails and toolbar\n this.trigger(\"prepare\");\n\n this.state = \"ready\";\n\n // \"ready\" event will trigger the content to load\n this.trigger(\"ready\");\n\n // Reveal container\n this.$container.setAttribute(\"aria-hidden\", \"false\");\n\n // Set focus on the first focusable element inside this instance\n if (this.option(\"trapFocus\")) {\n this.focus();\n }\n }\n\n /**\n * Override `option` method to get value from the current slide\n * @param {String} name option name\n * @param {...any} rest optional extra parameters\n * @returns {any}\n */\n option(name, ...rest) {\n const slide = this.getSlide();\n\n let value = slide ? slide[name] : undefined;\n\n if (value !== undefined) {\n if (typeof value === \"function\") {\n value = value.call(this, this, ...rest);\n }\n\n return value;\n }\n\n return super.option(name, ...rest);\n }\n\n /**\n * Bind event handlers for referencability\n */\n bindHandlers() {\n for (const methodName of [\n \"onMousedown\",\n \"onKeydown\",\n \"onClick\",\n\n \"onFocus\",\n\n \"onCreateSlide\",\n \"onSettle\",\n\n \"onTouchMove\",\n \"onTouchEnd\",\n\n \"onTransform\",\n ]) {\n this[methodName] = this[methodName].bind(this);\n }\n }\n\n /**\n * Set up a functions that will be called whenever the specified event is delivered\n */\n attachEvents() {\n document.addEventListener(\"mousedown\", this.onMousedown);\n document.addEventListener(\"keydown\", this.onKeydown, true);\n\n // Trap keyboard focus inside of the modal\n if (this.option(\"trapFocus\")) {\n document.addEventListener(\"focus\", this.onFocus, true);\n }\n\n this.$container.addEventListener(\"click\", this.onClick);\n }\n\n /**\n * Removes previously registered event listeners\n */\n detachEvents() {\n document.removeEventListener(\"mousedown\", this.onMousedown);\n document.removeEventListener(\"keydown\", this.onKeydown, true);\n\n document.removeEventListener(\"focus\", this.onFocus, true);\n\n this.$container.removeEventListener(\"click\", this.onClick);\n }\n\n /**\n * Initialize layout; create main container, backdrop nd layout for main carousel\n */\n initLayout() {\n this.$root = this.option(\"parentEl\") || document.body;\n\n // Container\n let mainTemplate = this.option(\"template.main\");\n\n if (mainTemplate) {\n this.$root.insertAdjacentHTML(\"beforeend\", this.localize(mainTemplate));\n\n this.$container = this.$root.querySelector(\".fancybox__container\");\n }\n\n if (!this.$container) {\n this.$container = document.createElement(\"div\");\n this.$root.appendChild(this.$container);\n }\n\n // Normally we would not need this, but Safari does not support `preventScroll:false` option for `focus` method\n // and that causes layout issues\n this.$container.onscroll = () => {\n this.$container.scrollLeft = 0;\n return false;\n };\n\n Object.entries({\n class: \"fancybox__container\",\n role: \"dialog\",\n tabIndex: \"-1\",\n \"aria-modal\": \"true\",\n \"aria-hidden\": \"true\",\n \"aria-label\": this.localize(\"{{MODAL}}\"),\n }).forEach((args) => this.$container.setAttribute(...args));\n\n if (this.option(\"animated\")) {\n this.$container.classList.add(\"is-animated\");\n }\n\n // Backdrop\n this.$backdrop = this.$container.querySelector(\".fancybox__backdrop\");\n\n if (!this.$backdrop) {\n this.$backdrop = document.createElement(\"div\");\n this.$backdrop.classList.add(\"fancybox__backdrop\");\n\n this.$container.appendChild(this.$backdrop);\n }\n\n // Carousel\n this.$carousel = this.$container.querySelector(\".fancybox__carousel\");\n\n if (!this.$carousel) {\n this.$carousel = document.createElement(\"div\");\n this.$carousel.classList.add(\"fancybox__carousel\");\n\n this.$container.appendChild(this.$carousel);\n }\n\n // Make instance reference accessible\n this.$container.Fancybox = this;\n\n // Make sure the container has an ID\n this.id = this.$container.getAttribute(\"id\");\n\n if (!this.id) {\n this.id = this.options.id || ++called;\n this.$container.setAttribute(\"id\", \"fancybox-\" + this.id);\n }\n\n // Add custom class name to main element\n const mainClass = this.option(\"mainClass\");\n\n if (mainClass) {\n this.$container.classList.add(...mainClass.split(\" \"));\n }\n\n // Add class name for element\n document.documentElement.classList.add(\"with-fancybox\");\n\n this.trigger(\"initLayout\");\n\n return this;\n }\n\n /**\n * Prepares slides for the corousel\n * @returns {Array} Slides\n */\n setItems(items) {\n const slides = [];\n\n for (const slide of items) {\n const $trigger = slide.$trigger;\n\n if ($trigger) {\n const dataset = $trigger.dataset || {};\n\n slide.src = dataset.src || $trigger.getAttribute(\"href\") || slide.src;\n slide.type = dataset.type || slide.type;\n\n // Support items without `src`, e.g., when `data-fancybox` attribute added directly to `` element\n if (!slide.src && $trigger instanceof HTMLImageElement) {\n slide.src = $trigger.currentSrc || slide.$trigger.src;\n }\n }\n\n // Check for thumbnail element\n let $thumb = slide.$thumb;\n\n if (!$thumb) {\n let origTarget = slide.$trigger && slide.$trigger.origTarget;\n\n if (origTarget) {\n if (origTarget instanceof HTMLImageElement) {\n $thumb = origTarget;\n } else {\n $thumb = origTarget.querySelector(\"img:not([aria-hidden])\");\n }\n }\n\n if (!$thumb && slide.$trigger) {\n $thumb =\n slide.$trigger instanceof HTMLImageElement\n ? slide.$trigger\n : slide.$trigger.querySelector(\"img:not([aria-hidden])\");\n }\n }\n\n slide.$thumb = $thumb || null;\n\n // Get thumbnail image source\n let thumb = slide.thumb;\n\n if (!thumb && $thumb) {\n thumb = $thumb.currentSrc || $thumb.src;\n\n if (!thumb && $thumb.dataset) {\n thumb = $thumb.dataset.lazySrc || $thumb.dataset.src;\n }\n }\n\n // Assume we have image, then use it as thumbnail\n if (!thumb && slide.type === \"image\") {\n thumb = slide.src;\n }\n\n slide.thumb = thumb || null;\n\n // Add empty caption to make things simpler\n slide.caption = slide.caption || \"\";\n\n slides.push(slide);\n }\n\n this.items = slides;\n }\n\n /**\n * Initialize main Carousel that will be used to display the content\n * @param {Array} slides\n */\n initCarousel() {\n this.Carousel = new Carousel(\n this.$carousel,\n extend(\n true,\n {},\n {\n prefix: \"\",\n\n classNames: {\n viewport: \"fancybox__viewport\",\n track: \"fancybox__track\",\n slide: \"fancybox__slide\",\n },\n\n textSelection: true,\n preload: this.option(\"preload\"),\n\n friction: 0.88,\n\n slides: this.items,\n initialPage: this.options.startIndex,\n slidesPerPage: 1,\n\n infiniteX: this.option(\"infinite\"),\n infiniteY: true,\n\n l10n: this.option(\"l10n\"),\n\n Dots: false,\n Navigation: {\n classNames: {\n main: \"fancybox__nav\",\n button: \"carousel__button\",\n\n next: \"is-next\",\n prev: \"is-prev\",\n },\n },\n\n Panzoom: {\n textSelection: true,\n\n panOnlyZoomed: () => {\n return (\n this.Carousel && this.Carousel.pages && this.Carousel.pages.length < 2 && !this.option(\"dragToClose\")\n );\n },\n\n lockAxis: () => {\n if (this.Carousel) {\n let rez = \"x\";\n\n if (this.option(\"dragToClose\")) {\n rez += \"y\";\n }\n\n return rez;\n }\n },\n },\n\n on: {\n \"*\": (name, ...details) => this.trigger(`Carousel.${name}`, ...details),\n init: (carousel) => (this.Carousel = carousel),\n createSlide: this.onCreateSlide,\n settle: this.onSettle,\n },\n },\n\n this.option(\"Carousel\")\n )\n );\n\n if (this.option(\"dragToClose\")) {\n this.Carousel.Panzoom.on({\n // Stop further touch event handling if content is scaled\n touchMove: this.onTouchMove,\n\n // Update backdrop opacity depending on vertical distance\n afterTransform: this.onTransform,\n\n // Close instance if drag distance exceeds limit\n touchEnd: this.onTouchEnd,\n });\n }\n\n this.trigger(\"initCarousel\");\n\n return this;\n }\n\n /**\n * Process `createSlide` event to create caption element inside new slide\n */\n onCreateSlide(carousel, slide) {\n let caption = slide.caption || \"\";\n\n if (typeof this.options.caption === \"function\") {\n caption = this.options.caption.call(this, this, this.Carousel, slide);\n }\n\n if (typeof caption === \"string\" && caption.length) {\n const $caption = document.createElement(\"div\");\n const id = `fancybox__caption_${this.id}_${slide.index}`;\n\n $caption.className = \"fancybox__caption\";\n $caption.innerHTML = caption;\n $caption.setAttribute(\"id\", id);\n\n slide.$caption = slide.$el.appendChild($caption);\n\n slide.$el.classList.add(\"has-caption\");\n slide.$el.setAttribute(\"aria-labelledby\", id);\n }\n }\n\n /**\n * Handle Carousel `settle` event\n */\n onSettle() {\n if (this.option(\"autoFocus\")) {\n this.focus();\n }\n }\n\n /**\n * Handle focus event\n * @param {Event} event - Focus event\n */\n onFocus(event) {\n if (!this.isTopmost()) {\n return;\n }\n\n this.focus(event);\n }\n\n /**\n * Handle click event on the container\n * @param {Event} event - Click event\n */\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n\n let eventTarget = event.composedPath()[0];\n\n if (eventTarget.matches(\"[data-fancybox-close]\")) {\n event.preventDefault();\n Fancybox.close(false, event);\n\n return;\n }\n\n if (eventTarget.matches(\"[data-fancybox-next]\")) {\n event.preventDefault();\n Fancybox.next();\n\n return;\n }\n\n if (eventTarget.matches(\"[data-fancybox-prev]\")) {\n event.preventDefault();\n Fancybox.prev();\n\n return;\n }\n\n const activeElement = document.activeElement;\n\n if (activeElement) {\n if (activeElement.closest(\"[contenteditable]\")) {\n return;\n }\n\n if (!eventTarget.matches(FOCUSABLE_ELEMENTS)) {\n activeElement.blur();\n }\n }\n\n // Skip if clicked inside content area\n if (eventTarget.closest(\".fancybox__content\")) {\n return;\n }\n\n // Skip if text is selected\n if (getSelection().toString().length) {\n return;\n }\n\n if (this.trigger(\"click\", event) === false) {\n return;\n }\n\n const action = this.option(\"click\");\n\n switch (action) {\n case \"close\":\n this.close();\n break;\n case \"next\":\n this.next();\n break;\n }\n }\n\n /**\n * Handle panzoom `touchMove` event; Disable dragging if content of current slide is scaled\n */\n onTouchMove() {\n const panzoom = this.getSlide().Panzoom;\n\n return panzoom && panzoom.content.scale !== 1 ? false : true;\n }\n\n /**\n * Handle panzoom `touchEnd` event; close when quick flick up/down is detected\n * @param {Object} panzoom - Panzoom instance\n */\n onTouchEnd(panzoom) {\n const distanceY = panzoom.dragOffset.y;\n\n if (Math.abs(distanceY) >= 150 || (Math.abs(distanceY) >= 35 && panzoom.dragOffset.time < 350)) {\n if (this.option(\"hideClass\")) {\n this.getSlide().hideClass = `fancybox-throwOut${panzoom.content.y < 0 ? \"Up\" : \"Down\"}`;\n }\n\n this.close();\n } else if (panzoom.lockAxis === \"y\") {\n panzoom.panTo({ y: 0 });\n }\n }\n\n /**\n * Handle `afterTransform` event; change backdrop opacity based on current y position of panzoom\n * @param {Object} panzoom - Panzoom instance\n */\n onTransform(panzoom) {\n const $backdrop = this.$backdrop;\n\n if ($backdrop) {\n const yPos = Math.abs(panzoom.content.y);\n const opacity = yPos < 1 ? \"\" : Math.max(0.33, Math.min(1, 1 - (yPos / panzoom.content.fitHeight) * 1.5));\n\n this.$container.style.setProperty(\"--fancybox-ts\", opacity ? \"0s\" : \"\");\n this.$container.style.setProperty(\"--fancybox-opacity\", opacity);\n }\n }\n\n /**\n * Handle `mousedown` event to mark that the mouse is in use\n */\n onMousedown() {\n if (this.state === \"ready\") {\n document.body.classList.add(\"is-using-mouse\");\n }\n }\n\n /**\n * Handle `keydown` event; trap focus\n * @param {Event} event Keydown event\n */\n onKeydown(event) {\n if (!this.isTopmost()) {\n return;\n }\n\n document.body.classList.remove(\"is-using-mouse\");\n\n const key = event.key;\n const keyboard = this.option(\"keyboard\");\n\n if (!keyboard || event.ctrlKey || event.altKey || event.shiftKey) {\n return;\n }\n\n const target = event.composedPath()[0];\n\n const classList = document.activeElement && document.activeElement.classList;\n const isUIElement = classList && classList.contains(\"carousel__button\");\n\n // Allow to close using Escape button\n if (key !== \"Escape\" && !isUIElement) {\n let ignoreElements =\n event.target.isContentEditable ||\n [\"BUTTON\", \"TEXTAREA\", \"OPTION\", \"INPUT\", \"SELECT\", \"VIDEO\"].indexOf(target.nodeName) !== -1;\n\n if (ignoreElements) {\n return;\n }\n }\n\n if (this.trigger(\"keydown\", key, event) === false) {\n return;\n }\n\n const action = keyboard[key];\n\n if (typeof this[action] === \"function\") {\n this[action]();\n }\n }\n\n /**\n * Get the active slide. This will be the first slide from the current page of the main carousel.\n */\n getSlide() {\n const carousel = this.Carousel;\n\n if (!carousel) return null;\n\n const page = carousel.page === null ? carousel.option(\"initialPage\") : carousel.page;\n const pages = carousel.pages || [];\n\n if (pages.length && pages[page]) {\n return pages[page].slides[0];\n }\n\n return null;\n }\n\n /**\n * Place focus on the first focusable element inside current slide\n * @param {Event} [event] - Focus event\n */\n focus(event) {\n if (Fancybox.ignoreFocusChange) {\n return;\n }\n\n if ([\"init\", \"closing\", \"customClosing\", \"destroy\"].indexOf(this.state) > -1) {\n return;\n }\n\n const $container = this.$container;\n const currentSlide = this.getSlide();\n const $currentSlide = currentSlide.state === \"done\" ? currentSlide.$el : null;\n\n // Skip if the DOM element that is currently in focus is already inside the current slide\n if ($currentSlide && $currentSlide.contains(document.activeElement)) {\n return;\n }\n\n if (event) {\n event.preventDefault();\n }\n\n Fancybox.ignoreFocusChange = true;\n\n const allFocusableElems = Array.from($container.querySelectorAll(FOCUSABLE_ELEMENTS));\n\n let enabledElems = [];\n let $firstEl;\n\n for (let node of allFocusableElems) {\n // Enable element if it's visible and\n // is inside the current slide or is outside main carousel (for example, inside the toolbar)\n const isNodeVisible = node.offsetParent;\n const isNodeInsideCurrentSlide = $currentSlide && $currentSlide.contains(node);\n const isNodeOutsideCarousel = !this.Carousel.$viewport.contains(node);\n\n if (isNodeVisible && (isNodeInsideCurrentSlide || isNodeOutsideCarousel)) {\n enabledElems.push(node);\n\n if (node.dataset.origTabindex !== undefined) {\n node.tabIndex = node.dataset.origTabindex;\n node.removeAttribute(\"data-orig-tabindex\");\n }\n\n if (\n node.hasAttribute(\"autoFocus\") ||\n (!$firstEl && isNodeInsideCurrentSlide && !node.classList.contains(\"carousel__button\"))\n ) {\n $firstEl = node;\n }\n } else {\n // Element is either hidden or is inside preloaded slide (e.g., not inside current slide, but next/prev)\n node.dataset.origTabindex =\n node.dataset.origTabindex === undefined ? node.getAttribute(\"tabindex\") : node.dataset.origTabindex;\n\n node.tabIndex = -1;\n }\n }\n\n if (!event) {\n if (this.option(\"autoFocus\") && $firstEl) {\n setFocusOn($firstEl);\n } else if (enabledElems.indexOf(document.activeElement) < 0) {\n setFocusOn($container);\n }\n } else {\n if (enabledElems.indexOf(event.target) > -1) {\n this.lastFocus = event.target;\n } else {\n if (this.lastFocus === $container) {\n setFocusOn(enabledElems[enabledElems.length - 1]);\n } else {\n setFocusOn($container);\n }\n }\n }\n\n this.lastFocus = document.activeElement;\n\n Fancybox.ignoreFocusChange = false;\n }\n\n /**\n * Hide vertical page scrollbar and adjust right padding value of `body` element to prevent content from shifting\n * (otherwise the `body` element may become wider and the content may expand horizontally).\n */\n hideScrollbar() {\n if (!canUseDOM) {\n return;\n }\n\n const scrollbarWidth = window.innerWidth - document.documentElement.getBoundingClientRect().width;\n const id = \"fancybox-style-noscroll\";\n\n let $style = document.getElementById(id);\n\n if ($style) {\n return;\n }\n\n if (scrollbarWidth > 0) {\n $style = document.createElement(\"style\");\n\n $style.id = id;\n $style.type = \"text/css\";\n $style.innerHTML = `.compensate-for-scrollbar {padding-right: ${scrollbarWidth}px;}`;\n\n document.getElementsByTagName(\"head\")[0].appendChild($style);\n\n document.body.classList.add(\"compensate-for-scrollbar\");\n }\n }\n\n /**\n * Stop hiding vertical page scrollbar\n */\n revealScrollbar() {\n document.body.classList.remove(\"compensate-for-scrollbar\");\n\n const el = document.getElementById(\"fancybox-style-noscroll\");\n\n if (el) {\n el.remove();\n }\n }\n\n /**\n * Remove content for given slide\n * @param {Object} slide - Carousel slide\n */\n clearContent(slide) {\n // * Clear previously added content and class name\n this.Carousel.trigger(\"removeSlide\", slide);\n\n if (slide.$content) {\n slide.$content.remove();\n slide.$content = null;\n }\n\n if (slide.$closeButton) {\n slide.$closeButton.remove();\n slide.$closeButton = null;\n }\n\n if (slide._className) {\n slide.$el.classList.remove(slide._className);\n }\n }\n\n /**\n * Set new content for given slide\n * @param {Object} slide - Carousel slide\n * @param {HTMLElement|String} html - HTML element or string containing HTML code\n * @param {Object} [opts] - Options\n */\n setContent(slide, html, opts = {}) {\n let $content;\n\n const $el = slide.$el;\n\n if (html instanceof HTMLElement) {\n if ([\"img\", \"iframe\", \"video\", \"audio\"].indexOf(html.nodeName.toLowerCase()) > -1) {\n $content = document.createElement(\"div\");\n $content.appendChild(html);\n } else {\n $content = html;\n }\n } else {\n const $fragment = document.createRange().createContextualFragment(html);\n\n $content = document.createElement(\"div\");\n $content.appendChild($fragment);\n }\n\n if (slide.filter && !slide.error) {\n $content = $content.querySelector(slide.filter);\n }\n\n if (!($content instanceof Element)) {\n this.setError(slide, \"{{ELEMENT_NOT_FOUND}}\");\n\n return;\n }\n\n // * Add class name indicating content type, for example `has-image`\n slide._className = `has-${opts.suffix || slide.type || \"unknown\"}`;\n\n $el.classList.add(slide._className);\n\n // * Set content\n $content.classList.add(\"fancybox__content\");\n\n // Make sure that content is not hidden and will be visible\n if ($content.style.display === \"none\" || getComputedStyle($content).getPropertyValue(\"display\") === \"none\") {\n $content.style.display = slide.display || this.option(\"defaultDisplay\") || \"flex\";\n }\n\n if (slide.id) {\n $content.setAttribute(\"id\", slide.id);\n }\n\n slide.$content = $content;\n\n $el.prepend($content);\n\n this.manageCloseButton(slide);\n\n if (slide.state !== \"loading\") {\n this.revealContent(slide);\n }\n\n return $content;\n }\n\n /**\n * Create close button if needed\n * @param {Object} slide\n */\n manageCloseButton(slide) {\n const position = slide.closeButton === undefined ? this.option(\"closeButton\") : slide.closeButton;\n\n if (!position || (position === \"top\" && this.$closeButton)) {\n return;\n }\n\n const $btn = document.createElement(\"button\");\n\n $btn.classList.add(\"carousel__button\", \"is-close\");\n $btn.setAttribute(\"title\", this.options.l10n.CLOSE);\n $btn.innerHTML = this.option(\"template.closeButton\");\n\n $btn.addEventListener(\"click\", (e) => this.close(e));\n\n if (position === \"inside\") {\n // Remove existing one to avoid scope issues\n if (slide.$closeButton) {\n slide.$closeButton.remove();\n }\n\n slide.$closeButton = slide.$content.appendChild($btn);\n } else {\n this.$closeButton = this.$container.insertBefore($btn, this.$container.firstChild);\n }\n }\n\n /**\n * Make content visible for given slide and optionally start CSS animation\n * @param {Object} slide - Carousel slide\n */\n revealContent(slide) {\n this.trigger(\"reveal\", slide);\n\n slide.$content.style.visibility = \"\";\n\n // Add CSS class name that reveals content (default animation is \"fadeIn\")\n let showClass = false;\n\n if (\n !(\n slide.error ||\n slide.state === \"loading\" ||\n this.Carousel.prevPage !== null ||\n slide.index !== this.options.startIndex\n )\n ) {\n showClass = slide.showClass === undefined ? this.option(\"showClass\") : slide.showClass;\n }\n\n if (!showClass) {\n this.done(slide);\n\n return;\n }\n\n slide.state = \"animating\";\n\n this.animateCSS(slide.$content, showClass, () => {\n this.done(slide);\n });\n }\n\n /**\n * Add class name to given HTML element and wait for `animationend` event to execute callback\n * @param {HTMLElement} $el\n * @param {String} className\n * @param {Function} callback - A callback to run\n */\n animateCSS($element, className, callback) {\n if ($element) {\n $element.dispatchEvent(new CustomEvent(\"animationend\", { bubbles: true, cancelable: true }));\n }\n\n if (!$element || !className) {\n if (typeof callback === \"function\") {\n callback();\n }\n\n return;\n }\n\n const handleAnimationEnd = function (event) {\n if (event.currentTarget === this) {\n $element.removeEventListener(\"animationend\", handleAnimationEnd);\n\n if (callback) {\n callback();\n }\n\n $element.classList.remove(className);\n }\n };\n\n $element.addEventListener(\"animationend\", handleAnimationEnd);\n $element.classList.add(className);\n }\n\n /**\n * Mark given slide as `done`, e.g., content is loaded and displayed completely\n * @param {Object} slide - Carousel slide\n */\n done(slide) {\n slide.state = \"done\";\n\n this.trigger(\"done\", slide);\n\n // Trigger focus for current slide (and ignore preloaded slides)\n const currentSlide = this.getSlide();\n\n if (currentSlide && slide.index === currentSlide.index && this.option(\"autoFocus\")) {\n this.focus();\n }\n }\n\n /**\n * Set error message as slide content\n * @param {Object} slide - Carousel slide\n * @param {String} message - Error message, can contain HTML code and template variables\n */\n setError(slide, message) {\n slide.error = message;\n\n this.hideLoading(slide);\n this.clearContent(slide);\n\n // Create new content\n const div = document.createElement(\"div\");\n div.classList.add(\"fancybox-error\");\n div.innerHTML = this.localize(message || \"

{{ERROR}}

\");\n\n this.setContent(slide, div, { suffix: \"error\" });\n }\n\n /**\n * Create loading indicator inside given slide\n * @param {Object} slide - Carousel slide\n */\n showLoading(slide) {\n slide.state = \"loading\";\n\n slide.$el.classList.add(\"is-loading\");\n\n let $spinner = slide.$el.querySelector(\".fancybox__spinner\");\n\n if ($spinner) {\n return;\n }\n\n $spinner = document.createElement(\"div\");\n\n $spinner.classList.add(\"fancybox__spinner\");\n $spinner.innerHTML = this.option(\"template.spinner\");\n\n $spinner.addEventListener(\"click\", () => {\n if (!this.Carousel.Panzoom.velocity) this.close();\n });\n\n slide.$el.prepend($spinner);\n }\n\n /**\n * Remove loading indicator from given slide\n * @param {Object} slide - Carousel slide\n */\n hideLoading(slide) {\n const $spinner = slide.$el && slide.$el.querySelector(\".fancybox__spinner\");\n\n if ($spinner) {\n $spinner.remove();\n\n slide.$el.classList.remove(\"is-loading\");\n }\n\n if (slide.state === \"loading\") {\n this.trigger(\"load\", slide);\n\n slide.state = \"ready\";\n }\n }\n\n /**\n * Slide carousel to next page\n */\n next() {\n const carousel = this.Carousel;\n\n if (carousel && carousel.pages.length > 1) {\n carousel.slideNext();\n }\n }\n\n /**\n * Slide carousel to previous page\n */\n prev() {\n const carousel = this.Carousel;\n\n if (carousel && carousel.pages.length > 1) {\n carousel.slidePrev();\n }\n }\n\n /**\n * Slide carousel to selected page with optional parameters\n * Examples:\n * Fancybox.getInstance().jumpTo(2);\n * Fancybox.getInstance().jumpTo(3, {friction: 0})\n * @param {...any} args - Arguments for Carousel `slideTo` method\n */\n jumpTo(...args) {\n if (this.Carousel) this.Carousel.slideTo(...args);\n }\n\n /**\n * Check if current instance is trying to close or is already closed\n * @returns {Boolean}\n */\n isClosing() {\n return [\"closing\", \"customClosing\", \"destroy\"].includes(this.state);\n }\n\n /**\n * Check if the current instance is not blocked by another instance\n * @returns {Boolean}\n */\n isTopmost() {\n return Fancybox.getInstance().id == this.id;\n }\n\n /**\n * Start closing the current instance\n * @param {Event} [event] - Optional click event\n */\n close(event) {\n if (event) event.preventDefault();\n\n // First, stop further execution if this instance is already closing\n // (this can happen if, for example, user clicks close button multiple times really fast)\n if (this.isClosing()) {\n return;\n }\n\n // Allow callbacks and/or plugins to prevent closing\n if (this.trigger(\"shouldClose\", event) === false) {\n return;\n }\n\n this.state = \"closing\";\n\n this.Carousel.Panzoom.destroy();\n\n this.detachEvents();\n\n this.trigger(\"closing\", event);\n\n if (this.state === \"destroy\") {\n return;\n }\n\n // Trigger default CSS closing animation for backdrop and interface elements\n this.$container.setAttribute(\"aria-hidden\", \"true\");\n\n this.$container.classList.add(\"is-closing\");\n\n // Clear inactive slides\n const currentSlide = this.getSlide();\n\n this.Carousel.slides.forEach((slide) => {\n if (slide.$content && slide.index !== currentSlide.index) {\n this.Carousel.trigger(\"removeSlide\", slide);\n }\n });\n\n // Start default closing animation\n if (this.state === \"closing\") {\n const hideClass = currentSlide.hideClass === undefined ? this.option(\"hideClass\") : currentSlide.hideClass;\n\n this.animateCSS(\n currentSlide.$content,\n hideClass,\n () => {\n this.destroy();\n },\n true\n );\n }\n }\n\n /**\n * Clean up after closing fancybox\n */\n destroy() {\n if (this.state === \"destroy\") {\n return;\n }\n\n this.state = \"destroy\";\n\n this.trigger(\"destroy\");\n\n const $trigger = this.option(\"placeFocusBack\") ? this.option(\"triggerTarget\", this.getSlide().$trigger) : null;\n\n // Destroy Carousel and then detach plugins;\n // * Note: this order allows plugins to receive `removeSlide` event\n this.Carousel.destroy();\n\n this.detachPlugins();\n\n this.Carousel = null;\n\n this.options = {};\n this.events = {};\n\n this.$container.remove();\n\n this.$container = this.$backdrop = this.$carousel = null;\n\n if ($trigger) {\n setFocusOn($trigger);\n }\n\n instances.delete(this.id);\n\n const nextInstance = Fancybox.getInstance();\n\n if (nextInstance) {\n nextInstance.focus();\n return;\n }\n\n document.documentElement.classList.remove(\"with-fancybox\");\n document.body.classList.remove(\"is-using-mouse\");\n\n this.revealScrollbar();\n }\n\n /**\n * Create new Fancybox instance with provided options\n * Example:\n * Fancybox.show([{ src : 'https://lipsum.app/id/1/300x225' }]);\n * @param {Array} items - Gallery items\n * @param {Object} [options] - Optional custom options\n * @returns {Object} Fancybox instance\n */\n static show(items, options = {}) {\n return new Fancybox(items, options);\n }\n\n /**\n * Starts Fancybox if event target matches any opener or target is `trigger element`\n * @param {Event} event - Click event\n * @param {Object} [options] - Optional custom options\n */\n static fromEvent(event, options = {}) {\n // Allow other scripts to prevent starting fancybox on click\n if (event.defaultPrevented) {\n return;\n }\n\n // Don't run if right-click\n if (event.button && event.button !== 0) {\n return;\n }\n\n // Ignore command/control + click\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n }\n\n const origTarget = event.composedPath()[0];\n let eventTarget = origTarget;\n\n // Support `trigger` element, e.g., start fancybox from different DOM element, for example,\n // to have one preview image for hidden image gallery\n let triggerGroupName;\n\n if (\n eventTarget.matches(\"[data-fancybox-trigger]\") ||\n (eventTarget = eventTarget.closest(\"[data-fancybox-trigger]\"))\n ) {\n options.triggerTarget = eventTarget;\n triggerGroupName = eventTarget && eventTarget.dataset && eventTarget.dataset.fancyboxTrigger;\n }\n\n if (triggerGroupName) {\n const triggerItems = document.querySelectorAll(`[data-fancybox=\"${triggerGroupName}\"]`);\n const triggerIndex = parseInt(eventTarget.dataset.fancyboxIndex, 10) || 0;\n\n eventTarget = triggerItems.length ? triggerItems[triggerIndex] : eventTarget;\n }\n\n // * Try to find matching openener\n let matchingOpener;\n let target;\n\n Array.from(Fancybox.openers.keys())\n .reverse()\n .some((opener) => {\n target = eventTarget || origTarget;\n\n let found = false;\n\n try {\n if (target instanceof Element && (typeof opener === \"string\" || opener instanceof String)) {\n // Chain closest() to event.target to find and return the parent element,\n // regardless if clicking on the child elements (icon, label, etc)\n found = target.matches(opener) || (target = target.closest(opener));\n }\n } catch (error) {}\n\n if (found) {\n event.preventDefault();\n matchingOpener = opener;\n return true;\n }\n\n return false;\n });\n\n let rez = false;\n\n if (matchingOpener) {\n options.event = event;\n options.target = target;\n\n target.origTarget = origTarget;\n\n rez = Fancybox.fromOpener(matchingOpener, options);\n\n // Check if the mouse is being used\n // Waiting for better browser support for `:focus-visible` -\n // https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo\n const nextInstance = Fancybox.getInstance();\n\n if (nextInstance && nextInstance.state === \"ready\" && event.detail) {\n document.body.classList.add(\"is-using-mouse\");\n }\n }\n\n return rez;\n }\n\n /**\n * Starts Fancybox using selector\n * @param {String} opener - Valid CSS selector string\n * @param {Object} [options] - Optional custom options\n */\n static fromOpener(opener, options = {}) {\n // Callback function called once for each group element that\n // 1) converts data attributes to boolean or JSON\n // 2) removes values that could cause issues\n const mapCallback = function (el) {\n const falseValues = [\"false\", \"0\", \"no\", \"null\", \"undefined\"];\n const trueValues = [\"true\", \"1\", \"yes\"];\n\n const dataset = Object.assign({}, el.dataset);\n const options = {};\n\n for (let [key, value] of Object.entries(dataset)) {\n if (key === \"fancybox\") {\n continue;\n }\n\n if (key === \"width\" || key === \"height\") {\n options[`_${key}`] = value;\n } else if (typeof value === \"string\" || value instanceof String) {\n if (falseValues.indexOf(value) > -1) {\n options[key] = false;\n } else if (trueValues.indexOf(options[key]) > -1) {\n options[key] = true;\n } else {\n try {\n options[key] = JSON.parse(value);\n } catch (e) {\n options[key] = value;\n }\n }\n } else {\n options[key] = value;\n }\n }\n\n if (el instanceof Element) {\n options.$trigger = el;\n }\n\n return options;\n };\n\n let items = [],\n index = options.startIndex || 0,\n target = options.target || null;\n\n // Get options\n // ===\n options = extend({}, options, Fancybox.openers.get(opener));\n\n // Get matching nodes\n // ===\n const groupAll = options.groupAll === undefined ? false : options.groupAll;\n\n const groupAttr = options.groupAttr === undefined ? \"data-fancybox\" : options.groupAttr;\n const groupValue = groupAttr && target ? target.getAttribute(`${groupAttr}`) : \"\";\n\n if (!target || groupValue || groupAll) {\n const $root = options.root || (target ? target.getRootNode() : document.body);\n\n items = [].slice.call($root.querySelectorAll(opener));\n }\n\n if (target && !groupAll) {\n if (groupValue) {\n items = items.filter((el) => el.getAttribute(`${groupAttr}`) === groupValue);\n } else {\n items = [target];\n }\n }\n\n if (!items.length) {\n return false;\n }\n\n // Exit if current instance is triggered from the same element\n // ===\n const currentInstance = Fancybox.getInstance();\n\n if (currentInstance && items.indexOf(currentInstance.options.$trigger) > -1) {\n return false;\n }\n\n // Start Fancybox\n // ===\n\n // Get index of current item in the gallery\n index = target ? items.indexOf(target) : index;\n\n // Convert items in a format supported by fancybox\n items = items.map(mapCallback);\n\n // * Create new fancybox instance\n return new Fancybox(\n items,\n extend({}, options, {\n startIndex: index,\n $trigger: target,\n })\n );\n }\n\n /**\n * Attach a click handler function that starts Fancybox to the selected items, as well as to all future matching elements.\n * @param {String} selector - Selector that should match trigger elements\n * @param {Object} [options] - Custom options\n */\n static bind(selector, options = {}) {\n function attachClickEvent() {\n document.body.addEventListener(\"click\", Fancybox.fromEvent, false);\n }\n\n if (!canUseDOM) {\n return;\n }\n\n if (!Fancybox.openers.size) {\n if (/complete|interactive|loaded/.test(document.readyState)) {\n attachClickEvent();\n } else {\n document.addEventListener(\"DOMContentLoaded\", attachClickEvent);\n }\n }\n\n Fancybox.openers.set(selector, options);\n }\n\n /**\n * Remove the click handler that was attached with `bind()`\n * @param {String} selector - A selector which should match the one originally passed to .bind()\n */\n static unbind(selector) {\n Fancybox.openers.delete(selector);\n\n if (!Fancybox.openers.size) {\n Fancybox.destroy();\n }\n }\n\n /**\n * Immediately destroy all instances (without closing animation) and clean up all bindings..\n */\n static destroy() {\n let fb;\n\n while ((fb = Fancybox.getInstance())) {\n fb.destroy();\n }\n\n Fancybox.openers = new Map();\n\n document.body.removeEventListener(\"click\", Fancybox.fromEvent, false);\n }\n\n /**\n * Retrieve instance by identifier or the top most instance, if identifier is not provided\n * @param {String|Numeric} [id] - Optional instance identifier\n */\n static getInstance(id) {\n if (id) {\n return instances.get(id);\n }\n\n const instance = Array.from(instances.values())\n .reverse()\n .find((instance) => {\n if (!instance.isClosing()) {\n return instance;\n }\n\n return false;\n });\n\n return instance || null;\n }\n\n /**\n * Close all or topmost currently active instance.\n * @param {boolean} [all] - All or only topmost active instance\n * @param {any} [arguments] - Optional data\n */\n static close(all = true, args) {\n if (all) {\n for (const instance of instances.values()) {\n instance.close(args);\n }\n } else {\n const instance = Fancybox.getInstance();\n\n if (instance) {\n instance.close(args);\n }\n }\n }\n\n /**\n * Slide topmost currently active instance to next page\n */\n static next() {\n const instance = Fancybox.getInstance();\n\n if (instance) {\n instance.next();\n }\n }\n\n /**\n * Slide topmost currently active instance to previous page\n */\n static prev() {\n const instance = Fancybox.getInstance();\n\n if (instance) {\n instance.prev();\n }\n }\n}\n\n// Expose version\nFancybox.version = \"__VERSION__\";\n\n// Expose defaults\nFancybox.defaults = defaults;\n\n// Expose openers\nFancybox.openers = new Map();\n\n// Add default plugins\nFancybox.Plugins = Plugins;\n\n// Auto init with default options\nFancybox.bind(\"[data-fancybox]\");\n\n// Prepare plugins\nfor (const [key, Plugin] of Object.entries(Fancybox.Plugins || {})) {\n if (typeof Plugin.create === \"function\") {\n Plugin.create(Fancybox);\n }\n}\n\nexport { Fancybox };\n","export default {\r\n CLOSE: \"Close\",\r\n NEXT: \"Next\",\r\n PREV: \"Previous\",\r\n MODAL: \"You can close this modal content with the ESC key\",\r\n ERROR: \"Something Went Wrong, Please Try Again Later\",\r\n IMAGE_ERROR: \"Image Not Found\",\r\n ELEMENT_NOT_FOUND: \"HTML Element Not Found\",\r\n AJAX_NOT_FOUND: \"Error Loading AJAX : Not Found\",\r\n AJAX_FORBIDDEN: \"Error Loading AJAX : Forbidden\",\r\n IFRAME_ERROR: \"Error Loading Page\",\r\n TOGGLE_ZOOM: \"Toggle zoom level\",\r\n TOGGLE_THUMBS: \"Toggle thumbnails\",\r\n TOGGLE_SLIDESHOW: \"Toggle slideshow\",\r\n TOGGLE_FULLSCREEN: \"Toggle full-screen mode\",\r\n DOWNLOAD: \"Download\",\r\n};\r\n"],"names":["isPlainObject","obj","constructor","Object","prototype","toString","call","extend","args","deep","shift","result","Error","extenders","slice","len","length","i","extender","key","hasOwnProperty","value","Array","isArray","base","canUseDOM","window","document","createElement","preventScrollSupported","FOCUSABLE_ELEMENTS","setFocusOn","node","focus","preventScroll","setActive","scrollTop","pageXOffset","body","scrollLeft","pageYOffset","scrollTo","top","left","behavior","e","Base","options","this","plugins","events","type","entries","option","fallback","rest","path","String","split","reduce","prev","curr","undefined","localize","str","params","replace","match","subkey","rez","toLowerCase","substring","index","join","on","name","callback","forEach","item","listeners","indexOf","push","once","listener","details","off","_","splice","trigger","attachPlugins","newPlugins","Plugin","defaults","plugin","attach","assign","detachPlugins","detach","round","precision","parseFloat","Math","Number","EPSILON","isScrollable","Element","__Panzoom","overflowY","getComputedStyle","overflowX","vertical","abs","scrollHeight","clientHeight","horizontal","scrollWidth","clientWidth","hasScrollbars","parentNode","ResizeObserver","observables","boundCheck","check","bind","observe","el","some","observable","newObservable","size","height","width","unobserve","filter","disconnect","changedEntries","currentHeight","currentWidth","map","requestAnimationFrame","Pointer","nativePointer","id","self","Touch","identifier","pageX","pageY","clientX","clientY","getDistance","a","b","sqrt","getMidpoint","PointerTracker","_element","start","move","end","startPointers","currentPointers","_pointerStart","event","buttons","button","pointer","p","_triggerPointerStart","addEventListener","_move","_pointerEnd","_touchStart","touch","from","changedTouches","previousPointers","changedPointers","isTouchEvent","t","trackedChangedPointers","findIndex","_moveCallback","_triggerPointerEnd","_endCallback","removeEventListener","passive","_touchEnd","_startCallback","stop","zoom","pinchToZoom","panOnlyZoomed","lockAxis","friction","decelFriction","zoomFriction","bounceForce","baseScale","minScale","maxScale","step","textSelection","click","wheel","wheelFactor","wheelLimit","draggableClass","draggingClass","ratio","Panzoom","$container","super","state","methodName","initLayout","resetValues","Plugins","updateMetrics","attachEvents","panTo","HTMLElement","$content","querySelector","$viewport","classList","add","append","childNodes","appendChild","updateRate","test","navigator","userAgent","container","viewport","content","origWidth","origHeight","x","y","scale","transform","resetDragPosition","onLoad","onClick","defaultPrevented","activeElement","closest","getSelection","target","hasAttribute","stopPropagation","rect","getClientRects","dragPosition","midPoint","dragStart","preventDefault","zoomWithClick","onWheel","zoomWithWheel","changedDelta","delta","max","min","deltaY","deltaX","wheelDelta","detail","newScale","getBoundingClientRect","zoomTo","toggleZoom","initObserver","pointerTracker","velocity","composedPath","nodeName","element","nodes","range","createRange","nodeType","Node","TEXT_NODE","selectNodeContents","right","bottom","getTextNodeFromPoint","time","Date","now","prevMidpoint","newMidpoint","panX","panY","prevDistance","newDistance","scaleDiff","dragOffset","axisToLock","angle","atan2","PI","stopImmediatePropagation","startPoint","xPos","yPos","getZoomDelta","setDragResistance","startAnimation","_dragOffset","recalculateTransform","remove","last","resizeObserver","updateTimer","setTimeout","isAnimating","endAnimation","silently","contentIsImage","HTMLImageElement","contentIsZoomable","shouldResizeParent","elem","naturalWidth","baseVal","offsetWidth","naturalHeight","offsetHeight","getFullHeight","style","maxWidth","maxHeight","contentRect","viewportRect","containerRect","viewportWidth","viewportHeight","viewportStyles","paddingLeft","paddingRight","paddingTop","paddingBottom","srcWidth","srcHeight","calculateAspectRatioFit","fitWidth","fitHeight","isZoomable","zoomIn","zoomOut","props","currentScale","percentXInCurrentBox","percentYInCurrentBox","ignoreBounds","boundX","boundY","getBounds","to","rAF","cancelAnimationFrame","animate","setEdgeForce","setDragForce","setTransform","pastLeft","pastRight","pastTop","pastBottom","force","restX","restY","bound","distance","final","handleCursor","detachEvents","destroy","clearTimeout","version","throttle","func","limit","lastCall","getTime","Navigation","carousel","$prev","$next","onRefresh","createButton","$btn","setAttribute","toUpperCase","classNames","innerHTML","build","pageCount","pages","elemDimWidth","wrapDimWidth","isInteger","cleanup","removeAttribute","page","prevTpl","nextTpl","main","next","Sync","selectedIndex","onNavReady","onNavClick","onNavCreateSlide","onTargetChange","addAsTargetFor","nav","addAsNavFor","initialSlide","initialPage","panzoom","clickedNavSlide","selectedNavIndex","parseInt","dataset","selectedSyncPage","findPageForSlide","slideTo","markSelectedSlide","slide","targetIndex","indexes","selectedNavPage","slides","$el","sync","$list","change","onChange","refresh","buildList","removeList","removeChild","rebuildDots","listExists","pagesCount","dotCount","children","lastChild","$dot","code","nextSibling","previousSibling","setActiveDot","$activeDot","preload","slidesPerPage","center","infinite","fill","dragFree","prefix","track","slideSelected","l10n","NEXT","PREV","GOTO","Carousel","slideNext","slidePrev","init","__Carousel","pageIndex","prevPage","prevPageIndex","initSlides","$track","manageSlideVisiblity","initPanzoom","querySelectorAll","isDom","lastSlideWidth","contentWidth","slideWidth","getSlideMetrics","currentPage","shouldCenter","shouldFill","sum","page2","updatePanzoom","firstSlide","isTestEl","visibility","customClass","prepend","currentStyle","marginLeft","marginRight","find","setPage","wrapInner","resizeParent","centerOnStart","afterUpdate","updatePage","beforeTransform","onBeforeTransform","touchEnd","onTouchEnd","currentX","getPropertyValue","leftBoundary","rightBoundary","hasDiff","insideCurrentInterval","insidePrevInterval","insideNextInterval","createSlideEl","removeSlideEl","nextIndex","nextPos","updatedX","markSelectedSlides","curentIndex","lazySrc","srcset","lazySrcset","src","backgroundImage","div","html","allElelements","goal","refSlide","refIndex","insertBefore","selectedClass","attr","contains","manageInfiniteTrack","isFlipped","nextPageIndex","getPageFromPosition","slideToClosest","interval","floor","toClosest","nextPosition","nextInterval","currPosition","decreasedPosition","increasedPosition","diff1","diff2","diff3","Thumbs","fancybox","prepare","onPrepare","closing","onClosing","keydown","onKeydown","getSlides","toggle","$carousel","Dots","items","thumb","hide","show","display","minSlideCount","minScreenHeight","autoStart","tpl","buildURLQuery","url","URL","URLSearchParams","search","set","matches","video","autoplay","youtube","autohide","fs","rel","hd","wmode","enablejsapi","html5","vimeo","show_title","show_byline","show_portrait","fullscreen","html5video","format","Html","onInit","ready","onReady","onCreateSlide","onRemoveSlide","onSelectSlide","onUnselectSlide","processType","videoId","encodeURIComponent","vendor","charAt","_width","_height","setContent","getSlide","playVideo","loadInlineContent","tmp","getElementById","$placeHolder","cloneNode","attrId","getAttribute","setError","loadAjaxContent","xhr","XMLHttpRequest","showLoading","onreadystatechange","readyState","DONE","hideLoading","status","responseText","data","ajax","open","setRequestHeader","send","loadIframeContent","$iframe","className","resizeIframe","onerror","onload","isFirstLoad","isReady","revealContent","setAspectRatio","maxRatio","width_","height_","autoSize","$parent","parentStyle","compStyles","paddingX","paddingY","contentWindow","$html","getElementsByTagName","$body","overflow","flex","error","newStyle","poster","$video","promise","play","then","catch","muted","err","poller","command","method","postMessage","JSON","stringify","pause","abort","$closeButton","onMessage","parse","origin","getElementsByClassName","source","ex","Image","done","onDone","onPageChange","clickTimer","$image","canZoom","imageFit","onImageStatusChange","alt","draggable","sizes","shouldWrap","$wrap","complete","initSlidePanzoom","startIndex","getZoomInfo","thumbRect","$thumb","thumbWidth","thumbHeight","contentHeight","shiftedTop","shiftedLeft","opacity","visualViewport","visibleTopLeft","elementFromPoint","visibleBottomRight","$caption","animatePosition","clickAction","touchIsEnabled","zoomInClass","zoomOutClass","close","process","action","dblclickAction","currSlide","canZoomInClass","canZoomOutClass","zoomOpacity","ignoreCoveredThumbnail","doubleClick","fit","wrap","Hash","initCarousel","hasCreatedHistory","origHash","timer","firstRun","currentSlide","currentHash","hash","newHash","slug","$trigger","history","title","location","pathname","hasSilentClose","replaceState","static","Fancybox","getInstance","getParsedURL","selectedElem","dispatchEvent","CustomEvent","bubbles","cancelable","groupElems","instance","startFromUrl","proceed","onHashChange","substr","pop","Fullscreen","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","activate","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","deactivate","exitFullscreen","mozCancelFullScreen","webkitExitFullscreen","Slideshow","active","handleVisibilityChange","isActive","setTimer","delay","jumpTo","$progress","transitionDuration","clearTimer","autoEnable","counter","position","class","tabindex","label","slideshow","download","thumbs","Toolbar","onSettle","hasImage","closeButton","update","onFsChange","prop","$svg","all_items","all_groups","includes","fullscreenEnabled","fullScreen","group","idx","cnt","downloadSrc","ScrollLock","pendingUpdate","startY","onResize","updateViewport","onTouchstart","onTouchmove","offsetLeft","offsetTop","touches","screenY","innerWidth","documentElement","curY","isAtTop","isAtBottom","showClass","hideClass","animated","hideScrollbar","parentEl","mainClass","autoFocus","trapFocus","placeFocusBack","dragToClose","keyboard","Escape","Delete","Backspace","PageUp","PageDown","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","template","spinner","CLOSE","MODAL","ERROR","IMAGE_ERROR","ELEMENT_NOT_FOUND","AJAX_NOT_FOUND","AJAX_FORBIDDEN","IFRAME_ERROR","TOGGLE_ZOOM","TOGGLE_THUMBS","TOGGLE_SLIDESHOW","TOGGLE_FULLSCREEN","DOWNLOAD","instances","Map","called","bindHandlers","setItems","onMousedown","onFocus","$root","mainTemplate","insertAdjacentHTML","onscroll","role","tabIndex","$backdrop","currentSrc","origTarget","caption","infiniteX","infiniteY","createSlide","settle","touchMove","onTouchMove","afterTransform","onTransform","isTopmost","eventTarget","blur","distanceY","setProperty","ctrlKey","altKey","shiftKey","isUIElement","isContentEditable","ignoreFocusChange","$currentSlide","allFocusableElems","$firstEl","enabledElems","isNodeVisible","offsetParent","isNodeInsideCurrentSlide","isNodeOutsideCarousel","origTabindex","lastFocus","scrollbarWidth","$style","revealScrollbar","clearContent","_className","opts","$fragment","createContextualFragment","suffix","manageCloseButton","firstChild","animateCSS","$element","handleAnimationEnd","currentTarget","message","$spinner","isClosing","delete","nextInstance","metaKey","triggerGroupName","matchingOpener","triggerTarget","fancyboxTrigger","triggerItems","triggerIndex","fancyboxIndex","openers","keys","reverse","opener","found","fromOpener","groupAll","get","groupAttr","groupValue","root","getRootNode","currentInstance","falseValues","trueValues","selector","attachClickEvent","fromEvent","fb","values","all","create"],"sourceRoot":""}