{"version":3,"file":"gallery.js","sources":["../../node_modules/@lunaweb/vega-reactor-js/src/patterns/Component.js","../../node_modules/parvus/dist/js/parvus.esm.js","../../sources/javascripts/front/components/Gallery.js","../../sources/javascripts/gallery.js"],"sourcesContent":["/**\n * Name: Component\n * Description: Base model for all components\n */\n\nexport default class Component {\n static settings = {};\n\n #element;\n #mounted;\n #settings;\n\n #listeners = {};\n\n constructor (element, options = {}) {\n this.#element = element;\n this.#mounted = false;\n this.#settings = {\n ...Component.settings,\n ...options\n };\n }\n\n get element () {\n return this.#element;\n }\n\n get mounted () {\n return this.#mounted;\n }\n\n get settings () {\n return this.#settings;\n }\n\n getNode (parameter) {\n let element = null;\n\n if (parameter instanceof Element) {\n element = parameter;\n } else if (typeof parameter === 'string') {\n const testSelector = this.#element.querySelector(parameter);\n element = testSelector ? testSelector : element;\n }\n\n return element;\n }\n\n fire (type, data) {\n var listeners = this.#listeners[type] || [];\n\n listeners.forEach(function (listener) {\n listener(data);\n });\n }\n\n on (type, handler) {\n if (typeof this.#listeners[type] === 'undefined') {\n this.#listeners[type] = [];\n }\n\n this.#listeners[type].push(handler);\n\n return this;\n }\n\n off (type, handler) {\n var index = this.#listeners[type].indexOf(handler);\n\n if (index > -1) {\n this.#listeners[type].splice(index, 1);\n }\n\n return this;\n }\n\n mount () {\n this.#element.classList.add('is-mounted');\n this.#mounted = true;\n this.fire('mount', this);\n }\n\n unmount () {\n this.#element.classList.remove('is-mounted');\n this.#mounted = false;\n this.fire('unmount', this);\n }\n}\n","/**\n * Parvus\n *\n * @author Benjamin de Oostfrees\n * @version 2.4.0\n * @url https://github.com/deoostfrees/parvus\n *\n * MIT license\n */\n\nvar en = {\n lightboxLabel: 'This is a dialog window that overlays the main content of the page. The modal displays the enlarged image. Pressing the Escape key will close the modal and bring you back to where you were on the page.',\n lightboxLoadingIndicatorLabel: 'Image loading',\n lightboxLoadingError: 'The requested image cannot be loaded.',\n controlsLabel: 'Controls',\n previousButtonLabel: 'Previous image',\n nextButtonLabel: 'Next image',\n closeButtonLabel: 'Close dialog window',\n sliderLabel: 'Images',\n slideLabel: 'Image'\n};\n\n// Default language\nfunction Parvus(userOptions) {\n /**\n * Global variables\n *\n */\n const BROWSER_WINDOW = window;\n const FOCUSABLE_ELEMENTS = ['a:not([inert]):not([tabindex^=\"-\"])', 'button:not([inert]):not([tabindex^=\"-\"]):not(:disabled)', '[tabindex]:not([inert]):not([tabindex^=\"-\"])'];\n const GROUP_ATTRIBUTES = {\n triggerElements: [],\n slider: null,\n sliderElements: [],\n contentElements: []\n };\n const GROUPS = {};\n let groupIdCounter = 0;\n let newGroup = null;\n let activeGroup = null;\n let currentIndex = 0;\n let config = {};\n let lightbox = null;\n let lightboxOverlay = null;\n let lightboxOverlayOpacity = 1;\n let toolbar = null;\n let toolbarLeft = null;\n let toolbarRight = null;\n let controls = null;\n let previousButton = null;\n let nextButton = null;\n let closeButton = null;\n let counter = null;\n let drag = {};\n let isDraggingX = false;\n let isDraggingY = false;\n let pointerDown = false;\n let lastFocus = null;\n let offset = null;\n let offsetTmp = null;\n let resizeTicking = false;\n let transitionDuration = null;\n let isReducedMotion = true;\n\n /**\n * Merge default options with user-provided options\n *\n * @param {Object} userOptions - User-provided options\n * @returns {Object} - Merged options object\n */\n const mergeOptions = userOptions => {\n // Default options\n const DEFAULT_OPTIONS = {\n selector: '.lightbox',\n gallerySelector: null,\n captions: true,\n captionsSelector: 'self',\n captionsAttribute: 'data-caption',\n docClose: true,\n swipeClose: true,\n simulateTouch: true,\n threshold: 50,\n backFocus: true,\n hideScrollbar: true,\n transitionDuration: 300,\n transitionTimingFunction: 'cubic-bezier(0.62, 0.16, 0.13, 1.01)',\n lightboxIndicatorIcon: '',\n previousButtonIcon: '',\n nextButtonIcon: '',\n closeButtonIcon: '',\n l10n: en\n };\n return {\n ...DEFAULT_OPTIONS,\n ...userOptions\n };\n };\n\n /**\n * Check prefers reduced motion\n * https://developer.mozilla.org/en-US/docs/Web/API/MediaQueryList\n *\n */\n const MOTIONQUERY = window.matchMedia('(prefers-reduced-motion)');\n const reducedMotionCheck = () => {\n if (MOTIONQUERY.matches) {\n isReducedMotion = true;\n transitionDuration = 0.1;\n } else {\n isReducedMotion = false;\n transitionDuration = config.transitionDuration;\n }\n };\n\n // Check for any OS level changes to the preference\n MOTIONQUERY.addEventListener('change', reducedMotionCheck);\n\n /**\n * Get scrollbar width\n *\n * @return {Number} - The scrollbar width\n */\n const getScrollbarWidth = () => {\n return BROWSER_WINDOW.innerWidth - document.documentElement.clientWidth;\n };\n\n /**\n * Get the group from element\n *\n * @param {HTMLElement} el - The element to retrieve the group from\n * @return {String} - The group of the element\n */\n const getGroup = el => {\n // Check if the data attribute \"group\" exists or set an alternative value\n const EL_GROUP = el.dataset.group || `default-${groupIdCounter}`;\n ++groupIdCounter;\n\n // Set the \"group\" data attribute if it doesn't exist\n if (!el.hasAttribute('data-group')) {\n el.setAttribute('data-group', EL_GROUP);\n }\n return EL_GROUP;\n };\n\n /**\n * Add zoom indicator to element\n *\n * @param {HTMLElement} el - The element to add the zoom indicator to\n */\n const addZoomIndicator = el => {\n if (el.querySelector('img')) {\n const LIGHTBOX_INDICATOR_ICON = document.createElement('div');\n el.classList.add('parvus-zoom');\n LIGHTBOX_INDICATOR_ICON.className = 'parvus-zoom__indicator';\n LIGHTBOX_INDICATOR_ICON.innerHTML = config.lightboxIndicatorIcon;\n el.appendChild(LIGHTBOX_INDICATOR_ICON);\n }\n };\n\n /**\n * Add an element\n *\n * @param {HTMLElement} el - The element to be added\n */\n const add = el => {\n if (!(el.tagName === 'A' && el.hasAttribute('href') || el.tagName === 'BUTTON' && el.hasAttribute('data-target'))) {\n throw new Error('Use a link with the \\'href\\' attribute or a button with the \\'data-target\\' attribute. Both attributes must have a path to the image file.');\n }\n newGroup = getGroup(el);\n if (!GROUPS[newGroup]) {\n GROUPS[newGroup] = structuredClone(GROUP_ATTRIBUTES);\n }\n if (GROUPS[newGroup].triggerElements.includes(el)) {\n throw new Error('Ups, element already added.');\n }\n GROUPS[newGroup].triggerElements.push(el);\n addZoomIndicator(el);\n el.classList.add('parvus-trigger');\n el.addEventListener('click', triggerParvus);\n if (isOpen() && newGroup === activeGroup) {\n const EL_INDEX = GROUPS[newGroup].triggerElements.indexOf(el);\n createSlide(EL_INDEX);\n createImage(el, EL_INDEX, () => {\n loadImage(EL_INDEX);\n });\n updateAttributes();\n updateSliderNavigationStatus();\n updateCounter();\n }\n };\n\n /**\n * Remove an element\n *\n * @param {HTMLElement} el - The element to be removed\n */\n const remove = el => {\n if (!el || !el.hasAttribute('data-group')) {\n return;\n }\n const EL_GROUP = getGroup(el);\n\n // Check if element exists\n if (!GROUPS[EL_GROUP] || !GROUPS[EL_GROUP].triggerElements.includes(el)) {\n return;\n }\n const EL_INDEX = GROUPS[EL_GROUP].triggerElements.indexOf(el);\n GROUPS[EL_GROUP].triggerElements.splice(EL_INDEX, 1);\n GROUPS[EL_GROUP].sliderElements.splice(EL_INDEX, 1);\n\n // Remove lightbox indicator icon if necessary\n if (el.classList.contains('parvus-zoom')) {\n const LIGHTBOX_INDICATOR_ICON = el.querySelector('.parvus-zoom__indicator');\n el.classList.remove('parvus-zoom');\n el.removeChild(LIGHTBOX_INDICATOR_ICON);\n }\n if (isOpen() && EL_GROUP === activeGroup) {\n updateAttributes();\n updateSliderNavigationStatus();\n updateCounter();\n }\n\n // Unbind click event handler\n el.removeEventListener('click', triggerParvus);\n el.classList.remove('parvus-trigger');\n };\n\n /**\n * Create the lightbox\n *\n */\n const createLightbox = () => {\n // Create the lightbox container\n lightbox = document.createElement('div');\n lightbox.setAttribute('role', 'dialog');\n lightbox.setAttribute('aria-modal', 'true');\n lightbox.setAttribute('aria-hidden', 'true');\n lightbox.setAttribute('tabindex', '-1');\n lightbox.setAttribute('aria-label', config.l10n.lightboxLabel);\n lightbox.classList.add('parvus');\n\n // Create the lightbox overlay container\n lightboxOverlay = document.createElement('div');\n lightboxOverlay.classList.add('parvus__overlay');\n\n // Add the lightbox overlay container to the lightbox container\n lightbox.appendChild(lightboxOverlay);\n\n // Create the toolbar\n toolbar = document.createElement('div');\n toolbar.className = 'parvus__toolbar';\n\n // Create the toolbar items\n toolbarLeft = document.createElement('div');\n toolbarRight = document.createElement('div');\n\n // Create the controls\n controls = document.createElement('div');\n controls.className = 'parvus__controls';\n controls.setAttribute('role', 'group');\n controls.setAttribute('aria-label', config.l10n.controlsLabel);\n\n // Add the controls to the right toolbar item\n toolbarRight.appendChild(controls);\n\n // Create the close button\n closeButton = document.createElement('button');\n closeButton.className = 'parvus__btn parvus__btn--close';\n closeButton.setAttribute('type', 'button');\n closeButton.setAttribute('aria-label', config.l10n.closeButtonLabel);\n closeButton.innerHTML = config.closeButtonIcon;\n\n // Add the close button to the controls\n controls.appendChild(closeButton);\n\n // Create the previous button\n previousButton = document.createElement('button');\n previousButton.className = 'parvus__btn parvus__btn--previous';\n previousButton.setAttribute('type', 'button');\n previousButton.setAttribute('aria-label', config.l10n.previousButtonLabel);\n previousButton.innerHTML = config.previousButtonIcon;\n\n // Add the previous button to the controls\n controls.appendChild(previousButton);\n\n // Create the next button\n nextButton = document.createElement('button');\n nextButton.className = 'parvus__btn parvus__btn--next';\n nextButton.setAttribute('type', 'button');\n nextButton.setAttribute('aria-label', config.l10n.nextButtonLabel);\n nextButton.innerHTML = config.nextButtonIcon;\n\n // Add the next button to the controls\n controls.appendChild(nextButton);\n\n // Create the counter\n counter = document.createElement('div');\n counter.className = 'parvus__counter';\n\n // Add the counter to the left toolbar item\n toolbarLeft.appendChild(counter);\n\n // Add the toolbar items to the toolbar\n toolbar.appendChild(toolbarLeft);\n toolbar.appendChild(toolbarRight);\n\n // Add the toolbar to the lightbox container\n lightbox.appendChild(toolbar);\n\n // Add the lightbox container to the body\n document.body.appendChild(lightbox);\n };\n\n /**\n * Create a slider\n *\n */\n const createSlider = () => {\n const SLIDER = document.createElement('div');\n SLIDER.className = 'parvus__slider';\n\n // Hide the slider\n SLIDER.setAttribute('aria-hidden', 'true');\n\n // Update the slider reference in GROUPS\n GROUPS[activeGroup].slider = SLIDER;\n\n // Add the slider to the lightbox container\n lightbox.appendChild(SLIDER);\n };\n\n /**\n * Get next slide index\n *\n * @param {Number} index\n */\n const getNextSlideIndex = currentIndex => {\n const SLIDE_ELEMENTS = GROUPS[activeGroup].sliderElements;\n const TOTAL_SLIDE_ELEMENTS = SLIDE_ELEMENTS.length;\n for (let i = currentIndex + 1; i < TOTAL_SLIDE_ELEMENTS; i++) {\n if (SLIDE_ELEMENTS[i] !== undefined) {\n return i;\n }\n }\n return -1;\n };\n\n /**\n * Get previous slide index\n *\n * @param {number} index - The current slide index\n * @returns {number} - The index of the previous slide, or -1 if there is no previous slide\n */\n const getPreviousSlideIndex = currentIndex => {\n const SLIDE_ELEMENTS = GROUPS[activeGroup].sliderElements;\n for (let i = currentIndex - 1; i >= 0; i--) {\n if (SLIDE_ELEMENTS[i] !== undefined) {\n return i;\n }\n }\n return -1;\n };\n\n /**\n * Create a slide\n *\n * @param {Number} index - The index of the slide\n */\n const createSlide = index => {\n if (GROUPS[activeGroup].sliderElements[index] !== undefined) {\n return;\n }\n const SLIDER_ELEMENT = document.createElement('div');\n const SLIDER_ELEMENT_CONTENT = document.createElement('div');\n const TRIGGER_ELEMENTS = GROUPS[activeGroup].triggerElements;\n const TOTAL_TRIGGER_ELEMENTS = TRIGGER_ELEMENTS.length;\n SLIDER_ELEMENT.className = 'parvus__slide';\n SLIDER_ELEMENT.style.position = 'absolute';\n SLIDER_ELEMENT.style.left = `${index * 100}%`;\n SLIDER_ELEMENT.setAttribute('aria-hidden', 'true');\n SLIDER_ELEMENT.appendChild(SLIDER_ELEMENT_CONTENT);\n\n // Add extra output for screen reader if there is more than one slide\n if (TOTAL_TRIGGER_ELEMENTS > 1) {\n SLIDER_ELEMENT.setAttribute('role', 'group');\n SLIDER_ELEMENT.setAttribute('aria-label', `${config.l10n.slideLabel} ${index + 1}/${TOTAL_TRIGGER_ELEMENTS}`);\n }\n GROUPS[activeGroup].sliderElements[index] = SLIDER_ELEMENT;\n if (index >= currentIndex) {\n const NEXT_SLIDE_INDEX = getNextSlideIndex(index);\n if (NEXT_SLIDE_INDEX !== -1) {\n GROUPS[activeGroup].sliderElements[NEXT_SLIDE_INDEX].before(SLIDER_ELEMENT);\n } else {\n GROUPS[activeGroup].slider.appendChild(SLIDER_ELEMENT);\n }\n } else {\n const PREVIOUS_SLIDE_INDEX = getPreviousSlideIndex(index);\n if (PREVIOUS_SLIDE_INDEX !== -1) {\n GROUPS[activeGroup].sliderElements[PREVIOUS_SLIDE_INDEX].after(SLIDER_ELEMENT);\n } else {\n GROUPS[activeGroup].slider.prepend(SLIDER_ELEMENT);\n }\n }\n };\n\n /**\n * Open Parvus\n *\n * @param {HTMLElement} el\n */\n const open = el => {\n if (!lightbox || !el || !el.classList.contains('parvus-trigger') || isOpen()) {\n return;\n }\n activeGroup = getGroup(el);\n if (!GROUPS[activeGroup].triggerElements.includes(el)) {\n throw new Error('Ups, I can\\'t find the element.');\n }\n currentIndex = GROUPS[activeGroup].triggerElements.indexOf(el);\n lastFocus = document.activeElement;\n history.pushState({\n parvus: 'close'\n }, 'Image', window.location.href);\n bindEvents();\n const NON_LIGHTBOX_ELEMENTS = document.querySelectorAll('body > *:not([aria-hidden=\"true\"])');\n NON_LIGHTBOX_ELEMENTS.forEach(nonLightboxEl => {\n nonLightboxEl.setAttribute('aria-hidden', 'true');\n nonLightboxEl.classList.add('parvus-hidden');\n });\n if (config.hideScrollbar) {\n document.body.style.marginInlineEnd = `${getScrollbarWidth()}px`;\n document.body.style.overflow = 'hidden';\n }\n lightbox.classList.add('parvus--is-opening');\n lightbox.setAttribute('aria-hidden', 'false');\n createSlider();\n createSlide(currentIndex);\n GROUPS[activeGroup].slider.setAttribute('aria-hidden', 'false');\n updateOffset();\n updateAttributes();\n updateSliderNavigationStatus();\n updateCounter();\n setFocusToFirstItem();\n loadSlide(currentIndex);\n createImage(el, currentIndex, () => {\n loadImage(currentIndex, true);\n lightbox.classList.remove('parvus--is-opening');\n GROUPS[activeGroup].slider.classList.add('parvus__slider--animate');\n });\n preload(currentIndex + 1);\n preload(currentIndex - 1);\n\n // Create and dispatch a new event\n fire('open', {\n source: el\n });\n document.body.classList.add('parvus-is-open');\n };\n\n /**\n * Close Parvus\n *\n */\n const close = () => {\n if (!isOpen()) {\n throw new Error('Ups, I\\'m already closed.');\n }\n const IMAGE = GROUPS[activeGroup].contentElements[currentIndex];\n const THUMBNAIL = GROUPS[activeGroup].triggerElements[currentIndex];\n unbindEvents();\n clearDrag();\n if (history.state?.parvus === 'close') {\n history.back();\n }\n const NON_LIGHTBOX_ELEMENTS = document.querySelectorAll('.parvus-hidden');\n NON_LIGHTBOX_ELEMENTS.forEach(nonLightboxEl => {\n nonLightboxEl.removeAttribute('aria-hidden');\n nonLightboxEl.classList.remove('parvus-hidden');\n });\n lightbox.classList.add('parvus--is-closing');\n requestAnimationFrame(() => {\n const THUMBNAIL_SIZE = THUMBNAIL.getBoundingClientRect();\n if (IMAGE && IMAGE.tagName === 'IMG') {\n const IMAGE_SIZE = IMAGE.getBoundingClientRect();\n const WIDTH_DIFFERENCE = THUMBNAIL_SIZE.width / IMAGE_SIZE.width;\n const HEIGHT_DIFFERENCE = THUMBNAIL_SIZE.height / IMAGE_SIZE.height;\n const X_DIFFERENCE = THUMBNAIL_SIZE.left - IMAGE_SIZE.left;\n const Y_DIFFERENCE = THUMBNAIL_SIZE.top - IMAGE_SIZE.top;\n IMAGE.style.transform = `translate(${X_DIFFERENCE}px, ${Y_DIFFERENCE}px) scale(${WIDTH_DIFFERENCE}, ${HEIGHT_DIFFERENCE})`;\n }\n IMAGE.style.opacity = 0;\n IMAGE.style.transition = `transform ${transitionDuration}ms ${config.transitionTimingFunction}, opacity ${transitionDuration}ms ${config.transitionTimingFunction} ${transitionDuration / 2}ms`;\n });\n const transitionendHandler = () => {\n leaveSlide(currentIndex);\n lastFocus = config.backFocus ? lastFocus : GROUPS[activeGroup].triggerElements[currentIndex];\n lastFocus.focus({\n preventScroll: true\n });\n lightbox.setAttribute('aria-hidden', 'true');\n lightbox.classList.remove('parvus--is-closing');\n lightbox.classList.remove('parvus--is-vertical-closing');\n IMAGE.style.transform = '';\n IMAGE.removeEventListener('transitionend', transitionendHandler);\n GROUPS[activeGroup].slider.remove();\n GROUPS[activeGroup].slider = null;\n GROUPS[activeGroup].sliderElements = [];\n GROUPS[activeGroup].contentElements = [];\n counter.removeAttribute('aria-hidden');\n previousButton.removeAttribute('aria-hidden');\n previousButton.removeAttribute('aria-disabled');\n nextButton.removeAttribute('aria-hidden');\n nextButton.removeAttribute('aria-disabled');\n if (config.hideScrollbar) {\n document.body.style.marginInlineEnd = '';\n document.body.style.overflow = '';\n }\n };\n IMAGE.addEventListener('transitionend', transitionendHandler, {\n once: true\n });\n\n // Create and dispatch a new event\n fire('close', {\n detail: {\n source: GROUPS[activeGroup].triggerElements[currentIndex]\n }\n });\n document.body.classList.remove('parvus-is-open');\n };\n\n /**\n * Preload slide with the specified index\n *\n * @param {Number} index - The index of the slide to be preloaded\n */\n const preload = index => {\n if (index < 0 || index >= GROUPS[activeGroup].triggerElements.length || GROUPS[activeGroup].sliderElements[index] !== undefined) {\n return;\n }\n createSlide(index);\n createImage(GROUPS[activeGroup].triggerElements[index], index, () => {\n loadImage(index);\n });\n };\n\n /**\n * Load slide with the specified index\n *\n * @param {Number} index - The index of the slide to be loaded\n */\n const loadSlide = index => {\n GROUPS[activeGroup].sliderElements[index].setAttribute('aria-hidden', 'false');\n };\n\n /**\n * Add caption to the container element\n *\n * @param {HTMLElement} containerEl - The container element to which the caption will be added\n * @param {HTMLElement} el - The trigger element associated with the caption\n * @param {Number} index - The index of the caption\n */\n const addCaption = (containerEl, el, index) => {\n const CAPTION_CONTAINER = document.createElement('div');\n let captionData = null;\n CAPTION_CONTAINER.className = 'parvus__caption';\n if (config.captionsSelector === 'self') {\n if (el.hasAttribute(config.captionsAttribute) && el.getAttribute(config.captionsAttribute) !== '') {\n captionData = el.getAttribute(config.captionsAttribute);\n }\n } else {\n const CAPTION_SELECTOR = el.querySelector(config.captionsSelector);\n if (CAPTION_SELECTOR !== null) {\n if (CAPTION_SELECTOR.hasAttribute(config.captionsAttribute) && CAPTION_SELECTOR.getAttribute(config.captionsAttribute) !== '') {\n captionData = CAPTION_SELECTOR.getAttribute(config.captionsAttribute);\n } else {\n captionData = CAPTION_SELECTOR.innerHTML;\n }\n }\n }\n if (captionData !== null) {\n const CAPTION_ID = `parvus__caption-${index}`;\n CAPTION_CONTAINER.setAttribute('aria-labelledby', CAPTION_ID);\n CAPTION_CONTAINER.id = CAPTION_ID;\n CAPTION_CONTAINER.innerHTML = `

${captionData}

`;\n containerEl.appendChild(CAPTION_CONTAINER);\n }\n };\n const createImage = (el, index, callback) => {\n const {\n contentElements,\n sliderElements\n } = GROUPS[activeGroup];\n if (contentElements[index] !== undefined) {\n if (callback && typeof callback === 'function') {\n callback();\n }\n return;\n }\n const CONTENT_CONTAINER_EL = sliderElements[index].querySelector('div');\n const IMAGE = new Image();\n const IMAGE_CONTAINER = document.createElement('div');\n const THUMBNAIL = el.querySelector('img');\n const LOADING_INDICATOR = document.createElement('div');\n IMAGE_CONTAINER.className = 'parvus__content';\n\n // Create loading indicator\n LOADING_INDICATOR.className = 'parvus__loader';\n LOADING_INDICATOR.setAttribute('role', 'progressbar');\n LOADING_INDICATOR.setAttribute('aria-label', config.l10n.lightboxLoadingIndicatorLabel);\n\n // Add loading indicator to content container\n CONTENT_CONTAINER_EL.appendChild(LOADING_INDICATOR);\n const checkImagePromise = new Promise((resolve, reject) => {\n IMAGE.onload = () => resolve(IMAGE);\n IMAGE.onerror = error => reject(error);\n });\n checkImagePromise.then(loadedImage => {\n loadedImage.style.opacity = 0;\n IMAGE_CONTAINER.appendChild(loadedImage);\n CONTENT_CONTAINER_EL.appendChild(IMAGE_CONTAINER);\n\n // Add caption if available\n if (config.captions) {\n addCaption(CONTENT_CONTAINER_EL, el, index);\n }\n contentElements[index] = loadedImage;\n\n // Set image width and height\n loadedImage.setAttribute('width', loadedImage.naturalWidth);\n loadedImage.setAttribute('height', loadedImage.naturalHeight);\n\n // Set image dimension\n setImageDimension(sliderElements[index], loadedImage);\n }).catch(() => {\n const ERROR_CONTAINER = document.createElement('div');\n ERROR_CONTAINER.classList.add('parvus__content');\n ERROR_CONTAINER.classList.add('parvus__content--error');\n ERROR_CONTAINER.innerHTML = `${config.l10n.lightboxLoadingError}`;\n CONTENT_CONTAINER_EL.appendChild(ERROR_CONTAINER);\n contentElements[index] = ERROR_CONTAINER;\n }).finally(() => {\n CONTENT_CONTAINER_EL.removeChild(LOADING_INDICATOR);\n if (callback && typeof callback === 'function') {\n callback();\n }\n });\n\n // Add `sizes` attribute\n if (el.hasAttribute('data-sizes') && el.getAttribute('data-sizes') !== '') {\n IMAGE.setAttribute('sizes', el.getAttribute('data-sizes'));\n }\n\n // Add `srcset` attribute\n if (el.hasAttribute('data-srcset') && el.getAttribute('data-srcset') !== '') {\n IMAGE.setAttribute('srcset', el.getAttribute('data-srcset'));\n }\n\n // Add `src` attribute\n if (el.tagName === 'A') {\n IMAGE.setAttribute('src', el.href);\n } else {\n IMAGE.setAttribute('src', el.getAttribute('data-target'));\n }\n\n // `alt` attribute\n if (THUMBNAIL && THUMBNAIL.hasAttribute('alt') && THUMBNAIL.getAttribute('alt') !== '') {\n IMAGE.alt = THUMBNAIL.alt;\n } else if (el.hasAttribute('data-alt') && el.getAttribute('data-alt') !== '') {\n IMAGE.alt = el.getAttribute('data-alt');\n } else {\n IMAGE.alt = '';\n }\n };\n\n /**\n * Load Image\n *\n * @param {Number} index - The index of the image to load\n */\n const loadImage = (index, animate) => {\n const IMAGE = GROUPS[activeGroup].contentElements[index];\n if (IMAGE && IMAGE.tagName === 'IMG') {\n const THUMBNAIL = GROUPS[activeGroup].triggerElements[index];\n if (animate) {\n const IMAGE_SIZE = IMAGE.getBoundingClientRect();\n const THUMBNAIL_SIZE = THUMBNAIL.getBoundingClientRect();\n const WIDTH_DIFFERENCE = THUMBNAIL_SIZE.width / IMAGE_SIZE.width;\n const HEIGHT_DIFFERENCE = THUMBNAIL_SIZE.height / IMAGE_SIZE.height;\n const X_DIFFERENCE = THUMBNAIL_SIZE.left - IMAGE_SIZE.left;\n const Y_DIFFERENCE = THUMBNAIL_SIZE.top - IMAGE_SIZE.top;\n requestAnimationFrame(() => {\n IMAGE.style.transform = `translate(${X_DIFFERENCE}px, ${Y_DIFFERENCE}px) scale(${WIDTH_DIFFERENCE}, ${HEIGHT_DIFFERENCE})`;\n IMAGE.style.transition = 'transform 0s, opacity 0s';\n\n // Animate the difference reversal on the next tick\n requestAnimationFrame(() => {\n IMAGE.style.transform = '';\n IMAGE.style.opacity = 1;\n IMAGE.style.transition = `transform ${transitionDuration}ms ${config.transitionTimingFunction}, opacity ${transitionDuration / 2}ms ${config.transitionTimingFunction}`;\n });\n });\n } else {\n IMAGE.style.opacity = 1;\n }\n } else {\n IMAGE.style.opacity = 1;\n }\n };\n const select = index => {\n const OLD_INDEX = currentIndex;\n if (!isOpen()) {\n throw new Error(\"Oops, I'm closed.\");\n } else {\n if (typeof index !== 'number' || isNaN(index)) {\n throw new Error('Oops, no slide specified.');\n }\n const triggerElements = GROUPS[activeGroup].triggerElements;\n if (index === currentIndex) {\n throw new Error(`Oops, slide ${index} is already selected.`);\n }\n if (index < -1 || index >= triggerElements.length) {\n throw new Error(`Oops, I can't find slide ${index}.`);\n }\n }\n if (GROUPS[activeGroup].sliderElements[index] !== undefined) {\n loadSlide(index);\n } else {\n createSlide(index);\n createImage(GROUPS[activeGroup].triggerElements[index], index, () => {\n loadImage(index);\n });\n loadSlide(index);\n }\n currentIndex = index;\n updateOffset();\n if (index < OLD_INDEX) {\n updateSliderNavigationStatus();\n preload(index - 1);\n } else if (index > OLD_INDEX) {\n updateSliderNavigationStatus();\n preload(index + 1);\n }\n leaveSlide(OLD_INDEX);\n updateCounter();\n\n // Create and dispatch a new event\n fire('select', {\n detail: {\n source: GROUPS[activeGroup].triggerElements[currentIndex]\n }\n });\n };\n\n /**\n * Select the previous slide\n *\n */\n const previous = () => {\n if (currentIndex > 0) {\n select(currentIndex - 1);\n } else {\n const {\n slider\n } = GROUPS[activeGroup];\n const offset = offsetTmp + config.threshold;\n requestAnimationFrame(() => {\n slider.style.transform = `translate3d(${offset}px, 0, 0)`;\n setTimeout(() => {\n updateOffset();\n }, 150);\n });\n }\n };\n\n /**\n * Select the next slide\n *\n */\n const next = () => {\n const {\n slider,\n triggerElements\n } = GROUPS[activeGroup];\n if (currentIndex < triggerElements.length - 1) {\n select(currentIndex + 1);\n } else {\n const offset = offsetTmp - config.threshold;\n requestAnimationFrame(() => {\n slider.style.transform = `translate3d(${offset}px, 0, 0)`;\n setTimeout(() => {\n updateOffset();\n }, 150);\n });\n }\n };\n\n /**\n * Leave slide\n *\n * This function is called after moving the index to a new slide.\n *\n * @param {Number} index - The index of the slide to leave.\n */\n const leaveSlide = index => {\n if (GROUPS[activeGroup].sliderElements[index] !== undefined) {\n GROUPS[activeGroup].sliderElements[index].setAttribute('aria-hidden', 'true');\n }\n };\n\n /**\n * Update offset\n *\n */\n const updateOffset = () => {\n activeGroup = activeGroup !== null ? activeGroup : newGroup;\n offset = -currentIndex * lightbox.offsetWidth;\n GROUPS[activeGroup].slider.style.transform = `translate3d(${offset}px, 0, 0)`;\n offsetTmp = offset;\n };\n\n /**\n * Update slider navigation status\n *\n * This function updates the disabled status of the slider navigation buttons\n * based on the current slide position.\n *\n */\n const updateSliderNavigationStatus = () => {\n const {\n triggerElements\n } = GROUPS[activeGroup];\n const TOTAL_TRIGGER_ELEMENTS = triggerElements.length;\n const FIRST_SLIDE = currentIndex === 0;\n const LAST_SLIDE = currentIndex === TOTAL_TRIGGER_ELEMENTS - 1;\n if (TOTAL_TRIGGER_ELEMENTS > 1) {\n if (FIRST_SLIDE) {\n previousButton.setAttribute('aria-disabled', 'true');\n nextButton.removeAttribute('aria-disabled');\n } else if (LAST_SLIDE) {\n previousButton.removeAttribute('aria-disabled');\n nextButton.setAttribute('aria-disabled', 'true');\n } else {\n previousButton.removeAttribute('aria-disabled');\n nextButton.removeAttribute('aria-disabled');\n }\n }\n };\n\n /**\n * Update counter\n *\n * This function updates the counter display based on the current slide index.\n */\n const updateCounter = () => {\n counter.textContent = `${currentIndex + 1}/${GROUPS[activeGroup].triggerElements.length}`;\n };\n\n /**\n * Clear drag after touchend event\n *\n * This function clears the drag state after the touchend event is triggered.\n */\n const clearDrag = () => {\n drag = {\n startX: 0,\n endX: 0,\n startY: 0,\n endY: 0\n };\n };\n\n /**\n * Recalculate drag/swipe event\n *\n */\n const updateAfterDrag = () => {\n const {\n startX,\n startY,\n endX,\n endY\n } = drag;\n const MOVEMENT_X = endX - startX;\n const MOVEMENT_Y = endY - startY;\n const MOVEMENT_X_DISTANCE = Math.abs(MOVEMENT_X);\n const MOVEMENT_Y_DISTANCE = Math.abs(MOVEMENT_Y);\n const {\n triggerElements\n } = GROUPS[activeGroup];\n const TOTAL_TRIGGER_ELEMENTS = triggerElements.length;\n if (isDraggingX) {\n if (MOVEMENT_X > 2 && MOVEMENT_X_DISTANCE >= config.threshold && currentIndex > 0) {\n previous();\n } else if (MOVEMENT_X < 2 && MOVEMENT_X_DISTANCE >= config.threshold && currentIndex !== TOTAL_TRIGGER_ELEMENTS - 1) {\n next();\n } else {\n updateOffset();\n }\n } else if (isDraggingY) {\n if (MOVEMENT_Y_DISTANCE > 2 && config.swipeClose && MOVEMENT_Y_DISTANCE >= config.threshold) {\n close();\n } else {\n lightbox.classList.remove('parvus--is-vertical-closing');\n updateOffset();\n }\n lightboxOverlay.style.opacity = '';\n } else {\n updateOffset();\n }\n };\n\n /**\n * Update Attributes\n *\n */\n const updateAttributes = () => {\n const TRIGGER_ELEMENTS = GROUPS[activeGroup].triggerElements;\n const TOTAL_TRIGGER_ELEMENTS = TRIGGER_ELEMENTS.length;\n const SLIDER = GROUPS[activeGroup].slider;\n const SLIDER_ELEMENTS = GROUPS[activeGroup].sliderElements;\n const IS_TOUCH = config.simulateTouch || isTouchDevice();\n const IS_DRAGGABLE = SLIDER.classList.contains('parvus__slider--is-draggable');\n\n // Add draggable class if neccesary\n if (IS_TOUCH && config.swipeClose && !IS_DRAGGABLE || IS_TOUCH && TOTAL_TRIGGER_ELEMENTS > 1 && !IS_DRAGGABLE) {\n SLIDER.classList.add('parvus__slider--is-draggable');\n } else {\n SLIDER.classList.remove('parvus__slider--is-draggable');\n }\n\n // Add extra output for screen reader if there is more than one slide\n if (TOTAL_TRIGGER_ELEMENTS > 1) {\n SLIDER.setAttribute('role', 'region');\n SLIDER.setAttribute('aria-roledescription', 'carousel');\n SLIDER.setAttribute('aria-label', config.l10n.sliderLabel);\n SLIDER_ELEMENTS.forEach((sliderElement, index) => {\n sliderElement.setAttribute('role', 'group');\n sliderElement.setAttribute('aria-label', `${config.l10n.slideLabel} ${index + 1}/${TOTAL_TRIGGER_ELEMENTS}`);\n });\n } else {\n SLIDER.removeAttribute('role');\n SLIDER.removeAttribute('aria-roledescription');\n SLIDER.removeAttribute('aria-label');\n SLIDER_ELEMENTS.forEach(sliderElement => {\n sliderElement.removeAttribute('role');\n sliderElement.removeAttribute('aria-label');\n });\n }\n\n // Show or hide buttons\n if (TOTAL_TRIGGER_ELEMENTS === 1) {\n counter.setAttribute('aria-hidden', 'true');\n previousButton.setAttribute('aria-hidden', 'true');\n nextButton.setAttribute('aria-hidden', 'true');\n } else {\n counter.removeAttribute('aria-hidden');\n previousButton.removeAttribute('aria-hidden');\n nextButton.removeAttribute('aria-hidden');\n }\n };\n\n /**\n * Resize event handler\n *\n */\n const resizeHandler = () => {\n if (!resizeTicking) {\n resizeTicking = true;\n BROWSER_WINDOW.requestAnimationFrame(() => {\n GROUPS[activeGroup].sliderElements.forEach((slide, index) => {\n setImageDimension(slide, GROUPS[activeGroup].contentElements[index]);\n });\n updateOffset();\n resizeTicking = false;\n });\n }\n };\n\n /**\n * Set image dimension\n *\n * @param {HTMLElement} slideEl - The slide element\n * @param {HTMLElement} contentEl - The content element\n */\n const setImageDimension = (slideEl, contentEl) => {\n if (contentEl.tagName !== 'IMG') {\n return;\n }\n const COMPUTED_STYLE = getComputedStyle(slideEl);\n const CAPTION_EL = slideEl.querySelector('.parvus__caption');\n const CAPTION_REC = CAPTION_EL ? CAPTION_EL.getBoundingClientRect().height : 0;\n const SRC_HEIGHT = contentEl.getAttribute('height');\n const SRC_WIDTH = contentEl.getAttribute('width');\n let maxHeight = slideEl.offsetHeight;\n let maxWidth = slideEl.offsetWidth;\n maxHeight -= parseFloat(COMPUTED_STYLE.paddingTop) + parseFloat(COMPUTED_STYLE.paddingBottom) + parseFloat(CAPTION_REC);\n maxWidth -= parseFloat(COMPUTED_STYLE.paddingLeft) + parseFloat(COMPUTED_STYLE.paddingRight);\n const RATIO = Math.min(maxWidth / SRC_WIDTH || 0, maxHeight / SRC_HEIGHT);\n const NEW_WIDTH = SRC_WIDTH * RATIO || 0;\n const NEW_HEIGHT = SRC_HEIGHT * RATIO || 0;\n if (SRC_HEIGHT > NEW_HEIGHT && SRC_HEIGHT < maxHeight && SRC_WIDTH > NEW_WIDTH && SRC_WIDTH < maxWidth || SRC_HEIGHT < NEW_HEIGHT && SRC_HEIGHT < maxHeight && SRC_WIDTH < NEW_WIDTH && SRC_WIDTH < maxWidth) {\n contentEl.style.width = '';\n contentEl.style.height = '';\n } else {\n contentEl.style.width = `${NEW_WIDTH}px`;\n contentEl.style.height = `${NEW_HEIGHT}px`;\n }\n };\n\n /**\n * Click event handler to trigger Parvus\n *\n * @param {Event} event - The click event object\n */\n const triggerParvus = function triggerParvus(event) {\n event.preventDefault();\n open(this);\n };\n\n /**\n * Event handler for click events\n *\n * @param {Event} event - The click event object\n */\n const clickHandler = event => {\n const {\n target\n } = event;\n if (target === previousButton) {\n previous();\n } else if (target === nextButton) {\n next();\n } else if (target === closeButton || config.docClose && !isDraggingY && !isDraggingX && target.classList.contains('parvus__slide')) {\n close();\n }\n event.stopPropagation();\n };\n\n /**\n * Get the focusable children of the given element\n *\n * @return {Array} - An array of focusable children\n */\n const getFocusableChildren = () => {\n return Array.from(lightbox.querySelectorAll(FOCUSABLE_ELEMENTS.join(', '))).filter(child => child.offsetParent !== null);\n };\n\n /**\n * Set focus to the first item in the list\n *\n */\n const setFocusToFirstItem = () => {\n const FOCUSABLE_CHILDREN = getFocusableChildren();\n FOCUSABLE_CHILDREN[0].focus();\n };\n\n /**\n * Event handler for the keydown event\n *\n * @param {Event} event - The keydown event object\n */\n const keydownHandler = event => {\n const FOCUSABLE_CHILDREN = getFocusableChildren();\n const FOCUSED_ITEM_INDEX = FOCUSABLE_CHILDREN.indexOf(document.activeElement);\n const lastIndex = FOCUSABLE_CHILDREN.length - 1;\n switch (event.code) {\n case 'Tab':\n {\n // Use the TAB key to navigate backwards and forwards\n if (event.shiftKey) {\n // Navigate backwards\n if (FOCUSED_ITEM_INDEX === 0) {\n FOCUSABLE_CHILDREN[lastIndex].focus();\n event.preventDefault();\n }\n } else {\n // Navigate forwards\n if (FOCUSED_ITEM_INDEX === lastIndex) {\n FOCUSABLE_CHILDREN[0].focus();\n event.preventDefault();\n }\n }\n break;\n }\n case 'Escape':\n {\n // Close Parvus when the ESC key is pressed\n close();\n event.preventDefault();\n break;\n }\n case 'ArrowLeft':\n {\n // Show the previous slide when the PREV key is pressed\n previous();\n event.preventDefault();\n break;\n }\n case 'ArrowRight':\n {\n // Show the next slide when the NEXT key is pressed\n next();\n event.preventDefault();\n break;\n }\n }\n };\n\n /**\n * Event handler for the mousedown event.\n *\n * This function is called when the mouse button is pressed down.\n * It handles the necessary actions and logic related to the mousedown event.\n *\n * @param {Event} event - The mousedown event object\n */\n const mousedownHandler = event => {\n isDraggingX = false;\n isDraggingY = false;\n pointerDown = true;\n const {\n pageX,\n pageY\n } = event;\n drag.startX = pageX;\n drag.startY = pageY;\n const {\n slider\n } = GROUPS[activeGroup];\n slider.classList.add('parvus__slider--is-dragging');\n slider.style.willChange = 'transform';\n event.stopPropagation();\n lightboxOverlayOpacity = getComputedStyle(lightboxOverlay).opacity;\n };\n\n /**\n * Event handler for the mousemove event.\n *\n * This function is called when the mouse is moved.\n * It handles the necessary actions and logic related to the mousemove event.\n *\n * @param {Event} event - The mousemove event object\n */\n const mousemoveHandler = event => {\n if (pointerDown) {\n const {\n pageX,\n pageY\n } = event;\n drag.endX = pageX;\n drag.endY = pageY;\n doSwipe();\n }\n event.preventDefault();\n };\n\n /**\n * Event handler for the mouseup event.\n *\n * This function is called when a mouse button is released.\n * It handles the necessary actions and logic related to the mouseup event.\n */\n const mouseupHandler = () => {\n pointerDown = false;\n const {\n slider\n } = GROUPS[activeGroup];\n slider.classList.remove('parvus__slider--is-dragging');\n slider.style.willChange = '';\n if (drag.endX || drag.endY) {\n updateAfterDrag();\n }\n clearDrag();\n };\n\n /**\n * Event handler for the touchstart event.\n *\n * This function is called when a touch interaction begins.\n * It handles the necessary actions and logic related to the touchstart event.\n *\n * @param {Event} event - The touchstart event object\n */\n const touchstartHandler = event => {\n isDraggingX = false;\n isDraggingY = false;\n const {\n clientX,\n clientY\n } = event.changedTouches[0];\n drag.startX = parseInt(clientX);\n drag.startY = parseInt(clientY);\n const {\n slider\n } = GROUPS[activeGroup];\n slider.classList.add('parvus__slider--is-dragging');\n slider.style.willChange = 'transform';\n lightboxOverlayOpacity = getComputedStyle(lightboxOverlay).getPropertyValue('opacity');\n event.stopPropagation();\n };\n\n /**\n * Event handler for the touchmove event.\n *\n * This function is called when the touch position changes during a touch interaction.\n * It handles the necessary actions and logic related to the touchmove event.\n *\n * @param {Event} event - The touchmove event object\n */\n const touchmoveHandler = event => {\n const {\n clientX,\n clientY\n } = event.changedTouches[0];\n drag.endX = parseInt(clientX);\n drag.endY = parseInt(clientY);\n doSwipe();\n event.preventDefault();\n };\n\n /**\n * Event handler for the touchend event.\n *\n * This function is called when the touch interaction ends. It handles the necessary\n * actions and logic related to the touchend event.\n */\n const touchendHandler = () => {\n const {\n slider\n } = GROUPS[activeGroup];\n slider.classList.remove('parvus__slider--is-dragging');\n slider.style.willChange = '';\n if (drag.endX || drag.endY) {\n updateAfterDrag();\n }\n clearDrag();\n };\n\n /**\n * Determine the swipe direction (horizontal or vertical).\n *\n * This function analyzes the swipe gesture and decides whether it is a horizontal\n * or vertical swipe based on the direction and angle of the swipe.\n */\n const doSwipe = () => {\n const {\n startX,\n endX,\n startY,\n endY\n } = drag;\n const MOVEMENT_X = startX - endX;\n const MOVEMENT_Y = endY - startY;\n const MOVEMENT_Y_DISTANCE = Math.abs(MOVEMENT_Y);\n if (Math.abs(MOVEMENT_X) > 2 && !isDraggingY && GROUPS[activeGroup].triggerElements.length > 1) {\n // Horizontal swipe\n GROUPS[activeGroup].slider.style.transform = `translate3d(${offsetTmp - Math.round(MOVEMENT_X)}px, 0, 0)`;\n isDraggingX = true;\n isDraggingY = false;\n } else if (Math.abs(MOVEMENT_Y) > 2 && !isDraggingX && config.swipeClose) {\n // Vertical swipe\n if (!isReducedMotion && MOVEMENT_Y_DISTANCE <= 100) {\n lightboxOverlay.style.opacity = lightboxOverlayOpacity - MOVEMENT_Y_DISTANCE / 100;\n }\n lightbox.classList.add('parvus--is-vertical-closing');\n GROUPS[activeGroup].slider.style.transform = `translate3d(${offsetTmp}px, ${Math.round(MOVEMENT_Y)}px, 0)`;\n isDraggingX = false;\n isDraggingY = true;\n }\n };\n\n /**\n * Bind specified events\n *\n */\n const bindEvents = () => {\n BROWSER_WINDOW.addEventListener('keydown', keydownHandler);\n BROWSER_WINDOW.addEventListener('resize', resizeHandler);\n\n // Popstate event\n BROWSER_WINDOW.addEventListener('popstate', close);\n\n // Click event\n lightbox.addEventListener('click', clickHandler);\n\n // Touch events\n if (isTouchDevice()) {\n lightbox.addEventListener('touchstart', touchstartHandler);\n lightbox.addEventListener('touchmove', touchmoveHandler);\n lightbox.addEventListener('touchend', touchendHandler);\n }\n\n // Mouse events\n if (config.simulateTouch) {\n lightbox.addEventListener('mousedown', mousedownHandler);\n lightbox.addEventListener('mouseup', mouseupHandler);\n lightbox.addEventListener('mousemove', mousemoveHandler);\n }\n };\n\n /**\n * Unbind specified events\n *\n */\n const unbindEvents = () => {\n BROWSER_WINDOW.removeEventListener('keydown', keydownHandler);\n BROWSER_WINDOW.removeEventListener('resize', resizeHandler);\n\n // Popstate event\n BROWSER_WINDOW.removeEventListener('popstate', close);\n\n // Click event\n lightbox.removeEventListener('click', clickHandler);\n\n // Touch events\n if (isTouchDevice()) {\n lightbox.removeEventListener('touchstart', touchstartHandler);\n lightbox.removeEventListener('touchmove', touchmoveHandler);\n lightbox.removeEventListener('touchend', touchendHandler);\n }\n\n // Mouse events\n if (config.simulateTouch) {\n lightbox.removeEventListener('mousedown', mousedownHandler);\n lightbox.removeEventListener('mouseup', mouseupHandler);\n lightbox.removeEventListener('mousemove', mousemoveHandler);\n }\n };\n\n /**\n * Destroy Parvus\n *\n */\n const destroy = () => {\n if (!lightbox) {\n return;\n }\n if (isOpen()) {\n close();\n }\n lightbox.remove();\n const LIGHTBOX_TRIGGER_ELS = document.querySelectorAll('.parvus-trigger');\n LIGHTBOX_TRIGGER_ELS.forEach(remove);\n\n // Create and dispatch a new event\n fire('destroy');\n };\n\n /**\n * Check if Parvus is open\n *\n * @returns {boolean} - True if Parvus is open, otherwise false\n */\n const isOpen = () => {\n return lightbox.getAttribute('aria-hidden') === 'false';\n };\n\n /**\n * Check if the device supports touch events\n *\n * @returns {boolean} - True if the device is touch capable, otherwise false\n */\n const isTouchDevice = () => {\n return 'ontouchstart' in window;\n };\n\n /**\n * Get the current index\n *\n * @returns {number} - The current index\n */\n const getCurrentIndex = () => {\n return currentIndex;\n };\n\n /**\n * Dispatch a custom event\n *\n * @param {String} type - The type of the event to dispatch\n * @param {Function} event - The event object\n */\n const fire = function (type) {\n let event = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const CUSTOM_EVENT = new CustomEvent(type, {\n detail: event,\n cancelable: true\n });\n lightbox.dispatchEvent(CUSTOM_EVENT);\n };\n\n /**\n * Bind a specific event listener\n *\n * @param {String} eventName - The name of the event to Bind\n * @param {Function} callback - The callback function\n */\n const on = (eventName, callback) => {\n if (lightbox) {\n lightbox.addEventListener(eventName, callback);\n }\n };\n\n /**\n * Unbind a specific event listener\n *\n * @param {String} eventName - The name of the event to unbind\n * @param {Function} callback - The callback function\n */\n const off = (eventName, callback) => {\n if (lightbox) {\n lightbox.removeEventListener(eventName, callback);\n }\n };\n\n /**\n * Init\n *\n */\n const init = () => {\n // Merge user options into defaults\n config = mergeOptions(userOptions);\n\n // Check if a lightbox element is present\n if (!document.querySelectorAll(config.selector).length) {\n return; // No elements for the lightbox available\n }\n\n reducedMotionCheck();\n\n // Check if the lightbox already exists\n if (!lightbox) {\n createLightbox();\n }\n if (config.gallerySelector !== null) {\n // Get a list of all `gallerySelector` elements within the document\n const GALLERY_ELS = document.querySelectorAll(config.gallerySelector);\n\n // Execute a few things once per element\n GALLERY_ELS.forEach((galleryEl, index) => {\n const GALLERY_INDEX = index;\n // Get a list of all `selector` elements within the `gallerySelector`\n const LIGHTBOX_TRIGGER_GALLERY_ELS = galleryEl.querySelectorAll(config.selector);\n\n // Execute a few things once per element\n LIGHTBOX_TRIGGER_GALLERY_ELS.forEach(lightboxTriggerEl => {\n lightboxTriggerEl.setAttribute('data-group', `parvus-gallery-${GALLERY_INDEX}`);\n add(lightboxTriggerEl);\n });\n });\n }\n\n // Get a list of all `selector` elements outside or without the `gallerySelector`\n const LIGHTBOX_TRIGGER_ELS = document.querySelectorAll(`${config.selector}:not(.parvus-trigger)`);\n LIGHTBOX_TRIGGER_ELS.forEach(add);\n };\n init();\n return {\n init,\n open,\n close,\n select,\n previous,\n next,\n currentIndex: getCurrentIndex,\n add,\n remove,\n destroy,\n isOpen,\n on,\n off\n };\n}\n\nexport { Parvus as default };\n","/**\n * Name: Gallery\n */\n\nimport Component from \"@lunaweb/vega-reactor-js/src/patterns/Component\";\nimport Parvus from \"parvus\";\n\nexport default class Gallery extends Component {\n\n static settings = {};\n\n #control;\n #items = [];\n #gallery;\n\n #handleControlClick\n\n constructor (element, options = {}) {\n super(element, {\n ...Gallery.settings,\n ...options\n });\n\n this.#control = this.element.querySelector('.js-gallery-control');\n this.#items = this.element.querySelectorAll('.js-gallery-item');\n\n this.#handleControlClick = this._handleControlClick.bind(this);\n }\n\n _handleControlClick (e) {\n this.#gallery.open(this.#items[0]);\n }\n\n mount () {\n this.#items.forEach((item) => {\n const image = item.querySelector('.js-gallery-image');\n if (image) {\n item.dataset.srcset = image.getAttribute('srcset');\n item.dataset.sizes = image.getAttribute('sizes');\n }\n });\n\n this.#gallery = new Parvus({\n l10n: {\n lightboxLabel: \"Ceci est une boîte de dialogue qui se superpose au contenu de la page. Elle affiche des images en plein écran. Appuyer sur la touche d'échappement pour fermer cette boîte de dialogue et poursuivre votre navigation.\",\n lightboxLoadingIndicatorLabel: \"Indicateur de chargement\",\n lightboxLoadingError: \"Cette image n'a pas pu être chargée.\",\n controlsLabel: \"Contrôles\",\n previousButtonLabel: \"Image précédente\",\n nextButtonLabel: \"Image suivante\",\n closeButtonLabel: \"Fermer la boîte de dialogue\",\n sliderLabel: \"Images\",\n slideLabel: \"Image\",\n },\n selector: '.js-gallery-item',\n previousButtonIcon: '',\n nextButtonIcon: '',\n closeButtonIcon: '',\n captionsAttribute: 'data-caption'\n });\n\n this.#control.addEventListener('click', this.#handleControlClick);\n super.mount();\n }\n\n unmount () {\n this.#gallery.destroy();\n this.#gallery = null;\n\n this.#items.forEach((item) => {\n item.removeAttribute('data-srcset');\n item.removeAttribute('data-sizes');\n });\n\n this.#control.removeEventListener('click', this.#handleControlClick);\n super.unmount();\n }\n}\n","import Gallery from './front/components/Gallery';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const galleryElements = document.querySelectorAll('.js-gallery');\n galleryElements.forEach((galleryElement) => {\n const gallery = new Gallery(galleryElement);\n gallery.mount();\n });\n});\n"],"names":["Component","static","element","mounted","settings","listeners","constructor","options","this","getNode","parameter","Element","testSelector","querySelector","fire","type","data","forEach","listener","on","handler","push","off","index","indexOf","splice","mount","classList","add","unmount","remove","en","lightboxLabel","lightboxLoadingIndicatorLabel","lightboxLoadingError","controlsLabel","previousButtonLabel","nextButtonLabel","closeButtonLabel","sliderLabel","slideLabel","Parvus","userOptions","BROWSER_WINDOW","window","FOCUSABLE_ELEMENTS","GROUP_ATTRIBUTES","triggerElements","slider","sliderElements","contentElements","GROUPS","groupIdCounter","newGroup","activeGroup","currentIndex","config","lightbox","lightboxOverlay","lightboxOverlayOpacity","toolbar","toolbarLeft","toolbarRight","controls","previousButton","nextButton","closeButton","counter","drag","isDraggingX","isDraggingY","pointerDown","lastFocus","offset","offsetTmp","resizeTicking","transitionDuration","isReducedMotion","MOTIONQUERY","matchMedia","reducedMotionCheck","matches","addEventListener","getGroup","el","EL_GROUP","dataset","group","hasAttribute","setAttribute","tagName","Error","structuredClone","includes","LIGHTBOX_INDICATOR_ICON","document","createElement","className","innerHTML","lightboxIndicatorIcon","appendChild","addZoomIndicator","triggerParvus","isOpen","EL_INDEX","createSlide","createImage","loadImage","updateAttributes","updateSliderNavigationStatus","updateCounter","contains","removeChild","removeEventListener","undefined","SLIDER_ELEMENT","SLIDER_ELEMENT_CONTENT","TOTAL_TRIGGER_ELEMENTS","length","style","position","left","l10n","NEXT_SLIDE_INDEX","SLIDE_ELEMENTS","TOTAL_SLIDE_ELEMENTS","i","getNextSlideIndex","before","PREVIOUS_SLIDE_INDEX","getPreviousSlideIndex","after","prepend","open","activeElement","history","pushState","parvus","location","href","bindEvents","querySelectorAll","nonLightboxEl","hideScrollbar","body","marginInlineEnd","innerWidth","documentElement","clientWidth","overflow","SLIDER","createSlider","updateOffset","setFocusToFirstItem","loadSlide","preload","source","close","IMAGE","THUMBNAIL","unbindEvents","clearDrag","state","back","removeAttribute","requestAnimationFrame","THUMBNAIL_SIZE","getBoundingClientRect","IMAGE_SIZE","WIDTH_DIFFERENCE","width","HEIGHT_DIFFERENCE","height","X_DIFFERENCE","Y_DIFFERENCE","top","transform","opacity","transition","transitionTimingFunction","transitionendHandler","leaveSlide","backFocus","focus","preventScroll","once","detail","callback","CONTENT_CONTAINER_EL","Image","IMAGE_CONTAINER","LOADING_INDICATOR","Promise","resolve","reject","onload","onerror","error","then","loadedImage","captions","containerEl","CAPTION_CONTAINER","captionData","captionsSelector","captionsAttribute","getAttribute","CAPTION_SELECTOR","CAPTION_ID","id","addCaption","naturalWidth","naturalHeight","setImageDimension","catch","ERROR_CONTAINER","finally","alt","animate","select","OLD_INDEX","isNaN","previous","threshold","setTimeout","next","offsetWidth","LAST_SLIDE","textContent","startX","endX","startY","endY","updateAfterDrag","MOVEMENT_X","MOVEMENT_Y","MOVEMENT_X_DISTANCE","Math","abs","MOVEMENT_Y_DISTANCE","swipeClose","SLIDER_ELEMENTS","IS_TOUCH","simulateTouch","isTouchDevice","IS_DRAGGABLE","sliderElement","resizeHandler","slide","slideEl","contentEl","COMPUTED_STYLE","getComputedStyle","CAPTION_EL","CAPTION_REC","SRC_HEIGHT","SRC_WIDTH","maxHeight","offsetHeight","maxWidth","parseFloat","paddingTop","paddingBottom","paddingLeft","paddingRight","RATIO","min","NEW_WIDTH","NEW_HEIGHT","event","preventDefault","clickHandler","target","docClose","stopPropagation","getFocusableChildren","Array","from","join","filter","child","offsetParent","keydownHandler","FOCUSABLE_CHILDREN","FOCUSED_ITEM_INDEX","lastIndex","code","shiftKey","mousedownHandler","pageX","pageY","willChange","mousemoveHandler","doSwipe","mouseupHandler","touchstartHandler","clientX","clientY","changedTouches","parseInt","getPropertyValue","touchmoveHandler","touchendHandler","round","arguments","CUSTOM_EVENT","CustomEvent","cancelable","dispatchEvent","init","selector","gallerySelector","previousButtonIcon","nextButtonIcon","closeButtonIcon","mergeOptions","galleryEl","GALLERY_INDEX","lightboxTriggerEl","destroy","eventName","Gallery","super","_classPrivateFieldInitSpec","_control","writable","value","_items","_gallery","_handleControlClick","_classPrivateFieldSet","bind","e","_classPrivateFieldGet","item","image","srcset","sizes","galleryElement"],"mappings":"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"}