{"version":3,"file":"pdp-v2.js","names":["__assign","lGEvents","#swatchBasketTrigger","#openSwatchBasketOverlay","#renderSwatchCount","#renderSwatch","#MAX_SWATCHES","#renderEmptySwatch","#removeAndRender","#updateOrderSwatchesButton","#syncBrochureCheckboxes","#swatchCounters","#renderSwatchBasket","#initSwatchPanel","lgZoom","init","init","init","init","init","init","init","init","lgZoom"],"sources":["../resources/javascript/pdp/configurator/cylindo-zoom-controls.js","../resources/javascript/pdp/configurator/short-desktop-viewport.js","../resources/javascript/pdp/configurator/config-slider.js","../resources/javascript/pdp/dimensions.js","../node_modules/lightgallery/lightgallery.es5.js","../node_modules/lightgallery/plugins/zoom/lg-zoom.es5.js","../resources/javascript/swatch/SwatchBasket.js","../resources/javascript/swatch/NabASwatch.js","../resources/javascript/pdp/gallery.js","../resources/javascript/pdp/cylindo.js","../node_modules/photoswipe/dist/photoswipe-lightbox.esm.js","../resources/javascript/pdp/photoswipe-gallery.js","../resources/javascript/pdp/configurator/popover.js","../resources/javascript/pdp/configurator/confirm-gate.js","../resources/javascript/pdp/configurator/goto-configurator.js","../resources/javascript/pdp/configurator/upsell.js","../resources/javascript/pdp/configurator/mattress-variant.js","../resources/javascript/swatch/initSwatchButton.js","../resources/javascript/pdp/configurator/configurator-state.js","../resources/javascript/pdp/configurator/configuration-bar.js","../resources/javascript/pdp/configurator/dynamic-config-bar.js","../resources/javascript/pdp/lp-qty-chooser.js","../resources/javascript/pdp/quick-add-overlay.js","../resources/javascript/pdp/v2-tracking.mjs","../resources/javascript/pdp/deferred-variant-content.js","../resources/javascript/pdp/product-grid-video.js","../resources/javascript/pdp/bump-light-gallery.js","../resources/javascript/pdp/inline-shack-search.js","../resources/javascript/pdp-v2.js"],"sourcesContent":["const zoomInSelector = '[data-hero-zoom-in]';\nconst zoomOutSelector = '[data-hero-zoom-out]';\nconst zoomActionsSelector = '[data-hero-zoom-actions]';\nconst viewerSelector = '[data-360-viewer]';\nconst defaultZoomLevel = 1;\nconst intermediateZoomLevel = '50%';\nconst maximumZoomLevel = '100%';\nconst zoomAnimationDuration = 320;\nconst zoomLayoutFadeDuration = 160;\nconst zoomLayoutExpandedAttribute = 'data-cylindo-zoom-expanded';\nconst zoomLayoutFadingAttribute = 'data-cylindo-zoom-fading';\n\n/**\n * Parses Cylindo zoom values which may be exposed as numbers or\n * percentage-like strings.\n *\n * @param {number|string|undefined|null} zoom\n * @returns {number}\n */\nconst parseZoomLevel = zoom => Number.parseFloat(zoom);\n\n/**\n * Keeps intermediate zoom values in the same shape as the target.\n *\n * @param {number} zoom\n * @param {'number'|'percentage'} format\n * @returns {number|string}\n */\nconst formatZoomLevel = (zoom, format) =>\n    format === 'percentage' ? `${zoom}%` : zoom;\n\n/**\n * Checks whether a zoom value is expressed as a percentage string.\n *\n * @param {number|string} zoom\n * @returns {boolean}\n */\nconst isPercentageZoom = zoom => typeof zoom === 'string' && zoom.includes('%');\n\n/**\n * Percentage zoom values and numeric Cylindo zoom values use different scales.\n *\n * @param {number|string} zoom\n * @returns {'number'|'percentage'}\n */\nconst getZoomFormat = zoom =>\n    isPercentageZoom(zoom) ? 'percentage' : 'number';\n\n/**\n * Smoothstep easing gives a gentle start and finish without overshooting.\n *\n * @param {number} progress\n * @returns {number}\n */\nconst easeZoomProgress = progress => progress * progress * (3 - 2 * progress);\n\n/**\n * Reads the Cylindo zoom level from an event, falling back to the viewer state.\n *\n * @param {CustomEvent|Event} event\n * @param {HTMLElement} viewer\n * @returns {number}\n */\nconst getEventZoom = (event, viewer) => {\n    const eventZoom = parseZoomLevel(event.detail?.zoom ?? event.detail);\n    const viewerZoom = parseZoomLevel(viewer.zoom);\n\n    if (Number.isFinite(eventZoom)) {\n        return eventZoom;\n    }\n\n    return Number.isFinite(viewerZoom) ? viewerZoom : defaultZoomLevel;\n};\n\n/**\n * Reads the active Cylindo item from an event, falling back to the viewer state.\n *\n * @param {CustomEvent|Event} event\n * @param {HTMLElement} viewer\n * @returns {object|null}\n */\nconst getEventItem = (event, viewer) =>\n    event.detail?.item ?? viewer.item ?? null;\n\n/**\n * Wires custom hero zoom controls to Cylindo's programmatic zoom API.\n */\nexport default class CylindoZoomControls {\n    /**\n     * @param {HTMLElement} root\n     */\n    constructor(root) {\n        this.root = root;\n        this.viewer = root.querySelector(viewerSelector);\n        this.actions = root.querySelector(zoomActionsSelector);\n        this.zoomInButton = root.querySelector(zoomInSelector);\n        this.zoomOutButton = root.querySelector(zoomOutSelector);\n        this.abortController = new AbortController();\n        this.isZoomable = true;\n        this.isViewerReady = false;\n        this.currentZoom = defaultZoomLevel;\n        this.currentZoomFormat = 'number';\n        this.requestedZoom = defaultZoomLevel;\n        this.zoomAnimationFrame = null;\n        this.zoomLayoutTransitionTimeout = null;\n        this.isZoomLayoutTransitioning = false;\n\n        this.init();\n    }\n\n    /**\n     * Finds the required DOM nodes and binds Cylindo zoom lifecycle listeners.\n     *\n     * @returns {void}\n     */\n    init() {\n        if (\n            !this.viewer ||\n            !this.actions ||\n            !this.zoomInButton ||\n            !this.zoomOutButton\n        ) {\n            return;\n        }\n\n        const { signal } = this.abortController;\n        this.setButtonsDisabled(true);\n\n        this.zoomInButton.addEventListener('click', this.handleZoomIn, {\n            signal,\n        });\n        this.zoomOutButton.addEventListener('click', this.handleZoomOut, {\n            signal,\n        });\n        this.viewer.addEventListener('zoom-change', this.handleZoomChange, {\n            signal,\n        });\n        this.viewer.addEventListener('item-change', this.handleItemChange, {\n            signal,\n        });\n\n        this.updateZoomState(\n            parseZoomLevel(this.viewer.zoom ?? this.currentZoom)\n        );\n        this.updateZoomAvailability(this.viewer.item ?? null);\n\n        customElements.whenDefined('cylindo-viewer').then(() => {\n            if (signal.aborted) {\n                return;\n            }\n\n            this.isViewerReady = true;\n            this.updateZoomState(\n                parseZoomLevel(this.viewer.zoom ?? this.currentZoom)\n            );\n            this.updateZoomAvailability(this.viewer.item ?? null);\n        });\n    }\n\n    handleZoomIn = () => {\n        if (\n            !this.isViewerReady ||\n            !this.isZoomable ||\n            this.isZoomLayoutTransitioning\n        ) {\n            return;\n        }\n\n        const zoomTarget =\n            parseZoomLevel(this.requestedZoom) > defaultZoomLevel\n                ? maximumZoomLevel\n                : intermediateZoomLevel;\n\n        this.transitionZoomLayout(true, () => this.animateZoomTo(zoomTarget));\n    };\n\n    handleZoomOut = () => {\n        if (!this.isViewerReady || this.isZoomLayoutTransitioning) {\n            return;\n        }\n\n        this.animateZoomTo(defaultZoomLevel, {\n            onComplete: () => {\n                if (typeof this.viewer.zoomStop === 'function') {\n                    this.viewer.zoomStop();\n                } else {\n                    this.viewer.zoom = defaultZoomLevel;\n                }\n\n                this.transitionZoomLayout(false);\n            },\n        });\n    };\n\n    handleZoomChange = event => {\n        this.updateZoomState(getEventZoom(event, this.viewer));\n    };\n\n    handleItemChange = event => {\n        this.updateZoomAvailability(getEventItem(event, this.viewer));\n    };\n\n    /**\n     * Stores the current Cylindo zoom level and toggles the zoom-out button.\n     *\n     * @param {number} zoom\n     * @returns {void}\n     */\n    updateZoomState(zoom) {\n        const requestedZoom = parseZoomLevel(this.requestedZoom);\n        const fallbackZoom = Number.isFinite(requestedZoom)\n            ? requestedZoom\n            : defaultZoomLevel;\n        const isZoomed =\n            (Number.isFinite(zoom) && zoom > defaultZoomLevel) ||\n            fallbackZoom > defaultZoomLevel;\n        this.currentZoom =\n            Number.isFinite(zoom) && zoom > defaultZoomLevel\n                ? zoom\n                : fallbackZoom;\n\n        this.zoomOutButton.toggleAttribute('hidden', !isZoomed);\n    }\n\n    /**\n     * Fades the viewer while swapping between padded and full-height layouts.\n     *\n     * @param {boolean} isExpanded\n     * @param {Function|null} onLayoutChanged\n     * @returns {void}\n     */\n    transitionZoomLayout(isExpanded, onLayoutChanged = null) {\n        if (\n            this.root.hasAttribute(zoomLayoutExpandedAttribute) === isExpanded\n        ) {\n            onLayoutChanged?.();\n            return;\n        }\n\n        this.clearZoomLayoutTransition();\n        this.isZoomLayoutTransitioning = true;\n        this.setButtonsDisabled(true);\n        this.root.toggleAttribute(zoomLayoutFadingAttribute, true);\n\n        this.zoomLayoutTransitionTimeout = window.setTimeout(() => {\n            this.zoomLayoutTransitionTimeout = null;\n\n            if (this.abortController.signal.aborted) {\n                return;\n            }\n\n            this.root.toggleAttribute(zoomLayoutExpandedAttribute, isExpanded);\n\n            window.requestAnimationFrame(() => {\n                if (this.abortController.signal.aborted) {\n                    return;\n                }\n\n                onLayoutChanged?.();\n                this.root.toggleAttribute(zoomLayoutFadingAttribute, false);\n                this.isZoomLayoutTransitioning = false;\n                this.setButtonsDisabled(\n                    !this.isViewerReady || !this.isZoomable\n                );\n            });\n        }, zoomLayoutFadeDuration);\n    }\n\n    /**\n     * Animates the known-working public Cylindo zoom property.\n     *\n     * @param {number|string} targetZoom\n     * @param {{onComplete?: Function}} options\n     * @returns {void}\n     */\n    animateZoomTo(targetZoom, { onComplete = null } = {}) {\n        this.cancelZoomAnimation();\n\n        if (typeof window.requestAnimationFrame !== 'function') {\n            this.viewer.zoom = targetZoom;\n            onComplete?.();\n            return;\n        }\n\n        const targetFormat =\n            targetZoom === defaultZoomLevel &&\n            getZoomFormat(this.requestedZoom) === 'percentage'\n                ? 'percentage'\n                : getZoomFormat(targetZoom);\n        const requestedZoom = parseZoomLevel(this.requestedZoom);\n        const viewerZoom = parseZoomLevel(this.viewer.zoom);\n        const canUseViewerZoom =\n            Number.isFinite(viewerZoom) &&\n            targetFormat === getZoomFormat(this.viewer.zoom);\n        const fromZoom = canUseViewerZoom\n            ? viewerZoom\n            : Number.isFinite(requestedZoom)\n              ? requestedZoom\n              : this.currentZoom;\n        const toZoom = parseZoomLevel(targetZoom);\n\n        if (!Number.isFinite(fromZoom) || !Number.isFinite(toZoom)) {\n            this.viewer.zoom = targetZoom;\n            onComplete?.();\n            return;\n        }\n\n        this.currentZoomFormat = targetFormat;\n        const startedAt = window.performance.now();\n\n        const step = timestamp => {\n            const elapsed = timestamp - startedAt;\n            const progress = Math.min(elapsed / zoomAnimationDuration, 1);\n            const easedProgress = easeZoomProgress(progress);\n            const nextZoom = fromZoom + (toZoom - fromZoom) * easedProgress;\n\n            if (progress < 1) {\n                this.currentZoom = nextZoom;\n                this.requestedZoom = formatZoomLevel(nextZoom, targetFormat);\n                this.viewer.zoom = this.requestedZoom;\n                this.zoomAnimationFrame = window.requestAnimationFrame(step);\n                return;\n            }\n\n            this.zoomAnimationFrame = null;\n            this.currentZoom = toZoom;\n            this.currentZoomFormat = targetFormat;\n            this.requestedZoom = targetZoom;\n            this.viewer.zoom = targetZoom;\n            onComplete?.();\n        };\n\n        this.zoomAnimationFrame = window.requestAnimationFrame(step);\n    }\n\n    /**\n     * Cancels any custom zoom animation currently in progress.\n     *\n     * @returns {void}\n     */\n    cancelZoomAnimation() {\n        if (this.zoomAnimationFrame === null) {\n            return;\n        }\n\n        window.cancelAnimationFrame(this.zoomAnimationFrame);\n        this.zoomAnimationFrame = null;\n    }\n\n    /**\n     * Cancels any pending padded/full-height layout transition.\n     *\n     * @returns {void}\n     */\n    clearZoomLayoutTransition() {\n        if (this.zoomLayoutTransitionTimeout !== null) {\n            window.clearTimeout(this.zoomLayoutTransitionTimeout);\n            this.zoomLayoutTransitionTimeout = null;\n        }\n\n        this.root.toggleAttribute(zoomLayoutFadingAttribute, false);\n        this.isZoomLayoutTransitioning = false;\n    }\n\n    /**\n     * Hides controls for Cylindo items that do not support zooming.\n     *\n     * @param {object|null} item\n     * @returns {void}\n     */\n    updateZoomAvailability(item) {\n        const canBeZoomedIn = item?.canBeZoomedIn;\n        this.isZoomable = canBeZoomedIn !== false;\n\n        this.actions.toggleAttribute('hidden', !this.isZoomable);\n        this.setButtonsDisabled(!this.isViewerReady || !this.isZoomable);\n\n        if (!this.isZoomable) {\n            this.handleZoomOut();\n        }\n    }\n\n    /**\n     * Keeps both zoom buttons aligned while the viewer is loading or unavailable.\n     *\n     * @param {boolean} isDisabled\n     * @returns {void}\n     */\n    setButtonsDisabled(isDisabled) {\n        this.zoomInButton.disabled = isDisabled;\n        this.zoomOutButton.disabled = isDisabled;\n    }\n\n    /**\n     * Removes listeners registered by this instance.\n     *\n     * @returns {void}\n     */\n    destroy() {\n        this.cancelZoomAnimation();\n        this.clearZoomLayoutTransition();\n        this.root.toggleAttribute(zoomLayoutExpandedAttribute, false);\n        this.abortController.abort();\n    }\n}\n","export const shortDesktopViewportHeight = 850;\nexport const shortDesktopViewportMinWidth = 1000;\n\nexport const shortDesktopViewportQuery =\n    `(max-height: ${shortDesktopViewportHeight}px) and ` +\n    `(min-width: ${shortDesktopViewportMinWidth}px)`;\n\nexport const isShortDesktopViewport = () =>\n    window.matchMedia(shortDesktopViewportQuery).matches;\n\n// The desktop side panel's geometry (400px, absolutely positioned) is only valid above the\n// mobile card's breakpoint, whatever else qualifies a product for it.\nexport const desktopPanelQuery = `(min-width: ${shortDesktopViewportMinWidth}px)`;\n\nexport const isDesktopPanelViewport = () =>\n    window.matchMedia(desktopPanelQuery).matches;\n","/**\n * Configurator Hero Slider\n * A lightweight slider using native CSS scroll-snap and Intersection Observer\n */\n\nimport CylindoZoomControls from './cylindo-zoom-controls';\nimport { shortDesktopViewportMinWidth } from './short-desktop-viewport';\n\nconst configuratorStepSelector = '[data-configurator-step]';\nconst configuratorSlideFadeClass = 'configurator-hero__slider--is-fading';\nconst configuratorViewerInteractingClass =\n    'configurator-hero__slides--viewer-interacting';\nconst configuratorSlideFadeDuration = 220;\nconst pairedSlidesHeroClass = 'configurator-hero--paired-slides';\nconst pairedSlidesStartClass = 'configurator-hero__slide--paired-start';\nconst pairedSlidesFullClass = 'configurator-hero__slide--paired-full';\nconst pairedSlidesViewportQuery = `(min-width: ${shortDesktopViewportMinWidth}px)`;\nconst endSwipeMinimumDistance = 50;\nconst endSwipeHorizontalRatio = 1.25;\n\nexport default class ConfiguratorSlider {\n    constructor(element) {\n        this.slider =\n            element ?? document.querySelector('[data-configurator-hero]');\n        this.hero = this.slider.closest('.configurator-hero');\n        this.configuratorStateContainer = this.hero.closest(\n            '[data-configurator-state]'\n        );\n        this.slidesContainer = this.slider.querySelector(\n            '.configurator-hero__slides'\n        );\n        this.slides = Array.from(\n            this.slidesContainer.querySelectorAll('.configurator-hero__slide')\n        );\n        this.configuratorStep = this.slider.querySelector(\n            configuratorStepSelector\n        );\n        this.prevButton = this.slider.querySelector('[data-hero-prev]');\n        this.nextButton = this.slider.querySelector('[data-hero-next]');\n        this.currentCounter = this.slider.querySelector('[data-hero-current]');\n        this.totalCounter = this.slider.querySelector('[data-hero-total]');\n        this.nav = this.slider.querySelector('.configurator-hero__nav');\n        this.viewGalleryButton = this.slider.querySelector(\n            '[data-hero-view-gallery]'\n        );\n\n        this.gallerySlideTotal = this.slides.length;\n        this.configuratorSlideIndex = this.configuratorStep\n            ? this.gallerySlideTotal\n            : -1;\n        this.totalSlides =\n            this.gallerySlideTotal + (this.configuratorStep ? 1 : 0);\n        this.startsOnConfigurator =\n            this.configuratorStateContainer?.getAttribute(\n                'data-configurator-state'\n            ) === 'on-configurator';\n        this.currentIndex =\n            this.startsOnConfigurator && this.hasConfiguratorSlide()\n                ? this.configuratorSlideIndex\n                : 0;\n        this.lifestyleSlideTotal = this.gallerySlideTotal;\n        this.lastLifestyleIndex = Math.max(this.lifestyleSlideTotal - 1, 0);\n        this.isLastSlide = false;\n        this.isConfiguratorSlideActive = false;\n        this.configuratorSlideFadeTimeout = null;\n        this.configuratorStateFrame = null;\n        this.isCylindoZoomed = false;\n        this.cylindoZoomControls = null;\n        this.cylindoInteractionReleaseTimeout = null;\n        this.pairedSlidesResizeFrame = null;\n        this.isPairedSlidesActive = this.hasPairedSlidesLayout();\n\n        this.init();\n    }\n\n    init() {\n        this.setupPairedSlidesMode();\n        this.updateCounter();\n\n        // Set up Intersection Observer\n        this.setupIntersectionObserver();\n\n        // Set up navigation\n        this.setupNavigation();\n\n        // The configurator sits outside the native scroll-snap container, so\n        // bridge a forward swipe from the final gallery slide into it.\n        this.setupEndSwipeNavigation();\n\n        // Keep configurator UI state in step with the final slide's snap position.\n        this.setupConfiguratorStateSync();\n\n        // Hide hero copy while the Cylindo viewer is zoomed.\n        this.setupCylindoZoomListener();\n\n        this.setupCylindoZoomControls();\n\n        // Let Cylindo own touch movement while the user is manipulating the viewer.\n        this.setupCylindoInteractionLock();\n\n        // Initial button state\n        this.updateButtonStates();\n\n        this.handleSlideChange(this.currentIndex);\n    }\n\n    setupPairedSlidesMode() {\n        this.updatePairedSlideClasses();\n        this.syncPairedSlidesMode();\n\n        this._handlePairedSlidesResize = () => {\n            if (this.pairedSlidesResizeFrame) {\n                return;\n            }\n\n            this.pairedSlidesResizeFrame = window.requestAnimationFrame(() => {\n                this.pairedSlidesResizeFrame = null;\n                this.syncPairedSlidesMode();\n            });\n        };\n\n        window.addEventListener('resize', this._handlePairedSlidesResize, {\n            passive: true,\n        });\n\n        window.visualViewport?.addEventListener(\n            'resize',\n            this._handlePairedSlidesResize,\n            { passive: true }\n        );\n    }\n\n    syncPairedSlidesMode() {\n        const wasPaired = this.isPairedSlidesMode();\n        const shouldPairSlides = this.hasPairedSlidesLayout();\n\n        this.isPairedSlidesActive = shouldPairSlides;\n\n        const nextIndex = this.getNavigableSlideIndex(this.currentIndex);\n        const shouldRealignSlide =\n            wasPaired !== shouldPairSlides || nextIndex !== this.currentIndex;\n\n        this.currentIndex = nextIndex;\n\n        if (shouldRealignSlide) {\n            this.scrollSlideIntoPosition(this.currentIndex, true);\n        }\n\n        this.updateCounter();\n        this.updateButtonStates();\n        this.syncConfiguratorSlideState();\n    }\n\n    updatePairedSlideClasses() {\n        this.slides.forEach((slide, index) => {\n            const isLifestyleSlide = this.isLifestyleSlideIndex(index);\n            const isLastOddLifestyleSlide =\n                isLifestyleSlide &&\n                this.lifestyleSlideTotal % 2 === 1 &&\n                index === this.lastLifestyleIndex;\n\n            slide.classList.toggle(\n                pairedSlidesStartClass,\n                isLifestyleSlide && index % 2 === 0\n            );\n            slide.classList.toggle(\n                pairedSlidesFullClass,\n                isLastOddLifestyleSlide\n            );\n        });\n    }\n\n    /**\n     * Whether paired slides should use two-image desktop navigation.\n     *\n     * @returns {boolean}\n     */\n    hasPairedSlidesLayout() {\n        return (\n            this.hero.classList.contains(pairedSlidesHeroClass) &&\n            window.matchMedia(pairedSlidesViewportQuery).matches\n        );\n    }\n\n    isPairedSlidesMode() {\n        return this.isPairedSlidesActive;\n    }\n\n    isLifestyleSlideIndex(index) {\n        return index > -1 && index < this.lifestyleSlideTotal;\n    }\n\n    getLastNavigableLifestyleIndex() {\n        if (this.lifestyleSlideTotal <= 1) {\n            return 0;\n        }\n\n        return this.lifestyleSlideTotal % 2 === 0\n            ? this.lifestyleSlideTotal - 2\n            : this.lifestyleSlideTotal - 1;\n    }\n\n    getNavigableSlideIndex(index) {\n        if (\n            !this.isPairedSlidesMode() ||\n            index === this.configuratorSlideIndex ||\n            !this.isLifestyleSlideIndex(index)\n        ) {\n            return index;\n        }\n\n        const lastNavigableLifestyleIndex =\n            this.getLastNavigableLifestyleIndex();\n\n        if (index >= lastNavigableLifestyleIndex) {\n            return lastNavigableLifestyleIndex;\n        }\n\n        return index - (index % 2);\n    }\n\n    setupIntersectionObserver() {\n        const options = {\n            root: this.slidesContainer,\n            threshold: 0.95,\n            rootMargin: '0px',\n        };\n\n        this.observer = new IntersectionObserver(entries => {\n            entries.forEach(entry => {\n                if (entry.isIntersecting) {\n                    const slideIndex = this.slides.indexOf(entry.target);\n                    this.handleSlideChange(slideIndex);\n                }\n            });\n        }, options);\n\n        // Observe all slides\n        this.slides.forEach(slide => {\n            this.observer.observe(slide);\n        });\n    }\n\n    handleSlideChange(newIndex) {\n        newIndex = this.getNavigableSlideIndex(newIndex);\n\n        const previousIndex = this.currentIndex;\n        this.currentIndex = newIndex;\n\n        this.updateCounter();\n\n        // Update button states\n        this.updateButtonStates();\n\n        this.isLastSlide = this.currentIndex === this.totalSlides - 1;\n        this.hero.classList.toggle(\n            'configurator-hero--configurator-preview',\n            this.isLastSlide\n        );\n        this.syncViewVisibility();\n        this.syncConfiguratorSlideState();\n\n        const header = this.hero.querySelector('.configurator-hero__header');\n        const activeSlide = this.getSlideForIndex(this.currentIndex);\n        const isCutout =\n            activeSlide?.classList.contains(\n                'configurator-hero__slide--cutout'\n            ) ?? false;\n        if (header) {\n            header.classList.toggle(\n                'configurator-hero__header--cutout',\n                isCutout\n            );\n        }\n\n        // Dispatch general slide change event\n        this.slider.dispatchEvent(\n            new CustomEvent('slideChange', {\n                detail: {\n                    currentIndex: this.currentIndex,\n                    previousIndex: previousIndex,\n                    isLastSlide: this.isLastSlide,\n                    slide: activeSlide,\n                },\n            })\n        );\n    }\n\n    syncViewVisibility() {\n        const isConfiguratorActive =\n            this.hasConfiguratorSlide() &&\n            this.currentIndex === this.configuratorSlideIndex;\n\n        this.slidesContainer.hidden = isConfiguratorActive;\n\n        if (this.configuratorStep) {\n            this.configuratorStep.hidden = !isConfiguratorActive;\n        }\n    }\n\n    dispatchConfiguratorEvent(action) {\n        this.slider.dispatchEvent(\n            new CustomEvent('configuratorSlide', {\n                detail: {\n                    action: action, // 'enter' or 'leave'\n                    slideIndex: this.currentIndex,\n                },\n            })\n        );\n\n        // Toggle configurator-visible class on the top-level hero element\n        if (this.hero) {\n            this.hero.classList.toggle(\n                'configurator-hero--configurator-visible',\n                action === 'enter'\n            );\n\n            document\n                .querySelector('[data-configurator-options]')\n                ?.classList.toggle(\n                    'configurator-options--visible',\n                    action === 'enter'\n                );\n        }\n\n        // Update parent wrapper state attribute for configurationBar & dynamicConfigBar\n        const wrapper = this.configuratorStateContainer;\n        if (wrapper) {\n            wrapper.setAttribute(\n                'data-configurator-state',\n                action === 'enter' ? 'on-configurator' : 'exploring'\n            );\n        }\n    }\n\n    setupConfiguratorStateSync() {\n        this._handleConfiguratorStateScroll = () => {\n            if (this.configuratorStateFrame) {\n                return;\n            }\n\n            this.configuratorStateFrame = window.requestAnimationFrame(() => {\n                this.configuratorStateFrame = null;\n                this.syncConfiguratorSlideState();\n            });\n        };\n\n        this.slidesContainer.addEventListener(\n            'scroll',\n            this._handleConfiguratorStateScroll,\n            { passive: true }\n        );\n    }\n\n    syncConfiguratorSlideState() {\n        if (!this.hasConfiguratorSlide()) {\n            return;\n        }\n\n        const shouldBeActive =\n            this.currentIndex === this.configuratorSlideIndex;\n\n        if (shouldBeActive === this.isConfiguratorSlideActive) {\n            return;\n        }\n\n        this.isConfiguratorSlideActive = shouldBeActive;\n        this.dispatchConfiguratorEvent(shouldBeActive ? 'enter' : 'leave');\n    }\n\n    /**\n     * Returns true once the configurator slide is aligned in the scroll-snap\n     * container, not merely mostly visible.\n     *\n     * @returns {boolean}\n     */\n    isConfiguratorSlideSnapped() {\n        return (\n            this.hasConfiguratorSlide() &&\n            this.currentIndex === this.configuratorSlideIndex\n        );\n    }\n\n    setupNavigation() {\n        this._handlePrev = () => this.goToPrevSlide();\n        this._handleNext = () => this.goToNextSlide();\n        this._handleViewGallery = () => this.goToGallery();\n        this._handleKeydown = event => {\n            if (event.key === 'ArrowLeft') {\n                this.goToPrevSlide();\n            } else if (event.key === 'ArrowRight') {\n                this.goToNextSlide();\n            }\n        };\n\n        this.prevButton?.addEventListener('click', this._handlePrev);\n        this.nextButton?.addEventListener('click', this._handleNext);\n        this.viewGalleryButton?.addEventListener(\n            'click',\n            this._handleViewGallery\n        );\n\n        this.slider.addEventListener('keydown', this._handleKeydown);\n    }\n\n    setupEndSwipeNavigation() {\n        if (!this.hasConfiguratorSlide() || this.lifestyleSlideTotal === 0) {\n            return;\n        }\n\n        let touchStart = null;\n\n        const resetTouch = () => {\n            touchStart = null;\n        };\n\n        this._handleEndSwipeTouchStart = event => {\n            const touch = event.touches[0];\n            const isViewerInteracting = this.slidesContainer.classList.contains(\n                configuratorViewerInteractingClass\n            );\n\n            if (\n                event.touches.length !== 1 ||\n                !touch ||\n                !this.isOnFinalGallerySlide() ||\n                this.isCylindoZoomed ||\n                isViewerInteracting\n            ) {\n                resetTouch();\n                return;\n            }\n\n            touchStart = {\n                x: touch.clientX,\n                y: touch.clientY,\n            };\n        };\n\n        this._handleEndSwipeTouchMove = event => {\n            if (event.touches.length !== 1) {\n                resetTouch();\n            }\n        };\n\n        this._handleEndSwipeTouchEnd = event => {\n            const touch = event.changedTouches[0];\n            const start = touchStart;\n\n            resetTouch();\n\n            if (\n                !start ||\n                !touch ||\n                event.touches.length > 0 ||\n                this.isCylindoZoomed ||\n                this.slidesContainer.classList.contains(\n                    configuratorViewerInteractingClass\n                ) ||\n                !this.isOnFinalGallerySlide()\n            ) {\n                return;\n            }\n\n            const horizontalDistance = start.x - touch.clientX;\n            const verticalDistance = Math.abs(start.y - touch.clientY);\n            const isForwardSwipe =\n                horizontalDistance >= endSwipeMinimumDistance &&\n                horizontalDistance >=\n                    verticalDistance * endSwipeHorizontalRatio;\n\n            if (isForwardSwipe) {\n                this.goToNextSlide();\n            }\n        };\n\n        this._handleEndSwipeTouchCancel = resetTouch;\n\n        this.slidesContainer.addEventListener(\n            'touchstart',\n            this._handleEndSwipeTouchStart,\n            { passive: true }\n        );\n        this.slidesContainer.addEventListener(\n            'touchmove',\n            this._handleEndSwipeTouchMove,\n            { passive: true }\n        );\n        this.slidesContainer.addEventListener(\n            'touchend',\n            this._handleEndSwipeTouchEnd,\n            { passive: true }\n        );\n        this.slidesContainer.addEventListener(\n            'touchcancel',\n            this._handleEndSwipeTouchCancel,\n            { passive: true }\n        );\n    }\n\n    isOnFinalGallerySlide() {\n        const finalGalleryIndex = this.isPairedSlidesMode()\n            ? this.getLastNavigableLifestyleIndex()\n            : this.lastLifestyleIndex;\n\n        return this.currentIndex === finalGalleryIndex;\n    }\n\n    setupCylindoZoomListener() {\n        this.cylindoViewer = this.slider.querySelector('[data-360-viewer]');\n\n        if (!this.cylindoViewer) {\n            return;\n        }\n\n        this._handleCylindoZoomChange = event => {\n            const eventZoom = Number.parseFloat(\n                event.detail?.zoom ?? event.detail\n            );\n            const viewerZoom = Number.parseFloat(this.cylindoViewer.zoom ?? 1);\n            const zoom = Number.isFinite(eventZoom) ? eventZoom : viewerZoom;\n            const isZoomed = zoom > 1;\n\n            if (isZoomed === this.isCylindoZoomed) {\n                return;\n            }\n\n            this.isCylindoZoomed = isZoomed;\n            this.slider.toggleAttribute('data-zoomed', isZoomed);\n        };\n\n        this.cylindoViewer.addEventListener(\n            'zoom-change',\n            this._handleCylindoZoomChange\n        );\n    }\n\n    setupCylindoZoomControls() {\n        this.cylindoZoomControls = new CylindoZoomControls(this.slider);\n    }\n\n    setupCylindoInteractionLock() {\n        const viewer = this.slider.querySelector('[data-360-viewer]');\n\n        if (!viewer) {\n            return;\n        }\n\n        const lock = () => {\n            window.clearTimeout(this.cylindoInteractionReleaseTimeout);\n            this.slidesContainer.classList.add(\n                configuratorViewerInteractingClass\n            );\n        };\n\n        const release = () => {\n            window.clearTimeout(this.cylindoInteractionReleaseTimeout);\n            this.cylindoInteractionReleaseTimeout = window.setTimeout(() => {\n                this.slidesContainer.classList.remove(\n                    configuratorViewerInteractingClass\n                );\n                this.syncConfiguratorSlideState();\n            }, 120);\n        };\n\n        this._handleCylindoInteractionStart = lock;\n        this._handleCylindoInteractionEnd = release;\n\n        viewer.addEventListener('pointerdown', lock, { passive: true });\n        viewer.addEventListener('touchstart', lock, { passive: true });\n        viewer.addEventListener('mousedown', lock);\n\n        window.addEventListener('pointerup', release, { passive: true });\n        window.addEventListener('pointercancel', release, { passive: true });\n        window.addEventListener('touchend', release, { passive: true });\n        window.addEventListener('touchcancel', release, { passive: true });\n        window.addEventListener('mouseup', release);\n    }\n\n    /**\n     * Leaves the configurator for the first gallery slide.\n     */\n    goToGallery() {\n        if (this.lifestyleSlideTotal === 0) {\n            return;\n        }\n\n        this.scrollToSlide(0);\n    }\n\n    goToPrevSlide() {\n        const previousIndex = this.getPreviousSlideIndex();\n\n        if (previousIndex !== null) {\n            this.scrollToSlide(previousIndex);\n        }\n    }\n\n    goToNextSlide() {\n        const nextIndex = this.getNextSlideIndex();\n\n        if (nextIndex !== null) {\n            this.scrollToSlide(nextIndex);\n        }\n    }\n\n    getPreviousSlideIndex() {\n        if (!this.isPairedSlidesMode()) {\n            return this.currentIndex > 0 ? this.currentIndex - 1 : null;\n        }\n\n        if (this.currentIndex <= 0) {\n            return null;\n        }\n\n        if (this.currentIndex === this.configuratorSlideIndex) {\n            const lastNavigableLifestyleIndex =\n                this.getLastNavigableLifestyleIndex();\n\n            return lastNavigableLifestyleIndex === this.currentIndex\n                ? null\n                : lastNavigableLifestyleIndex;\n        }\n\n        return Math.max(this.currentIndex - 2, 0);\n    }\n\n    getNextSlideIndex() {\n        if (!this.isPairedSlidesMode()) {\n            return this.currentIndex < this.totalSlides - 1\n                ? this.currentIndex + 1\n                : null;\n        }\n\n        if (this.currentIndex === this.configuratorSlideIndex) {\n            return null;\n        }\n\n        const lastNavigableLifestyleIndex =\n            this.getLastNavigableLifestyleIndex();\n\n        if (this.currentIndex >= lastNavigableLifestyleIndex) {\n            return this.hasConfiguratorSlide()\n                ? this.configuratorSlideIndex\n                : null;\n        }\n\n        return Math.min(this.currentIndex + 2, lastNavigableLifestyleIndex);\n    }\n\n    scrollToSlide(index, instant = false) {\n        index = this.getNavigableSlideIndex(index);\n\n        if (index < 0 || index >= this.totalSlides) {\n            return;\n        }\n\n        const isConfiguratorTarget =\n            this.hasConfiguratorSlide() &&\n            index === this.configuratorSlideIndex;\n        const isLeavingConfigurator =\n            this.hasConfiguratorSlide() &&\n            this.currentIndex === this.configuratorSlideIndex &&\n            index !== this.currentIndex;\n\n        if (\n            !instant &&\n            index !== this.currentIndex &&\n            (isConfiguratorTarget || isLeavingConfigurator)\n        ) {\n            this.fadeToSlide(index);\n\n            return;\n        }\n\n        if (isConfiguratorTarget) {\n            this.handleSlideChange(index);\n            return;\n        }\n\n        if (instant) {\n            this.handleSlideChange(index);\n            this.scrollSlideIntoPosition(index, true);\n            return;\n        }\n\n        this.scrollSlideIntoPosition(index, false);\n    }\n\n    /**\n     * Fades the slider while moving to a slide.\n     *\n     * @param {number} index\n     */\n    fadeToSlide(index) {\n        window.clearTimeout(this.configuratorSlideFadeTimeout);\n        this.slider.classList.add(configuratorSlideFadeClass);\n\n        this.configuratorSlideFadeTimeout = window.setTimeout(() => {\n            this.configuratorSlideFadeTimeout = null;\n            this.handleSlideChange(index);\n\n            if (index !== this.configuratorSlideIndex) {\n                this.scrollSlideIntoPosition(index, true);\n            }\n\n            window.requestAnimationFrame(() => {\n                this.slider.classList.remove(configuratorSlideFadeClass);\n            });\n        }, configuratorSlideFadeDuration);\n    }\n\n    /**\n     * Moves the slide container horizontally without changing page scroll.\n     *\n     * @param {number} index\n     * @param {boolean} instant\n     */\n    scrollSlideIntoPosition(index, instant = false) {\n        const slide = this.slides[index];\n\n        if (!slide) {\n            return;\n        }\n\n        if (instant) {\n            const currentScrollBehavior =\n                this.slidesContainer.style.scrollBehavior;\n\n            this.slidesContainer.style.scrollBehavior = 'auto';\n            this.slidesContainer.scrollTo({\n                left: slide.offsetLeft,\n                top: this.slidesContainer.scrollTop,\n                behavior: 'auto',\n            });\n            this.slidesContainer.style.scrollBehavior = currentScrollBehavior;\n\n            return;\n        }\n\n        this.slidesContainer.scrollTo({\n            left: slide.offsetLeft,\n            top: this.slidesContainer.scrollTop,\n            behavior: 'smooth',\n        });\n    }\n\n    // The arrows page through the gallery; on the configurator slide they give\n    // way to the \"View gallery\" pill, which occupies the same corner.\n    updateButtonStates() {\n        const onConfigurator = this.isConfiguratorSlideSnapped();\n\n        if (this.prevButton) {\n            this.prevButton.disabled = this.getPreviousSlideIndex() === null;\n        }\n\n        if (this.nextButton) {\n            this.nextButton.disabled = this.getNextSlideIndex() === null;\n        }\n\n        this.nav?.toggleAttribute(\n            'hidden',\n            this.totalSlides <= 1 || onConfigurator\n        );\n\n        this.viewGalleryButton?.toggleAttribute(\n            'hidden',\n            this.lifestyleSlideTotal === 0 || !onConfigurator\n        );\n    }\n\n    updateCounter() {\n        if (this.currentCounter) {\n            this.currentCounter.textContent = this.getDisplayedSlideIndex();\n        }\n\n        if (this.totalCounter) {\n            this.totalCounter.textContent = this.getDisplayedSlideTotal();\n        }\n    }\n\n    getDisplayedSlideIndex() {\n        if (!this.isPairedSlidesMode()) {\n            return this.currentIndex + 1;\n        }\n\n        if (this.currentIndex === this.configuratorSlideIndex) {\n            return this.getDisplayedSlideTotal();\n        }\n\n        return Math.floor(this.currentIndex / 2) + 1;\n    }\n\n    getDisplayedSlideTotal() {\n        if (!this.isPairedSlidesMode()) {\n            return this.totalSlides;\n        }\n\n        const lifestyleSlideTotal = Math.ceil(this.lifestyleSlideTotal / 2);\n\n        return lifestyleSlideTotal + (this.hasConfiguratorSlide() ? 1 : 0);\n    }\n\n    hasConfiguratorSlide() {\n        return (\n            this.configuratorSlideIndex > -1 && Boolean(this.configuratorStep)\n        );\n    }\n\n    getConfiguratorSlide() {\n        return this.hasConfiguratorSlide() ? this.configuratorStep : null;\n    }\n\n    getSlideForIndex(index) {\n        if (\n            this.hasConfiguratorSlide() &&\n            index === this.configuratorSlideIndex\n        ) {\n            return this.configuratorStep;\n        }\n\n        return this.slides[index] ?? null;\n    }\n\n    // Public method to go to a specific slide\n    goToSlide(index, instant = false) {\n        this.scrollToSlide(index, instant);\n    }\n\n    // Public method to get current state\n    getState() {\n        return {\n            currentIndex: this.currentIndex,\n            totalSlides: this.totalSlides,\n            isLastSlide: this.isLastSlide,\n        };\n    }\n\n    // Cleanup\n    destroy() {\n        this.observer.disconnect();\n\n        if (this._handlePrev) {\n            this.prevButton?.removeEventListener('click', this._handlePrev);\n        }\n\n        if (this._handleNext) {\n            this.nextButton?.removeEventListener('click', this._handleNext);\n        }\n\n        if (this._handleViewGallery) {\n            this.viewGalleryButton?.removeEventListener(\n                'click',\n                this._handleViewGallery\n            );\n        }\n\n        if (this._handleKeydown) {\n            this.slider.removeEventListener('keydown', this._handleKeydown);\n        }\n\n        if (this._handleEndSwipeTouchStart) {\n            this.slidesContainer.removeEventListener(\n                'touchstart',\n                this._handleEndSwipeTouchStart\n            );\n            this.slidesContainer.removeEventListener(\n                'touchmove',\n                this._handleEndSwipeTouchMove\n            );\n            this.slidesContainer.removeEventListener(\n                'touchend',\n                this._handleEndSwipeTouchEnd\n            );\n            this.slidesContainer.removeEventListener(\n                'touchcancel',\n                this._handleEndSwipeTouchCancel\n            );\n        }\n\n        if (this._handleConfiguratorStateScroll) {\n            this.slidesContainer.removeEventListener(\n                'scroll',\n                this._handleConfiguratorStateScroll\n            );\n        }\n\n        if (this.configuratorStateFrame) {\n            window.cancelAnimationFrame(this.configuratorStateFrame);\n        }\n\n        window.clearTimeout(this.cylindoInteractionReleaseTimeout);\n        window.clearTimeout(this.configuratorSlideFadeTimeout);\n        this.slider.classList.remove(configuratorSlideFadeClass);\n        this.slidesContainer.classList.remove(\n            configuratorViewerInteractingClass\n        );\n\n        if (this._handlePairedSlidesResize) {\n            window.removeEventListener(\n                'resize',\n                this._handlePairedSlidesResize\n            );\n            window.visualViewport?.removeEventListener(\n                'resize',\n                this._handlePairedSlidesResize\n            );\n        }\n\n        if (this.pairedSlidesResizeFrame) {\n            window.cancelAnimationFrame(this.pairedSlidesResizeFrame);\n        }\n\n        if (this.cylindoViewer && this._handleCylindoZoomChange) {\n            this.cylindoViewer.removeEventListener(\n                'zoom-change',\n                this._handleCylindoZoomChange\n            );\n        }\n\n        const viewer = this.slider.querySelector('[data-360-viewer]');\n        if (\n            viewer &&\n            this._handleCylindoInteractionStart &&\n            this._handleCylindoInteractionEnd\n        ) {\n            viewer.removeEventListener(\n                'pointerdown',\n                this._handleCylindoInteractionStart\n            );\n            viewer.removeEventListener(\n                'touchstart',\n                this._handleCylindoInteractionStart\n            );\n            viewer.removeEventListener(\n                'mousedown',\n                this._handleCylindoInteractionStart\n            );\n\n            window.removeEventListener(\n                'pointerup',\n                this._handleCylindoInteractionEnd\n            );\n            window.removeEventListener(\n                'pointercancel',\n                this._handleCylindoInteractionEnd\n            );\n            window.removeEventListener(\n                'touchend',\n                this._handleCylindoInteractionEnd\n            );\n            window.removeEventListener(\n                'touchcancel',\n                this._handleCylindoInteractionEnd\n            );\n            window.removeEventListener(\n                'mouseup',\n                this._handleCylindoInteractionEnd\n            );\n        }\n\n        this.cylindoZoomControls?.destroy();\n        this.slider.removeAttribute('data-zoomed');\n    }\n}\n","import { DimensionsV2 } from '../product/dimensions';\nimport { optionKindSize } from './chooser/constants';\nimport { initOverlayButtons } from '../features/overlays';\nimport { pdpDataEvent } from './page';\nimport { getCookieValue } from '../util/cookie';\n\nexport const initDimensions = () => {\n    // Initialise the dimensions v2 block if it's present on the page.\n    const dimensionsblock = document.querySelector('[data-dimensions-block]');\n\n    if (\n        dimensionsblock &&\n        dimensionsblock.querySelector('[data-dimensions]') &&\n        dimensionsblock.querySelector('[data-table] tbody')?.rows.length > 0\n    ) {\n        const dimsV2 = new DimensionsV2(dimensionsblock);\n\n        // When the product size is changed, update the highlighted size column in the\n        // dimensions table.\n        document.body.addEventListener(pdpDataEvent, e => {\n            const { options } = e.detail;\n\n            for (const option in options) {\n                if (options[option].kind === optionKindSize) {\n                    dimsV2.setSelectedSize(options[option].value);\n                    break;\n                }\n            }\n        });\n\n        // Highlight the size column for the initially selected size.\n        const initialSize = document.querySelector('.js-hidden_size')?.value;\n        if (initialSize) {\n            dimsV2.setSelectedSize(initialSize);\n        }\n    }\n\n    if (getCookieValue('kiosk') && dimensionsblock) {\n        const dimensionsButton = dimensionsblock.querySelector(\n            '.product_dimensions-print-button'\n        );\n\n        if (dimensionsButton) {\n            dimensionsButton.setAttribute('target', '_self');\n        }\n    }\n\n    initOverlayButtons();\n};\n","/*!\n * lightgallery | 2.9.0 | October 1st 2025\n * http://www.lightgalleryjs.com/\n * Copyright (c) 2020 Sachin Neravath;\n * @license GPLv3\n */\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nvar __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\n\r\nfunction __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\n\n/**\r\n * List of lightGallery events\r\n * All events should be documented here\r\n * Below interfaces are used to build the website documentations\r\n * */\r\nvar lGEvents = {\r\n    afterAppendSlide: 'lgAfterAppendSlide',\r\n    init: 'lgInit',\r\n    hasVideo: 'lgHasVideo',\r\n    containerResize: 'lgContainerResize',\r\n    updateSlides: 'lgUpdateSlides',\r\n    afterAppendSubHtml: 'lgAfterAppendSubHtml',\r\n    beforeOpen: 'lgBeforeOpen',\r\n    afterOpen: 'lgAfterOpen',\r\n    slideItemLoad: 'lgSlideItemLoad',\r\n    beforeSlide: 'lgBeforeSlide',\r\n    afterSlide: 'lgAfterSlide',\r\n    posterClick: 'lgPosterClick',\r\n    dragStart: 'lgDragStart',\r\n    dragMove: 'lgDragMove',\r\n    dragEnd: 'lgDragEnd',\r\n    beforeNextSlide: 'lgBeforeNextSlide',\r\n    beforePrevSlide: 'lgBeforePrevSlide',\r\n    beforeClose: 'lgBeforeClose',\r\n    afterClose: 'lgAfterClose',\r\n    rotateLeft: 'lgRotateLeft',\r\n    rotateRight: 'lgRotateRight',\r\n    flipHorizontal: 'lgFlipHorizontal',\r\n    flipVertical: 'lgFlipVertical',\r\n    autoplay: 'lgAutoplay',\r\n    autoplayStart: 'lgAutoplayStart',\r\n    autoplayStop: 'lgAutoplayStop',\r\n};\n\nvar lightGalleryCoreSettings = {\r\n    mode: 'lg-slide',\r\n    easing: 'ease',\r\n    speed: 400,\r\n    licenseKey: '0000-0000-000-0000',\r\n    height: '100%',\r\n    width: '100%',\r\n    addClass: '',\r\n    startClass: 'lg-start-zoom',\r\n    backdropDuration: 300,\r\n    container: '',\r\n    startAnimationDuration: 400,\r\n    zoomFromOrigin: true,\r\n    hideBarsDelay: 0,\r\n    showBarsAfter: 10000,\r\n    slideDelay: 0,\r\n    supportLegacyBrowser: true,\r\n    allowMediaOverlap: false,\r\n    videoMaxSize: '1280-720',\r\n    loadYouTubePoster: true,\r\n    defaultCaptionHeight: 0,\r\n    ariaLabelledby: '',\r\n    ariaDescribedby: '',\r\n    resetScrollPosition: true,\r\n    hideScrollbar: false,\r\n    closable: true,\r\n    swipeToClose: true,\r\n    closeOnTap: true,\r\n    showCloseIcon: true,\r\n    showMaximizeIcon: false,\r\n    loop: true,\r\n    escKey: true,\r\n    keyPress: true,\r\n    trapFocus: true,\r\n    controls: true,\r\n    slideEndAnimation: true,\r\n    hideControlOnEnd: false,\r\n    mousewheel: false,\r\n    getCaptionFromTitleOrAlt: true,\r\n    appendSubHtmlTo: '.lg-sub-html',\r\n    subHtmlSelectorRelative: false,\r\n    preload: 2,\r\n    numberOfSlideItemsInDom: 10,\r\n    selector: '',\r\n    selectWithin: '',\r\n    nextHtml: '',\r\n    prevHtml: '',\r\n    index: 0,\r\n    iframeWidth: '100%',\r\n    iframeHeight: '100%',\r\n    iframeMaxWidth: '100%',\r\n    iframeMaxHeight: '100%',\r\n    download: true,\r\n    counter: true,\r\n    appendCounterTo: '.lg-toolbar',\r\n    swipeThreshold: 50,\r\n    enableSwipe: true,\r\n    enableDrag: true,\r\n    dynamic: false,\r\n    dynamicEl: [],\r\n    extraProps: [],\r\n    exThumbImage: '',\r\n    isMobile: undefined,\r\n    mobileSettings: {\r\n        controls: false,\r\n        showCloseIcon: false,\r\n        download: false,\r\n    },\r\n    plugins: [],\r\n    strings: {\r\n        closeGallery: 'Close gallery',\r\n        toggleMaximize: 'Toggle maximize',\r\n        previousSlide: 'Previous slide',\r\n        nextSlide: 'Next slide',\r\n        download: 'Download',\r\n        playVideo: 'Play video',\r\n        mediaLoadingFailed: 'Oops... Failed to load content...',\r\n    },\r\n};\n\nfunction initLgPolyfills() {\r\n    (function () {\r\n        if (typeof window.CustomEvent === 'function')\r\n            return false;\r\n        function CustomEvent(event, params) {\r\n            params = params || {\r\n                bubbles: false,\r\n                cancelable: false,\r\n                detail: null,\r\n            };\r\n            var evt = document.createEvent('CustomEvent');\r\n            evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\r\n            return evt;\r\n        }\r\n        window.CustomEvent = CustomEvent;\r\n    })();\r\n    (function () {\r\n        if (!Element.prototype.matches) {\r\n            Element.prototype.matches =\r\n                Element.prototype.msMatchesSelector ||\r\n                    Element.prototype.webkitMatchesSelector;\r\n        }\r\n    })();\r\n}\r\nvar lgQuery = /** @class */ (function () {\r\n    function lgQuery(selector) {\r\n        this.cssVenderPrefixes = [\r\n            'TransitionDuration',\r\n            'TransitionTimingFunction',\r\n            'Transform',\r\n            'Transition',\r\n        ];\r\n        this.selector = this._getSelector(selector);\r\n        this.firstElement = this._getFirstEl();\r\n        return this;\r\n    }\r\n    lgQuery.generateUUID = function () {\r\n        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n            var r = (Math.random() * 16) | 0, v = c == 'x' ? r : (r & 0x3) | 0x8;\r\n            return v.toString(16);\r\n        });\r\n    };\r\n    lgQuery.prototype._getSelector = function (selector, context) {\r\n        if (context === void 0) { context = document; }\r\n        if (typeof selector !== 'string') {\r\n            return selector;\r\n        }\r\n        context = context || document;\r\n        var fl = selector.substring(0, 1);\r\n        if (fl === '#') {\r\n            return context.querySelector(selector);\r\n        }\r\n        else {\r\n            return context.querySelectorAll(selector);\r\n        }\r\n    };\r\n    lgQuery.prototype._each = function (func) {\r\n        if (!this.selector) {\r\n            return this;\r\n        }\r\n        if (this.selector.length !== undefined) {\r\n            [].forEach.call(this.selector, func);\r\n        }\r\n        else {\r\n            func(this.selector, 0);\r\n        }\r\n        return this;\r\n    };\r\n    lgQuery.prototype._setCssVendorPrefix = function (el, cssProperty, value) {\r\n        // prettier-ignore\r\n        var property = cssProperty.replace(/-([a-z])/gi, function (s, group1) {\r\n            return group1.toUpperCase();\r\n        });\r\n        if (this.cssVenderPrefixes.indexOf(property) !== -1) {\r\n            el.style[property.charAt(0).toLowerCase() + property.slice(1)] = value;\r\n            el.style['webkit' + property] = value;\r\n            el.style['moz' + property] = value;\r\n            el.style['ms' + property] = value;\r\n            el.style['o' + property] = value;\r\n        }\r\n        else {\r\n            el.style[property] = value;\r\n        }\r\n    };\r\n    lgQuery.prototype._getFirstEl = function () {\r\n        if (this.selector && this.selector.length !== undefined) {\r\n            return this.selector[0];\r\n        }\r\n        else {\r\n            return this.selector;\r\n        }\r\n    };\r\n    lgQuery.prototype.isEventMatched = function (event, eventName) {\r\n        var eventNamespace = eventName.split('.');\r\n        return event\r\n            .split('.')\r\n            .filter(function (e) { return e; })\r\n            .every(function (e) {\r\n            return eventNamespace.indexOf(e) !== -1;\r\n        });\r\n    };\r\n    lgQuery.prototype.attr = function (attr, value) {\r\n        if (value === undefined) {\r\n            if (!this.firstElement) {\r\n                return '';\r\n            }\r\n            return this.firstElement.getAttribute(attr);\r\n        }\r\n        this._each(function (el) {\r\n            el.setAttribute(attr, value);\r\n        });\r\n        return this;\r\n    };\r\n    lgQuery.prototype.find = function (selector) {\r\n        return $LG(this._getSelector(selector, this.selector));\r\n    };\r\n    lgQuery.prototype.first = function () {\r\n        if (this.selector && this.selector.length !== undefined) {\r\n            return $LG(this.selector[0]);\r\n        }\r\n        else {\r\n            return $LG(this.selector);\r\n        }\r\n    };\r\n    lgQuery.prototype.eq = function (index) {\r\n        return $LG(this.selector[index]);\r\n    };\r\n    lgQuery.prototype.parent = function () {\r\n        return $LG(this.selector.parentElement);\r\n    };\r\n    lgQuery.prototype.get = function () {\r\n        return this._getFirstEl();\r\n    };\r\n    lgQuery.prototype.removeAttr = function (attributes) {\r\n        var attrs = attributes.split(' ');\r\n        this._each(function (el) {\r\n            attrs.forEach(function (attr) { return el.removeAttribute(attr); });\r\n        });\r\n        return this;\r\n    };\r\n    lgQuery.prototype.wrap = function (className) {\r\n        if (!this.firstElement) {\r\n            return this;\r\n        }\r\n        var wrapper = document.createElement('div');\r\n        wrapper.className = className;\r\n        this.firstElement.parentNode.insertBefore(wrapper, this.firstElement);\r\n        this.firstElement.parentNode.removeChild(this.firstElement);\r\n        wrapper.appendChild(this.firstElement);\r\n        return this;\r\n    };\r\n    lgQuery.prototype.addClass = function (classNames) {\r\n        if (classNames === void 0) { classNames = ''; }\r\n        this._each(function (el) {\r\n            // IE doesn't support multiple arguments\r\n            classNames.split(' ').forEach(function (className) {\r\n                if (className) {\r\n                    el.classList.add(className);\r\n                }\r\n            });\r\n        });\r\n        return this;\r\n    };\r\n    lgQuery.prototype.removeClass = function (classNames) {\r\n        this._each(function (el) {\r\n            // IE doesn't support multiple arguments\r\n            classNames.split(' ').forEach(function (className) {\r\n                if (className) {\r\n                    el.classList.remove(className);\r\n                }\r\n            });\r\n        });\r\n        return this;\r\n    };\r\n    lgQuery.prototype.hasClass = function (className) {\r\n        if (!this.firstElement) {\r\n            return false;\r\n        }\r\n        return this.firstElement.classList.contains(className);\r\n    };\r\n    lgQuery.prototype.hasAttribute = function (attribute) {\r\n        if (!this.firstElement) {\r\n            return false;\r\n        }\r\n        return this.firstElement.hasAttribute(attribute);\r\n    };\r\n    lgQuery.prototype.toggleClass = function (className) {\r\n        if (!this.firstElement) {\r\n            return this;\r\n        }\r\n        if (this.hasClass(className)) {\r\n            this.removeClass(className);\r\n        }\r\n        else {\r\n            this.addClass(className);\r\n        }\r\n        return this;\r\n    };\r\n    lgQuery.prototype.css = function (property, value) {\r\n        var _this = this;\r\n        this._each(function (el) {\r\n            _this._setCssVendorPrefix(el, property, value);\r\n        });\r\n        return this;\r\n    };\r\n    // Need to pass separate namespaces for separate elements\r\n    lgQuery.prototype.on = function (events, listener) {\r\n        var _this = this;\r\n        if (!this.selector) {\r\n            return this;\r\n        }\r\n        events.split(' ').forEach(function (event) {\r\n            if (!Array.isArray(lgQuery.eventListeners[event])) {\r\n                lgQuery.eventListeners[event] = [];\r\n            }\r\n            lgQuery.eventListeners[event].push(listener);\r\n            _this.selector.addEventListener(event.split('.')[0], listener);\r\n        });\r\n        return this;\r\n    };\r\n    // @todo - test this\r\n    lgQuery.prototype.once = function (event, listener) {\r\n        var _this = this;\r\n        this.on(event, function () {\r\n            _this.off(event);\r\n            listener(event);\r\n        });\r\n        return this;\r\n    };\r\n    lgQuery.prototype.off = function (event) {\r\n        var _this = this;\r\n        if (!this.selector) {\r\n            return this;\r\n        }\r\n        Object.keys(lgQuery.eventListeners).forEach(function (eventName) {\r\n            if (_this.isEventMatched(event, eventName)) {\r\n                lgQuery.eventListeners[eventName].forEach(function (listener) {\r\n                    _this.selector.removeEventListener(eventName.split('.')[0], listener);\r\n                });\r\n                lgQuery.eventListeners[eventName] = [];\r\n            }\r\n        });\r\n        return this;\r\n    };\r\n    lgQuery.prototype.trigger = function (event, detail) {\r\n        if (!this.firstElement) {\r\n            return this;\r\n        }\r\n        var customEvent = new CustomEvent(event.split('.')[0], {\r\n            detail: detail || null,\r\n        });\r\n        this.firstElement.dispatchEvent(customEvent);\r\n        return this;\r\n    };\r\n    // Does not support IE\r\n    lgQuery.prototype.load = function (url) {\r\n        var _this = this;\r\n        fetch(url)\r\n            .then(function (res) { return res.text(); })\r\n            .then(function (html) {\r\n            _this.selector.innerHTML = html;\r\n        });\r\n        return this;\r\n    };\r\n    lgQuery.prototype.html = function (html) {\r\n        if (html === undefined) {\r\n            if (!this.firstElement) {\r\n                return '';\r\n            }\r\n            return this.firstElement.innerHTML;\r\n        }\r\n        this._each(function (el) {\r\n            el.innerHTML = html;\r\n        });\r\n        return this;\r\n    };\r\n    lgQuery.prototype.append = function (html) {\r\n        this._each(function (el) {\r\n            if (typeof html === 'string') {\r\n                el.insertAdjacentHTML('beforeend', html);\r\n            }\r\n            else {\r\n                el.appendChild(html);\r\n            }\r\n        });\r\n        return this;\r\n    };\r\n    lgQuery.prototype.prepend = function (html) {\r\n        this._each(function (el) {\r\n            if (typeof html === 'string') {\r\n                el.insertAdjacentHTML('afterbegin', html);\r\n            }\r\n            else if (html instanceof HTMLElement) {\r\n                el.insertBefore(html.cloneNode(true), el.firstChild);\r\n            }\r\n        });\r\n        return this;\r\n    };\r\n    lgQuery.prototype.remove = function () {\r\n        this._each(function (el) {\r\n            el.parentNode.removeChild(el);\r\n        });\r\n        return this;\r\n    };\r\n    lgQuery.prototype.empty = function () {\r\n        this._each(function (el) {\r\n            el.innerHTML = '';\r\n        });\r\n        return this;\r\n    };\r\n    lgQuery.prototype.scrollTop = function (scrollTop) {\r\n        if (scrollTop !== undefined) {\r\n            document.body.scrollTop = scrollTop;\r\n            document.documentElement.scrollTop = scrollTop;\r\n            return this;\r\n        }\r\n        else {\r\n            return (window.pageYOffset ||\r\n                document.documentElement.scrollTop ||\r\n                document.body.scrollTop ||\r\n                0);\r\n        }\r\n    };\r\n    lgQuery.prototype.scrollLeft = function (scrollLeft) {\r\n        if (scrollLeft !== undefined) {\r\n            document.body.scrollLeft = scrollLeft;\r\n            document.documentElement.scrollLeft = scrollLeft;\r\n            return this;\r\n        }\r\n        else {\r\n            return (window.pageXOffset ||\r\n                document.documentElement.scrollLeft ||\r\n                document.body.scrollLeft ||\r\n                0);\r\n        }\r\n    };\r\n    lgQuery.prototype.offset = function () {\r\n        if (!this.firstElement) {\r\n            return {\r\n                left: 0,\r\n                top: 0,\r\n            };\r\n        }\r\n        var rect = this.firstElement.getBoundingClientRect();\r\n        var bodyMarginLeft = $LG('body').style().marginLeft;\r\n        // Minus body margin - https://stackoverflow.com/questions/30711548/is-getboundingclientrect-left-returning-a-wrong-value\r\n        return {\r\n            left: rect.left - parseFloat(bodyMarginLeft) + this.scrollLeft(),\r\n            top: rect.top + this.scrollTop(),\r\n        };\r\n    };\r\n    lgQuery.prototype.style = function () {\r\n        if (!this.firstElement) {\r\n            return {};\r\n        }\r\n        return (this.firstElement.currentStyle ||\r\n            window.getComputedStyle(this.firstElement));\r\n    };\r\n    // Width without padding and border even if box-sizing is used.\r\n    lgQuery.prototype.width = function () {\r\n        var style = this.style();\r\n        return (this.firstElement.clientWidth -\r\n            parseFloat(style.paddingLeft) -\r\n            parseFloat(style.paddingRight));\r\n    };\r\n    // Height without padding and border even if box-sizing is used.\r\n    lgQuery.prototype.height = function () {\r\n        var style = this.style();\r\n        return (this.firstElement.clientHeight -\r\n            parseFloat(style.paddingTop) -\r\n            parseFloat(style.paddingBottom));\r\n    };\r\n    lgQuery.eventListeners = {};\r\n    return lgQuery;\r\n}());\r\nfunction $LG(selector) {\r\n    initLgPolyfills();\r\n    return new lgQuery(selector);\r\n}\n\nvar defaultDynamicOptions = [\r\n    'src',\r\n    'sources',\r\n    'subHtml',\r\n    'subHtmlUrl',\r\n    'html',\r\n    'video',\r\n    'poster',\r\n    'slideName',\r\n    'responsive',\r\n    'srcset',\r\n    'sizes',\r\n    'iframe',\r\n    'downloadUrl',\r\n    'download',\r\n    'width',\r\n    'facebookShareUrl',\r\n    'tweetText',\r\n    'iframeTitle',\r\n    'twitterShareUrl',\r\n    'pinterestShareUrl',\r\n    'pinterestText',\r\n    'fbHtml',\r\n    'disqusIdentifier',\r\n    'disqusUrl',\r\n];\r\n// Convert html data-attribute to camalcase\r\nfunction convertToData(attr) {\r\n    // FInd a way for lgsize\r\n    if (attr === 'href') {\r\n        return 'src';\r\n    }\r\n    attr = attr.replace('data-', '');\r\n    attr = attr.charAt(0).toLowerCase() + attr.slice(1);\r\n    attr = attr.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase(); });\r\n    return attr;\r\n}\r\nvar utils = {\r\n    /**\r\n     * Fetches HTML content from a given URL and inserts it into a specified element.\r\n     *\r\n     * @param url - The URL to fetch the HTML content from.\r\n     * @param element - The DOM element (jQuery object) to insert the HTML content into.\r\n     * @param insertMethod - The method to insert the HTML ('append' or 'replace').\r\n     */\r\n    fetchCaptionFromUrl: function (url, element, insertMethod) {\r\n        // Fetch content from the URL\r\n        fetch(url)\r\n            .then(function (response) { return response.text(); })\r\n            .then(function (htmlContent) {\r\n            if (insertMethod === 'append') {\r\n                var contentDiv = \"<div class=\\\"lg-sub-html\\\">\" + htmlContent + \"</div>\";\r\n                element.append(contentDiv);\r\n            }\r\n            else {\r\n                element.html(htmlContent);\r\n            }\r\n        });\r\n    },\r\n    /**\r\n     * get possible width and height from the lgSize attribute. Used for ZoomFromOrigin option\r\n     */\r\n    getSize: function (el, container, spacing, defaultLgSize) {\r\n        if (spacing === void 0) { spacing = 0; }\r\n        var LGel = $LG(el);\r\n        var lgSize = LGel.attr('data-lg-size') || defaultLgSize;\r\n        if (!lgSize) {\r\n            return;\r\n        }\r\n        var isResponsiveSizes = lgSize.split(',');\r\n        // if at-least two viewport sizes are available\r\n        if (isResponsiveSizes[1]) {\r\n            var wWidth = window.innerWidth;\r\n            for (var i = 0; i < isResponsiveSizes.length; i++) {\r\n                var size_1 = isResponsiveSizes[i];\r\n                var responsiveWidth = parseInt(size_1.split('-')[2], 10);\r\n                if (responsiveWidth > wWidth) {\r\n                    lgSize = size_1;\r\n                    break;\r\n                }\r\n                // take last item as last option\r\n                if (i === isResponsiveSizes.length - 1) {\r\n                    lgSize = size_1;\r\n                }\r\n            }\r\n        }\r\n        var size = lgSize.split('-');\r\n        var width = parseInt(size[0], 10);\r\n        var height = parseInt(size[1], 10);\r\n        var cWidth = container.width();\r\n        var cHeight = container.height() - spacing;\r\n        var maxWidth = Math.min(cWidth, width);\r\n        var maxHeight = Math.min(cHeight, height);\r\n        var ratio = Math.min(maxWidth / width, maxHeight / height);\r\n        return { width: width * ratio, height: height * ratio };\r\n    },\r\n    /**\r\n     * @desc Get transform value based on the imageSize. Used for ZoomFromOrigin option\r\n     * @param {jQuery Element}\r\n     * @returns {String} Transform CSS string\r\n     */\r\n    getTransform: function (el, container, top, bottom, imageSize) {\r\n        if (!imageSize) {\r\n            return;\r\n        }\r\n        var LGel = $LG(el).find('img').first();\r\n        if (!LGel.get()) {\r\n            return;\r\n        }\r\n        var containerRect = container.get().getBoundingClientRect();\r\n        var wWidth = containerRect.width;\r\n        // using innerWidth to include mobile safari bottom bar\r\n        var wHeight = container.height() - (top + bottom);\r\n        var elWidth = LGel.width();\r\n        var elHeight = LGel.height();\r\n        var elStyle = LGel.style();\r\n        var x = (wWidth - elWidth) / 2 -\r\n            LGel.offset().left +\r\n            (parseFloat(elStyle.paddingLeft) || 0) +\r\n            (parseFloat(elStyle.borderLeft) || 0) +\r\n            $LG(window).scrollLeft() +\r\n            containerRect.left;\r\n        var y = (wHeight - elHeight) / 2 -\r\n            LGel.offset().top +\r\n            (parseFloat(elStyle.paddingTop) || 0) +\r\n            (parseFloat(elStyle.borderTop) || 0) +\r\n            $LG(window).scrollTop() +\r\n            top;\r\n        var scX = elWidth / imageSize.width;\r\n        var scY = elHeight / imageSize.height;\r\n        var transform = 'translate3d(' +\r\n            (x *= -1) +\r\n            'px, ' +\r\n            (y *= -1) +\r\n            'px, 0) scale3d(' +\r\n            scX +\r\n            ', ' +\r\n            scY +\r\n            ', 1)';\r\n        return transform;\r\n    },\r\n    getIframeMarkup: function (iframeWidth, iframeHeight, iframeMaxWidth, iframeMaxHeight, src, iframeTitle) {\r\n        var title = iframeTitle ? 'title=\"' + iframeTitle + '\"' : '';\r\n        return \"<div class=\\\"lg-media-cont lg-has-iframe\\\" style=\\\"width:\" + iframeWidth + \"; max-width:\" + iframeMaxWidth + \"; height: \" + iframeHeight + \"; max-height:\" + iframeMaxHeight + \"\\\">\\n                    <iframe class=\\\"lg-object\\\" frameborder=\\\"0\\\" \" + title + \" src=\\\"\" + src + \"\\\"  allowfullscreen=\\\"true\\\"></iframe>\\n                </div>\";\r\n    },\r\n    getImgMarkup: function (index, src, altAttr, srcset, sizes, sources) {\r\n        var srcsetAttr = srcset ? \"srcset=\\\"\" + srcset + \"\\\"\" : '';\r\n        var sizesAttr = sizes ? \"sizes=\\\"\" + sizes + \"\\\"\" : '';\r\n        var imgMarkup = \"<img \" + altAttr + \" \" + srcsetAttr + \"  \" + sizesAttr + \" class=\\\"lg-object lg-image\\\" data-index=\\\"\" + index + \"\\\" src=\\\"\" + src + \"\\\" />\";\r\n        var sourceTag = '';\r\n        if (sources) {\r\n            var sourceObj = typeof sources === 'string' ? JSON.parse(sources) : sources;\r\n            sourceTag = sourceObj.map(function (source) {\r\n                var attrs = '';\r\n                Object.keys(source).forEach(function (key) {\r\n                    // Do not remove the first space as it is required to separate the attributes\r\n                    attrs += \" \" + key + \"=\\\"\" + source[key] + \"\\\"\";\r\n                });\r\n                return \"<source \" + attrs + \"></source>\";\r\n            });\r\n        }\r\n        return \"\" + sourceTag + imgMarkup;\r\n    },\r\n    // Get src from responsive src\r\n    getResponsiveSrc: function (srcItms) {\r\n        var rsWidth = [];\r\n        var rsSrc = [];\r\n        var src = '';\r\n        for (var i = 0; i < srcItms.length; i++) {\r\n            var _src = srcItms[i].split(' ');\r\n            // Manage empty space\r\n            if (_src[0] === '') {\r\n                _src.splice(0, 1);\r\n            }\r\n            rsSrc.push(_src[0]);\r\n            rsWidth.push(_src[1]);\r\n        }\r\n        var wWidth = window.innerWidth;\r\n        for (var j = 0; j < rsWidth.length; j++) {\r\n            if (parseInt(rsWidth[j], 10) > wWidth) {\r\n                src = rsSrc[j];\r\n                break;\r\n            }\r\n        }\r\n        return src;\r\n    },\r\n    isImageLoaded: function (img) {\r\n        if (!img)\r\n            return false;\r\n        // During the onload event, IE correctly identifies any images that\r\n        // weren’t downloaded as not complete. Others should too. Gecko-based\r\n        // browsers act like NS4 in that they report this incorrectly.\r\n        if (!img.complete) {\r\n            return false;\r\n        }\r\n        // However, they do have two very useful properties: naturalWidth and\r\n        // naturalHeight. These give the true size of the image. If it failed\r\n        // to load, either of these should be zero.\r\n        if (img.naturalWidth === 0) {\r\n            return false;\r\n        }\r\n        // No other way of checking: assume it’s ok.\r\n        return true;\r\n    },\r\n    getVideoPosterMarkup: function (_poster, dummyImg, videoContStyle, playVideoString, _isVideo) {\r\n        var videoClass = '';\r\n        if (_isVideo && _isVideo.youtube) {\r\n            videoClass = 'lg-has-youtube';\r\n        }\r\n        else if (_isVideo && _isVideo.vimeo) {\r\n            videoClass = 'lg-has-vimeo';\r\n        }\r\n        else {\r\n            videoClass = 'lg-has-html5';\r\n        }\r\n        var _dummy = dummyImg;\r\n        if (typeof dummyImg !== 'string') {\r\n            _dummy = dummyImg.outerHTML;\r\n        }\r\n        return \"<div class=\\\"lg-video-cont \" + videoClass + \"\\\" style=\\\"\" + videoContStyle + \"\\\">\\n                <div class=\\\"lg-video-play-button\\\">\\n                <svg\\n                    viewBox=\\\"0 0 20 20\\\"\\n                    preserveAspectRatio=\\\"xMidYMid\\\"\\n                    focusable=\\\"false\\\"\\n                    aria-labelledby=\\\"\" + playVideoString + \"\\\"\\n                    role=\\\"img\\\"\\n                    class=\\\"lg-video-play-icon\\\"\\n                >\\n                    <title>\" + playVideoString + \"</title>\\n                    <polygon class=\\\"lg-video-play-icon-inner\\\" points=\\\"1,0 20,10 1,20\\\"></polygon>\\n                </svg>\\n                <svg class=\\\"lg-video-play-icon-bg\\\" viewBox=\\\"0 0 50 50\\\" focusable=\\\"false\\\">\\n                    <circle cx=\\\"50%\\\" cy=\\\"50%\\\" r=\\\"20\\\"></circle></svg>\\n                <svg class=\\\"lg-video-play-icon-circle\\\" viewBox=\\\"0 0 50 50\\\" focusable=\\\"false\\\">\\n                    <circle cx=\\\"50%\\\" cy=\\\"50%\\\" r=\\\"20\\\"></circle>\\n                </svg>\\n            </div>\\n            \" + _dummy + \"\\n            <img class=\\\"lg-object lg-video-poster\\\" src=\\\"\" + _poster + \"\\\" />\\n        </div>\";\r\n    },\r\n    getFocusableElements: function (container) {\r\n        var elements = container.querySelectorAll('a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type=\"text\"]:not([disabled]), input[type=\"radio\"]:not([disabled]), input[type=\"checkbox\"]:not([disabled]), select:not([disabled])');\r\n        var visibleElements = [].filter.call(elements, function (element) {\r\n            var style = window.getComputedStyle(element);\r\n            return style.display !== 'none' && style.visibility !== 'hidden';\r\n        });\r\n        return visibleElements;\r\n    },\r\n    /**\r\n     * @desc Create dynamic elements array from gallery items when dynamic option is false\r\n     * It helps to avoid frequent DOM interaction\r\n     * and avoid multiple checks for dynamic elments\r\n     *\r\n     * @returns {Array} dynamicEl\r\n     */\r\n    getDynamicOptions: function (items, extraProps, getCaptionFromTitleOrAlt, exThumbImage) {\r\n        var dynamicElements = [];\r\n        var availableDynamicOptions = __spreadArrays(defaultDynamicOptions, extraProps);\r\n        [].forEach.call(items, function (item) {\r\n            var dynamicEl = {};\r\n            for (var i = 0; i < item.attributes.length; i++) {\r\n                var attr = item.attributes[i];\r\n                if (attr.specified) {\r\n                    var dynamicAttr = convertToData(attr.name);\r\n                    var label = '';\r\n                    if (availableDynamicOptions.indexOf(dynamicAttr) > -1) {\r\n                        label = dynamicAttr;\r\n                    }\r\n                    if (label) {\r\n                        dynamicEl[label] = attr.value;\r\n                    }\r\n                }\r\n            }\r\n            var currentItem = $LG(item);\r\n            var alt = currentItem.find('img').first().attr('alt');\r\n            var title = currentItem.attr('title');\r\n            var thumb = exThumbImage\r\n                ? currentItem.attr(exThumbImage)\r\n                : currentItem.find('img').first().attr('src');\r\n            dynamicEl.thumb = thumb;\r\n            if (getCaptionFromTitleOrAlt && !dynamicEl.subHtml) {\r\n                dynamicEl.subHtml = title || alt || '';\r\n            }\r\n            dynamicEl.alt = alt || title || '';\r\n            dynamicElements.push(dynamicEl);\r\n        });\r\n        return dynamicElements;\r\n    },\r\n    isMobile: function () {\r\n        return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);\r\n    },\r\n    /**\r\n     * @desc Check the given src is video\r\n     * @param {String} src\r\n     * @return {Object} video type\r\n     * Ex:{ youtube  :  [\"//www.youtube.com/watch?v=c0asJgSyxcY\", \"c0asJgSyxcY\"] }\r\n     *\r\n     * @todo - this information can be moved to dynamicEl to avoid frequent calls\r\n     */\r\n    isVideo: function (src, isHTML5VIdeo, index) {\r\n        if (!src) {\r\n            if (isHTML5VIdeo) {\r\n                return {\r\n                    html5: true,\r\n                };\r\n            }\r\n            else {\r\n                console.error('lightGallery :- data-src is not provided on slide item ' +\r\n                    (index + 1) +\r\n                    '. Please make sure the selector property is properly configured. More info - https://www.lightgalleryjs.com/demos/html-markup/');\r\n                return;\r\n            }\r\n        }\r\n        var youtube = src.match(/\\/\\/(?:www\\.)?youtu(?:\\.be|be\\.com|be-nocookie\\.com)\\/(?:watch\\?v=|embed\\/)?([a-z0-9\\-\\_\\%]+)([\\&|?][\\S]*)*/i);\r\n        var vimeo = src.match(/\\/\\/(?:www\\.)?(?:player\\.)?vimeo.com\\/(?:video\\/)?([0-9a-z\\-_]+)(.*)?/i);\r\n        var wistia = src.match(/https?:\\/\\/(.+)?(wistia\\.com|wi\\.st)\\/(medias|embed)\\/([0-9a-z\\-_]+)(.*)/);\r\n        if (youtube) {\r\n            return {\r\n                youtube: youtube,\r\n            };\r\n        }\r\n        else if (vimeo) {\r\n            return {\r\n                vimeo: vimeo,\r\n            };\r\n        }\r\n        else if (wistia) {\r\n            return {\r\n                wistia: wistia,\r\n            };\r\n        }\r\n    },\r\n};\n\n// @ref - https://stackoverflow.com/questions/3971841/how-to-resize-images-proportionally-keeping-the-aspect-ratio\r\n// @ref - https://2ality.com/2017/04/setting-up-multi-platform-packages.html\r\n// Unique id for each gallery\r\nvar lgId = 0;\r\nvar LightGallery = /** @class */ (function () {\r\n    function LightGallery(element, options) {\r\n        this.lgOpened = false;\r\n        this.index = 0;\r\n        // lightGallery modules\r\n        this.plugins = [];\r\n        // false when lightGallery load first slide content;\r\n        this.lGalleryOn = false;\r\n        // True when a slide animation is in progress\r\n        this.lgBusy = false;\r\n        this.currentItemsInDom = [];\r\n        // Scroll top value before lightGallery is opened\r\n        this.prevScrollTop = 0;\r\n        this.bodyPaddingRight = 0;\r\n        this.isDummyImageRemoved = false;\r\n        this.dragOrSwipeEnabled = false;\r\n        this.mediaContainerPosition = {\r\n            top: 0,\r\n            bottom: 0,\r\n        };\r\n        if (!element) {\r\n            return this;\r\n        }\r\n        lgId++;\r\n        this.lgId = lgId;\r\n        this.el = element;\r\n        this.LGel = $LG(element);\r\n        this.generateSettings(options);\r\n        this.buildModules();\r\n        // When using dynamic mode, ensure dynamicEl is an array\r\n        if (this.settings.dynamic &&\r\n            this.settings.dynamicEl !== undefined &&\r\n            !Array.isArray(this.settings.dynamicEl)) {\r\n            throw 'When using dynamic mode, you must also define dynamicEl as an Array.';\r\n        }\r\n        this.galleryItems = this.getItems();\r\n        this.normalizeSettings();\r\n        // Gallery items\r\n        this.init();\r\n        this.validateLicense();\r\n        return this;\r\n    }\r\n    LightGallery.prototype.generateSettings = function (options) {\r\n        // lightGallery settings\r\n        this.settings = __assign(__assign({}, lightGalleryCoreSettings), options);\r\n        if (this.settings.isMobile &&\r\n            typeof this.settings.isMobile === 'function'\r\n            ? this.settings.isMobile()\r\n            : utils.isMobile()) {\r\n            var mobileSettings = __assign(__assign({}, this.settings.mobileSettings), this.settings.mobileSettings);\r\n            this.settings = __assign(__assign({}, this.settings), mobileSettings);\r\n        }\r\n    };\r\n    LightGallery.prototype.normalizeSettings = function () {\r\n        if (this.settings.slideEndAnimation) {\r\n            this.settings.hideControlOnEnd = false;\r\n        }\r\n        if (!this.settings.closable) {\r\n            this.settings.swipeToClose = false;\r\n        }\r\n        // And reset it on close to get the correct value next time\r\n        this.zoomFromOrigin = this.settings.zoomFromOrigin;\r\n        // At the moment, Zoom from image doesn't support dynamic options\r\n        // @todo add zoomFromOrigin support for dynamic images\r\n        if (this.settings.dynamic) {\r\n            this.zoomFromOrigin = false;\r\n        }\r\n        if (this.settings.container) {\r\n            var container = this.settings.container;\r\n            if (typeof container === 'function') {\r\n                this.settings.container = container();\r\n            }\r\n            else if (typeof container === 'string') {\r\n                var el = document.querySelector(container);\r\n                this.settings.container = el !== null && el !== void 0 ? el : document.body;\r\n            }\r\n        }\r\n        else {\r\n            this.settings.container = document.body;\r\n        }\r\n        // settings.preload should not be grater than $item.length\r\n        this.settings.preload = Math.min(this.settings.preload, this.galleryItems.length);\r\n    };\r\n    LightGallery.prototype.init = function () {\r\n        var _this = this;\r\n        this.addSlideVideoInfo(this.galleryItems);\r\n        this.buildStructure();\r\n        this.LGel.trigger(lGEvents.init, {\r\n            instance: this,\r\n        });\r\n        if (this.settings.keyPress) {\r\n            this.keyPress();\r\n        }\r\n        setTimeout(function () {\r\n            _this.enableDrag();\r\n            _this.enableSwipe();\r\n            _this.triggerPosterClick();\r\n        }, 50);\r\n        this.arrow();\r\n        if (this.settings.mousewheel) {\r\n            this.mousewheel();\r\n        }\r\n        if (!this.settings.dynamic) {\r\n            this.openGalleryOnItemClick();\r\n        }\r\n    };\r\n    LightGallery.prototype.openGalleryOnItemClick = function () {\r\n        var _this = this;\r\n        var _loop_1 = function (index) {\r\n            var element = this_1.items[index];\r\n            var $element = $LG(element);\r\n            // Using different namespace for click because click event should not unbind if selector is same object('this')\r\n            // @todo manage all event listners - should have namespace that represent element\r\n            var uuid = lgQuery.generateUUID();\r\n            $element\r\n                .attr('data-lg-id', uuid)\r\n                .on(\"click.lgcustom-item-\" + uuid, function (e) {\r\n                e.preventDefault();\r\n                var currentItemIndex = _this.settings.index || index;\r\n                _this.openGallery(currentItemIndex, element);\r\n            });\r\n        };\r\n        var this_1 = this;\r\n        // Using for loop instead of using bubbling as the items can be any html element.\r\n        for (var index = 0; index < this.items.length; index++) {\r\n            _loop_1(index);\r\n        }\r\n    };\r\n    /**\r\n     * Module constructor\r\n     * Modules are build incrementally.\r\n     * Gallery should be opened only once all the modules are initialized.\r\n     * use moduleBuildTimeout to make sure this\r\n     */\r\n    LightGallery.prototype.buildModules = function () {\r\n        var _this = this;\r\n        this.settings.plugins.forEach(function (plugin) {\r\n            _this.plugins.push(new plugin(_this, $LG));\r\n        });\r\n    };\r\n    LightGallery.prototype.validateLicense = function () {\r\n        if (!this.settings.licenseKey) {\r\n            console.error('Please provide a valid license key');\r\n        }\r\n        else if (this.settings.licenseKey === '0000-0000-000-0000') {\r\n            console.warn(\"lightGallery: \" + this.settings.licenseKey + \" license key is not valid for production use\");\r\n        }\r\n    };\r\n    LightGallery.prototype.getSlideItem = function (index) {\r\n        return $LG(this.getSlideItemId(index));\r\n    };\r\n    LightGallery.prototype.getSlideItemId = function (index) {\r\n        return \"#lg-item-\" + this.lgId + \"-\" + index;\r\n    };\r\n    LightGallery.prototype.getIdName = function (id) {\r\n        return id + \"-\" + this.lgId;\r\n    };\r\n    LightGallery.prototype.getElementById = function (id) {\r\n        return $LG(\"#\" + this.getIdName(id));\r\n    };\r\n    LightGallery.prototype.manageSingleSlideClassName = function () {\r\n        if (this.galleryItems.length < 2) {\r\n            this.outer.addClass('lg-single-item');\r\n        }\r\n        else {\r\n            this.outer.removeClass('lg-single-item');\r\n        }\r\n    };\r\n    LightGallery.prototype.buildStructure = function () {\r\n        var _this = this;\r\n        var container = this.$container && this.$container.get();\r\n        if (container) {\r\n            return;\r\n        }\r\n        var controls = '';\r\n        var subHtmlCont = '';\r\n        // Create controls\r\n        if (this.settings.controls) {\r\n            controls = \"<button type=\\\"button\\\" id=\\\"\" + this.getIdName('lg-prev') + \"\\\" aria-label=\\\"\" + this.settings.strings['previousSlide'] + \"\\\" class=\\\"lg-prev lg-icon\\\"> \" + this.settings.prevHtml + \" </button>\\n                <button type=\\\"button\\\" id=\\\"\" + this.getIdName('lg-next') + \"\\\" aria-label=\\\"\" + this.settings.strings['nextSlide'] + \"\\\" class=\\\"lg-next lg-icon\\\"> \" + this.settings.nextHtml + \" </button>\";\r\n        }\r\n        if (this.settings.appendSubHtmlTo !== '.lg-item') {\r\n            subHtmlCont =\r\n                '<div class=\"lg-sub-html\" role=\"status\" aria-live=\"polite\"></div>';\r\n        }\r\n        var addClasses = '';\r\n        if (this.settings.allowMediaOverlap) {\r\n            // Do not remove space before last single quote\r\n            addClasses += 'lg-media-overlap ';\r\n        }\r\n        var ariaLabelledby = this.settings.ariaLabelledby\r\n            ? 'aria-labelledby=\"' + this.settings.ariaLabelledby + '\"'\r\n            : '';\r\n        var ariaDescribedby = this.settings.ariaDescribedby\r\n            ? 'aria-describedby=\"' + this.settings.ariaDescribedby + '\"'\r\n            : '';\r\n        var containerClassName = \"lg-container \" + this.settings.addClass + \" \" + (document.body !== this.settings.container ? 'lg-inline' : '');\r\n        var closeIcon = this.settings.closable && this.settings.showCloseIcon\r\n            ? \"<button type=\\\"button\\\" aria-label=\\\"\" + this.settings.strings['closeGallery'] + \"\\\" id=\\\"\" + this.getIdName('lg-close') + \"\\\" class=\\\"lg-close lg-icon\\\"></button>\"\r\n            : '';\r\n        var maximizeIcon = this.settings.showMaximizeIcon\r\n            ? \"<button type=\\\"button\\\" aria-label=\\\"\" + this.settings.strings['toggleMaximize'] + \"\\\" id=\\\"\" + this.getIdName('lg-maximize') + \"\\\" class=\\\"lg-maximize lg-icon\\\"></button>\"\r\n            : '';\r\n        var template = \"\\n        <div class=\\\"\" + containerClassName + \"\\\" id=\\\"\" + this.getIdName('lg-container') + \"\\\" tabindex=\\\"-1\\\" aria-modal=\\\"true\\\" \" + ariaLabelledby + \" \" + ariaDescribedby + \" role=\\\"dialog\\\"\\n        >\\n            <div id=\\\"\" + this.getIdName('lg-backdrop') + \"\\\" class=\\\"lg-backdrop\\\"></div>\\n\\n            <div id=\\\"\" + this.getIdName('lg-outer') + \"\\\" class=\\\"lg-outer lg-use-css3 lg-css3 lg-hide-items \" + addClasses + \" \\\">\\n\\n              <div id=\\\"\" + this.getIdName('lg-content') + \"\\\" class=\\\"lg-content\\\">\\n                <div id=\\\"\" + this.getIdName('lg-inner') + \"\\\" class=\\\"lg-inner\\\">\\n                </div>\\n                \" + controls + \"\\n              </div>\\n                <div id=\\\"\" + this.getIdName('lg-toolbar') + \"\\\" class=\\\"lg-toolbar lg-group\\\">\\n                    \" + maximizeIcon + \"\\n                    \" + closeIcon + \"\\n                    </div>\\n                    \" + (this.settings.appendSubHtmlTo === '.lg-outer'\r\n            ? subHtmlCont\r\n            : '') + \"\\n                <div id=\\\"\" + this.getIdName('lg-components') + \"\\\" class=\\\"lg-components\\\">\\n                    \" + (this.settings.appendSubHtmlTo === '.lg-sub-html'\r\n            ? subHtmlCont\r\n            : '') + \"\\n                </div>\\n            </div>\\n        </div>\\n        \";\r\n        $LG(this.settings.container).append(template);\r\n        if (document.body !== this.settings.container) {\r\n            $LG(this.settings.container).css('position', 'relative');\r\n        }\r\n        this.outer = this.getElementById('lg-outer');\r\n        this.$lgComponents = this.getElementById('lg-components');\r\n        this.$backdrop = this.getElementById('lg-backdrop');\r\n        this.$container = this.getElementById('lg-container');\r\n        this.$inner = this.getElementById('lg-inner');\r\n        this.$content = this.getElementById('lg-content');\r\n        this.$toolbar = this.getElementById('lg-toolbar');\r\n        this.$backdrop.css('transition-duration', this.settings.backdropDuration + 'ms');\r\n        var outerClassNames = this.settings.mode + \" \";\r\n        this.manageSingleSlideClassName();\r\n        if (this.settings.enableDrag) {\r\n            outerClassNames += 'lg-grab ';\r\n        }\r\n        this.outer.addClass(outerClassNames);\r\n        this.$inner.css('transition-timing-function', this.settings.easing);\r\n        this.$inner.css('transition-duration', this.settings.speed + 'ms');\r\n        if (this.settings.download) {\r\n            this.$toolbar.append(\"<a id=\\\"\" + this.getIdName('lg-download') + \"\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\" aria-label=\\\"\" + this.settings.strings['download'] + \"\\\" download class=\\\"lg-download lg-icon\\\"></a>\");\r\n        }\r\n        this.counter();\r\n        $LG(window).on(\"resize.lg.global\" + this.lgId + \" orientationchange.lg.global\" + this.lgId, function () {\r\n            _this.refreshOnResize();\r\n        });\r\n        this.hideBars();\r\n        this.manageCloseGallery();\r\n        this.toggleMaximize();\r\n        this.initModules();\r\n    };\r\n    LightGallery.prototype.refreshOnResize = function () {\r\n        if (this.lgOpened) {\r\n            var currentGalleryItem = this.galleryItems[this.index];\r\n            var __slideVideoInfo = currentGalleryItem.__slideVideoInfo;\r\n            this.mediaContainerPosition = this.getMediaContainerPosition();\r\n            var _a = this.mediaContainerPosition, top_1 = _a.top, bottom = _a.bottom;\r\n            this.currentImageSize = utils.getSize(this.items[this.index], this.outer, top_1 + bottom, __slideVideoInfo && this.settings.videoMaxSize);\r\n            if (__slideVideoInfo) {\r\n                this.resizeVideoSlide(this.index, this.currentImageSize);\r\n            }\r\n            if (this.zoomFromOrigin && !this.isDummyImageRemoved) {\r\n                var imgStyle = this.getDummyImgStyles(this.currentImageSize);\r\n                this.outer\r\n                    .find('.lg-current .lg-dummy-img')\r\n                    .first()\r\n                    .attr('style', imgStyle);\r\n            }\r\n            this.LGel.trigger(lGEvents.containerResize);\r\n        }\r\n    };\r\n    LightGallery.prototype.resizeVideoSlide = function (index, imageSize) {\r\n        var lgVideoStyle = this.getVideoContStyle(imageSize);\r\n        var currentSlide = this.getSlideItem(index);\r\n        currentSlide.find('.lg-video-cont').attr('style', lgVideoStyle);\r\n    };\r\n    /**\r\n     * Update slides dynamically.\r\n     * Add, edit or delete slides dynamically when lightGallery is opened.\r\n     * Modify the current gallery items and pass it via updateSlides method\r\n     * @note\r\n     * - Do not mutate existing lightGallery items directly.\r\n     * - Always pass new list of gallery items\r\n     * - You need to take care of thumbnails outside the gallery if any\r\n     * - user this method only if you want to update slides when the gallery is opened. Otherwise, use `refresh()` method.\r\n     * @param items Gallery items\r\n     * @param index After the update operation, which slide gallery should navigate to\r\n     * @category lGPublicMethods\r\n     * @example\r\n     * const plugin = lightGallery();\r\n     *\r\n     * // Adding slides dynamically\r\n     * let galleryItems = [\r\n     * // Access existing lightGallery items\r\n     * // galleryItems are automatically generated internally from the gallery HTML markup\r\n     * // or directly from galleryItems when dynamic gallery is used\r\n     *   ...plugin.galleryItems,\r\n     *     ...[\r\n     *       {\r\n     *         src: 'img/img-1.png',\r\n     *           thumb: 'img/thumb1.png',\r\n     *         },\r\n     *     ],\r\n     *   ];\r\n     *   plugin.updateSlides(\r\n     *     galleryItems,\r\n     *     plugin.index,\r\n     *   );\r\n     *\r\n     *\r\n     * // Remove slides dynamically\r\n     * galleryItems = JSON.parse(\r\n     *   JSON.stringify(updateSlideInstance.galleryItems),\r\n     * );\r\n     * galleryItems.shift();\r\n     * updateSlideInstance.updateSlides(galleryItems, 1);\r\n     * @see <a href=\"/demos/update-slides/\">Demo</a>\r\n     */\r\n    LightGallery.prototype.updateSlides = function (items, index) {\r\n        if (this.index > items.length - 1) {\r\n            this.index = items.length - 1;\r\n        }\r\n        if (items.length === 1) {\r\n            this.index = 0;\r\n        }\r\n        if (!items.length) {\r\n            this.closeGallery();\r\n            return;\r\n        }\r\n        var currentSrc = this.galleryItems[index].src;\r\n        this.galleryItems = items;\r\n        this.updateControls();\r\n        this.$inner.empty();\r\n        this.currentItemsInDom = [];\r\n        var _index = 0;\r\n        // Find the current index based on source value of the slide\r\n        this.galleryItems.some(function (galleryItem, itemIndex) {\r\n            if (galleryItem.src === currentSrc) {\r\n                _index = itemIndex;\r\n                return true;\r\n            }\r\n            return false;\r\n        });\r\n        this.currentItemsInDom = this.organizeSlideItems(_index, -1);\r\n        this.loadContent(_index, true);\r\n        this.getSlideItem(_index).addClass('lg-current');\r\n        this.index = _index;\r\n        this.updateCurrentCounter(_index);\r\n        this.LGel.trigger(lGEvents.updateSlides);\r\n    };\r\n    // Get gallery items based on multiple conditions\r\n    LightGallery.prototype.getItems = function () {\r\n        // Gallery items\r\n        this.items = [];\r\n        if (!this.settings.dynamic) {\r\n            if (this.settings.selector === 'this') {\r\n                this.items.push(this.el);\r\n            }\r\n            else if (this.settings.selector) {\r\n                if (typeof this.settings.selector === 'string') {\r\n                    if (this.settings.selectWithin) {\r\n                        var selectWithin = $LG(this.settings.selectWithin);\r\n                        this.items = selectWithin\r\n                            .find(this.settings.selector)\r\n                            .get();\r\n                    }\r\n                    else {\r\n                        this.items = this.el.querySelectorAll(this.settings.selector);\r\n                    }\r\n                }\r\n                else {\r\n                    this.items = this.settings.selector;\r\n                }\r\n            }\r\n            else {\r\n                this.items = this.el.children;\r\n            }\r\n            return utils.getDynamicOptions(this.items, this.settings.extraProps, this.settings.getCaptionFromTitleOrAlt, this.settings.exThumbImage);\r\n        }\r\n        else {\r\n            return this.settings.dynamicEl || [];\r\n        }\r\n    };\r\n    LightGallery.prototype.shouldHideScrollbar = function () {\r\n        return (this.settings.hideScrollbar &&\r\n            document.body === this.settings.container);\r\n    };\r\n    LightGallery.prototype.hideScrollbar = function () {\r\n        if (!this.shouldHideScrollbar()) {\r\n            return;\r\n        }\r\n        this.bodyPaddingRight = parseFloat($LG('body').style().paddingRight);\r\n        var bodyRect = document.documentElement.getBoundingClientRect();\r\n        var scrollbarWidth = window.innerWidth - bodyRect.width;\r\n        $LG(document.body).css('padding-right', scrollbarWidth + this.bodyPaddingRight + 'px');\r\n        $LG(document.body).addClass('lg-overlay-open');\r\n    };\r\n    LightGallery.prototype.resetScrollBar = function () {\r\n        if (!this.shouldHideScrollbar()) {\r\n            return;\r\n        }\r\n        $LG(document.body).css('padding-right', this.bodyPaddingRight + 'px');\r\n        $LG(document.body).removeClass('lg-overlay-open');\r\n    };\r\n    /**\r\n     * Open lightGallery.\r\n     * Open gallery with specific slide by passing index of the slide as parameter.\r\n     * @category lGPublicMethods\r\n     * @param {Number} index  - index of the slide\r\n     * @param {HTMLElement} element - Which image lightGallery should zoom from\r\n     *\r\n     * @example\r\n     * const $dynamicGallery = document.getElementById('dynamic-gallery-demo');\r\n     * const dynamicGallery = lightGallery($dynamicGallery, {\r\n     *     dynamic: true,\r\n     *     dynamicEl: [\r\n     *         {\r\n     *              src: 'img/1.jpg',\r\n     *              thumb: 'img/thumb-1.jpg',\r\n     *              subHtml: '<h4>Image 1 title</h4><p>Image 1 descriptions.</p>',\r\n     *         },\r\n     *         ...\r\n     *     ],\r\n     * });\r\n     * $dynamicGallery.addEventListener('click', function () {\r\n     *     // Starts with third item.(Optional).\r\n     *     // This is useful if you want use dynamic mode with\r\n     *     // custom thumbnails (thumbnails outside gallery),\r\n     *     dynamicGallery.openGallery(2);\r\n     * });\r\n     *\r\n     */\r\n    LightGallery.prototype.openGallery = function (index, element) {\r\n        var _this = this;\r\n        if (index === void 0) { index = this.settings.index; }\r\n        // prevent accidental double execution\r\n        if (this.lgOpened)\r\n            return;\r\n        this.lgOpened = true;\r\n        this.outer.removeClass('lg-hide-items');\r\n        this.hideScrollbar();\r\n        // Add display block, but still has opacity 0\r\n        this.$container.addClass('lg-show');\r\n        var itemsToBeInsertedToDom = this.getItemsToBeInsertedToDom(index, index);\r\n        this.currentItemsInDom = itemsToBeInsertedToDom;\r\n        var items = '';\r\n        itemsToBeInsertedToDom.forEach(function (item) {\r\n            items = items + (\"<div id=\\\"\" + item + \"\\\" class=\\\"lg-item\\\"></div>\");\r\n        });\r\n        this.$inner.append(items);\r\n        this.addHtml(index);\r\n        var transform = '';\r\n        this.mediaContainerPosition = this.getMediaContainerPosition();\r\n        var _a = this.mediaContainerPosition, top = _a.top, bottom = _a.bottom;\r\n        if (!this.settings.allowMediaOverlap) {\r\n            this.setMediaContainerPosition(top, bottom);\r\n        }\r\n        var __slideVideoInfo = this.galleryItems[index].__slideVideoInfo;\r\n        if (this.zoomFromOrigin && element) {\r\n            this.currentImageSize = utils.getSize(element, this.outer, top + bottom, __slideVideoInfo && this.settings.videoMaxSize);\r\n            transform = utils.getTransform(element, this.outer, top, bottom, this.currentImageSize);\r\n        }\r\n        if (!this.zoomFromOrigin || !transform) {\r\n            this.outer.addClass(this.settings.startClass);\r\n            this.getSlideItem(index).removeClass('lg-complete');\r\n        }\r\n        var timeout = this.settings.zoomFromOrigin\r\n            ? 100\r\n            : this.settings.backdropDuration;\r\n        setTimeout(function () {\r\n            _this.outer.addClass('lg-components-open');\r\n        }, timeout);\r\n        this.index = index;\r\n        this.LGel.trigger(lGEvents.beforeOpen);\r\n        // add class lg-current to remove initial transition\r\n        this.getSlideItem(index).addClass('lg-current');\r\n        this.lGalleryOn = false;\r\n        // Store the current scroll top value to scroll back after closing the gallery..\r\n        this.prevScrollTop = $LG(window).scrollTop();\r\n        setTimeout(function () {\r\n            // Need to check both zoomFromOrigin and transform values as we need to set set the\r\n            // default opening animation if user missed to add the lg-size attribute\r\n            if (_this.zoomFromOrigin && transform) {\r\n                var currentSlide_1 = _this.getSlideItem(index);\r\n                currentSlide_1.css('transform', transform);\r\n                setTimeout(function () {\r\n                    currentSlide_1\r\n                        .addClass('lg-start-progress lg-start-end-progress')\r\n                        .css('transition-duration', _this.settings.startAnimationDuration + 'ms');\r\n                    _this.outer.addClass('lg-zoom-from-image');\r\n                });\r\n                setTimeout(function () {\r\n                    currentSlide_1.css('transform', 'translate3d(0, 0, 0)');\r\n                }, 100);\r\n            }\r\n            setTimeout(function () {\r\n                _this.$backdrop.addClass('in');\r\n                _this.$container.addClass('lg-show-in');\r\n            }, 10);\r\n            setTimeout(function () {\r\n                if (_this.settings.trapFocus &&\r\n                    document.body === _this.settings.container) {\r\n                    _this.trapFocus();\r\n                }\r\n            }, _this.settings.backdropDuration + 50);\r\n            // lg-visible class resets gallery opacity to 1\r\n            if (!_this.zoomFromOrigin || !transform) {\r\n                setTimeout(function () {\r\n                    _this.outer.addClass('lg-visible');\r\n                }, _this.settings.backdropDuration);\r\n            }\r\n            // initiate slide function\r\n            _this.slide(index, false, false, false);\r\n            _this.LGel.trigger(lGEvents.afterOpen);\r\n        });\r\n        if (document.body === this.settings.container) {\r\n            $LG('html').addClass('lg-on');\r\n        }\r\n    };\r\n    /**\r\n     * Note - Changing the position of the media on every slide transition creates a flickering effect.\r\n     * Therefore, The height of the caption is calculated dynamically, only once based on the first slide caption.\r\n     * if you have dynamic captions for each media,\r\n     * you can provide an appropriate height for the captions via allowMediaOverlap option\r\n     */\r\n    LightGallery.prototype.getMediaContainerPosition = function () {\r\n        if (this.settings.allowMediaOverlap) {\r\n            return {\r\n                top: 0,\r\n                bottom: 0,\r\n            };\r\n        }\r\n        var top = this.$toolbar.get().clientHeight || 0;\r\n        var subHtml = this.outer.find('.lg-components .lg-sub-html').get();\r\n        var captionHeight = this.settings.defaultCaptionHeight ||\r\n            (subHtml && subHtml.clientHeight) ||\r\n            0;\r\n        var thumbContainer = this.outer.find('.lg-thumb-outer').get();\r\n        var thumbHeight = thumbContainer ? thumbContainer.clientHeight : 0;\r\n        var bottom = thumbHeight + captionHeight;\r\n        return {\r\n            top: top,\r\n            bottom: bottom,\r\n        };\r\n    };\r\n    LightGallery.prototype.setMediaContainerPosition = function (top, bottom) {\r\n        if (top === void 0) { top = 0; }\r\n        if (bottom === void 0) { bottom = 0; }\r\n        this.$content.css('top', top + 'px').css('bottom', bottom + 'px');\r\n    };\r\n    LightGallery.prototype.hideBars = function () {\r\n        var _this = this;\r\n        // Hide controllers if mouse doesn't move for some period\r\n        setTimeout(function () {\r\n            _this.outer.removeClass('lg-hide-items');\r\n            if (_this.settings.hideBarsDelay > 0) {\r\n                _this.outer.on('mousemove.lg click.lg touchstart.lg', function () {\r\n                    _this.outer.removeClass('lg-hide-items');\r\n                    clearTimeout(_this.hideBarTimeout);\r\n                    // Timeout will be cleared on each slide movement also\r\n                    _this.hideBarTimeout = setTimeout(function () {\r\n                        _this.outer.addClass('lg-hide-items');\r\n                    }, _this.settings.hideBarsDelay);\r\n                });\r\n                _this.outer.trigger('mousemove.lg');\r\n            }\r\n        }, this.settings.showBarsAfter);\r\n    };\r\n    LightGallery.prototype.initPictureFill = function ($img) {\r\n        if (this.settings.supportLegacyBrowser) {\r\n            try {\r\n                picturefill({\r\n                    elements: [$img.get()],\r\n                });\r\n            }\r\n            catch (e) {\r\n                console.warn('lightGallery :- If you want srcset or picture tag to be supported for older browser please include picturefil javascript library in your document.');\r\n            }\r\n        }\r\n    };\r\n    /**\r\n     *  @desc Create image counter\r\n     *  Ex: 1/10\r\n     */\r\n    LightGallery.prototype.counter = function () {\r\n        if (this.settings.counter) {\r\n            var counterHtml = \"<div class=\\\"lg-counter\\\" role=\\\"status\\\" aria-live=\\\"polite\\\">\\n                <span id=\\\"\" + this.getIdName('lg-counter-current') + \"\\\" class=\\\"lg-counter-current\\\">\" + (this.index + 1) + \" </span> /\\n                <span id=\\\"\" + this.getIdName('lg-counter-all') + \"\\\" class=\\\"lg-counter-all\\\">\" + this.galleryItems.length + \" </span></div>\";\r\n            this.outer.find(this.settings.appendCounterTo).append(counterHtml);\r\n        }\r\n    };\r\n    /**\r\n     *  @desc add sub-html into the slide\r\n     *  @param {Number} index - index of the slide\r\n     */\r\n    LightGallery.prototype.addHtml = function (index) {\r\n        var subHtml;\r\n        var subHtmlUrl;\r\n        if (this.galleryItems[index].subHtmlUrl) {\r\n            subHtmlUrl = this.galleryItems[index].subHtmlUrl;\r\n        }\r\n        else {\r\n            subHtml = this.galleryItems[index].subHtml;\r\n        }\r\n        if (!subHtmlUrl) {\r\n            if (subHtml) {\r\n                // get first letter of sub-html\r\n                // if first letter starts with . or # get the html form the jQuery object\r\n                var fL = subHtml.substring(0, 1);\r\n                if (fL === '.' || fL === '#') {\r\n                    try {\r\n                        if (this.settings.subHtmlSelectorRelative &&\r\n                            !this.settings.dynamic) {\r\n                            subHtml = $LG(this.items)\r\n                                .eq(index)\r\n                                .find(subHtml)\r\n                                .first()\r\n                                .html();\r\n                        }\r\n                        else {\r\n                            subHtml = $LG(subHtml).first().html();\r\n                        }\r\n                    }\r\n                    catch (error) {\r\n                        console.warn(\"Error processing subHtml selector \\\"\" + subHtml + \"\\\"\");\r\n                        subHtml = '';\r\n                    }\r\n                }\r\n            }\r\n            else {\r\n                subHtml = '';\r\n            }\r\n        }\r\n        if (this.settings.appendSubHtmlTo !== '.lg-item') {\r\n            if (subHtmlUrl) {\r\n                utils.fetchCaptionFromUrl(subHtmlUrl, this.outer.find('.lg-sub-html'), 'replace');\r\n            }\r\n            else {\r\n                this.outer.find('.lg-sub-html').html(subHtml);\r\n            }\r\n        }\r\n        else {\r\n            var currentSlide = $LG(this.getSlideItemId(index));\r\n            if (subHtmlUrl) {\r\n                utils.fetchCaptionFromUrl(subHtmlUrl, currentSlide, 'append');\r\n            }\r\n            else {\r\n                currentSlide.append(\"<div class=\\\"lg-sub-html\\\">\" + subHtml + \"</div>\");\r\n            }\r\n        }\r\n        // Add lg-empty-html class if title doesn't exist\r\n        if (typeof subHtml !== 'undefined' && subHtml !== null) {\r\n            if (subHtml === '') {\r\n                this.outer\r\n                    .find(this.settings.appendSubHtmlTo)\r\n                    .addClass('lg-empty-html');\r\n            }\r\n            else {\r\n                this.outer\r\n                    .find(this.settings.appendSubHtmlTo)\r\n                    .removeClass('lg-empty-html');\r\n            }\r\n        }\r\n        this.LGel.trigger(lGEvents.afterAppendSubHtml, {\r\n            index: index,\r\n        });\r\n    };\r\n    /**\r\n     *  @desc Preload slides\r\n     *  @param {Number} index - index of the slide\r\n     * @todo preload not working for the first slide, Also, should work for the first and last slide as well\r\n     */\r\n    LightGallery.prototype.preload = function (index) {\r\n        for (var i = 1; i <= this.settings.preload; i++) {\r\n            if (i >= this.galleryItems.length - index) {\r\n                break;\r\n            }\r\n            this.loadContent(index + i, false);\r\n        }\r\n        for (var j = 1; j <= this.settings.preload; j++) {\r\n            if (index - j < 0) {\r\n                break;\r\n            }\r\n            this.loadContent(index - j, false);\r\n        }\r\n    };\r\n    LightGallery.prototype.getDummyImgStyles = function (imageSize) {\r\n        if (!imageSize)\r\n            return '';\r\n        return \"width:\" + imageSize.width + \"px;\\n                margin-left: -\" + imageSize.width / 2 + \"px;\\n                margin-top: -\" + imageSize.height / 2 + \"px;\\n                height:\" + imageSize.height + \"px\";\r\n    };\r\n    LightGallery.prototype.getVideoContStyle = function (imageSize) {\r\n        if (!imageSize)\r\n            return '';\r\n        return \"width:\" + imageSize.width + \"px;\\n                height:\" + imageSize.height + \"px\";\r\n    };\r\n    LightGallery.prototype.getDummyImageContent = function ($currentSlide, index, alt) {\r\n        var $currentItem;\r\n        if (!this.settings.dynamic) {\r\n            $currentItem = $LG(this.items).eq(index);\r\n        }\r\n        if ($currentItem) {\r\n            var _dummyImgSrc = void 0;\r\n            if (!this.settings.exThumbImage) {\r\n                _dummyImgSrc = $currentItem.find('img').first().attr('src');\r\n            }\r\n            else {\r\n                _dummyImgSrc = $currentItem.attr(this.settings.exThumbImage);\r\n            }\r\n            if (!_dummyImgSrc)\r\n                return '';\r\n            var imgStyle = this.getDummyImgStyles(this.currentImageSize);\r\n            var dummyImgContentImg = document.createElement('img');\r\n            dummyImgContentImg.alt = alt || '';\r\n            dummyImgContentImg.src = _dummyImgSrc;\r\n            dummyImgContentImg.className = \"lg-dummy-img\";\r\n            dummyImgContentImg.style.cssText = imgStyle;\r\n            $currentSlide.addClass('lg-first-slide');\r\n            this.outer.addClass('lg-first-slide-loading');\r\n            return dummyImgContentImg;\r\n        }\r\n        return '';\r\n    };\r\n    LightGallery.prototype.setImgMarkup = function (src, $currentSlide, index) {\r\n        var currentGalleryItem = this.galleryItems[index];\r\n        var alt = currentGalleryItem.alt, srcset = currentGalleryItem.srcset, sizes = currentGalleryItem.sizes, sources = currentGalleryItem.sources;\r\n        // Use the thumbnail as dummy image which will be resized to actual image size and\r\n        // displayed on top of actual image\r\n        var imgContent = '';\r\n        var altAttr = alt ? 'alt=\"' + alt + '\"' : '';\r\n        if (this.isFirstSlideWithZoomAnimation()) {\r\n            imgContent = this.getDummyImageContent($currentSlide, index, altAttr);\r\n        }\r\n        else {\r\n            imgContent = utils.getImgMarkup(index, src, altAttr, srcset, sizes, sources);\r\n        }\r\n        var picture = document.createElement('picture');\r\n        picture.className = 'lg-img-wrap';\r\n        $LG(picture).append(imgContent);\r\n        $currentSlide.prepend(picture);\r\n    };\r\n    LightGallery.prototype.onSlideObjectLoad = function ($slide, isHTML5VideoWithoutPoster, onLoad, onError) {\r\n        var mediaObject = $slide.find('.lg-object').first();\r\n        if (utils.isImageLoaded(mediaObject.get()) ||\r\n            isHTML5VideoWithoutPoster) {\r\n            onLoad();\r\n        }\r\n        else {\r\n            mediaObject.on('load.lg error.lg', function () {\r\n                onLoad && onLoad();\r\n            });\r\n            mediaObject.on('error.lg', function () {\r\n                onError && onError();\r\n            });\r\n        }\r\n    };\r\n    /**\r\n     *\r\n     * @param $el Current slide item\r\n     * @param index\r\n     * @param delay Delay is 0 except first time\r\n     * @param speed Speed is same as delay, except it is 0 if gallery is opened via hash plugin\r\n     * @param isFirstSlide\r\n     */\r\n    LightGallery.prototype.onLgObjectLoad = function (currentSlide, index, delay, speed, isFirstSlide, isHTML5VideoWithoutPoster) {\r\n        var _this = this;\r\n        this.onSlideObjectLoad(currentSlide, isHTML5VideoWithoutPoster, function () {\r\n            _this.triggerSlideItemLoad(currentSlide, index, delay, speed, isFirstSlide);\r\n        }, function () {\r\n            currentSlide.addClass('lg-complete lg-complete_');\r\n            currentSlide.html('<span class=\"lg-error-msg\">' +\r\n                _this.settings.strings['mediaLoadingFailed'] +\r\n                '</span>');\r\n        });\r\n    };\r\n    LightGallery.prototype.triggerSlideItemLoad = function ($currentSlide, index, delay, speed, isFirstSlide) {\r\n        var _this = this;\r\n        var currentGalleryItem = this.galleryItems[index];\r\n        // Adding delay for video slides without poster for better performance and user experience\r\n        // Videos should start playing once once the gallery is completely loaded\r\n        var _speed = isFirstSlide &&\r\n            this.getSlideType(currentGalleryItem) === 'video' &&\r\n            !currentGalleryItem.poster\r\n            ? speed\r\n            : 0;\r\n        setTimeout(function () {\r\n            $currentSlide.addClass('lg-complete lg-complete_');\r\n            _this.LGel.trigger(lGEvents.slideItemLoad, {\r\n                index: index,\r\n                delay: delay || 0,\r\n                isFirstSlide: isFirstSlide,\r\n            });\r\n        }, _speed);\r\n    };\r\n    LightGallery.prototype.isFirstSlideWithZoomAnimation = function () {\r\n        return !!(!this.lGalleryOn &&\r\n            this.zoomFromOrigin &&\r\n            this.currentImageSize);\r\n    };\r\n    // Add video slideInfo\r\n    LightGallery.prototype.addSlideVideoInfo = function (items) {\r\n        var _this = this;\r\n        items.forEach(function (element, index) {\r\n            element.__slideVideoInfo = utils.isVideo(element.src, !!element.video, index);\r\n            if (element.__slideVideoInfo &&\r\n                _this.settings.loadYouTubePoster &&\r\n                !element.poster &&\r\n                element.__slideVideoInfo.youtube) {\r\n                element.poster = \"//img.youtube.com/vi/\" + element.__slideVideoInfo.youtube[1] + \"/maxresdefault.jpg\";\r\n            }\r\n        });\r\n    };\r\n    /**\r\n     *  Load slide content into slide.\r\n     *  This is used to load content into slides that is not visible too\r\n     *  @param {Number} index - index of the slide.\r\n     *  @param {Boolean} rec - if true call loadcontent() function again.\r\n     */\r\n    LightGallery.prototype.loadContent = function (index, rec) {\r\n        var _this = this;\r\n        var currentGalleryItem = this.galleryItems[index];\r\n        var $currentSlide = $LG(this.getSlideItemId(index));\r\n        var poster = currentGalleryItem.poster, srcset = currentGalleryItem.srcset, sizes = currentGalleryItem.sizes, sources = currentGalleryItem.sources;\r\n        var src = currentGalleryItem.src;\r\n        var video = currentGalleryItem.video;\r\n        var _html5Video = video && typeof video === 'string' ? JSON.parse(video) : video;\r\n        if (currentGalleryItem.responsive) {\r\n            var srcDyItms = currentGalleryItem.responsive.split(',');\r\n            src = utils.getResponsiveSrc(srcDyItms) || src;\r\n        }\r\n        var videoInfo = currentGalleryItem.__slideVideoInfo;\r\n        var lgVideoStyle = '';\r\n        var iframe = !!currentGalleryItem.iframe;\r\n        var isFirstSlide = !this.lGalleryOn;\r\n        // delay for adding complete class. it is 0 except first time.\r\n        var delay = 0;\r\n        if (isFirstSlide) {\r\n            if (this.zoomFromOrigin && this.currentImageSize) {\r\n                delay = this.settings.startAnimationDuration + 10;\r\n            }\r\n            else {\r\n                delay = this.settings.backdropDuration + 10;\r\n            }\r\n        }\r\n        if (!$currentSlide.hasClass('lg-loaded')) {\r\n            if (videoInfo) {\r\n                var _a = this.mediaContainerPosition, top_2 = _a.top, bottom = _a.bottom;\r\n                var videoSize = utils.getSize(this.items[index], this.outer, top_2 + bottom, videoInfo && this.settings.videoMaxSize);\r\n                lgVideoStyle = this.getVideoContStyle(videoSize);\r\n            }\r\n            if (iframe) {\r\n                var markup = utils.getIframeMarkup(this.settings.iframeWidth, this.settings.iframeHeight, this.settings.iframeMaxWidth, this.settings.iframeMaxHeight, src, currentGalleryItem.iframeTitle);\r\n                $currentSlide.prepend(markup);\r\n            }\r\n            else if (poster) {\r\n                var dummyImg = '';\r\n                var hasStartAnimation = isFirstSlide &&\r\n                    this.zoomFromOrigin &&\r\n                    this.currentImageSize;\r\n                if (hasStartAnimation) {\r\n                    dummyImg = this.getDummyImageContent($currentSlide, index, '');\r\n                }\r\n                var markup = utils.getVideoPosterMarkup(poster, dummyImg || '', lgVideoStyle, this.settings.strings['playVideo'], videoInfo);\r\n                $currentSlide.prepend(markup);\r\n            }\r\n            else if (videoInfo) {\r\n                var markup = \"<div class=\\\"lg-video-cont \\\" style=\\\"\" + lgVideoStyle + \"\\\"></div>\";\r\n                $currentSlide.prepend(markup);\r\n            }\r\n            else {\r\n                this.setImgMarkup(src, $currentSlide, index);\r\n                if (srcset || sources) {\r\n                    var $img = $currentSlide.find('.lg-object');\r\n                    this.initPictureFill($img);\r\n                }\r\n            }\r\n            if (poster || videoInfo) {\r\n                this.LGel.trigger(lGEvents.hasVideo, {\r\n                    index: index,\r\n                    src: src,\r\n                    html5Video: _html5Video,\r\n                    hasPoster: !!poster,\r\n                });\r\n            }\r\n            this.LGel.trigger(lGEvents.afterAppendSlide, { index: index });\r\n            if (this.lGalleryOn &&\r\n                this.settings.appendSubHtmlTo === '.lg-item') {\r\n                this.addHtml(index);\r\n            }\r\n        }\r\n        // For first time add some delay for displaying the start animation.\r\n        var _speed = 0;\r\n        // Do not change the delay value because it is required for zoom plugin.\r\n        // If gallery opened from direct url (hash) speed value should be 0\r\n        if (delay && !$LG(document.body).hasClass('lg-from-hash')) {\r\n            _speed = delay;\r\n        }\r\n        // Only for first slide and zoomFromOrigin is enabled\r\n        if (this.isFirstSlideWithZoomAnimation()) {\r\n            setTimeout(function () {\r\n                $currentSlide\r\n                    .removeClass('lg-start-end-progress lg-start-progress')\r\n                    .removeAttr('style');\r\n            }, this.settings.startAnimationDuration + 100);\r\n            if (!$currentSlide.hasClass('lg-loaded')) {\r\n                setTimeout(function () {\r\n                    if (_this.getSlideType(currentGalleryItem) === 'image') {\r\n                        var alt = currentGalleryItem.alt;\r\n                        var altAttr = alt ? 'alt=\"' + alt + '\"' : '';\r\n                        $currentSlide\r\n                            .find('.lg-img-wrap')\r\n                            .append(utils.getImgMarkup(index, src, altAttr, srcset, sizes, currentGalleryItem.sources));\r\n                        if (srcset || sources) {\r\n                            var $img = $currentSlide.find('.lg-object');\r\n                            _this.initPictureFill($img);\r\n                        }\r\n                    }\r\n                    if (_this.getSlideType(currentGalleryItem) === 'image' ||\r\n                        (_this.getSlideType(currentGalleryItem) === 'video' &&\r\n                            poster)) {\r\n                        _this.onLgObjectLoad($currentSlide, index, delay, _speed, true, false);\r\n                        // load remaining slides once the slide is completely loaded\r\n                        _this.onSlideObjectLoad($currentSlide, !!(videoInfo && videoInfo.html5 && !poster), function () {\r\n                            _this.loadContentOnFirstSlideLoad(index, $currentSlide, _speed);\r\n                        }, function () {\r\n                            _this.loadContentOnFirstSlideLoad(index, $currentSlide, _speed);\r\n                        });\r\n                    }\r\n                }, this.settings.startAnimationDuration + 100);\r\n            }\r\n        }\r\n        // SLide content has been added to dom\r\n        $currentSlide.addClass('lg-loaded');\r\n        if (!this.isFirstSlideWithZoomAnimation() ||\r\n            (this.getSlideType(currentGalleryItem) === 'video' && !poster)) {\r\n            this.onLgObjectLoad($currentSlide, index, delay, _speed, isFirstSlide, !!(videoInfo && videoInfo.html5 && !poster));\r\n        }\r\n        // When gallery is opened once content is loaded (second time) need to add lg-complete class for css styling\r\n        if ((!this.zoomFromOrigin || !this.currentImageSize) &&\r\n            $currentSlide.hasClass('lg-complete_') &&\r\n            !this.lGalleryOn) {\r\n            setTimeout(function () {\r\n                $currentSlide.addClass('lg-complete');\r\n            }, this.settings.backdropDuration);\r\n        }\r\n        // Content loaded\r\n        // Need to set lGalleryOn before calling preload function\r\n        this.lGalleryOn = true;\r\n        if (rec === true) {\r\n            if (!$currentSlide.hasClass('lg-complete_')) {\r\n                $currentSlide\r\n                    .find('.lg-object')\r\n                    .first()\r\n                    .on('load.lg error.lg', function () {\r\n                    _this.preload(index);\r\n                });\r\n            }\r\n            else {\r\n                this.preload(index);\r\n            }\r\n        }\r\n    };\r\n    /**\r\n     * @desc Remove dummy image content and load next slides\r\n     * Called only for the first time if zoomFromOrigin animation is enabled\r\n     * @param index\r\n     * @param $currentSlide\r\n     * @param speed\r\n     */\r\n    LightGallery.prototype.loadContentOnFirstSlideLoad = function (index, $currentSlide, speed) {\r\n        var _this = this;\r\n        setTimeout(function () {\r\n            $currentSlide.find('.lg-dummy-img').remove();\r\n            $currentSlide.removeClass('lg-first-slide');\r\n            _this.outer.removeClass('lg-first-slide-loading');\r\n            _this.isDummyImageRemoved = true;\r\n            _this.preload(index);\r\n        }, speed + 300);\r\n    };\r\n    LightGallery.prototype.getItemsToBeInsertedToDom = function (index, prevIndex, numberOfItems) {\r\n        var _this = this;\r\n        if (numberOfItems === void 0) { numberOfItems = 0; }\r\n        var itemsToBeInsertedToDom = [];\r\n        // Minimum 2 items should be there\r\n        var possibleNumberOfItems = Math.max(numberOfItems, 3);\r\n        possibleNumberOfItems = Math.min(possibleNumberOfItems, this.galleryItems.length);\r\n        var prevIndexItem = \"lg-item-\" + this.lgId + \"-\" + prevIndex;\r\n        if (this.galleryItems.length <= 3) {\r\n            this.galleryItems.forEach(function (_element, index) {\r\n                itemsToBeInsertedToDom.push(\"lg-item-\" + _this.lgId + \"-\" + index);\r\n            });\r\n            return itemsToBeInsertedToDom;\r\n        }\r\n        if (index < (this.galleryItems.length - 1) / 2) {\r\n            for (var idx = index; idx > index - possibleNumberOfItems / 2 && idx >= 0; idx--) {\r\n                itemsToBeInsertedToDom.push(\"lg-item-\" + this.lgId + \"-\" + idx);\r\n            }\r\n            var numberOfExistingItems = itemsToBeInsertedToDom.length;\r\n            for (var idx = 0; idx < possibleNumberOfItems - numberOfExistingItems; idx++) {\r\n                itemsToBeInsertedToDom.push(\"lg-item-\" + this.lgId + \"-\" + (index + idx + 1));\r\n            }\r\n        }\r\n        else {\r\n            for (var idx = index; idx <= this.galleryItems.length - 1 &&\r\n                idx < index + possibleNumberOfItems / 2; idx++) {\r\n                itemsToBeInsertedToDom.push(\"lg-item-\" + this.lgId + \"-\" + idx);\r\n            }\r\n            var numberOfExistingItems = itemsToBeInsertedToDom.length;\r\n            for (var idx = 0; idx < possibleNumberOfItems - numberOfExistingItems; idx++) {\r\n                itemsToBeInsertedToDom.push(\"lg-item-\" + this.lgId + \"-\" + (index - idx - 1));\r\n            }\r\n        }\r\n        if (this.settings.loop) {\r\n            if (index === this.galleryItems.length - 1) {\r\n                itemsToBeInsertedToDom.push(\"lg-item-\" + this.lgId + \"-\" + 0);\r\n            }\r\n            else if (index === 0) {\r\n                itemsToBeInsertedToDom.push(\"lg-item-\" + this.lgId + \"-\" + (this.galleryItems.length - 1));\r\n            }\r\n        }\r\n        if (itemsToBeInsertedToDom.indexOf(prevIndexItem) === -1) {\r\n            itemsToBeInsertedToDom.push(\"lg-item-\" + this.lgId + \"-\" + prevIndex);\r\n        }\r\n        return itemsToBeInsertedToDom;\r\n    };\r\n    LightGallery.prototype.organizeSlideItems = function (index, prevIndex) {\r\n        var _this = this;\r\n        var itemsToBeInsertedToDom = this.getItemsToBeInsertedToDom(index, prevIndex, this.settings.numberOfSlideItemsInDom);\r\n        itemsToBeInsertedToDom.forEach(function (item) {\r\n            if (_this.currentItemsInDom.indexOf(item) === -1) {\r\n                _this.$inner.append(\"<div id=\\\"\" + item + \"\\\" class=\\\"lg-item\\\"></div>\");\r\n            }\r\n        });\r\n        this.currentItemsInDom.forEach(function (item) {\r\n            if (itemsToBeInsertedToDom.indexOf(item) === -1) {\r\n                $LG(\"#\" + item).remove();\r\n            }\r\n        });\r\n        return itemsToBeInsertedToDom;\r\n    };\r\n    /**\r\n     * Get previous index of the slide\r\n     */\r\n    LightGallery.prototype.getPreviousSlideIndex = function () {\r\n        var prevIndex = 0;\r\n        try {\r\n            var currentItemId = this.outer\r\n                .find('.lg-current')\r\n                .first()\r\n                .attr('id');\r\n            prevIndex = parseInt(currentItemId.split('-')[3]) || 0;\r\n        }\r\n        catch (error) {\r\n            prevIndex = 0;\r\n        }\r\n        return prevIndex;\r\n    };\r\n    LightGallery.prototype.setDownloadValue = function (index) {\r\n        if (this.settings.download) {\r\n            var currentGalleryItem = this.galleryItems[index];\r\n            var hideDownloadBtn = currentGalleryItem.downloadUrl === false ||\r\n                currentGalleryItem.downloadUrl === 'false';\r\n            if (hideDownloadBtn) {\r\n                this.outer.addClass('lg-hide-download');\r\n            }\r\n            else {\r\n                var $download = this.getElementById('lg-download');\r\n                this.outer.removeClass('lg-hide-download');\r\n                $download.attr('href', currentGalleryItem.downloadUrl ||\r\n                    currentGalleryItem.src);\r\n                if (currentGalleryItem.download) {\r\n                    $download.attr('download', currentGalleryItem.download);\r\n                }\r\n            }\r\n        }\r\n    };\r\n    LightGallery.prototype.makeSlideAnimation = function (direction, currentSlideItem, previousSlideItem) {\r\n        var _this = this;\r\n        if (this.lGalleryOn) {\r\n            previousSlideItem.addClass('lg-slide-progress');\r\n        }\r\n        setTimeout(function () {\r\n            // remove all transitions\r\n            _this.outer.addClass('lg-no-trans');\r\n            _this.outer\r\n                .find('.lg-item')\r\n                .removeClass('lg-prev-slide lg-next-slide');\r\n            if (direction === 'prev') {\r\n                //prevslide\r\n                currentSlideItem.addClass('lg-prev-slide');\r\n                previousSlideItem.addClass('lg-next-slide');\r\n            }\r\n            else {\r\n                // next slide\r\n                currentSlideItem.addClass('lg-next-slide');\r\n                previousSlideItem.addClass('lg-prev-slide');\r\n            }\r\n            // give 50 ms for browser to add/remove class\r\n            setTimeout(function () {\r\n                _this.outer.find('.lg-item').removeClass('lg-current');\r\n                currentSlideItem.addClass('lg-current');\r\n                // reset all transitions\r\n                _this.outer.removeClass('lg-no-trans');\r\n            }, 50);\r\n        }, this.lGalleryOn ? this.settings.slideDelay : 0);\r\n    };\r\n    /**\r\n     * Goto a specific slide.\r\n     * @param {Number} index - index of the slide\r\n     * @param {Boolean} fromTouch - true if slide function called via touch event or mouse drag\r\n     * @param {Boolean} fromThumb - true if slide function called via thumbnail click\r\n     * @param {String} direction - Direction of the slide(next/prev)\r\n     * @category lGPublicMethods\r\n     * @example\r\n     *  const plugin = lightGallery();\r\n     *  // to go to 3rd slide\r\n     *  plugin.slide(2);\r\n     *\r\n     */\r\n    LightGallery.prototype.slide = function (index, fromTouch, fromThumb, direction) {\r\n        var _this = this;\r\n        var prevIndex = this.getPreviousSlideIndex();\r\n        this.currentItemsInDom = this.organizeSlideItems(index, prevIndex);\r\n        // Prevent multiple call, Required for hsh plugin\r\n        if (this.lGalleryOn && prevIndex === index) {\r\n            return;\r\n        }\r\n        var numberOfGalleryItems = this.galleryItems.length;\r\n        if (!this.lgBusy) {\r\n            if (this.settings.counter) {\r\n                this.updateCurrentCounter(index);\r\n            }\r\n            var currentSlideItem = this.getSlideItem(index);\r\n            var previousSlideItem_1 = this.getSlideItem(prevIndex);\r\n            var currentGalleryItem = this.galleryItems[index];\r\n            var videoInfo = currentGalleryItem.__slideVideoInfo;\r\n            this.outer.attr('data-lg-slide-type', this.getSlideType(currentGalleryItem));\r\n            this.setDownloadValue(index);\r\n            if (videoInfo) {\r\n                var _a = this.mediaContainerPosition, top_3 = _a.top, bottom = _a.bottom;\r\n                var videoSize = utils.getSize(this.items[index], this.outer, top_3 + bottom, videoInfo && this.settings.videoMaxSize);\r\n                this.resizeVideoSlide(index, videoSize);\r\n            }\r\n            this.LGel.trigger(lGEvents.beforeSlide, {\r\n                prevIndex: prevIndex,\r\n                index: index,\r\n                fromTouch: !!fromTouch,\r\n                fromThumb: !!fromThumb,\r\n            });\r\n            this.lgBusy = true;\r\n            clearTimeout(this.hideBarTimeout);\r\n            this.arrowDisable(index);\r\n            if (!direction) {\r\n                if (index < prevIndex) {\r\n                    direction = 'prev';\r\n                }\r\n                else if (index > prevIndex) {\r\n                    direction = 'next';\r\n                }\r\n            }\r\n            if (!fromTouch) {\r\n                this.makeSlideAnimation(direction, currentSlideItem, previousSlideItem_1);\r\n            }\r\n            else {\r\n                this.outer\r\n                    .find('.lg-item')\r\n                    .removeClass('lg-prev-slide lg-current lg-next-slide');\r\n                var touchPrev = void 0;\r\n                var touchNext = void 0;\r\n                if (numberOfGalleryItems > 2) {\r\n                    touchPrev = index - 1;\r\n                    touchNext = index + 1;\r\n                    if (index === 0 && prevIndex === numberOfGalleryItems - 1) {\r\n                        // next slide\r\n                        touchNext = 0;\r\n                        touchPrev = numberOfGalleryItems - 1;\r\n                    }\r\n                    else if (index === numberOfGalleryItems - 1 &&\r\n                        prevIndex === 0) {\r\n                        // prev slide\r\n                        touchNext = 0;\r\n                        touchPrev = numberOfGalleryItems - 1;\r\n                    }\r\n                }\r\n                else {\r\n                    touchPrev = 0;\r\n                    touchNext = 1;\r\n                }\r\n                if (direction === 'prev') {\r\n                    this.getSlideItem(touchNext).addClass('lg-next-slide');\r\n                }\r\n                else {\r\n                    this.getSlideItem(touchPrev).addClass('lg-prev-slide');\r\n                }\r\n                currentSlideItem.addClass('lg-current');\r\n            }\r\n            // Do not put load content in set timeout as it needs to load immediately when the gallery is opened\r\n            if (!this.lGalleryOn) {\r\n                this.loadContent(index, true);\r\n            }\r\n            else {\r\n                setTimeout(function () {\r\n                    _this.loadContent(index, true);\r\n                    // Add title if this.settings.appendSubHtmlTo === lg-sub-html\r\n                    if (_this.settings.appendSubHtmlTo !== '.lg-item') {\r\n                        _this.addHtml(index);\r\n                    }\r\n                }, this.settings.speed + 50 + (fromTouch ? 0 : this.settings.slideDelay));\r\n            }\r\n            setTimeout(function () {\r\n                _this.lgBusy = false;\r\n                previousSlideItem_1.removeClass('lg-slide-progress');\r\n                _this.LGel.trigger(lGEvents.afterSlide, {\r\n                    prevIndex: prevIndex,\r\n                    index: index,\r\n                    fromTouch: fromTouch,\r\n                    fromThumb: fromThumb,\r\n                });\r\n            }, (this.lGalleryOn ? this.settings.speed + 100 : 100) + (fromTouch ? 0 : this.settings.slideDelay));\r\n        }\r\n        this.index = index;\r\n    };\r\n    LightGallery.prototype.updateCurrentCounter = function (index) {\r\n        this.getElementById('lg-counter-current').html(index + 1 + '');\r\n    };\r\n    LightGallery.prototype.updateCounterTotal = function () {\r\n        this.getElementById('lg-counter-all').html(this.galleryItems.length + '');\r\n    };\r\n    LightGallery.prototype.getSlideType = function (item) {\r\n        if (item.__slideVideoInfo) {\r\n            return 'video';\r\n        }\r\n        else if (item.iframe) {\r\n            return 'iframe';\r\n        }\r\n        else {\r\n            return 'image';\r\n        }\r\n    };\r\n    LightGallery.prototype.touchMove = function (startCoords, endCoords, e) {\r\n        var distanceX = endCoords.pageX - startCoords.pageX;\r\n        var distanceY = endCoords.pageY - startCoords.pageY;\r\n        var allowSwipe = false;\r\n        if (this.swipeDirection) {\r\n            allowSwipe = true;\r\n        }\r\n        else {\r\n            if (Math.abs(distanceX) > 15) {\r\n                this.swipeDirection = 'horizontal';\r\n                allowSwipe = true;\r\n            }\r\n            else if (Math.abs(distanceY) > 15) {\r\n                this.swipeDirection = 'vertical';\r\n                allowSwipe = true;\r\n            }\r\n        }\r\n        if (!allowSwipe) {\r\n            return;\r\n        }\r\n        var $currentSlide = this.getSlideItem(this.index);\r\n        if (this.swipeDirection === 'horizontal') {\r\n            e === null || e === void 0 ? void 0 : e.preventDefault();\r\n            // reset opacity and transition duration\r\n            this.outer.addClass('lg-dragging');\r\n            // move current slide\r\n            this.setTranslate($currentSlide, distanceX, 0);\r\n            // move next and prev slide with current slide\r\n            var width = $currentSlide.get().offsetWidth;\r\n            var slideWidthAmount = (width * 15) / 100;\r\n            var gutter = slideWidthAmount - Math.abs((distanceX * 10) / 100);\r\n            this.setTranslate(this.outer.find('.lg-prev-slide').first(), -width + distanceX - gutter, 0);\r\n            this.setTranslate(this.outer.find('.lg-next-slide').first(), width + distanceX + gutter, 0);\r\n        }\r\n        else if (this.swipeDirection === 'vertical') {\r\n            if (this.settings.swipeToClose) {\r\n                e === null || e === void 0 ? void 0 : e.preventDefault();\r\n                this.$container.addClass('lg-dragging-vertical');\r\n                var opacity = 1 - Math.abs(distanceY) / window.innerHeight;\r\n                this.$backdrop.css('opacity', opacity);\r\n                var scale = 1 - Math.abs(distanceY) / (window.innerWidth * 2);\r\n                this.setTranslate($currentSlide, 0, distanceY, scale, scale);\r\n                if (Math.abs(distanceY) > 100) {\r\n                    this.outer\r\n                        .addClass('lg-hide-items')\r\n                        .removeClass('lg-components-open');\r\n                }\r\n            }\r\n        }\r\n    };\r\n    LightGallery.prototype.touchEnd = function (endCoords, startCoords, event) {\r\n        var _this = this;\r\n        var distance;\r\n        // keep slide animation for any mode while dragg/swipe\r\n        if (this.settings.mode !== 'lg-slide') {\r\n            this.outer.addClass('lg-slide');\r\n        }\r\n        // set transition duration\r\n        setTimeout(function () {\r\n            _this.$container.removeClass('lg-dragging-vertical');\r\n            _this.outer\r\n                .removeClass('lg-dragging lg-hide-items')\r\n                .addClass('lg-components-open');\r\n            var triggerClick = true;\r\n            if (_this.swipeDirection === 'horizontal') {\r\n                distance = endCoords.pageX - startCoords.pageX;\r\n                var distanceAbs = Math.abs(endCoords.pageX - startCoords.pageX);\r\n                if (distance < 0 &&\r\n                    distanceAbs > _this.settings.swipeThreshold) {\r\n                    _this.goToNextSlide(true);\r\n                    triggerClick = false;\r\n                }\r\n                else if (distance > 0 &&\r\n                    distanceAbs > _this.settings.swipeThreshold) {\r\n                    _this.goToPrevSlide(true);\r\n                    triggerClick = false;\r\n                }\r\n            }\r\n            else if (_this.swipeDirection === 'vertical') {\r\n                distance = Math.abs(endCoords.pageY - startCoords.pageY);\r\n                if (_this.settings.closable &&\r\n                    _this.settings.swipeToClose &&\r\n                    distance > 100) {\r\n                    _this.closeGallery();\r\n                    return;\r\n                }\r\n                else {\r\n                    _this.$backdrop.css('opacity', 1);\r\n                }\r\n            }\r\n            _this.outer.find('.lg-item').removeAttr('style');\r\n            if (triggerClick &&\r\n                Math.abs(endCoords.pageX - startCoords.pageX) < 5) {\r\n                // Trigger click if distance is less than 5 pix\r\n                var target = $LG(event.target);\r\n                if (_this.isPosterElement(target)) {\r\n                    _this.LGel.trigger(lGEvents.posterClick);\r\n                }\r\n            }\r\n            _this.swipeDirection = undefined;\r\n        });\r\n        // remove slide class once drag/swipe is completed if mode is not slide\r\n        setTimeout(function () {\r\n            if (!_this.outer.hasClass('lg-dragging') &&\r\n                _this.settings.mode !== 'lg-slide') {\r\n                _this.outer.removeClass('lg-slide');\r\n            }\r\n        }, this.settings.speed + 100);\r\n    };\r\n    LightGallery.prototype.enableSwipe = function () {\r\n        var _this = this;\r\n        var startCoords = {};\r\n        var endCoords = {};\r\n        var isMoved = false;\r\n        var isSwiping = false;\r\n        if (this.settings.enableSwipe) {\r\n            this.$inner.on('touchstart.lg', function (e) {\r\n                _this.dragOrSwipeEnabled = true;\r\n                var $item = _this.getSlideItem(_this.index);\r\n                if (($LG(e.target).hasClass('lg-item') ||\r\n                    $item.get().contains(e.target)) &&\r\n                    !_this.outer.hasClass('lg-zoomed') &&\r\n                    !_this.lgBusy &&\r\n                    e.touches.length === 1) {\r\n                    isSwiping = true;\r\n                    _this.touchAction = 'swipe';\r\n                    _this.manageSwipeClass();\r\n                    startCoords = {\r\n                        pageX: e.touches[0].pageX,\r\n                        pageY: e.touches[0].pageY,\r\n                    };\r\n                }\r\n            });\r\n            this.$inner.on('touchmove.lg', function (e) {\r\n                if (isSwiping &&\r\n                    _this.touchAction === 'swipe' &&\r\n                    e.touches.length === 1) {\r\n                    endCoords = {\r\n                        pageX: e.touches[0].pageX,\r\n                        pageY: e.touches[0].pageY,\r\n                    };\r\n                    _this.touchMove(startCoords, endCoords, e);\r\n                    isMoved = true;\r\n                }\r\n            });\r\n            this.$inner.on('touchend.lg', function (event) {\r\n                if (_this.touchAction === 'swipe') {\r\n                    if (isMoved) {\r\n                        isMoved = false;\r\n                        _this.touchEnd(endCoords, startCoords, event);\r\n                    }\r\n                    else if (isSwiping) {\r\n                        var target = $LG(event.target);\r\n                        if (_this.isPosterElement(target)) {\r\n                            _this.LGel.trigger(lGEvents.posterClick);\r\n                        }\r\n                    }\r\n                    _this.touchAction = undefined;\r\n                    isSwiping = false;\r\n                }\r\n            });\r\n        }\r\n    };\r\n    LightGallery.prototype.enableDrag = function () {\r\n        var _this = this;\r\n        var startCoords = {};\r\n        var endCoords = {};\r\n        var isDraging = false;\r\n        var isMoved = false;\r\n        if (this.settings.enableDrag) {\r\n            this.outer.on('mousedown.lg', function (e) {\r\n                _this.dragOrSwipeEnabled = true;\r\n                var $item = _this.getSlideItem(_this.index);\r\n                if ($LG(e.target).hasClass('lg-item') ||\r\n                    $item.get().contains(e.target)) {\r\n                    if (!_this.outer.hasClass('lg-zoomed') && !_this.lgBusy) {\r\n                        e.preventDefault();\r\n                        if (!_this.lgBusy) {\r\n                            _this.manageSwipeClass();\r\n                            startCoords = {\r\n                                pageX: e.pageX,\r\n                                pageY: e.pageY,\r\n                            };\r\n                            isDraging = true;\r\n                            // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723\r\n                            _this.outer.get().scrollLeft += 1;\r\n                            _this.outer.get().scrollLeft -= 1;\r\n                            // *\r\n                            _this.outer\r\n                                .removeClass('lg-grab')\r\n                                .addClass('lg-grabbing');\r\n                            _this.LGel.trigger(lGEvents.dragStart);\r\n                        }\r\n                    }\r\n                }\r\n            });\r\n            $LG(window).on(\"mousemove.lg.global\" + this.lgId, function (e) {\r\n                if (isDraging && _this.lgOpened) {\r\n                    isMoved = true;\r\n                    endCoords = {\r\n                        pageX: e.pageX,\r\n                        pageY: e.pageY,\r\n                    };\r\n                    _this.touchMove(startCoords, endCoords);\r\n                    _this.LGel.trigger(lGEvents.dragMove);\r\n                }\r\n            });\r\n            $LG(window).on(\"mouseup.lg.global\" + this.lgId, function (event) {\r\n                if (!_this.lgOpened) {\r\n                    return;\r\n                }\r\n                var target = $LG(event.target);\r\n                if (isMoved) {\r\n                    isMoved = false;\r\n                    _this.touchEnd(endCoords, startCoords, event);\r\n                    _this.LGel.trigger(lGEvents.dragEnd);\r\n                }\r\n                else if (_this.isPosterElement(target)) {\r\n                    _this.LGel.trigger(lGEvents.posterClick);\r\n                }\r\n                // Prevent execution on click\r\n                if (isDraging) {\r\n                    isDraging = false;\r\n                    _this.outer.removeClass('lg-grabbing').addClass('lg-grab');\r\n                }\r\n            });\r\n        }\r\n    };\r\n    LightGallery.prototype.triggerPosterClick = function () {\r\n        var _this = this;\r\n        this.$inner.on('click.lg', function (event) {\r\n            if (!_this.dragOrSwipeEnabled &&\r\n                _this.isPosterElement($LG(event.target))) {\r\n                _this.LGel.trigger(lGEvents.posterClick);\r\n            }\r\n        });\r\n    };\r\n    LightGallery.prototype.manageSwipeClass = function () {\r\n        var _touchNext = this.index + 1;\r\n        var _touchPrev = this.index - 1;\r\n        if (this.settings.loop && this.galleryItems.length > 2) {\r\n            if (this.index === 0) {\r\n                _touchPrev = this.galleryItems.length - 1;\r\n            }\r\n            else if (this.index === this.galleryItems.length - 1) {\r\n                _touchNext = 0;\r\n            }\r\n        }\r\n        this.outer.find('.lg-item').removeClass('lg-next-slide lg-prev-slide');\r\n        if (_touchPrev > -1) {\r\n            this.getSlideItem(_touchPrev).addClass('lg-prev-slide');\r\n        }\r\n        this.getSlideItem(_touchNext).addClass('lg-next-slide');\r\n    };\r\n    /**\r\n     * Go to next slide\r\n     * @param {Boolean} fromTouch - true if slide function called via touch event\r\n     * @category lGPublicMethods\r\n     * @example\r\n     *  const plugin = lightGallery();\r\n     *  plugin.goToNextSlide();\r\n     * @see <a href=\"/demos/methods/\">Demo</a>\r\n     */\r\n    LightGallery.prototype.goToNextSlide = function (fromTouch) {\r\n        var _this = this;\r\n        var _loop = this.settings.loop;\r\n        if (fromTouch && this.galleryItems.length < 3) {\r\n            _loop = false;\r\n        }\r\n        if (!this.lgBusy) {\r\n            if (this.index + 1 < this.galleryItems.length) {\r\n                this.index++;\r\n                this.LGel.trigger(lGEvents.beforeNextSlide, {\r\n                    index: this.index,\r\n                });\r\n                this.slide(this.index, !!fromTouch, false, 'next');\r\n            }\r\n            else {\r\n                if (_loop) {\r\n                    this.index = 0;\r\n                    this.LGel.trigger(lGEvents.beforeNextSlide, {\r\n                        index: this.index,\r\n                    });\r\n                    this.slide(this.index, !!fromTouch, false, 'next');\r\n                }\r\n                else if (this.settings.slideEndAnimation && !fromTouch) {\r\n                    this.outer.addClass('lg-right-end');\r\n                    setTimeout(function () {\r\n                        _this.outer.removeClass('lg-right-end');\r\n                    }, 400);\r\n                }\r\n            }\r\n        }\r\n    };\r\n    /**\r\n     * Go to previous slides\r\n     * @param {Boolean} fromTouch - true if slide function called via touch event\r\n     * @category lGPublicMethods\r\n     * @example\r\n     *  const plugin = lightGallery({});\r\n     *  plugin.goToPrevSlide();\r\n     * @see <a href=\"/demos/methods/\">Demo</a>\r\n     *\r\n     */\r\n    LightGallery.prototype.goToPrevSlide = function (fromTouch) {\r\n        var _this = this;\r\n        var _loop = this.settings.loop;\r\n        if (fromTouch && this.galleryItems.length < 3) {\r\n            _loop = false;\r\n        }\r\n        if (!this.lgBusy) {\r\n            if (this.index > 0) {\r\n                this.index--;\r\n                this.LGel.trigger(lGEvents.beforePrevSlide, {\r\n                    index: this.index,\r\n                    fromTouch: fromTouch,\r\n                });\r\n                this.slide(this.index, !!fromTouch, false, 'prev');\r\n            }\r\n            else {\r\n                if (_loop) {\r\n                    this.index = this.galleryItems.length - 1;\r\n                    this.LGel.trigger(lGEvents.beforePrevSlide, {\r\n                        index: this.index,\r\n                        fromTouch: fromTouch,\r\n                    });\r\n                    this.slide(this.index, !!fromTouch, false, 'prev');\r\n                }\r\n                else if (this.settings.slideEndAnimation && !fromTouch) {\r\n                    this.outer.addClass('lg-left-end');\r\n                    setTimeout(function () {\r\n                        _this.outer.removeClass('lg-left-end');\r\n                    }, 400);\r\n                }\r\n            }\r\n        }\r\n    };\r\n    LightGallery.prototype.keyPress = function () {\r\n        var _this = this;\r\n        $LG(window).on(\"keydown.lg.global\" + this.lgId, function (e) {\r\n            if (_this.lgOpened &&\r\n                _this.settings.escKey === true &&\r\n                e.keyCode === 27) {\r\n                e.preventDefault();\r\n                if (_this.settings.allowMediaOverlap &&\r\n                    _this.outer.hasClass('lg-can-toggle') &&\r\n                    _this.outer.hasClass('lg-components-open')) {\r\n                    _this.outer.removeClass('lg-components-open');\r\n                }\r\n                else {\r\n                    _this.closeGallery();\r\n                }\r\n            }\r\n            if (_this.lgOpened && _this.galleryItems.length > 1) {\r\n                if (e.keyCode === 37) {\r\n                    e.preventDefault();\r\n                    _this.goToPrevSlide();\r\n                }\r\n                if (e.keyCode === 39) {\r\n                    e.preventDefault();\r\n                    _this.goToNextSlide();\r\n                }\r\n            }\r\n        });\r\n    };\r\n    LightGallery.prototype.arrow = function () {\r\n        var _this = this;\r\n        this.getElementById('lg-prev').on('click.lg', function () {\r\n            _this.goToPrevSlide();\r\n        });\r\n        this.getElementById('lg-next').on('click.lg', function () {\r\n            _this.goToNextSlide();\r\n        });\r\n    };\r\n    LightGallery.prototype.arrowDisable = function (index) {\r\n        // Disable arrows if settings.hideControlOnEnd is true\r\n        if (!this.settings.loop && this.settings.hideControlOnEnd) {\r\n            var $prev = this.getElementById('lg-prev');\r\n            var $next = this.getElementById('lg-next');\r\n            if (index + 1 === this.galleryItems.length) {\r\n                $next.attr('disabled', 'disabled').addClass('disabled');\r\n            }\r\n            else {\r\n                $next.removeAttr('disabled').removeClass('disabled');\r\n            }\r\n            if (index === 0) {\r\n                $prev.attr('disabled', 'disabled').addClass('disabled');\r\n            }\r\n            else {\r\n                $prev.removeAttr('disabled').removeClass('disabled');\r\n            }\r\n        }\r\n    };\r\n    LightGallery.prototype.setTranslate = function ($el, xValue, yValue, scaleX, scaleY) {\r\n        if (scaleX === void 0) { scaleX = 1; }\r\n        if (scaleY === void 0) { scaleY = 1; }\r\n        $el.css('transform', 'translate3d(' +\r\n            xValue +\r\n            'px, ' +\r\n            yValue +\r\n            'px, 0px) scale3d(' +\r\n            scaleX +\r\n            ', ' +\r\n            scaleY +\r\n            ', 1)');\r\n    };\r\n    LightGallery.prototype.mousewheel = function () {\r\n        var _this = this;\r\n        var lastCall = 0;\r\n        this.outer.on('wheel.lg', function (e) {\r\n            if (!e.deltaY || _this.galleryItems.length < 2) {\r\n                return;\r\n            }\r\n            e.preventDefault();\r\n            var now = new Date().getTime();\r\n            if (now - lastCall < 1000) {\r\n                return;\r\n            }\r\n            lastCall = now;\r\n            if (e.deltaY > 0) {\r\n                _this.goToNextSlide();\r\n            }\r\n            else if (e.deltaY < 0) {\r\n                _this.goToPrevSlide();\r\n            }\r\n        });\r\n    };\r\n    LightGallery.prototype.isSlideElement = function (target) {\r\n        return (target.hasClass('lg-outer') ||\r\n            target.hasClass('lg-item') ||\r\n            target.hasClass('lg-img-wrap') ||\r\n            target.hasClass('lg-img-rotate'));\r\n    };\r\n    LightGallery.prototype.isPosterElement = function (target) {\r\n        var playButton = this.getSlideItem(this.index)\r\n            .find('.lg-video-play-button')\r\n            .get();\r\n        return (target.hasClass('lg-video-poster') ||\r\n            target.hasClass('lg-video-play-button') ||\r\n            (playButton && playButton.contains(target.get())));\r\n    };\r\n    /**\r\n     * Maximize minimize inline gallery.\r\n     * @category lGPublicMethods\r\n     */\r\n    LightGallery.prototype.toggleMaximize = function () {\r\n        var _this = this;\r\n        this.getElementById('lg-maximize').on('click.lg', function () {\r\n            _this.$container.toggleClass('lg-inline');\r\n            _this.refreshOnResize();\r\n        });\r\n    };\r\n    LightGallery.prototype.invalidateItems = function () {\r\n        for (var index = 0; index < this.items.length; index++) {\r\n            var element = this.items[index];\r\n            var $element = $LG(element);\r\n            $element.off(\"click.lgcustom-item-\" + $element.attr('data-lg-id'));\r\n        }\r\n    };\r\n    LightGallery.prototype.trapFocus = function () {\r\n        var _this = this;\r\n        this.$container.get().focus({\r\n            preventScroll: true,\r\n        });\r\n        $LG(window).on(\"keydown.lg.global\" + this.lgId, function (e) {\r\n            if (!_this.lgOpened) {\r\n                return;\r\n            }\r\n            var isTabPressed = e.key === 'Tab' || e.keyCode === 9;\r\n            if (!isTabPressed) {\r\n                return;\r\n            }\r\n            var focusableEls = utils.getFocusableElements(_this.$container.get());\r\n            var firstFocusableEl = focusableEls[0];\r\n            var lastFocusableEl = focusableEls[focusableEls.length - 1];\r\n            if (e.shiftKey) {\r\n                if (document.activeElement === firstFocusableEl) {\r\n                    lastFocusableEl.focus();\r\n                    e.preventDefault();\r\n                }\r\n            }\r\n            else {\r\n                if (document.activeElement === lastFocusableEl) {\r\n                    firstFocusableEl.focus();\r\n                    e.preventDefault();\r\n                }\r\n            }\r\n        });\r\n    };\r\n    LightGallery.prototype.manageCloseGallery = function () {\r\n        var _this = this;\r\n        if (!this.settings.closable)\r\n            return;\r\n        var mousedown = false;\r\n        this.getElementById('lg-close').on('click.lg', function () {\r\n            _this.closeGallery();\r\n        });\r\n        if (this.settings.closeOnTap) {\r\n            // If you drag the slide and release outside gallery gets close on chrome\r\n            // for preventing this check mousedown and mouseup happened on .lg-item or lg-outer\r\n            this.outer.on('mousedown.lg', function (e) {\r\n                var target = $LG(e.target);\r\n                if (_this.isSlideElement(target)) {\r\n                    mousedown = true;\r\n                }\r\n                else {\r\n                    mousedown = false;\r\n                }\r\n            });\r\n            this.outer.on('mousemove.lg', function () {\r\n                mousedown = false;\r\n            });\r\n            this.outer.on('mouseup.lg', function (e) {\r\n                var target = $LG(e.target);\r\n                if (_this.isSlideElement(target) && mousedown) {\r\n                    if (!_this.outer.hasClass('lg-dragging')) {\r\n                        _this.closeGallery();\r\n                    }\r\n                }\r\n            });\r\n        }\r\n    };\r\n    /**\r\n     * Close lightGallery if it is opened.\r\n     *\r\n     * @description If closable is false in the settings, you need to pass true via closeGallery method to force close gallery\r\n     * @return returns the estimated time to close gallery completely including the close animation duration\r\n     * @category lGPublicMethods\r\n     * @example\r\n     *  const plugin = lightGallery();\r\n     *  plugin.closeGallery();\r\n     *\r\n     */\r\n    LightGallery.prototype.closeGallery = function (force) {\r\n        var _this = this;\r\n        if (!this.lgOpened || (!this.settings.closable && !force)) {\r\n            return 0;\r\n        }\r\n        this.LGel.trigger(lGEvents.beforeClose);\r\n        if (this.settings.resetScrollPosition && !this.settings.hideScrollbar) {\r\n            $LG(window).scrollTop(this.prevScrollTop);\r\n        }\r\n        var currentItem = this.items[this.index];\r\n        var transform;\r\n        if (this.zoomFromOrigin && currentItem) {\r\n            var _a = this.mediaContainerPosition, top_4 = _a.top, bottom = _a.bottom;\r\n            var _b = this.galleryItems[this.index], __slideVideoInfo = _b.__slideVideoInfo, poster = _b.poster;\r\n            var imageSize = utils.getSize(currentItem, this.outer, top_4 + bottom, __slideVideoInfo && poster && this.settings.videoMaxSize);\r\n            transform = utils.getTransform(currentItem, this.outer, top_4, bottom, imageSize);\r\n        }\r\n        if (this.zoomFromOrigin && transform) {\r\n            this.outer.addClass('lg-closing lg-zoom-from-image');\r\n            this.getSlideItem(this.index)\r\n                .addClass('lg-start-end-progress')\r\n                .css('transition-duration', this.settings.startAnimationDuration + 'ms')\r\n                .css('transform', transform);\r\n        }\r\n        else {\r\n            this.outer.addClass('lg-hide-items');\r\n            // lg-zoom-from-image is used for setting the opacity to 1 if zoomFromOrigin is true\r\n            // If the closing item doesn't have the lg-size attribute, remove this class to avoid the closing css conflicts\r\n            this.outer.removeClass('lg-zoom-from-image');\r\n        }\r\n        // Unbind all events added by lightGallery\r\n        // @todo\r\n        //this.$el.off('.lg.tm');\r\n        this.destroyModules();\r\n        this.lGalleryOn = false;\r\n        this.isDummyImageRemoved = false;\r\n        this.zoomFromOrigin = this.settings.zoomFromOrigin;\r\n        clearTimeout(this.hideBarTimeout);\r\n        this.hideBarTimeout = false;\r\n        $LG('html').removeClass('lg-on');\r\n        this.outer.removeClass('lg-visible lg-components-open');\r\n        // Resetting opacity to 0 isd required as  vertical swipe to close function adds inline opacity.\r\n        this.$backdrop.removeClass('in').css('opacity', 0);\r\n        var removeTimeout = this.zoomFromOrigin && transform\r\n            ? Math.max(this.settings.startAnimationDuration, this.settings.backdropDuration)\r\n            : this.settings.backdropDuration;\r\n        this.$container.removeClass('lg-show-in');\r\n        // Once the closign animation is completed and gallery is invisible\r\n        setTimeout(function () {\r\n            if (_this.zoomFromOrigin && transform) {\r\n                _this.outer.removeClass('lg-zoom-from-image');\r\n            }\r\n            _this.$container.removeClass('lg-show');\r\n            // Reset scrollbar\r\n            _this.resetScrollBar();\r\n            // Need to remove inline opacity as it is used in the stylesheet as well\r\n            _this.$backdrop\r\n                .removeAttr('style')\r\n                .css('transition-duration', _this.settings.backdropDuration + 'ms');\r\n            _this.outer.removeClass(\"lg-closing \" + _this.settings.startClass);\r\n            _this.getSlideItem(_this.index).removeClass('lg-start-end-progress');\r\n            _this.$inner.empty();\r\n            if (_this.lgOpened) {\r\n                _this.LGel.trigger(lGEvents.afterClose, {\r\n                    instance: _this,\r\n                });\r\n            }\r\n            if (_this.$container.get()) {\r\n                _this.$container.get().blur();\r\n            }\r\n            _this.lgOpened = false;\r\n        }, removeTimeout + 100);\r\n        return removeTimeout + 100;\r\n    };\r\n    LightGallery.prototype.initModules = function () {\r\n        this.plugins.forEach(function (module) {\r\n            try {\r\n                module.init();\r\n            }\r\n            catch (err) {\r\n                console.warn(\"lightGallery:- make sure lightGallery module is properly initiated\");\r\n            }\r\n        });\r\n    };\r\n    LightGallery.prototype.destroyModules = function (destroy) {\r\n        this.plugins.forEach(function (module) {\r\n            try {\r\n                if (destroy) {\r\n                    module.destroy();\r\n                }\r\n                else {\r\n                    module.closeGallery && module.closeGallery();\r\n                }\r\n            }\r\n            catch (err) {\r\n                console.warn(\"lightGallery:- make sure lightGallery module is properly destroyed\");\r\n            }\r\n        });\r\n    };\r\n    /**\r\n     * Refresh lightGallery with new set of children.\r\n     *\r\n     * @description This is useful to update the gallery when the child elements are changed without calling destroy method.\r\n     *\r\n     * If you are using dynamic mode, you can pass the modified array of dynamicEl as the first parameter to refresh the dynamic gallery\r\n     * @see <a href=\"/demos/dynamic-mode/\">Demo</a>\r\n     * @category lGPublicMethods\r\n     * @example\r\n     *  const plugin = lightGallery();\r\n     *  // Delete or add children, then call\r\n     *  plugin.refresh();\r\n     *\r\n     */\r\n    LightGallery.prototype.refresh = function (galleryItems) {\r\n        if (!this.settings.dynamic) {\r\n            this.invalidateItems();\r\n        }\r\n        if (galleryItems) {\r\n            this.galleryItems = galleryItems;\r\n        }\r\n        else {\r\n            this.galleryItems = this.getItems();\r\n        }\r\n        this.updateControls();\r\n        this.openGalleryOnItemClick();\r\n        this.LGel.trigger(lGEvents.updateSlides);\r\n    };\r\n    LightGallery.prototype.updateControls = function () {\r\n        this.addSlideVideoInfo(this.galleryItems);\r\n        this.updateCounterTotal();\r\n        this.manageSingleSlideClassName();\r\n    };\r\n    LightGallery.prototype.destroyGallery = function () {\r\n        this.destroyModules(true);\r\n        if (!this.settings.dynamic) {\r\n            this.invalidateItems();\r\n        }\r\n        $LG(window).off(\".lg.global\" + this.lgId);\r\n        this.LGel.off('.lg');\r\n        this.$container.remove();\r\n    };\r\n    /**\r\n     * Destroy lightGallery.\r\n     * Destroy lightGallery and its plugin instances completely\r\n     *\r\n     * @description This method also calls CloseGallery function internally. Returns the time takes to completely close and destroy the instance.\r\n     * In case if you want to re-initialize lightGallery right after destroying it, initialize it only once the destroy process is completed.\r\n     * You can use refresh method most of the times.\r\n     * @category lGPublicMethods\r\n     * @example\r\n     *  const plugin = lightGallery();\r\n     *  plugin.destroy();\r\n     *\r\n     */\r\n    LightGallery.prototype.destroy = function () {\r\n        var closeTimeout = this.closeGallery(true);\r\n        if (closeTimeout) {\r\n            setTimeout(this.destroyGallery.bind(this), closeTimeout);\r\n        }\r\n        else {\r\n            this.destroyGallery();\r\n        }\r\n        return closeTimeout;\r\n    };\r\n    return LightGallery;\r\n}());\n\nfunction lightGallery(el, options) {\r\n    return new LightGallery(el, options);\r\n}\n\nexport default lightGallery;\n//# sourceMappingURL=lightgallery.es5.js.map\n","/*!\n * lightgallery | 2.9.0 | October 1st 2025\n * http://www.lightgalleryjs.com/\n * Copyright (c) 2020 Sachin Neravath;\n * @license GPLv3\n */\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nvar __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\n\nvar zoomSettings = {\r\n    scale: 1,\r\n    zoom: true,\r\n    infiniteZoom: true,\r\n    actualSize: true,\r\n    showZoomInOutIcons: false,\r\n    actualSizeIcons: {\r\n        zoomIn: 'lg-zoom-in',\r\n        zoomOut: 'lg-zoom-out',\r\n    },\r\n    enableZoomAfter: 300,\r\n    zoomPluginStrings: {\r\n        zoomIn: 'Zoom in',\r\n        zoomOut: 'Zoom out',\r\n        viewActualSize: 'View actual size',\r\n    },\r\n};\n\n/**\r\n * List of lightGallery events\r\n * All events should be documented here\r\n * Below interfaces are used to build the website documentations\r\n * */\r\nvar lGEvents = {\r\n    afterAppendSlide: 'lgAfterAppendSlide',\r\n    init: 'lgInit',\r\n    hasVideo: 'lgHasVideo',\r\n    containerResize: 'lgContainerResize',\r\n    updateSlides: 'lgUpdateSlides',\r\n    afterAppendSubHtml: 'lgAfterAppendSubHtml',\r\n    beforeOpen: 'lgBeforeOpen',\r\n    afterOpen: 'lgAfterOpen',\r\n    slideItemLoad: 'lgSlideItemLoad',\r\n    beforeSlide: 'lgBeforeSlide',\r\n    afterSlide: 'lgAfterSlide',\r\n    posterClick: 'lgPosterClick',\r\n    dragStart: 'lgDragStart',\r\n    dragMove: 'lgDragMove',\r\n    dragEnd: 'lgDragEnd',\r\n    beforeNextSlide: 'lgBeforeNextSlide',\r\n    beforePrevSlide: 'lgBeforePrevSlide',\r\n    beforeClose: 'lgBeforeClose',\r\n    afterClose: 'lgAfterClose',\r\n    rotateLeft: 'lgRotateLeft',\r\n    rotateRight: 'lgRotateRight',\r\n    flipHorizontal: 'lgFlipHorizontal',\r\n    flipVertical: 'lgFlipVertical',\r\n    autoplay: 'lgAutoplay',\r\n    autoplayStart: 'lgAutoplayStart',\r\n    autoplayStop: 'lgAutoplayStop',\r\n};\n\nvar ZOOM_TRANSITION_DURATION = 500;\r\nvar Zoom = /** @class */ (function () {\r\n    function Zoom(instance, $LG) {\r\n        // get lightGallery core plugin instance\r\n        this.core = instance;\r\n        this.$LG = $LG;\r\n        this.settings = __assign(__assign({}, zoomSettings), this.core.settings);\r\n        return this;\r\n    }\r\n    // Append Zoom controls. Actual size, Zoom-in, Zoom-out\r\n    Zoom.prototype.buildTemplates = function () {\r\n        var zoomIcons = this.settings.showZoomInOutIcons\r\n            ? \"<button id=\\\"\" + this.core.getIdName('lg-zoom-in') + \"\\\" type=\\\"button\\\" aria-label=\\\"\" + this.settings.zoomPluginStrings['zoomIn'] + \"\\\" class=\\\"lg-zoom-in lg-icon\\\"></button><button id=\\\"\" + this.core.getIdName('lg-zoom-out') + \"\\\" type=\\\"button\\\" aria-label=\\\"\" + this.settings.zoomPluginStrings['zoomOut'] + \"\\\" class=\\\"lg-zoom-out lg-icon\\\"></button>\"\r\n            : '';\r\n        if (this.settings.actualSize) {\r\n            zoomIcons += \"<button id=\\\"\" + this.core.getIdName('lg-actual-size') + \"\\\" type=\\\"button\\\" aria-label=\\\"\" + this.settings.zoomPluginStrings['viewActualSize'] + \"\\\" class=\\\"\" + this.settings.actualSizeIcons.zoomIn + \" lg-icon\\\"></button>\";\r\n        }\r\n        this.core.outer.addClass('lg-use-transition-for-zoom');\r\n        this.core.$toolbar.first().append(zoomIcons);\r\n    };\r\n    /**\r\n     * @desc Enable zoom option only once the image is completely loaded\r\n     * If zoomFromOrigin is true, Zoom is enabled once the dummy image has been inserted\r\n     *\r\n     * Zoom styles are defined under lg-zoomable CSS class.\r\n     */\r\n    Zoom.prototype.enableZoom = function (event) {\r\n        var _this = this;\r\n        // delay will be 0 except first time\r\n        var _speed = this.settings.enableZoomAfter + event.detail.delay;\r\n        // set _speed value 0 if gallery opened from direct url and if it is first slide\r\n        if (this.$LG('body').first().hasClass('lg-from-hash') &&\r\n            event.detail.delay) {\r\n            // will execute only once\r\n            _speed = 0;\r\n        }\r\n        else {\r\n            // Remove lg-from-hash to enable starting animation.\r\n            this.$LG('body').first().removeClass('lg-from-hash');\r\n        }\r\n        this.zoomableTimeout = setTimeout(function () {\r\n            if (!_this.isImageSlide(_this.core.index)) {\r\n                return;\r\n            }\r\n            _this.core.getSlideItem(event.detail.index).addClass('lg-zoomable');\r\n            if (event.detail.index === _this.core.index) {\r\n                _this.setZoomEssentials();\r\n            }\r\n        }, _speed + 30);\r\n    };\r\n    Zoom.prototype.enableZoomOnSlideItemLoad = function () {\r\n        // Add zoomable class\r\n        this.core.LGel.on(lGEvents.slideItemLoad + \".zoom\", this.enableZoom.bind(this));\r\n    };\r\n    Zoom.prototype.getDragCords = function (e) {\r\n        return {\r\n            x: e.pageX,\r\n            y: e.pageY,\r\n        };\r\n    };\r\n    Zoom.prototype.getSwipeCords = function (e) {\r\n        var x = e.touches[0].pageX;\r\n        var y = e.touches[0].pageY;\r\n        return {\r\n            x: x,\r\n            y: y,\r\n        };\r\n    };\r\n    Zoom.prototype.getDragAllowedAxises = function (scale, scaleDiff) {\r\n        if (!this.containerRect) {\r\n            return {\r\n                allowX: false,\r\n                allowY: false,\r\n            };\r\n        }\r\n        var $image = this.core\r\n            .getSlideItem(this.core.index)\r\n            .find('.lg-image')\r\n            .first()\r\n            .get();\r\n        var height = 0;\r\n        var width = 0;\r\n        var rect = $image.getBoundingClientRect();\r\n        if (scale) {\r\n            height = $image.offsetHeight * scale;\r\n            width = $image.offsetWidth * scale;\r\n        }\r\n        else if (scaleDiff) {\r\n            height = rect.height + scaleDiff * rect.height;\r\n            width = rect.width + scaleDiff * rect.width;\r\n        }\r\n        else {\r\n            height = rect.height;\r\n            width = rect.width;\r\n        }\r\n        var allowY = height > this.containerRect.height;\r\n        var allowX = width > this.containerRect.width;\r\n        return {\r\n            allowX: allowX,\r\n            allowY: allowY,\r\n        };\r\n    };\r\n    Zoom.prototype.setZoomEssentials = function () {\r\n        this.containerRect = this.core.$content.get().getBoundingClientRect();\r\n    };\r\n    /**\r\n     * @desc Image zoom\r\n     * Translate the wrap and scale the image to get better user experience\r\n     *\r\n     * @param {String} scale - Zoom decrement/increment value\r\n     */\r\n    Zoom.prototype.zoomImage = function (scale, scaleDiff, reposition, resetToMax) {\r\n        if (!this.containerRect || Math.abs(scaleDiff) <= 0)\r\n            return;\r\n        var offsetX = this.containerRect.width / 2 + this.containerRect.left;\r\n        var offsetY = this.containerRect.height / 2 +\r\n            this.containerRect.top +\r\n            this.scrollTop;\r\n        var originalX;\r\n        var originalY;\r\n        if (scale === 1) {\r\n            this.positionChanged = false;\r\n        }\r\n        var dragAllowedAxises = this.getDragAllowedAxises(0, scaleDiff);\r\n        var allowY = dragAllowedAxises.allowY, allowX = dragAllowedAxises.allowX;\r\n        if (this.positionChanged) {\r\n            originalX = this.left / (this.scale - scaleDiff);\r\n            originalY = this.top / (this.scale - scaleDiff);\r\n            this.pageX = offsetX - originalX;\r\n            this.pageY = offsetY - originalY;\r\n            this.positionChanged = false;\r\n        }\r\n        var possibleSwipeCords = this.getPossibleSwipeDragCords(scaleDiff);\r\n        var x;\r\n        var y;\r\n        var _x = offsetX - this.pageX;\r\n        var _y = offsetY - this.pageY;\r\n        if (scale - scaleDiff > 1) {\r\n            var scaleVal = (scale - scaleDiff) / Math.abs(scaleDiff);\r\n            _x =\r\n                (scaleDiff < 0 ? -_x : _x) +\r\n                    this.left * (scaleVal + (scaleDiff < 0 ? -1 : 1));\r\n            _y =\r\n                (scaleDiff < 0 ? -_y : _y) +\r\n                    this.top * (scaleVal + (scaleDiff < 0 ? -1 : 1));\r\n            x = _x / scaleVal;\r\n            y = _y / scaleVal;\r\n        }\r\n        else {\r\n            var scaleVal = (scale - scaleDiff) * scaleDiff;\r\n            x = _x * scaleVal;\r\n            y = _y * scaleVal;\r\n        }\r\n        if (reposition) {\r\n            if (allowX) {\r\n                if (this.isBeyondPossibleLeft(x, possibleSwipeCords.minX)) {\r\n                    x = possibleSwipeCords.minX;\r\n                }\r\n                else if (this.isBeyondPossibleRight(x, possibleSwipeCords.maxX)) {\r\n                    x = possibleSwipeCords.maxX;\r\n                }\r\n            }\r\n            else {\r\n                if (scale > 1) {\r\n                    if (x < possibleSwipeCords.minX) {\r\n                        x = possibleSwipeCords.minX;\r\n                    }\r\n                    else if (x > possibleSwipeCords.maxX) {\r\n                        x = possibleSwipeCords.maxX;\r\n                    }\r\n                }\r\n            }\r\n            // @todo fix this\r\n            if (allowY) {\r\n                if (this.isBeyondPossibleTop(y, possibleSwipeCords.minY)) {\r\n                    y = possibleSwipeCords.minY;\r\n                }\r\n                else if (this.isBeyondPossibleBottom(y, possibleSwipeCords.maxY)) {\r\n                    y = possibleSwipeCords.maxY;\r\n                }\r\n            }\r\n            else {\r\n                // If the translate value based on index of beyond the viewport, utilize the available space to prevent image being cut out\r\n                if (scale > 1) {\r\n                    //If image goes beyond viewport top, use the minim possible translate value\r\n                    if (y < possibleSwipeCords.minY) {\r\n                        y = possibleSwipeCords.minY;\r\n                    }\r\n                    else if (y > possibleSwipeCords.maxY) {\r\n                        y = possibleSwipeCords.maxY;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        this.setZoomStyles({\r\n            x: x,\r\n            y: y,\r\n            scale: scale,\r\n        });\r\n        this.left = x;\r\n        this.top = y;\r\n        if (resetToMax) {\r\n            this.setZoomImageSize();\r\n        }\r\n    };\r\n    Zoom.prototype.resetImageTranslate = function (index) {\r\n        if (!this.isImageSlide(index)) {\r\n            return;\r\n        }\r\n        var $image = this.core.getSlideItem(index).find('.lg-image').first();\r\n        this.imageReset = false;\r\n        $image.removeClass('reset-transition reset-transition-y reset-transition-x');\r\n        this.core.outer.removeClass('lg-actual-size');\r\n        $image.css('width', 'auto').css('height', 'auto');\r\n        setTimeout(function () {\r\n            $image.removeClass('no-transition');\r\n        }, 10);\r\n    };\r\n    Zoom.prototype.setZoomImageSize = function () {\r\n        var _this = this;\r\n        var $image = this.core\r\n            .getSlideItem(this.core.index)\r\n            .find('.lg-image')\r\n            .first();\r\n        setTimeout(function () {\r\n            var actualSizeScale = _this.getCurrentImageActualSizeScale();\r\n            if (_this.scale >= actualSizeScale) {\r\n                $image.addClass('no-transition');\r\n                _this.imageReset = true;\r\n            }\r\n        }, ZOOM_TRANSITION_DURATION);\r\n        setTimeout(function () {\r\n            var actualSizeScale = _this.getCurrentImageActualSizeScale();\r\n            if (_this.scale >= actualSizeScale) {\r\n                var dragAllowedAxises = _this.getDragAllowedAxises(_this.scale);\r\n                $image\r\n                    .css('width', $image.get().naturalWidth + 'px')\r\n                    .css('height', $image.get().naturalHeight + 'px');\r\n                _this.core.outer.addClass('lg-actual-size');\r\n                if (dragAllowedAxises.allowX && dragAllowedAxises.allowY) {\r\n                    $image.addClass('reset-transition');\r\n                }\r\n                else if (dragAllowedAxises.allowX &&\r\n                    !dragAllowedAxises.allowY) {\r\n                    $image.addClass('reset-transition-x');\r\n                }\r\n                else if (!dragAllowedAxises.allowX &&\r\n                    dragAllowedAxises.allowY) {\r\n                    $image.addClass('reset-transition-y');\r\n                }\r\n            }\r\n        }, ZOOM_TRANSITION_DURATION + 50);\r\n    };\r\n    /**\r\n     * @desc apply scale3d to image and translate to image wrap\r\n     * @param {style} X,Y and scale\r\n     */\r\n    Zoom.prototype.setZoomStyles = function (style) {\r\n        var $imageWrap = this.core\r\n            .getSlideItem(this.core.index)\r\n            .find('.lg-img-wrap')\r\n            .first();\r\n        var $image = this.core\r\n            .getSlideItem(this.core.index)\r\n            .find('.lg-image')\r\n            .first();\r\n        var $dummyImage = this.core.outer\r\n            .find('.lg-current .lg-dummy-img')\r\n            .first();\r\n        this.scale = style.scale;\r\n        $image.css('transform', 'scale3d(' + style.scale + ', ' + style.scale + ', 1)');\r\n        $dummyImage.css('transform', 'scale3d(' + style.scale + ', ' + style.scale + ', 1)');\r\n        var transform = 'translate3d(' + style.x + 'px, ' + style.y + 'px, 0)';\r\n        $imageWrap.css('transform', transform);\r\n    };\r\n    /**\r\n     * @param index - Index of the current slide\r\n     * @param event - event will be available only if the function is called on clicking/taping the imags\r\n     */\r\n    Zoom.prototype.setActualSize = function (index, event) {\r\n        var _this = this;\r\n        if (this.zoomInProgress) {\r\n            return;\r\n        }\r\n        this.zoomInProgress = true;\r\n        var currentItem = this.core.galleryItems[this.core.index];\r\n        this.resetImageTranslate(index);\r\n        setTimeout(function () {\r\n            // Allow zoom only on image\r\n            if (!currentItem.src ||\r\n                _this.core.outer.hasClass('lg-first-slide-loading')) {\r\n                return;\r\n            }\r\n            var scale = _this.getCurrentImageActualSizeScale();\r\n            var prevScale = _this.scale;\r\n            if (_this.core.outer.hasClass('lg-zoomed')) {\r\n                _this.scale = 1;\r\n            }\r\n            else {\r\n                _this.scale = _this.getScale(scale);\r\n            }\r\n            _this.setPageCords(event);\r\n            _this.beginZoom(_this.scale);\r\n            _this.zoomImage(_this.scale, _this.scale - prevScale, true, true);\r\n        }, 50);\r\n        setTimeout(function () {\r\n            _this.core.outer.removeClass('lg-grabbing').addClass('lg-grab');\r\n        }, 60);\r\n        setTimeout(function () {\r\n            _this.zoomInProgress = false;\r\n        }, ZOOM_TRANSITION_DURATION + 110);\r\n    };\r\n    Zoom.prototype.getNaturalWidth = function (index) {\r\n        var $image = this.core.getSlideItem(index).find('.lg-image').first();\r\n        var naturalWidth = this.core.galleryItems[index].width;\r\n        return naturalWidth\r\n            ? parseFloat(naturalWidth)\r\n            : $image.get().naturalWidth;\r\n    };\r\n    Zoom.prototype.getActualSizeScale = function (naturalWidth, width) {\r\n        var _scale;\r\n        var scale;\r\n        if (naturalWidth >= width) {\r\n            _scale = naturalWidth / width;\r\n            scale = _scale || 2;\r\n        }\r\n        else {\r\n            scale = 1;\r\n        }\r\n        return scale;\r\n    };\r\n    Zoom.prototype.getCurrentImageActualSizeScale = function () {\r\n        var $image = this.core\r\n            .getSlideItem(this.core.index)\r\n            .find('.lg-image')\r\n            .first();\r\n        var width = $image.get().offsetWidth;\r\n        var naturalWidth = this.getNaturalWidth(this.core.index) || width;\r\n        return this.getActualSizeScale(naturalWidth, width);\r\n    };\r\n    Zoom.prototype.getPageCords = function (event) {\r\n        var cords = {};\r\n        if (event) {\r\n            cords.x = event.pageX || event.touches[0].pageX;\r\n            cords.y = event.pageY || event.touches[0].pageY;\r\n        }\r\n        else {\r\n            var containerRect = this.core.$content\r\n                .get()\r\n                .getBoundingClientRect();\r\n            cords.x = containerRect.width / 2 + containerRect.left;\r\n            cords.y =\r\n                containerRect.height / 2 + this.scrollTop + containerRect.top;\r\n        }\r\n        return cords;\r\n    };\r\n    Zoom.prototype.setPageCords = function (event) {\r\n        var pageCords = this.getPageCords(event);\r\n        this.pageX = pageCords.x;\r\n        this.pageY = pageCords.y;\r\n    };\r\n    Zoom.prototype.manageActualPixelClassNames = function () {\r\n        var $actualSize = this.core.getElementById('lg-actual-size');\r\n        $actualSize\r\n            .removeClass(this.settings.actualSizeIcons.zoomIn)\r\n            .addClass(this.settings.actualSizeIcons.zoomOut);\r\n    };\r\n    // If true, zoomed - in else zoomed out\r\n    Zoom.prototype.beginZoom = function (scale) {\r\n        this.core.outer.removeClass('lg-zoom-drag-transition lg-zoom-dragging');\r\n        if (scale > 1) {\r\n            this.core.outer.addClass('lg-zoomed');\r\n            this.manageActualPixelClassNames();\r\n        }\r\n        else {\r\n            this.resetZoom();\r\n        }\r\n        return scale > 1;\r\n    };\r\n    Zoom.prototype.getScale = function (scale) {\r\n        var actualSizeScale = this.getCurrentImageActualSizeScale();\r\n        if (scale < 1) {\r\n            scale = 1;\r\n        }\r\n        else if (scale > actualSizeScale) {\r\n            scale = actualSizeScale;\r\n        }\r\n        return scale;\r\n    };\r\n    Zoom.prototype.init = function () {\r\n        var _this = this;\r\n        if (!this.settings.zoom) {\r\n            return;\r\n        }\r\n        this.buildTemplates();\r\n        this.enableZoomOnSlideItemLoad();\r\n        var tapped = null;\r\n        this.core.outer.on('dblclick.lg', function (event) {\r\n            if (!_this.$LG(event.target).hasClass('lg-image')) {\r\n                return;\r\n            }\r\n            _this.setActualSize(_this.core.index, event);\r\n        });\r\n        this.core.outer.on('touchstart.lg', function (event) {\r\n            var $target = _this.$LG(event.target);\r\n            if (event.touches.length === 1 && $target.hasClass('lg-image')) {\r\n                if (!tapped) {\r\n                    tapped = setTimeout(function () {\r\n                        tapped = null;\r\n                    }, 300);\r\n                }\r\n                else {\r\n                    clearTimeout(tapped);\r\n                    tapped = null;\r\n                    event.preventDefault();\r\n                    _this.setActualSize(_this.core.index, event);\r\n                }\r\n            }\r\n        });\r\n        this.core.LGel.on(lGEvents.containerResize + \".zoom \" + lGEvents.rotateRight + \".zoom \" + lGEvents.rotateLeft + \".zoom \" + lGEvents.flipHorizontal + \".zoom \" + lGEvents.flipVertical + \".zoom\", function () {\r\n            if (!_this.core.lgOpened ||\r\n                !_this.isImageSlide(_this.core.index) ||\r\n                _this.core.touchAction) {\r\n                return;\r\n            }\r\n            var _LGel = _this.core\r\n                .getSlideItem(_this.core.index)\r\n                .find('.lg-img-wrap')\r\n                .first();\r\n            _this.top = 0;\r\n            _this.left = 0;\r\n            _this.setZoomEssentials();\r\n            _this.setZoomSwipeStyles(_LGel, { x: 0, y: 0 });\r\n            _this.positionChanged = true;\r\n        });\r\n        // Update zoom on resize and orientationchange\r\n        this.$LG(window).on(\"scroll.lg.zoom.global\" + this.core.lgId, function () {\r\n            if (!_this.core.lgOpened)\r\n                return;\r\n            _this.scrollTop = _this.$LG(window).scrollTop();\r\n        });\r\n        this.core.getElementById('lg-zoom-out').on('click.lg', function () {\r\n            // Allow zoom only on image\r\n            if (!_this.isImageSlide(_this.core.index)) {\r\n                return;\r\n            }\r\n            var timeout = 0;\r\n            if (_this.imageReset) {\r\n                _this.resetImageTranslate(_this.core.index);\r\n                timeout = 50;\r\n            }\r\n            setTimeout(function () {\r\n                var scale = _this.scale - _this.settings.scale;\r\n                if (scale < 1) {\r\n                    scale = 1;\r\n                }\r\n                _this.beginZoom(scale);\r\n                _this.zoomImage(scale, -_this.settings.scale, true, !_this.settings.infiniteZoom);\r\n            }, timeout);\r\n        });\r\n        this.core.getElementById('lg-zoom-in').on('click.lg', function () {\r\n            _this.zoomIn();\r\n        });\r\n        this.core.getElementById('lg-actual-size').on('click.lg', function () {\r\n            _this.setActualSize(_this.core.index);\r\n        });\r\n        this.core.LGel.on(lGEvents.beforeOpen + \".zoom\", function () {\r\n            _this.core.outer.find('.lg-item').removeClass('lg-zoomable');\r\n        });\r\n        this.core.LGel.on(lGEvents.afterOpen + \".zoom\", function () {\r\n            _this.scrollTop = _this.$LG(window).scrollTop();\r\n            // Set the initial value center\r\n            _this.pageX = _this.core.outer.width() / 2;\r\n            _this.pageY = _this.core.outer.height() / 2 + _this.scrollTop;\r\n            _this.scale = 1;\r\n        });\r\n        // Reset zoom on slide change\r\n        this.core.LGel.on(lGEvents.afterSlide + \".zoom\", function (event) {\r\n            var prevIndex = event.detail.prevIndex;\r\n            _this.scale = 1;\r\n            _this.positionChanged = false;\r\n            _this.zoomInProgress = false;\r\n            _this.resetZoom(prevIndex);\r\n            _this.resetImageTranslate(prevIndex);\r\n            if (_this.isImageSlide(_this.core.index)) {\r\n                _this.setZoomEssentials();\r\n            }\r\n        });\r\n        // Drag option after zoom\r\n        this.zoomDrag();\r\n        this.pinchZoom();\r\n        this.zoomSwipe();\r\n        // Store the zoomable timeout value just to clear it while closing\r\n        this.zoomableTimeout = false;\r\n        this.positionChanged = false;\r\n        this.zoomInProgress = false;\r\n    };\r\n    Zoom.prototype.zoomIn = function () {\r\n        // Allow zoom only on image\r\n        if (!this.isImageSlide(this.core.index)) {\r\n            return;\r\n        }\r\n        var scale = this.scale + this.settings.scale;\r\n        if (!this.settings.infiniteZoom) {\r\n            scale = this.getScale(scale);\r\n        }\r\n        this.beginZoom(scale);\r\n        this.zoomImage(scale, Math.min(this.settings.scale, scale - this.scale), true, !this.settings.infiniteZoom);\r\n    };\r\n    // Reset zoom effect\r\n    Zoom.prototype.resetZoom = function (index) {\r\n        this.core.outer.removeClass('lg-zoomed lg-zoom-drag-transition');\r\n        var $actualSize = this.core.getElementById('lg-actual-size');\r\n        var $item = this.core.getSlideItem(index !== undefined ? index : this.core.index);\r\n        $actualSize\r\n            .removeClass(this.settings.actualSizeIcons.zoomOut)\r\n            .addClass(this.settings.actualSizeIcons.zoomIn);\r\n        $item.find('.lg-img-wrap').first().removeAttr('style');\r\n        $item.find('.lg-image').first().removeAttr('style');\r\n        this.scale = 1;\r\n        this.left = 0;\r\n        this.top = 0;\r\n        // Reset pagx pagy values to center\r\n        this.setPageCords();\r\n    };\r\n    Zoom.prototype.getTouchDistance = function (e) {\r\n        return Math.sqrt((e.touches[0].pageX - e.touches[1].pageX) *\r\n            (e.touches[0].pageX - e.touches[1].pageX) +\r\n            (e.touches[0].pageY - e.touches[1].pageY) *\r\n                (e.touches[0].pageY - e.touches[1].pageY));\r\n    };\r\n    Zoom.prototype.pinchZoom = function () {\r\n        var _this = this;\r\n        var startDist = 0;\r\n        var pinchStarted = false;\r\n        var initScale = 1;\r\n        var prevScale = 0;\r\n        var $item = this.core.getSlideItem(this.core.index);\r\n        this.core.outer.on('touchstart.lg', function (e) {\r\n            $item = _this.core.getSlideItem(_this.core.index);\r\n            if (!_this.isImageSlide(_this.core.index)) {\r\n                return;\r\n            }\r\n            if (e.touches.length === 2) {\r\n                e.preventDefault();\r\n                if (_this.core.outer.hasClass('lg-first-slide-loading')) {\r\n                    return;\r\n                }\r\n                initScale = _this.scale || 1;\r\n                _this.core.outer.removeClass('lg-zoom-drag-transition lg-zoom-dragging');\r\n                _this.setPageCords(e);\r\n                _this.resetImageTranslate(_this.core.index);\r\n                _this.core.touchAction = 'pinch';\r\n                startDist = _this.getTouchDistance(e);\r\n            }\r\n        });\r\n        this.core.$inner.on('touchmove.lg', function (e) {\r\n            if (e.touches.length === 2 &&\r\n                _this.core.touchAction === 'pinch' &&\r\n                (_this.$LG(e.target).hasClass('lg-item') ||\r\n                    $item.get().contains(e.target))) {\r\n                e.preventDefault();\r\n                var endDist = _this.getTouchDistance(e);\r\n                var distance = startDist - endDist;\r\n                if (!pinchStarted && Math.abs(distance) > 5) {\r\n                    pinchStarted = true;\r\n                }\r\n                if (pinchStarted) {\r\n                    prevScale = _this.scale;\r\n                    var _scale = Math.max(1, initScale + -distance * 0.02);\r\n                    _this.scale =\r\n                        Math.round((_scale + Number.EPSILON) * 100) / 100;\r\n                    var diff = _this.scale - prevScale;\r\n                    _this.zoomImage(_this.scale, Math.round((diff + Number.EPSILON) * 100) / 100, false, false);\r\n                }\r\n            }\r\n        });\r\n        this.core.$inner.on('touchend.lg', function (e) {\r\n            if (_this.core.touchAction === 'pinch' &&\r\n                (_this.$LG(e.target).hasClass('lg-item') ||\r\n                    $item.get().contains(e.target))) {\r\n                pinchStarted = false;\r\n                startDist = 0;\r\n                if (_this.scale <= 1) {\r\n                    _this.resetZoom();\r\n                }\r\n                else {\r\n                    var actualSizeScale = _this.getCurrentImageActualSizeScale();\r\n                    if (_this.scale >= actualSizeScale) {\r\n                        var scaleDiff = actualSizeScale - _this.scale;\r\n                        if (scaleDiff === 0) {\r\n                            scaleDiff = 0.01;\r\n                        }\r\n                        _this.zoomImage(actualSizeScale, scaleDiff, false, true);\r\n                    }\r\n                    _this.manageActualPixelClassNames();\r\n                    _this.core.outer.addClass('lg-zoomed');\r\n                }\r\n                _this.core.touchAction = undefined;\r\n            }\r\n        });\r\n    };\r\n    Zoom.prototype.touchendZoom = function (startCoords, endCoords, allowX, allowY, touchDuration) {\r\n        var distanceXnew = endCoords.x - startCoords.x;\r\n        var distanceYnew = endCoords.y - startCoords.y;\r\n        var speedX = Math.abs(distanceXnew) / touchDuration + 1;\r\n        var speedY = Math.abs(distanceYnew) / touchDuration + 1;\r\n        if (speedX > 2) {\r\n            speedX += 1;\r\n        }\r\n        if (speedY > 2) {\r\n            speedY += 1;\r\n        }\r\n        distanceXnew = distanceXnew * speedX;\r\n        distanceYnew = distanceYnew * speedY;\r\n        var _LGel = this.core\r\n            .getSlideItem(this.core.index)\r\n            .find('.lg-img-wrap')\r\n            .first();\r\n        var distance = {};\r\n        distance.x = this.left + distanceXnew;\r\n        distance.y = this.top + distanceYnew;\r\n        var possibleSwipeCords = this.getPossibleSwipeDragCords();\r\n        if (Math.abs(distanceXnew) > 15 || Math.abs(distanceYnew) > 15) {\r\n            if (allowY) {\r\n                if (this.isBeyondPossibleTop(distance.y, possibleSwipeCords.minY)) {\r\n                    distance.y = possibleSwipeCords.minY;\r\n                }\r\n                else if (this.isBeyondPossibleBottom(distance.y, possibleSwipeCords.maxY)) {\r\n                    distance.y = possibleSwipeCords.maxY;\r\n                }\r\n            }\r\n            if (allowX) {\r\n                if (this.isBeyondPossibleLeft(distance.x, possibleSwipeCords.minX)) {\r\n                    distance.x = possibleSwipeCords.minX;\r\n                }\r\n                else if (this.isBeyondPossibleRight(distance.x, possibleSwipeCords.maxX)) {\r\n                    distance.x = possibleSwipeCords.maxX;\r\n                }\r\n            }\r\n            if (allowY) {\r\n                this.top = distance.y;\r\n            }\r\n            else {\r\n                distance.y = this.top;\r\n            }\r\n            if (allowX) {\r\n                this.left = distance.x;\r\n            }\r\n            else {\r\n                distance.x = this.left;\r\n            }\r\n            this.setZoomSwipeStyles(_LGel, distance);\r\n            this.positionChanged = true;\r\n        }\r\n    };\r\n    Zoom.prototype.getZoomSwipeCords = function (startCoords, endCoords, allowX, allowY, possibleSwipeCords) {\r\n        var distance = {};\r\n        if (allowY) {\r\n            distance.y = this.top + (endCoords.y - startCoords.y);\r\n            if (this.isBeyondPossibleTop(distance.y, possibleSwipeCords.minY)) {\r\n                var diffMinY = possibleSwipeCords.minY - distance.y;\r\n                distance.y = possibleSwipeCords.minY - diffMinY / 6;\r\n            }\r\n            else if (this.isBeyondPossibleBottom(distance.y, possibleSwipeCords.maxY)) {\r\n                var diffMaxY = distance.y - possibleSwipeCords.maxY;\r\n                distance.y = possibleSwipeCords.maxY + diffMaxY / 6;\r\n            }\r\n        }\r\n        else {\r\n            distance.y = this.top;\r\n        }\r\n        if (allowX) {\r\n            distance.x = this.left + (endCoords.x - startCoords.x);\r\n            if (this.isBeyondPossibleLeft(distance.x, possibleSwipeCords.minX)) {\r\n                var diffMinX = possibleSwipeCords.minX - distance.x;\r\n                distance.x = possibleSwipeCords.minX - diffMinX / 6;\r\n            }\r\n            else if (this.isBeyondPossibleRight(distance.x, possibleSwipeCords.maxX)) {\r\n                var difMaxX = distance.x - possibleSwipeCords.maxX;\r\n                distance.x = possibleSwipeCords.maxX + difMaxX / 6;\r\n            }\r\n        }\r\n        else {\r\n            distance.x = this.left;\r\n        }\r\n        return distance;\r\n    };\r\n    Zoom.prototype.isBeyondPossibleLeft = function (x, minX) {\r\n        return x >= minX;\r\n    };\r\n    Zoom.prototype.isBeyondPossibleRight = function (x, maxX) {\r\n        return x <= maxX;\r\n    };\r\n    Zoom.prototype.isBeyondPossibleTop = function (y, minY) {\r\n        return y >= minY;\r\n    };\r\n    Zoom.prototype.isBeyondPossibleBottom = function (y, maxY) {\r\n        return y <= maxY;\r\n    };\r\n    Zoom.prototype.isImageSlide = function (index) {\r\n        var currentItem = this.core.galleryItems[index];\r\n        return this.core.getSlideType(currentItem) === 'image';\r\n    };\r\n    Zoom.prototype.getPossibleSwipeDragCords = function (scale) {\r\n        var $image = this.core\r\n            .getSlideItem(this.core.index)\r\n            .find('.lg-image')\r\n            .first();\r\n        var bottom = this.core.mediaContainerPosition.bottom;\r\n        var imgRect = $image.get().getBoundingClientRect();\r\n        var imageHeight = imgRect.height;\r\n        var imageWidth = imgRect.width;\r\n        if (scale) {\r\n            imageHeight = imageHeight + scale * imageHeight;\r\n            imageWidth = imageWidth + scale * imageWidth;\r\n        }\r\n        var minY = (imageHeight - this.containerRect.height) / 2;\r\n        var maxY = (this.containerRect.height - imageHeight) / 2 + bottom;\r\n        var minX = (imageWidth - this.containerRect.width) / 2;\r\n        var maxX = (this.containerRect.width - imageWidth) / 2;\r\n        var possibleSwipeCords = {\r\n            minY: minY,\r\n            maxY: maxY,\r\n            minX: minX,\r\n            maxX: maxX,\r\n        };\r\n        return possibleSwipeCords;\r\n    };\r\n    Zoom.prototype.setZoomSwipeStyles = function (LGel, distance) {\r\n        LGel.css('transform', 'translate3d(' + distance.x + 'px, ' + distance.y + 'px, 0)');\r\n    };\r\n    Zoom.prototype.zoomSwipe = function () {\r\n        var _this = this;\r\n        var startCoords = {};\r\n        var endCoords = {};\r\n        var isMoved = false;\r\n        // Allow x direction drag\r\n        var allowX = false;\r\n        // Allow Y direction drag\r\n        var allowY = false;\r\n        var startTime = new Date();\r\n        var endTime = new Date();\r\n        var possibleSwipeCords;\r\n        var _LGel;\r\n        var $item = this.core.getSlideItem(this.core.index);\r\n        this.core.$inner.on('touchstart.lg', function (e) {\r\n            // Allow zoom only on image\r\n            if (!_this.isImageSlide(_this.core.index)) {\r\n                return;\r\n            }\r\n            $item = _this.core.getSlideItem(_this.core.index);\r\n            if ((_this.$LG(e.target).hasClass('lg-item') ||\r\n                $item.get().contains(e.target)) &&\r\n                e.touches.length === 1 &&\r\n                _this.core.outer.hasClass('lg-zoomed')) {\r\n                e.preventDefault();\r\n                startTime = new Date();\r\n                _this.core.touchAction = 'zoomSwipe';\r\n                _LGel = _this.core\r\n                    .getSlideItem(_this.core.index)\r\n                    .find('.lg-img-wrap')\r\n                    .first();\r\n                var dragAllowedAxises = _this.getDragAllowedAxises(0);\r\n                allowY = dragAllowedAxises.allowY;\r\n                allowX = dragAllowedAxises.allowX;\r\n                if (allowX || allowY) {\r\n                    startCoords = _this.getSwipeCords(e);\r\n                }\r\n                possibleSwipeCords = _this.getPossibleSwipeDragCords();\r\n                // reset opacity and transition duration\r\n                _this.core.outer.addClass('lg-zoom-dragging lg-zoom-drag-transition');\r\n            }\r\n        });\r\n        this.core.$inner.on('touchmove.lg', function (e) {\r\n            if (e.touches.length === 1 &&\r\n                _this.core.touchAction === 'zoomSwipe' &&\r\n                (_this.$LG(e.target).hasClass('lg-item') ||\r\n                    $item.get().contains(e.target))) {\r\n                e.preventDefault();\r\n                _this.core.touchAction = 'zoomSwipe';\r\n                endCoords = _this.getSwipeCords(e);\r\n                var distance = _this.getZoomSwipeCords(startCoords, endCoords, allowX, allowY, possibleSwipeCords);\r\n                if (Math.abs(endCoords.x - startCoords.x) > 15 ||\r\n                    Math.abs(endCoords.y - startCoords.y) > 15) {\r\n                    isMoved = true;\r\n                    _this.setZoomSwipeStyles(_LGel, distance);\r\n                }\r\n            }\r\n        });\r\n        this.core.$inner.on('touchend.lg', function (e) {\r\n            if (_this.core.touchAction === 'zoomSwipe' &&\r\n                (_this.$LG(e.target).hasClass('lg-item') ||\r\n                    $item.get().contains(e.target))) {\r\n                e.preventDefault();\r\n                _this.core.touchAction = undefined;\r\n                _this.core.outer.removeClass('lg-zoom-dragging');\r\n                if (!isMoved) {\r\n                    return;\r\n                }\r\n                isMoved = false;\r\n                endTime = new Date();\r\n                var touchDuration = endTime.valueOf() - startTime.valueOf();\r\n                _this.touchendZoom(startCoords, endCoords, allowX, allowY, touchDuration);\r\n            }\r\n        });\r\n    };\r\n    Zoom.prototype.zoomDrag = function () {\r\n        var _this = this;\r\n        var startCoords = {};\r\n        var endCoords = {};\r\n        var isDragging = false;\r\n        var isMoved = false;\r\n        // Allow x direction drag\r\n        var allowX = false;\r\n        // Allow Y direction drag\r\n        var allowY = false;\r\n        var startTime;\r\n        var endTime;\r\n        var possibleSwipeCords;\r\n        var _LGel;\r\n        this.core.outer.on('mousedown.lg.zoom', function (e) {\r\n            // Allow zoom only on image\r\n            if (!_this.isImageSlide(_this.core.index)) {\r\n                return;\r\n            }\r\n            var $item = _this.core.getSlideItem(_this.core.index);\r\n            if (_this.$LG(e.target).hasClass('lg-item') ||\r\n                $item.get().contains(e.target)) {\r\n                startTime = new Date();\r\n                _LGel = _this.core\r\n                    .getSlideItem(_this.core.index)\r\n                    .find('.lg-img-wrap')\r\n                    .first();\r\n                var dragAllowedAxises = _this.getDragAllowedAxises(0);\r\n                allowY = dragAllowedAxises.allowY;\r\n                allowX = dragAllowedAxises.allowX;\r\n                if (_this.core.outer.hasClass('lg-zoomed')) {\r\n                    if (_this.$LG(e.target).hasClass('lg-object') &&\r\n                        (allowX || allowY)) {\r\n                        e.preventDefault();\r\n                        startCoords = _this.getDragCords(e);\r\n                        possibleSwipeCords = _this.getPossibleSwipeDragCords();\r\n                        isDragging = true;\r\n                        _this.core.outer\r\n                            .removeClass('lg-grab')\r\n                            .addClass('lg-grabbing lg-zoom-drag-transition lg-zoom-dragging');\r\n                        // reset opacity and transition duration\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        this.$LG(window).on(\"mousemove.lg.zoom.global\" + this.core.lgId, function (e) {\r\n            if (isDragging) {\r\n                isMoved = true;\r\n                endCoords = _this.getDragCords(e);\r\n                var distance = _this.getZoomSwipeCords(startCoords, endCoords, allowX, allowY, possibleSwipeCords);\r\n                _this.setZoomSwipeStyles(_LGel, distance);\r\n            }\r\n        });\r\n        this.$LG(window).on(\"mouseup.lg.zoom.global\" + this.core.lgId, function (e) {\r\n            if (isDragging) {\r\n                endTime = new Date();\r\n                isDragging = false;\r\n                _this.core.outer.removeClass('lg-zoom-dragging');\r\n                // Fix for chrome mouse move on click\r\n                if (isMoved &&\r\n                    (startCoords.x !== endCoords.x ||\r\n                        startCoords.y !== endCoords.y)) {\r\n                    endCoords = _this.getDragCords(e);\r\n                    var touchDuration = endTime.valueOf() - startTime.valueOf();\r\n                    _this.touchendZoom(startCoords, endCoords, allowX, allowY, touchDuration);\r\n                }\r\n                isMoved = false;\r\n            }\r\n            _this.core.outer.removeClass('lg-grabbing').addClass('lg-grab');\r\n        });\r\n    };\r\n    Zoom.prototype.closeGallery = function () {\r\n        this.resetZoom();\r\n        this.zoomInProgress = false;\r\n    };\r\n    Zoom.prototype.destroy = function () {\r\n        // Unbind all events added by lightGallery zoom plugin\r\n        this.$LG(window).off(\".lg.zoom.global\" + this.core.lgId);\r\n        this.core.LGel.off('.lg.zoom');\r\n        this.core.LGel.off('.zoom');\r\n        clearTimeout(this.zoomableTimeout);\r\n        this.zoomableTimeout = false;\r\n    };\r\n    return Zoom;\r\n}());\n\nexport default Zoom;\n//# sourceMappingURL=lg-zoom.es5.js.map\n","import Dialog from 'dialog';\nimport {\n    getBrochureOptin,\n    removeItem,\n    setBrochureOptin,\n} from './local-storage';\nimport { renderSwatchTicks } from '../swatch/render-swatch-ticks';\n\n/**\n * Class representing a swatch basket.\n * Manages the UI and functionality related to the swatch basket.\n */\nexport class SwatchBasket {\n    /**\n     * Maximum number of swatches allowed in the basket.\n     * @private\n     */\n    #MAX_SWATCHES = 6;\n\n    /**\n     * Collection of elements displaying the count of swatches.\n     * @private\n     */\n    #swatchCounters;\n\n    /**\n     * Trigger element to open the swatch basket overlay.\n     * @private\n     */\n    #swatchBasketTrigger;\n\n    /**\n     * Creates a SwatchBasket instance.\n     * @param {HTMLElement} element - The element where the basket is rendered.\n     */\n    constructor(element) {\n        this.basket = element;\n        this.#swatchBasketTrigger = document.querySelector(\n            '[data-swatch-basket-trigger]'\n        );\n\n        this.#swatchBasketTrigger?.addEventListener('click', e => {\n            e.preventDefault();\n            this.#openSwatchBasketOverlay();\n        });\n\n        this.renderSwatchBasket();\n    }\n\n    /**\n     * Opens the overlay for the swatch basket.\n     * @private\n     */\n    #openSwatchBasketOverlay = () => {\n        Dialog.render('[data-swatch-basket]', {\n            modifiers: ['takeover', 'swatch-basket'],\n            callback: () => {\n                this.renderSwatchBasket();\n            },\n        });\n    };\n\n    /**\n     * Renders the swatch basket UI.\n     */\n    renderSwatchBasket = () => {\n        const swatches = JSON.parse(localStorage.getItem('swatches')) ?? [];\n        const swatchList = document.querySelector('[data-swatch-list]');\n        const swatchContainer = document.querySelector(\n            '[data-swatch-container]'\n        );\n        const swatchBasket = document.querySelector('[data-recent-swatches]');\n        const swatchFormSubmit = document.querySelector(\n            '[data-swatch-order-submit]'\n        );\n\n        if (!swatchList) {\n            return;\n        }\n\n        swatchList.innerHTML = '';\n        this.#renderSwatchCount(swatches);\n\n        for (const swatch of swatches) {\n            this.#renderSwatch(swatch, swatchList);\n        }\n\n        // If we have less than the max swatches, render an empty swatch\n        if (swatches.length < this.#MAX_SWATCHES) {\n            this.#renderEmptySwatch(swatches, swatchList);\n        }\n\n        const removeSwatchButtons = document.querySelectorAll(\n            '[data-swatch-remove]'\n        );\n\n        // We need to dynamically add this event listener as we're rendering the UI\n        for (const button of removeSwatchButtons) {\n            button.addEventListener('click', event => {\n                this.#removeAndRender(event.currentTarget.dataset.swatchRemove);\n            });\n        }\n\n        if (swatchContainer) {\n            renderSwatchTicks(swatchContainer);\n        }\n\n        if (swatchBasket) {\n            renderSwatchTicks(swatchBasket);\n        }\n\n        this.#updateOrderSwatchesButton(swatches.length);\n        this.#syncBrochureCheckboxes();\n\n        swatchFormSubmit.addEventListener('click', event => {\n            event.preventDefault();\n            let redirectURl = new URL(\n                swatchFormSubmit.getAttribute('href'),\n                window.location.origin\n            );\n            const overlay = event.target.closest('.dialog__content');\n\n            if (overlay) {\n                if (overlay.querySelector('[data-swatch-checkbox]')?.checked) {\n                    redirectURl.searchParams.set('brochure', 'true');\n                }\n            } else {\n                if (document.querySelector('[data-swatch-checkbox]')?.checked) {\n                    redirectURl.searchParams.set('brochure', 'true');\n                }\n            }\n\n            window.location.replace(redirectURl);\n        });\n    };\n\n    #syncBrochureCheckboxes = () => {\n        const brochureCheckboxes = document.querySelectorAll(\n            '[data-swatch-checkbox]'\n        );\n\n        for (const checkbox of brochureCheckboxes) {\n            checkbox.checked = getBrochureOptin();\n\n            if (checkbox.dataset.brochureStorageBound) {\n                continue;\n            }\n\n            checkbox.dataset.brochureStorageBound = 'true';\n            checkbox.addEventListener('change', event => {\n                setBrochureOptin(event.currentTarget.checked);\n                this.#syncBrochureCheckboxes();\n            });\n        }\n    };\n\n    /**\n     * Removes a swatch and re-renders the basket.\n     * @private\n     * @param {string} item - The swatch to be removed.\n     */\n    #removeAndRender = item => {\n        removeItem('swatches', item);\n        this.renderSwatchBasket();\n    };\n\n    /**\n     * Enables/disables the order swatches button\n     * @private\n     * @param {number} numOfSwatches - The number of added swatches.\n     */\n    #updateOrderSwatchesButton = numOfSwatches => {\n        const orderSwatchesButtons = document.querySelectorAll(\n            '[data-swatch-order-submit]'\n        );\n\n        for (const button of orderSwatchesButtons) {\n            button.setAttribute('disabled', true);\n\n            if (numOfSwatches > 0) {\n                button.removeAttribute('disabled');\n            }\n        }\n    };\n\n    /**\n     * Renders the swatch count.\n     * @private\n     * @param {Array} swatches - Array of swatches.\n     */\n    #renderSwatchCount = swatches => {\n        this.#swatchCounters = document.querySelectorAll('[data-swatch-count]');\n        for (const counter of this.#swatchCounters) {\n            counter.textContent = `Your swatches (${swatches.length}/${\n                this.#MAX_SWATCHES\n            })`;\n        }\n    };\n\n    /**\n     * Renders an empty swatch slot in the swatch list.\n     * @private\n     * @param {Array} swatches - Array of swatches.\n     * @param {HTMLElement} swatchList - The element where swatches are listed.\n     */\n    #renderEmptySwatch = (swatches, swatchList) => {\n        const remaining = this.#MAX_SWATCHES - swatches.length;\n        const pluralSwatches = remaining === 1 ? 'swatch' : 'swatches';\n\n        swatchList.insertAdjacentHTML(\n            'beforeend',\n            `<li class=\"swatch-item\">\n          <div class=\"swatch-item__square\">\n            +${remaining}\n          </div>\n          <div class=\"swatch-item__details\">\n            <h3 class=\"swatch-item__title\">Still space for ${remaining} more ${pluralSwatches}!</h3>\n          </div>\n          <a href=\"/swatches\" class=\"swatch-item__link\">Choose more</a>\n       </li>`\n        );\n    };\n\n    /**\n     * Renders an individual swatch in the swatch list.\n     * @private\n     * @param {Object} swatch - Swatch object containing details.\n     * @param {HTMLElement} swatchList - The element where swatches are listed.\n     */\n    #renderSwatch = (swatch, swatchList) => {\n        const swatchValue = JSON.parse(swatch.value);\n        const swatchVisual = swatch.imageHtml\n            ? `<figure class=\"swatch-item__image\">${swatch.imageHtml}</figure>`\n            : `<figure class=\"swatch-item__image swatch ${swatch.categoryClass}\" style=\"${swatch.backgroundCSS}\"></figure>`;\n\n        swatchList.insertAdjacentHTML(\n            'beforeend',\n            `<li class=\"swatch-item\">\n          ${swatchVisual}\n          <div class=\"swatch-item__details\">\n            <div class=\"swatch-item__header\">\n              <h3 class=\"swatch-item__title\">${swatch.title}</h3>\n              <button class=\"swatch-item__link\" type=\"button\" data-swatch-remove=\"${swatchValue.colour}\">Remove</button>\n            </div>\n            <p class=\"swatch-item__material\">${swatch.longTitle}</p>\n          </div>\n       </li>`\n        );\n    };\n}\n","import { SwatchBasket } from './SwatchBasket';\nimport { swatchSelectedEvent, initSwatchPanel } from './swatch';\nimport { handleLocalStorage } from './local-storage';\nimport { loadOverlay } from '../features/overlays';\n\n/**\n * Class representing the nab a swatch overlay\n */\nexport class NabASwatch {\n    constructor(colourGlobalCode, materialGlobalCode, sku) {\n        this.colourGlobalCode = colourGlobalCode;\n        this.materialGlobalCode = materialGlobalCode;\n        this.sku = sku;\n\n        const params = new URLSearchParams({\n            colour_global: this.colourGlobalCode,\n            material_global: this.materialGlobalCode,\n        });\n\n        if (this.sku) {\n            params.set('stockitem', this.sku);\n        }\n\n        this.overlayUrl = `/swatches/nab-a-swatch?${params.toString()}`;\n\n        this.loadNabASwatchOverlay(this.overlayUrl);\n    }\n\n    loadNabASwatchOverlay = url => {\n        const nabASwatch = this;\n        loadOverlay(url, {\n            modifiers: ['sidebar', 'nab-a-swatch'],\n            callback: function () {\n                nabASwatch.#renderSwatchBasket(this.target);\n                nabASwatch.#initSwatchPanel(this.target);\n            },\n        });\n    };\n\n    get overlayCallback() {\n        return () => this.loadNabASwatchOverlay(this.overlayUrl);\n    }\n\n    /**\n     * Initialize swatch panel and attach event listeners for swatch selection.\n     * @private\n     */\n    #initSwatchPanel = dialogTarget => {\n        const container = dialogTarget.querySelector('[data-swatch-container]');\n\n        if (!container) {\n            return;\n        }\n\n        initSwatchPanel(container);\n\n        container.addEventListener(swatchSelectedEvent, event => {\n            handleLocalStorage(\n                event.detail,\n                'loaf-render-swatch-basket',\n                this.overlayCallback,\n                false\n            );\n        });\n    };\n\n    /**\n     * Renders the swatch basket\n     * @private\n     */\n    #renderSwatchBasket = dialogTarget => {\n        const swatchBasket = new SwatchBasket(\n            dialogTarget.querySelector('[data-swatch-basket]')\n        );\n\n        swatchBasket.renderSwatchBasket();\n\n        // Listen for custom event to render the swatch basket.\n        document.addEventListener('loaf-render-swatch-basket', () => {\n            swatchBasket.renderSwatchBasket();\n        });\n    };\n}\n","import { handleFragmentInit } from './fragments';\nimport { initialiseSwiper } from '../swiper/swiper';\nimport { replaceElementHTML } from './replace';\nimport lightGallery from 'lightgallery';\nimport lgZoom from 'lightgallery/plugins/zoom';\nimport { initGalleryCylindoViewer } from './gallery/cylindo';\nimport VideoPlayer from '../../../vendor/d3r/cloudinary/resources/javascript/src/video-player';\nimport {\n    addToLocalStorage,\n    handleLocalStorage,\n    MAX_BASKET_SWATCHES,\n} from '../swatch/local-storage';\nimport { NabASwatch } from '../swatch/NabASwatch';\n\nexport const initGallery = () => {\n    handleFragmentInit(({ replace }) => {\n        if (replace?.gallery) {\n            replaceElementHTML('.product-gallery', replace.gallery);\n        }\n        initGalleryCylindoViewer();\n        initGallerySliders();\n        initGallerySwatchButtons();\n        initGalleryVideo();\n        initLightGallery();\n        initLightGalleryBump();\n    });\n};\n\nconst initGallerySliders = () => {\n    const thumbs = document.querySelector(\n        '[data-carousel-type=\"productThumbs\"]'\n    );\n    const thumbSwiper = initialiseSwiper(thumbs);\n\n    const gallery = document.querySelector(\n        '[data-carousel-type=\"productGallery\"]'\n    );\n\n    const customOptions = {\n        thumbs: {\n            swiper: thumbSwiper,\n        },\n    };\n\n    initialiseSwiper(gallery, customOptions);\n};\n\nconst initGallerySwatchButtons = () => {\n    const addToSwatchesButtons = document.querySelectorAll(\n        '[data-add-swatch-slide]'\n    );\n\n    for (const addToSwatchesButton of addToSwatchesButtons ?? []) {\n        addToSwatchesButton.addEventListener('click', async event => {\n            event.stopPropagation();\n\n            const btn = event.target.closest('button');\n            const colourGlobalCode = btn.dataset.colourGlobalCode;\n            const materialGlobalCode = btn.dataset.materialGlobalCode;\n            const sku = btn.dataset.stockitem;\n\n            // Resolve swatch data from server before adding to basket\n            let swatchObject = null;\n            try {\n                const response = await fetch(\n                    `/swatches/resolve-swatch?colour_global=${encodeURIComponent(colourGlobalCode)}&material_global=${encodeURIComponent(materialGlobalCode)}`,\n                    { headers: { 'X-Requested-With': 'XMLHttpRequest' } }\n                );\n                const data = await response.json();\n\n                if (data.result && data.payload?.swatch) {\n                    const swatch = data.payload.swatch;\n                    swatchObject = {\n                        value: JSON.stringify({ colour: swatch.urlname }),\n                        title: swatch.title,\n                        longTitle: swatch.material_global_name,\n                        backgroundCSS: swatch.hex_background_css,\n                        categoryClass: '',\n                        hex: swatch.hex,\n                        imageHtml: swatch.image_html,\n                        colourCode: colourGlobalCode,\n                        materialCode: materialGlobalCode,\n                    };\n                }\n            } catch (e) {\n                // Fall through — overlay will still open without pre-adding\n            }\n\n            const openOverlay = () =>\n                new NabASwatch(colourGlobalCode, materialGlobalCode, sku);\n\n            if (swatchObject) {\n                const swatches =\n                    JSON.parse(localStorage.getItem('swatches')) ?? [];\n\n                if (swatches.length >= MAX_BASKET_SWATCHES) {\n                    handleLocalStorage(\n                        swatchObject,\n                        'loaf-swatch-exists',\n                        openOverlay,\n                        true\n                    );\n\n                    document.addEventListener(\n                        'loaf-swatch-exists',\n                        () => {\n                            new NabASwatch(\n                                colourGlobalCode,\n                                materialGlobalCode,\n                                sku\n                            );\n                        },\n                        { once: true }\n                    );\n                } else {\n                    addToLocalStorage(swatches, swatchObject);\n                    openOverlay();\n                }\n            } else {\n                openOverlay();\n            }\n        });\n    }\n};\n\nconst initGalleryVideo = () => {\n    const gallery = document.querySelector(\n        '[data-carousel-type=\"productGallery\"]'\n    );\n\n    if (!gallery) {\n        return;\n    }\n\n    gallery\n        .querySelectorAll('.cld-video-player')\n        .forEach(elm => new VideoPlayer(elm));\n};\n\nconst initLightGallery = () => {\n    const lightGalleryElement = document.querySelector('[data-lightgallery]');\n\n    if (!lightGalleryElement) {\n        return;\n    }\n\n    lightGallery(lightGalleryElement, {\n        plugins: [lgZoom],\n        speed: 250,\n        selector: '.lightgallery',\n    });\n};\n\nconst initLightGalleryBump = () => {\n    const showBumpButtons = document.querySelectorAll(\n        '[data-lightgallery-bump-button]'\n    );\n    const bumpGalleryElement = document.querySelector(\n        '[data-lightgallery-bump]'\n    );\n\n    if (!showBumpButtons.length || !bumpGalleryElement) {\n        return;\n    }\n\n    const bumpGallery = lightGallery(bumpGalleryElement, {\n        plugins: [lgZoom],\n        speed: 250,\n        selector: '.lightgallerybump',\n    });\n\n    showBumpButtons.forEach(showBumpButton => {\n        showBumpButton.addEventListener('click', () => {\n            bumpGallery.openGallery();\n        });\n    });\n};\n","import { initGallery } from './gallery';\nimport { initGalleryCylindoViewer } from './gallery/cylindo';\n\n/**\n * iOS fix for cylindo in the slider where cylindo viewer doesn't go full screen\n *\n *  - On fullscreen click, hide all other slides and show only cylindo slide.\n *  - On fullscreen exit, show all other slides and reset cylindo slide, the reinvoke gallery init.\n *  - Also, cylindo slide is moved to the first position in the gallery.\n */\nconst iosCylindoSlideFix = () => {\n    const oldState = {};\n\n    function isiOS() {\n        const platforms = [\n            'iPad',\n            'iPhone',\n            'iPod',\n            'iPad Simulator',\n            'iPhone Simulator',\n            'iPod Simulator',\n        ];\n        return (\n            platforms.includes(navigator.platform) ||\n            (navigator.userAgent.includes('Mac') && 'ontouchend' in document)\n        );\n    }\n\n    function hideOtherSlides() {\n        const gallerySlides = document.querySelectorAll(\n            'figure.product-gallery__item:not(.js-slide-cylindo)'\n        );\n\n        gallerySlides.forEach(slide => {\n            slide.style.display = 'none';\n        });\n    }\n\n    function showOtherSlides() {\n        const gallerySlides = document.querySelectorAll(\n            'figure.product-gallery__item:not(.js-slide-cylindo)'\n        );\n\n        gallerySlides.forEach(slide => {\n            slide.style.display = 'unset';\n        });\n    }\n\n    function moveCylindoSlide() {\n        const cylindoSlide = document.querySelector(\n            'figure.product-gallery__item.js-slide-cylindo'\n        );\n\n        oldState.transform = cylindoSlide.style.transform;\n        oldState.width = cylindoSlide.style.width;\n        oldState.pointerEvents = cylindoSlide.style.pointerEvents;\n\n        cylindoSlide.style.transform = 'translate3d(0px, 0px, 0px)';\n        cylindoSlide.style.width = '100vw';\n        cylindoSlide.style.pointerEvents = 'auto';\n    }\n\n    function resetCylindoSlide() {\n        const cylindoSlide = document.querySelector(\n            'figure.product-gallery__item.js-slide-cylindo'\n        );\n\n        cylindoSlide.style.transform = oldState.transform;\n        cylindoSlide.style.width = oldState.width;\n        cylindoSlide.style.pointerEvents = oldState.pointerEvents;\n    }\n\n    const viewer = document.querySelector('cylindo-viewer');\n\n    if (viewer && isiOS()) {\n        viewer.addEventListener('fullscreen-change', () => {\n            const galleryWrap = viewer.closest('.product-gallery');\n            if (galleryWrap) {\n                if (galleryWrap.dataset.open) {\n                    showOtherSlides();\n                    resetCylindoSlide();\n                    delete galleryWrap.dataset.open;\n                    galleryWrap.style.display = 'grid';\n                    setTimeout(() => {\n                        initGallery();\n                        initGalleryCylindoViewer();\n                    }, 0);\n                } else {\n                    hideOtherSlides();\n                    moveCylindoSlide();\n                    galleryWrap.dataset.open = true;\n                    galleryWrap.style.display = 'block';\n                }\n            }\n        });\n    }\n};\n\nexport const initCylindo = () => {\n    iosCylindoSlideFix();\n};\n","/*!\n  * PhotoSwipe Lightbox 5.4.4 - https://photoswipe.com\n  * (c) 2024 Dmytro Semenov\n  */\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/**\r\n * @template {keyof HTMLElementTagNameMap} T\r\n * @param {string} className\r\n * @param {T} tagName\r\n * @param {Node} [appendToEl]\r\n * @returns {HTMLElementTagNameMap[T]}\r\n */\nfunction createElement(className, tagName, appendToEl) {\n  const el = document.createElement(tagName);\n\n  if (className) {\n    el.className = className;\n  }\n\n  if (appendToEl) {\n    appendToEl.appendChild(el);\n  }\n\n  return el;\n}\n/**\r\n * Get transform string\r\n *\r\n * @param {number} x\r\n * @param {number} [y]\r\n * @param {number} [scale]\r\n * @returns {string}\r\n */\n\nfunction toTransformString(x, y, scale) {\n  let propValue = `translate3d(${x}px,${y || 0}px,0)`;\n\n  if (scale !== undefined) {\n    propValue += ` scale3d(${scale},${scale},1)`;\n  }\n\n  return propValue;\n}\n/**\r\n * Apply width and height CSS properties to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string | number} w\r\n * @param {string | number} h\r\n */\n\nfunction setWidthHeight(el, w, h) {\n  el.style.width = typeof w === 'number' ? `${w}px` : w;\n  el.style.height = typeof h === 'number' ? `${h}px` : h;\n}\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\n\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\n\nconst LOAD_STATE = {\n  IDLE: 'idle',\n  LOADING: 'loading',\n  LOADED: 'loaded',\n  ERROR: 'error'\n};\n/**\r\n * Check if click or keydown event was dispatched\r\n * with a special key or via mouse wheel.\r\n *\r\n * @param {MouseEvent | KeyboardEvent} e\r\n * @returns {boolean}\r\n */\n\nfunction specialKeyUsed(e) {\n  return 'button' in e && e.button === 1 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey;\n}\n/**\r\n * Parse `gallery` or `children` options.\r\n *\r\n * @param {import('../photoswipe.js').ElementProvider} [option]\r\n * @param {string} [legacySelector]\r\n * @param {HTMLElement | Document} [parent]\r\n * @returns HTMLElement[]\r\n */\n\nfunction getElementsFromOption(option, legacySelector, parent = document) {\n  /** @type {HTMLElement[]} */\n  let elements = [];\n\n  if (option instanceof Element) {\n    elements = [option];\n  } else if (option instanceof NodeList || Array.isArray(option)) {\n    elements = Array.from(option);\n  } else {\n    const selector = typeof option === 'string' ? option : legacySelector;\n\n    if (selector) {\n      elements = Array.from(parent.querySelectorAll(selector));\n    }\n  }\n\n  return elements;\n}\n/**\r\n * Check if variable is PhotoSwipe class\r\n *\r\n * @param {any} fn\r\n * @returns {boolean}\r\n */\n\nfunction isPswpClass(fn) {\n  return typeof fn === 'function' && fn.prototype && fn.prototype.goTo;\n}\n/**\r\n * Check if browser is Safari\r\n *\r\n * @returns {boolean}\r\n */\n\nfunction isSafari() {\n  return !!(navigator.vendor && navigator.vendor.match(/apple/i));\n}\n\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\n\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('../slide/content.js').default} ContentDefault */\n\n/** @typedef {import('../slide/slide.js').default} Slide */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\n\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\n\n/**\r\n * Allow adding an arbitrary props to the Content\r\n * https://photoswipe.com/custom-content/#using-webp-image-format\r\n * @typedef {ContentDefault & Record<string, any>} Content\r\n */\n\n/** @typedef {{ x?: number; y?: number }} Point */\n\n/**\r\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\r\n *\r\n *\r\n * https://photoswipe.com/adding-ui-elements/\r\n *\r\n * @prop {undefined} uiRegister\r\n * @prop {{ data: UIElementData }} uiElementCreate\r\n *\r\n *\r\n * https://photoswipe.com/events/#initialization-events\r\n *\r\n * @prop {undefined} beforeOpen\r\n * @prop {undefined} firstUpdate\r\n * @prop {undefined} initialLayout\r\n * @prop {undefined} change\r\n * @prop {undefined} afterInit\r\n * @prop {undefined} bindEvents\r\n *\r\n *\r\n * https://photoswipe.com/events/#opening-or-closing-transition-events\r\n *\r\n * @prop {undefined} openingAnimationStart\r\n * @prop {undefined} openingAnimationEnd\r\n * @prop {undefined} closingAnimationStart\r\n * @prop {undefined} closingAnimationEnd\r\n *\r\n *\r\n * https://photoswipe.com/events/#closing-events\r\n *\r\n * @prop {undefined} close\r\n * @prop {undefined} destroy\r\n *\r\n *\r\n * https://photoswipe.com/events/#pointer-and-gesture-events\r\n *\r\n * @prop {{ originalEvent: PointerEvent }} pointerDown\r\n * @prop {{ originalEvent: PointerEvent }} pointerMove\r\n * @prop {{ originalEvent: PointerEvent }} pointerUp\r\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\r\n * @prop {{ panY: number }} verticalDrag can be default prevented\r\n *\r\n *\r\n * https://photoswipe.com/events/#slide-content-events\r\n *\r\n * @prop {{ content: Content }} contentInit\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\r\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\r\n * @prop {{ content: Content; slide: Slide }} loadError\r\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\r\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\r\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\r\n * @prop {{ content: Content }} contentAppend can be default prevented\r\n * @prop {{ content: Content }} contentActivate can be default prevented\r\n * @prop {{ content: Content }} contentDeactivate can be default prevented\r\n * @prop {{ content: Content }} contentRemove can be default prevented\r\n * @prop {{ content: Content }} contentDestroy can be default prevented\r\n *\r\n *\r\n * undocumented\r\n *\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\r\n *\r\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\r\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\r\n * @prop {{ slide: Slide }} firstZoomPan\r\n * @prop {{ slide: Slide | undefined, data: SlideData, index: number }} gettingData\r\n * @prop {undefined} beforeResize\r\n * @prop {undefined} resize\r\n * @prop {undefined} viewportSize\r\n * @prop {undefined} updateScrollOffset\r\n * @prop {{ slide: Slide }} slideInit\r\n * @prop {{ slide: Slide }} afterSetContent\r\n * @prop {{ slide: Slide }} slideLoad\r\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\r\n * @prop {{ slide: Slide }} appendHeavyContent\r\n * @prop {{ slide: Slide }} slideActivate\r\n * @prop {{ slide: Slide }} slideDeactivate\r\n * @prop {{ slide: Slide }} slideDestroy\r\n * @prop {{ destZoomLevel: number, centerPoint: Point | undefined, transitionDuration: number | false | undefined }} beforeZoomTo\r\n * @prop {{ slide: Slide }} zoomPanUpdate\r\n * @prop {{ slide: Slide }} initialZoomPan\r\n * @prop {{ slide: Slide }} calcSlideSize\r\n * @prop {undefined} resolutionChanged\r\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\r\n * @prop {{ content: Content }} contentAppendImage can be default prevented\r\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\r\n * @prop {undefined} lazyLoad\r\n * @prop {{ slide: Slide }} calcBounds\r\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\r\n *\r\n *\r\n * legacy\r\n *\r\n * @prop {undefined} init\r\n * @prop {undefined} initialZoomIn\r\n * @prop {undefined} initialZoomOut\r\n * @prop {undefined} initialZoomInEnd\r\n * @prop {undefined} initialZoomOutEnd\r\n * @prop {{ dataSource: DataSource | undefined, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\n\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource | undefined) => number} numItems\r\n * Modify the total amount of slides. Example on Data sources page.\r\n * https://photoswipe.com/filters/#numitems\r\n *\r\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\r\n * Modify slide item data. Example on Data sources page.\r\n * https://photoswipe.com/filters/#itemdata\r\n *\r\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\r\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\r\n * https://photoswipe.com/filters/#domitemdata\r\n *\r\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\r\n * Modify clicked gallery item index.\r\n * https://photoswipe.com/filters/#clickedindex\r\n *\r\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\r\n * Modify placeholder image source.\r\n * https://photoswipe.com/filters/#placeholdersrc\r\n *\r\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\r\n * Modify if the content is currently loading.\r\n * https://photoswipe.com/filters/#iscontentloading\r\n *\r\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\r\n * Modify if the content can be zoomed.\r\n * https://photoswipe.com/filters/#iscontentzoomable\r\n *\r\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\r\n * Modify if the placeholder should be used for the content.\r\n * https://photoswipe.com/filters/#usecontentplaceholder\r\n *\r\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\r\n * Modify if the placeholder should be kept after the content is loaded.\r\n * https://photoswipe.com/filters/#iskeepingplaceholder\r\n *\r\n *\r\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\r\n * Modify an element when the content has error state (for example, if image cannot be loaded).\r\n * https://photoswipe.com/filters/#contenterrorelement\r\n *\r\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\r\n * Modify a UI element that's being created.\r\n * https://photoswipe.com/filters/#uielement\r\n *\r\n * @prop {(thumbnail: HTMLElement | null | undefined, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thumbnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds | undefined, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the thumbnail bounds from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbbounds\r\n *\r\n * @prop {(srcsetSizesWidth: number, content: Content) => number} srcsetSizesWidth\r\n *\r\n * @prop {(preventPointerEvent: boolean, event: PointerEvent, pointerType: string) => boolean} preventPointerEvent\r\n *\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent<T> : PhotoSwipeEvent<T> & PhotoSwipeEventsMap[T]} AugmentedEvent\r\n */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {(event: AugmentedEvent<T>) => void} EventCallback\r\n */\n\n/**\r\n * Base PhotoSwipe event object\r\n *\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n */\nclass PhotoSwipeEvent {\n  /**\r\n   * @param {T} type\r\n   * @param {PhotoSwipeEventsMap[T]} [details]\r\n   */\n  constructor(type, details) {\n    this.type = type;\n    this.defaultPrevented = false;\n\n    if (details) {\n      Object.assign(this, details);\n    }\n  }\n\n  preventDefault() {\n    this.defaultPrevented = true;\n  }\n\n}\n/**\r\n * PhotoSwipe base class that can listen and dispatch for events.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\r\n */\n\n\nclass Eventable {\n  constructor() {\n    /**\r\n     * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent<T>) => void)[] }}\r\n     */\n    this._listeners = {};\n    /**\r\n     * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter<T>[] }}\r\n     */\n\n    this._filters = {};\n    /** @type {PhotoSwipe | undefined} */\n\n    this.pswp = undefined;\n    /** @type {PhotoSwipeOptions | undefined} */\n\n    this.options = undefined;\n  }\n  /**\r\n   * @template {keyof PhotoSwipeFiltersMap} T\r\n   * @param {T} name\r\n   * @param {PhotoSwipeFiltersMap[T]} fn\r\n   * @param {number} priority\r\n   */\n\n\n  addFilter(name, fn, priority = 100) {\n    var _this$_filters$name, _this$_filters$name2, _this$pswp;\n\n    if (!this._filters[name]) {\n      this._filters[name] = [];\n    }\n\n    (_this$_filters$name = this._filters[name]) === null || _this$_filters$name === void 0 || _this$_filters$name.push({\n      fn,\n      priority\n    });\n    (_this$_filters$name2 = this._filters[name]) === null || _this$_filters$name2 === void 0 || _this$_filters$name2.sort((f1, f2) => f1.priority - f2.priority);\n    (_this$pswp = this.pswp) === null || _this$pswp === void 0 || _this$pswp.addFilter(name, fn, priority);\n  }\n  /**\r\n   * @template {keyof PhotoSwipeFiltersMap} T\r\n   * @param {T} name\r\n   * @param {PhotoSwipeFiltersMap[T]} fn\r\n   */\n\n\n  removeFilter(name, fn) {\n    if (this._filters[name]) {\n      // @ts-expect-error\n      this._filters[name] = this._filters[name].filter(filter => filter.fn !== fn);\n    }\n\n    if (this.pswp) {\n      this.pswp.removeFilter(name, fn);\n    }\n  }\n  /**\r\n   * @template {keyof PhotoSwipeFiltersMap} T\r\n   * @param {T} name\r\n   * @param {Parameters<PhotoSwipeFiltersMap[T]>} args\r\n   * @returns {Parameters<PhotoSwipeFiltersMap[T]>[0]}\r\n   */\n\n\n  applyFilters(name, ...args) {\n    var _this$_filters$name3;\n\n    (_this$_filters$name3 = this._filters[name]) === null || _this$_filters$name3 === void 0 || _this$_filters$name3.forEach(filter => {\n      // @ts-expect-error\n      args[0] = filter.fn.apply(this, args);\n    });\n    return args[0];\n  }\n  /**\r\n   * @template {keyof PhotoSwipeEventsMap} T\r\n   * @param {T} name\r\n   * @param {EventCallback<T>} fn\r\n   */\n\n\n  on(name, fn) {\n    var _this$_listeners$name, _this$pswp2;\n\n    if (!this._listeners[name]) {\n      this._listeners[name] = [];\n    }\n\n    (_this$_listeners$name = this._listeners[name]) === null || _this$_listeners$name === void 0 || _this$_listeners$name.push(fn); // When binding events to lightbox,\n    // also bind events to PhotoSwipe Core,\n    // if it's open.\n\n    (_this$pswp2 = this.pswp) === null || _this$pswp2 === void 0 || _this$pswp2.on(name, fn);\n  }\n  /**\r\n   * @template {keyof PhotoSwipeEventsMap} T\r\n   * @param {T} name\r\n   * @param {EventCallback<T>} fn\r\n   */\n\n\n  off(name, fn) {\n    var _this$pswp3;\n\n    if (this._listeners[name]) {\n      // @ts-expect-error\n      this._listeners[name] = this._listeners[name].filter(listener => fn !== listener);\n    }\n\n    (_this$pswp3 = this.pswp) === null || _this$pswp3 === void 0 || _this$pswp3.off(name, fn);\n  }\n  /**\r\n   * @template {keyof PhotoSwipeEventsMap} T\r\n   * @param {T} name\r\n   * @param {PhotoSwipeEventsMap[T]} [details]\r\n   * @returns {AugmentedEvent<T>}\r\n   */\n\n\n  dispatch(name, details) {\n    var _this$_listeners$name2;\n\n    if (this.pswp) {\n      return this.pswp.dispatch(name, details);\n    }\n\n    const event =\n    /** @type {AugmentedEvent<T>} */\n    new PhotoSwipeEvent(name, details);\n    (_this$_listeners$name2 = this._listeners[name]) === null || _this$_listeners$name2 === void 0 || _this$_listeners$name2.forEach(listener => {\n      listener.call(this, event);\n    });\n    return event;\n  }\n\n}\n\nclass Placeholder {\n  /**\r\n   * @param {string | false} imageSrc\r\n   * @param {HTMLElement} container\r\n   */\n  constructor(imageSrc, container) {\n    // Create placeholder\n    // (stretched thumbnail or simple div behind the main image)\n\n    /** @type {HTMLImageElement | HTMLDivElement | null} */\n    this.element = createElement('pswp__img pswp__img--placeholder', imageSrc ? 'img' : 'div', container);\n\n    if (imageSrc) {\n      const imgEl =\n      /** @type {HTMLImageElement} */\n      this.element;\n      imgEl.decoding = 'async';\n      imgEl.alt = '';\n      imgEl.src = imageSrc;\n      imgEl.setAttribute('role', 'presentation');\n    }\n\n    this.element.setAttribute('aria-hidden', 'true');\n  }\n  /**\r\n   * @param {number} width\r\n   * @param {number} height\r\n   */\n\n\n  setDisplayedSize(width, height) {\n    if (!this.element) {\n      return;\n    }\n\n    if (this.element.tagName === 'IMG') {\n      // Use transform scale() to modify img placeholder size\n      // (instead of changing width/height directly).\n      // This helps with performance, specifically in iOS15 Safari.\n      setWidthHeight(this.element, 250, 'auto');\n      this.element.style.transformOrigin = '0 0';\n      this.element.style.transform = toTransformString(0, 0, width / 250);\n    } else {\n      setWidthHeight(this.element, width, height);\n    }\n  }\n\n  destroy() {\n    var _this$element;\n\n    if ((_this$element = this.element) !== null && _this$element !== void 0 && _this$element.parentNode) {\n      this.element.remove();\n    }\n\n    this.element = null;\n  }\n\n}\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../util/util.js').LoadState} LoadState */\n\nclass Content {\n  /**\r\n   * @param {SlideData} itemData Slide data\r\n   * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n   * @param {number} index\r\n   */\n  constructor(itemData, instance, index) {\n    this.instance = instance;\n    this.data = itemData;\n    this.index = index;\n    /** @type {HTMLImageElement | HTMLDivElement | undefined} */\n\n    this.element = undefined;\n    /** @type {Placeholder | undefined} */\n\n    this.placeholder = undefined;\n    /** @type {Slide | undefined} */\n\n    this.slide = undefined;\n    this.displayedImageWidth = 0;\n    this.displayedImageHeight = 0;\n    this.width = Number(this.data.w) || Number(this.data.width) || 0;\n    this.height = Number(this.data.h) || Number(this.data.height) || 0;\n    this.isAttached = false;\n    this.hasSlide = false;\n    this.isDecoding = false;\n    /** @type {LoadState} */\n\n    this.state = LOAD_STATE.IDLE;\n\n    if (this.data.type) {\n      this.type = this.data.type;\n    } else if (this.data.src) {\n      this.type = 'image';\n    } else {\n      this.type = 'html';\n    }\n\n    this.instance.dispatch('contentInit', {\n      content: this\n    });\n  }\n\n  removePlaceholder() {\n    if (this.placeholder && !this.keepPlaceholder()) {\n      // With delay, as image might be loaded, but not rendered\n      setTimeout(() => {\n        if (this.placeholder) {\n          this.placeholder.destroy();\n          this.placeholder = undefined;\n        }\n      }, 1000);\n    }\n  }\n  /**\r\n   * Preload content\r\n   *\r\n   * @param {boolean} isLazy\r\n   * @param {boolean} [reload]\r\n   */\n\n\n  load(isLazy, reload) {\n    if (this.slide && this.usePlaceholder()) {\n      if (!this.placeholder) {\n        const placeholderSrc = this.instance.applyFilters('placeholderSrc', // use  image-based placeholder only for the first slide,\n        // as rendering (even small stretched thumbnail) is an expensive operation\n        this.data.msrc && this.slide.isFirstSlide ? this.data.msrc : false, this);\n        this.placeholder = new Placeholder(placeholderSrc, this.slide.container);\n      } else {\n        const placeholderEl = this.placeholder.element; // Add placeholder to DOM if it was already created\n\n        if (placeholderEl && !placeholderEl.parentElement) {\n          this.slide.container.prepend(placeholderEl);\n        }\n      }\n    }\n\n    if (this.element && !reload) {\n      return;\n    }\n\n    if (this.instance.dispatch('contentLoad', {\n      content: this,\n      isLazy\n    }).defaultPrevented) {\n      return;\n    }\n\n    if (this.isImageContent()) {\n      this.element = createElement('pswp__img', 'img'); // Start loading only after width is defined, as sizes might depend on it.\n      // Due to Safari feature, we must define sizes before srcset.\n\n      if (this.displayedImageWidth) {\n        this.loadImage(isLazy);\n      }\n    } else {\n      this.element = createElement('pswp__content', 'div');\n      this.element.innerHTML = this.data.html || '';\n    }\n\n    if (reload && this.slide) {\n      this.slide.updateContentSize(true);\n    }\n  }\n  /**\r\n   * Preload image\r\n   *\r\n   * @param {boolean} isLazy\r\n   */\n\n\n  loadImage(isLazy) {\n    var _this$data$src, _this$data$alt;\n\n    if (!this.isImageContent() || !this.element || this.instance.dispatch('contentLoadImage', {\n      content: this,\n      isLazy\n    }).defaultPrevented) {\n      return;\n    }\n\n    const imageElement =\n    /** @type HTMLImageElement */\n    this.element;\n    this.updateSrcsetSizes();\n\n    if (this.data.srcset) {\n      imageElement.srcset = this.data.srcset;\n    }\n\n    imageElement.src = (_this$data$src = this.data.src) !== null && _this$data$src !== void 0 ? _this$data$src : '';\n    imageElement.alt = (_this$data$alt = this.data.alt) !== null && _this$data$alt !== void 0 ? _this$data$alt : '';\n    this.state = LOAD_STATE.LOADING;\n\n    if (imageElement.complete) {\n      this.onLoaded();\n    } else {\n      imageElement.onload = () => {\n        this.onLoaded();\n      };\n\n      imageElement.onerror = () => {\n        this.onError();\n      };\n    }\n  }\n  /**\r\n   * Assign slide to content\r\n   *\r\n   * @param {Slide} slide\r\n   */\n\n\n  setSlide(slide) {\n    this.slide = slide;\n    this.hasSlide = true;\n    this.instance = slide.pswp; // todo: do we need to unset slide?\n  }\n  /**\r\n   * Content load success handler\r\n   */\n\n\n  onLoaded() {\n    this.state = LOAD_STATE.LOADED;\n\n    if (this.slide && this.element) {\n      this.instance.dispatch('loadComplete', {\n        slide: this.slide,\n        content: this\n      }); // if content is reloaded\n\n      if (this.slide.isActive && this.slide.heavyAppended && !this.element.parentNode) {\n        this.append();\n        this.slide.updateContentSize(true);\n      }\n\n      if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n        this.removePlaceholder();\n      }\n    }\n  }\n  /**\r\n   * Content load error handler\r\n   */\n\n\n  onError() {\n    this.state = LOAD_STATE.ERROR;\n\n    if (this.slide) {\n      this.displayError();\n      this.instance.dispatch('loadComplete', {\n        slide: this.slide,\n        isError: true,\n        content: this\n      });\n      this.instance.dispatch('loadError', {\n        slide: this.slide,\n        content: this\n      });\n    }\n  }\n  /**\r\n   * @returns {Boolean} If the content is currently loading\r\n   */\n\n\n  isLoading() {\n    return this.instance.applyFilters('isContentLoading', this.state === LOAD_STATE.LOADING, this);\n  }\n  /**\r\n   * @returns {Boolean} If the content is in error state\r\n   */\n\n\n  isError() {\n    return this.state === LOAD_STATE.ERROR;\n  }\n  /**\r\n   * @returns {boolean} If the content is image\r\n   */\n\n\n  isImageContent() {\n    return this.type === 'image';\n  }\n  /**\r\n   * Update content size\r\n   *\r\n   * @param {Number} width\r\n   * @param {Number} height\r\n   */\n\n\n  setDisplayedSize(width, height) {\n    if (!this.element) {\n      return;\n    }\n\n    if (this.placeholder) {\n      this.placeholder.setDisplayedSize(width, height);\n    }\n\n    if (this.instance.dispatch('contentResize', {\n      content: this,\n      width,\n      height\n    }).defaultPrevented) {\n      return;\n    }\n\n    setWidthHeight(this.element, width, height);\n\n    if (this.isImageContent() && !this.isError()) {\n      const isInitialSizeUpdate = !this.displayedImageWidth && width;\n      this.displayedImageWidth = width;\n      this.displayedImageHeight = height;\n\n      if (isInitialSizeUpdate) {\n        this.loadImage(false);\n      } else {\n        this.updateSrcsetSizes();\n      }\n\n      if (this.slide) {\n        this.instance.dispatch('imageSizeChange', {\n          slide: this.slide,\n          width,\n          height,\n          content: this\n        });\n      }\n    }\n  }\n  /**\r\n   * @returns {boolean} If the content can be zoomed\r\n   */\n\n\n  isZoomable() {\n    return this.instance.applyFilters('isContentZoomable', this.isImageContent() && this.state !== LOAD_STATE.ERROR, this);\n  }\n  /**\r\n   * Update image srcset sizes attribute based on width and height\r\n   */\n\n\n  updateSrcsetSizes() {\n    // Handle srcset sizes attribute.\n    //\n    // Never lower quality, if it was increased previously.\n    // Chrome does this automatically, Firefox and Safari do not,\n    // so we store largest used size in dataset.\n    if (!this.isImageContent() || !this.element || !this.data.srcset) {\n      return;\n    }\n\n    const image =\n    /** @type HTMLImageElement */\n    this.element;\n    const sizesWidth = this.instance.applyFilters('srcsetSizesWidth', this.displayedImageWidth, this);\n\n    if (!image.dataset.largestUsedSize || sizesWidth > parseInt(image.dataset.largestUsedSize, 10)) {\n      image.sizes = sizesWidth + 'px';\n      image.dataset.largestUsedSize = String(sizesWidth);\n    }\n  }\n  /**\r\n   * @returns {boolean} If content should use a placeholder (from msrc by default)\r\n   */\n\n\n  usePlaceholder() {\n    return this.instance.applyFilters('useContentPlaceholder', this.isImageContent(), this);\n  }\n  /**\r\n   * Preload content with lazy-loading param\r\n   */\n\n\n  lazyLoad() {\n    if (this.instance.dispatch('contentLazyLoad', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    }\n\n    this.load(true);\n  }\n  /**\r\n   * @returns {boolean} If placeholder should be kept after content is loaded\r\n   */\n\n\n  keepPlaceholder() {\n    return this.instance.applyFilters('isKeepingPlaceholder', this.isLoading(), this);\n  }\n  /**\r\n   * Destroy the content\r\n   */\n\n\n  destroy() {\n    this.hasSlide = false;\n    this.slide = undefined;\n\n    if (this.instance.dispatch('contentDestroy', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    }\n\n    this.remove();\n\n    if (this.placeholder) {\n      this.placeholder.destroy();\n      this.placeholder = undefined;\n    }\n\n    if (this.isImageContent() && this.element) {\n      this.element.onload = null;\n      this.element.onerror = null;\n      this.element = undefined;\n    }\n  }\n  /**\r\n   * Display error message\r\n   */\n\n\n  displayError() {\n    if (this.slide) {\n      var _this$instance$option, _this$instance$option2;\n\n      let errorMsgEl = createElement('pswp__error-msg', 'div');\n      errorMsgEl.innerText = (_this$instance$option = (_this$instance$option2 = this.instance.options) === null || _this$instance$option2 === void 0 ? void 0 : _this$instance$option2.errorMsg) !== null && _this$instance$option !== void 0 ? _this$instance$option : '';\n      errorMsgEl =\n      /** @type {HTMLDivElement} */\n      this.instance.applyFilters('contentErrorElement', errorMsgEl, this);\n      this.element = createElement('pswp__content pswp__error-msg-container', 'div');\n      this.element.appendChild(errorMsgEl);\n      this.slide.container.innerText = '';\n      this.slide.container.appendChild(this.element);\n      this.slide.updateContentSize(true);\n      this.removePlaceholder();\n    }\n  }\n  /**\r\n   * Append the content\r\n   */\n\n\n  append() {\n    if (this.isAttached || !this.element) {\n      return;\n    }\n\n    this.isAttached = true;\n\n    if (this.state === LOAD_STATE.ERROR) {\n      this.displayError();\n      return;\n    }\n\n    if (this.instance.dispatch('contentAppend', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    }\n\n    const supportsDecode = ('decode' in this.element);\n\n    if (this.isImageContent()) {\n      // Use decode() on nearby slides\n      //\n      // Nearby slide images are in DOM and not hidden via display:none.\n      // However, they are placed offscreen (to the left and right side).\n      //\n      // Some browsers do not composite the image until it's actually visible,\n      // using decode() helps.\n      //\n      // You might ask \"why dont you just decode() and then append all images\",\n      // that's because I want to show image before it's fully loaded,\n      // as browser can render parts of image while it is loading.\n      // We do not do this in Safari due to partial loading bug.\n      if (supportsDecode && this.slide && (!this.slide.isActive || isSafari())) {\n        this.isDecoding = true; // purposefully using finally instead of then,\n        // as if srcset sizes changes dynamically - it may cause decode error\n\n        /** @type {HTMLImageElement} */\n\n        this.element.decode().catch(() => {}).finally(() => {\n          this.isDecoding = false;\n          this.appendImage();\n        });\n      } else {\n        this.appendImage();\n      }\n    } else if (this.slide && !this.element.parentNode) {\n      this.slide.container.appendChild(this.element);\n    }\n  }\n  /**\r\n   * Activate the slide,\r\n   * active slide is generally the current one,\r\n   * meaning the user can see it.\r\n   */\n\n\n  activate() {\n    if (this.instance.dispatch('contentActivate', {\n      content: this\n    }).defaultPrevented || !this.slide) {\n      return;\n    }\n\n    if (this.isImageContent() && this.isDecoding && !isSafari()) {\n      // add image to slide when it becomes active,\n      // even if it's not finished decoding\n      this.appendImage();\n    } else if (this.isError()) {\n      this.load(false, true); // try to reload\n    }\n\n    if (this.slide.holderElement) {\n      this.slide.holderElement.setAttribute('aria-hidden', 'false');\n    }\n  }\n  /**\r\n   * Deactivate the content\r\n   */\n\n\n  deactivate() {\n    this.instance.dispatch('contentDeactivate', {\n      content: this\n    });\n\n    if (this.slide && this.slide.holderElement) {\n      this.slide.holderElement.setAttribute('aria-hidden', 'true');\n    }\n  }\n  /**\r\n   * Remove the content from DOM\r\n   */\n\n\n  remove() {\n    this.isAttached = false;\n\n    if (this.instance.dispatch('contentRemove', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    }\n\n    if (this.element && this.element.parentNode) {\n      this.element.remove();\n    }\n\n    if (this.placeholder && this.placeholder.element) {\n      this.placeholder.element.remove();\n    }\n  }\n  /**\r\n   * Append the image content to slide container\r\n   */\n\n\n  appendImage() {\n    if (!this.isAttached) {\n      return;\n    }\n\n    if (this.instance.dispatch('contentAppendImage', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    } // ensure that element exists and is not already appended\n\n\n    if (this.slide && this.element && !this.element.parentNode) {\n      this.slide.container.appendChild(this.element);\n    }\n\n    if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n      this.removePlaceholder();\n    }\n  }\n\n}\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipeBase} pswp\r\n * @returns {Point}\r\n */\nfunction getViewportSize(options, pswp) {\n  if (options.getViewportSizeFn) {\n    const newViewportSize = options.getViewportSizeFn(options, pswp);\n\n    if (newViewportSize) {\n      return newViewportSize;\n    }\n  }\n\n  return {\n    x: document.documentElement.clientWidth,\n    // TODO: height on mobile is very incosistent due to toolbar\n    // find a way to improve this\n    //\n    // document.documentElement.clientHeight - doesn't seem to work well\n    y: window.innerHeight\n  };\n}\n/**\r\n * Parses padding option.\r\n * Supported formats:\r\n *\r\n * // Object\r\n * padding: {\r\n *  top: 0,\r\n *  bottom: 0,\r\n *  left: 0,\r\n *  right: 0\r\n * }\r\n *\r\n * // A function that returns the object\r\n * paddingFn: (viewportSize, itemData, index) => {\r\n *  return {\r\n *    top: 0,\r\n *    bottom: 0,\r\n *    left: 0,\r\n *    right: 0\r\n *  };\r\n * }\r\n *\r\n * // Legacy variant\r\n * paddingLeft: 0,\r\n * paddingRight: 0,\r\n * paddingTop: 0,\r\n * paddingBottom: 0,\r\n *\r\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {Point} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index Slide index\r\n * @returns {number}\r\n */\n\nfunction parsePaddingOption(prop, options, viewportSize, itemData, index) {\n  let paddingValue = 0;\n\n  if (options.paddingFn) {\n    paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\n  } else if (options.padding) {\n    paddingValue = options.padding[prop];\n  } else {\n    const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1); // @ts-expect-error\n\n    if (options[legacyPropName]) {\n      // @ts-expect-error\n      paddingValue = options[legacyPropName];\n    }\n  }\n\n  return Number(paddingValue) || 0;\n}\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {Point} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n * @returns {Point}\r\n */\n\nfunction getPanAreaSize(options, viewportSize, itemData, index) {\n  return {\n    x: viewportSize.x - parsePaddingOption('left', options, viewportSize, itemData, index) - parsePaddingOption('right', options, viewportSize, itemData, index),\n    y: viewportSize.y - parsePaddingOption('top', options, viewportSize, itemData, index) - parsePaddingOption('bottom', options, viewportSize, itemData, index)\n  };\n}\n\nconst MAX_IMAGE_WIDTH = 4000;\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\n\n/**\r\n * Calculates zoom levels for specific slide.\r\n * Depends on viewport size and image size.\r\n */\n\nclass ZoomLevel {\n  /**\r\n   * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n   * @param {SlideData} itemData Slide data\r\n   * @param {number} index Slide index\r\n   * @param {PhotoSwipe} [pswp] PhotoSwipe instance, can be undefined if not initialized yet\r\n   */\n  constructor(options, itemData, index, pswp) {\n    this.pswp = pswp;\n    this.options = options;\n    this.itemData = itemData;\n    this.index = index;\n    /** @type { Point | null } */\n\n    this.panAreaSize = null;\n    /** @type { Point | null } */\n\n    this.elementSize = null;\n    this.fit = 1;\n    this.fill = 1;\n    this.vFill = 1;\n    this.initial = 1;\n    this.secondary = 1;\n    this.max = 1;\n    this.min = 1;\n  }\n  /**\r\n   * Calculate initial, secondary and maximum zoom level for the specified slide.\r\n   *\r\n   * It should be called when either image or viewport size changes.\r\n   *\r\n   * @param {number} maxWidth\r\n   * @param {number} maxHeight\r\n   * @param {Point} panAreaSize\r\n   */\n\n\n  update(maxWidth, maxHeight, panAreaSize) {\n    /** @type {Point} */\n    const elementSize = {\n      x: maxWidth,\n      y: maxHeight\n    };\n    this.elementSize = elementSize;\n    this.panAreaSize = panAreaSize;\n    const hRatio = panAreaSize.x / elementSize.x;\n    const vRatio = panAreaSize.y / elementSize.y;\n    this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\n    this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio); // zoom.vFill defines zoom level of the image\n    // when it has 100% of viewport vertical space (height)\n\n    this.vFill = Math.min(1, vRatio);\n    this.initial = this._getInitial();\n    this.secondary = this._getSecondary();\n    this.max = Math.max(this.initial, this.secondary, this._getMax());\n    this.min = Math.min(this.fit, this.initial, this.secondary);\n\n    if (this.pswp) {\n      this.pswp.dispatch('zoomLevelsUpdate', {\n        zoomLevels: this,\n        slideData: this.itemData\n      });\n    }\n  }\n  /**\r\n   * Parses user-defined zoom option.\r\n   *\r\n   * @private\r\n   * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\r\n   * @returns { number | undefined }\r\n   */\n\n\n  _parseZoomLevelOption(optionPrefix) {\n    const optionName =\n    /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */\n    optionPrefix + 'ZoomLevel';\n    const optionValue = this.options[optionName];\n\n    if (!optionValue) {\n      return;\n    }\n\n    if (typeof optionValue === 'function') {\n      return optionValue(this);\n    }\n\n    if (optionValue === 'fill') {\n      return this.fill;\n    }\n\n    if (optionValue === 'fit') {\n      return this.fit;\n    }\n\n    return Number(optionValue);\n  }\n  /**\r\n   * Get zoom level to which image will be zoomed after double-tap gesture,\r\n   * or when user clicks on zoom icon,\r\n   * or mouse-click on image itself.\r\n   * If you return 1 image will be zoomed to its original size.\r\n   *\r\n   * @private\r\n   * @return {number}\r\n   */\n\n\n  _getSecondary() {\n    let currZoomLevel = this._parseZoomLevelOption('secondary');\n\n    if (currZoomLevel) {\n      return currZoomLevel;\n    } // 3x of \"fit\" state, but not larger than original\n\n\n    currZoomLevel = Math.min(1, this.fit * 3);\n\n    if (this.elementSize && currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\n      currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\n    }\n\n    return currZoomLevel;\n  }\n  /**\r\n   * Get initial image zoom level.\r\n   *\r\n   * @private\r\n   * @return {number}\r\n   */\n\n\n  _getInitial() {\n    return this._parseZoomLevelOption('initial') || this.fit;\n  }\n  /**\r\n   * Maximum zoom level when user zooms\r\n   * via zoom/pinch gesture,\r\n   * via cmd/ctrl-wheel or via trackpad.\r\n   *\r\n   * @private\r\n   * @return {number}\r\n   */\n\n\n  _getMax() {\n    // max zoom level is x4 from \"fit state\",\n    // used for zoom gesture and ctrl/trackpad zoom\n    return this._parseZoomLevelOption('max') || Math.max(1, this.fit * 4);\n  }\n\n}\n\n/**\r\n * Lazy-load an image\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n * @param {number} index\r\n * @returns {Content} Image that is being decoded or false.\r\n */\n\nfunction lazyLoadData(itemData, instance, index) {\n  const content = instance.createContentFromData(itemData, index);\n  /** @type {ZoomLevel | undefined} */\n\n  let zoomLevel;\n  const {\n    options\n  } = instance; // We need to know dimensions of the image to preload it,\n  // as it might use srcset, and we need to define sizes\n\n  if (options) {\n    zoomLevel = new ZoomLevel(options, itemData, -1);\n    let viewportSize;\n\n    if (instance.pswp) {\n      viewportSize = instance.pswp.viewportSize;\n    } else {\n      viewportSize = getViewportSize(options, instance);\n    }\n\n    const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\n    zoomLevel.update(content.width, content.height, panAreaSize);\n  }\n\n  content.lazyLoad();\n\n  if (zoomLevel) {\n    content.setDisplayedSize(Math.ceil(content.width * zoomLevel.initial), Math.ceil(content.height * zoomLevel.initial));\n  }\n\n  return content;\n}\n/**\r\n * Lazy-loads specific slide.\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * By default, it loads image based on viewport size and initial zoom level.\r\n *\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n * @returns {Content | undefined}\r\n */\n\nfunction lazyLoadSlide(index, instance) {\n  const itemData = instance.getItemData(index);\n\n  if (instance.dispatch('lazyLoadSlide', {\n    index,\n    itemData\n  }).defaultPrevented) {\n    return;\n  }\n\n  return lazyLoadData(itemData, instance, index);\n}\n\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\n\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\n\n/**\r\n * PhotoSwipe base class that can retrieve data about every slide.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\r\n */\n\nclass PhotoSwipeBase extends Eventable {\n  /**\r\n   * Get total number of slides\r\n   *\r\n   * @returns {number}\r\n   */\n  getNumItems() {\n    var _this$options;\n\n    let numItems = 0;\n    const dataSource = (_this$options = this.options) === null || _this$options === void 0 ? void 0 : _this$options.dataSource;\n\n    if (dataSource && 'length' in dataSource) {\n      // may be an array or just object with length property\n      numItems = dataSource.length;\n    } else if (dataSource && 'gallery' in dataSource) {\n      // query DOM elements\n      if (!dataSource.items) {\n        dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n      }\n\n      if (dataSource.items) {\n        numItems = dataSource.items.length;\n      }\n    } // legacy event, before filters were introduced\n\n\n    const event = this.dispatch('numItems', {\n      dataSource,\n      numItems\n    });\n    return this.applyFilters('numItems', event.numItems, dataSource);\n  }\n  /**\r\n   * @param {SlideData} slideData\r\n   * @param {number} index\r\n   * @returns {Content}\r\n   */\n\n\n  createContentFromData(slideData, index) {\n    return new Content(slideData, this, index);\n  }\n  /**\r\n   * Get item data by index.\r\n   *\r\n   * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\r\n   * For example, it may contain properties like\r\n   * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\r\n   *\r\n   * @param {number} index\r\n   * @returns {SlideData}\r\n   */\n\n\n  getItemData(index) {\n    var _this$options2;\n\n    const dataSource = (_this$options2 = this.options) === null || _this$options2 === void 0 ? void 0 : _this$options2.dataSource;\n    /** @type {SlideData | HTMLElement} */\n\n    let dataSourceItem = {};\n\n    if (Array.isArray(dataSource)) {\n      // Datasource is an array of elements\n      dataSourceItem = dataSource[index];\n    } else if (dataSource && 'gallery' in dataSource) {\n      // dataSource has gallery property,\n      // thus it was created by Lightbox, based on\n      // gallery and children options\n      // query DOM elements\n      if (!dataSource.items) {\n        dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n      }\n\n      dataSourceItem = dataSource.items[index];\n    }\n\n    let itemData = dataSourceItem;\n\n    if (itemData instanceof Element) {\n      itemData = this._domElementToItemData(itemData);\n    } // Dispatching the itemData event,\n    // it's a legacy verion before filters were introduced\n\n\n    const event = this.dispatch('itemData', {\n      itemData: itemData || {},\n      index\n    });\n    return this.applyFilters('itemData', event.itemData, index);\n  }\n  /**\r\n   * Get array of gallery DOM elements,\r\n   * based on childSelector and gallery element.\r\n   *\r\n   * @param {HTMLElement} galleryElement\r\n   * @returns {HTMLElement[]}\r\n   */\n\n\n  _getGalleryDOMElements(galleryElement) {\n    var _this$options3, _this$options4;\n\n    if ((_this$options3 = this.options) !== null && _this$options3 !== void 0 && _this$options3.children || (_this$options4 = this.options) !== null && _this$options4 !== void 0 && _this$options4.childSelector) {\n      return getElementsFromOption(this.options.children, this.options.childSelector, galleryElement) || [];\n    }\n\n    return [galleryElement];\n  }\n  /**\r\n   * Converts DOM element to item data object.\r\n   *\r\n   * @param {HTMLElement} element DOM element\r\n   * @returns {SlideData}\r\n   */\n\n\n  _domElementToItemData(element) {\n    /** @type {SlideData} */\n    const itemData = {\n      element\n    };\n    const linkEl =\n    /** @type {HTMLAnchorElement} */\n    element.tagName === 'A' ? element : element.querySelector('a');\n\n    if (linkEl) {\n      // src comes from data-pswp-src attribute,\n      // if it's empty link href is used\n      itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\n\n      if (linkEl.dataset.pswpSrcset) {\n        itemData.srcset = linkEl.dataset.pswpSrcset;\n      }\n\n      itemData.width = linkEl.dataset.pswpWidth ? parseInt(linkEl.dataset.pswpWidth, 10) : 0;\n      itemData.height = linkEl.dataset.pswpHeight ? parseInt(linkEl.dataset.pswpHeight, 10) : 0; // support legacy w & h properties\n\n      itemData.w = itemData.width;\n      itemData.h = itemData.height;\n\n      if (linkEl.dataset.pswpType) {\n        itemData.type = linkEl.dataset.pswpType;\n      }\n\n      const thumbnailEl = element.querySelector('img');\n\n      if (thumbnailEl) {\n        var _thumbnailEl$getAttri;\n\n        // msrc is URL to placeholder image that's displayed before large image is loaded\n        // by default it's displayed only for the first slide\n        itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\n        itemData.alt = (_thumbnailEl$getAttri = thumbnailEl.getAttribute('alt')) !== null && _thumbnailEl$getAttri !== void 0 ? _thumbnailEl$getAttri : '';\n      }\n\n      if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\n        itemData.thumbCropped = true;\n      }\n    }\n\n    return this.applyFilters('domItemData', itemData, element, linkEl);\n  }\n  /**\r\n   * Lazy-load by slide data\r\n   *\r\n   * @param {SlideData} itemData Data about the slide\r\n   * @param {number} index\r\n   * @returns {Content} Image that is being decoded or false.\r\n   */\n\n\n  lazyLoadData(itemData, index) {\n    return lazyLoadData(itemData, this, index);\n  }\n\n}\n\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Type<T>} Type<T>\r\n */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/content.js').default} Content */\n\n/** @typedef {import('../core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\n\n/** @typedef {import('../core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\n\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {import('../core/eventable.js').EventCallback<T>} EventCallback<T>\r\n */\n\n/**\r\n * PhotoSwipe Lightbox\r\n *\r\n * - If user has unsupported browser it falls back to default browser action (just opens URL)\r\n * - Binds click event to links that should open PhotoSwipe\r\n * - parses DOM strcture for PhotoSwipe (retrieves large image URLs and sizes)\r\n * - Initializes PhotoSwipe\r\n *\r\n *\r\n * Loader options use the same object as PhotoSwipe, and supports such options:\r\n *\r\n * gallery - Element | Element[] | NodeList | string selector for the gallery element\r\n * children - Element | Element[] | NodeList | string selector for the gallery children\r\n *\r\n */\n\nclass PhotoSwipeLightbox extends PhotoSwipeBase {\n  /**\r\n   * @param {PhotoSwipeOptions} [options]\r\n   */\n  constructor(options) {\n    super();\n    /** @type {PhotoSwipeOptions} */\n\n    this.options = options || {};\n    this._uid = 0;\n    this.shouldOpen = false;\n    /**\r\n     * @private\r\n     * @type {Content | undefined}\r\n     */\n\n    this._preloadedContent = undefined;\n    this.onThumbnailsClick = this.onThumbnailsClick.bind(this);\n  }\n  /**\r\n   * Initialize lightbox, should be called only once.\r\n   * It's not included in the main constructor, so you may bind events before it.\r\n   */\n\n\n  init() {\n    // Bind click events to each gallery\n    getElementsFromOption(this.options.gallery, this.options.gallerySelector).forEach(galleryElement => {\n      galleryElement.addEventListener('click', this.onThumbnailsClick, false);\n    });\n  }\n  /**\r\n   * @param {MouseEvent} e\r\n   */\n\n\n  onThumbnailsClick(e) {\n    // Exit and allow default browser action if:\n    if (specialKeyUsed(e) // ... if clicked with a special key (ctrl/cmd...)\n    || window.pswp) {\n      // ... if PhotoSwipe is already open\n      return;\n    } // If both clientX and clientY are 0 or not defined,\n    // the event is likely triggered by keyboard,\n    // so we do not pass the initialPoint\n    //\n    // Note that some screen readers emulate the mouse position,\n    // so it's not the ideal way to detect them.\n    //\n\n    /** @type {Point | null} */\n\n\n    let initialPoint = {\n      x: e.clientX,\n      y: e.clientY\n    };\n\n    if (!initialPoint.x && !initialPoint.y) {\n      initialPoint = null;\n    }\n\n    let clickedIndex = this.getClickedIndex(e);\n    clickedIndex = this.applyFilters('clickedIndex', clickedIndex, e, this);\n    /** @type {DataSource} */\n\n    const dataSource = {\n      gallery:\n      /** @type {HTMLElement} */\n      e.currentTarget\n    };\n\n    if (clickedIndex >= 0) {\n      e.preventDefault();\n      this.loadAndOpen(clickedIndex, dataSource, initialPoint);\n    }\n  }\n  /**\r\n   * Get index of gallery item that was clicked.\r\n   *\r\n   * @param {MouseEvent} e click event\r\n   * @returns {number}\r\n   */\n\n\n  getClickedIndex(e) {\n    // legacy option\n    if (this.options.getClickedIndexFn) {\n      return this.options.getClickedIndexFn.call(this, e);\n    }\n\n    const clickedTarget =\n    /** @type {HTMLElement} */\n    e.target;\n    const childElements = getElementsFromOption(this.options.children, this.options.childSelector,\n    /** @type {HTMLElement} */\n    e.currentTarget);\n    const clickedChildIndex = childElements.findIndex(child => child === clickedTarget || child.contains(clickedTarget));\n\n    if (clickedChildIndex !== -1) {\n      return clickedChildIndex;\n    } else if (this.options.children || this.options.childSelector) {\n      // click wasn't on a child element\n      return -1;\n    } // There is only one item (which is the gallery)\n\n\n    return 0;\n  }\n  /**\r\n   * Load and open PhotoSwipe\r\n   *\r\n   * @param {number} index\r\n   * @param {DataSource} [dataSource]\r\n   * @param {Point | null} [initialPoint]\r\n   * @returns {boolean}\r\n   */\n\n\n  loadAndOpen(index, dataSource, initialPoint) {\n    // Check if the gallery is already open\n    if (window.pswp || !this.options) {\n      return false;\n    } // Use the first gallery element if dataSource is not provided\n\n\n    if (!dataSource && this.options.gallery && this.options.children) {\n      const galleryElements = getElementsFromOption(this.options.gallery);\n\n      if (galleryElements[0]) {\n        dataSource = {\n          gallery: galleryElements[0]\n        };\n      }\n    } // set initial index\n\n\n    this.options.index = index; // define options for PhotoSwipe constructor\n\n    this.options.initialPointerPos = initialPoint;\n    this.shouldOpen = true;\n    this.preload(index, dataSource);\n    return true;\n  }\n  /**\r\n   * Load the main module and the slide content by index\r\n   *\r\n   * @param {number} index\r\n   * @param {DataSource} [dataSource]\r\n   */\n\n\n  preload(index, dataSource) {\n    const {\n      options\n    } = this;\n\n    if (dataSource) {\n      options.dataSource = dataSource;\n    } // Add the main module\n\n    /** @type {Promise<Type<PhotoSwipe>>[]} */\n\n\n    const promiseArray = [];\n    const pswpModuleType = typeof options.pswpModule;\n\n    if (isPswpClass(options.pswpModule)) {\n      promiseArray.push(Promise.resolve(\n      /** @type {Type<PhotoSwipe>} */\n      options.pswpModule));\n    } else if (pswpModuleType === 'string') {\n      throw new Error('pswpModule as string is no longer supported');\n    } else if (pswpModuleType === 'function') {\n      promiseArray.push(\n      /** @type {() => Promise<Type<PhotoSwipe>>} */\n      options.pswpModule());\n    } else {\n      throw new Error('pswpModule is not valid');\n    } // Add custom-defined promise, if any\n\n\n    if (typeof options.openPromise === 'function') {\n      // allow developers to perform some task before opening\n      promiseArray.push(options.openPromise());\n    }\n\n    if (options.preloadFirstSlide !== false && index >= 0) {\n      this._preloadedContent = lazyLoadSlide(index, this);\n    } // Wait till all promises resolve and open PhotoSwipe\n\n\n    const uid = ++this._uid;\n    Promise.all(promiseArray).then(iterableModules => {\n      if (this.shouldOpen) {\n        const mainModule = iterableModules[0];\n\n        this._openPhotoswipe(mainModule, uid);\n      }\n    });\n  }\n  /**\r\n   * @private\r\n   * @param {Type<PhotoSwipe> | { default: Type<PhotoSwipe> }} module\r\n   * @param {number} uid\r\n   */\n\n\n  _openPhotoswipe(module, uid) {\n    // Cancel opening if UID doesn't match the current one\n    // (if user clicked on another gallery item before current was loaded).\n    //\n    // Or if shouldOpen flag is set to false\n    // (developer may modify it via public API)\n    if (uid !== this._uid && this.shouldOpen) {\n      return;\n    }\n\n    this.shouldOpen = false; // PhotoSwipe is already open\n\n    if (window.pswp) {\n      return;\n    }\n    /**\r\n     * Pass data to PhotoSwipe and open init\r\n     *\r\n     * @type {PhotoSwipe}\r\n     */\n\n\n    const pswp = typeof module === 'object' ? new module.default(this.options) // eslint-disable-line\n    : new module(this.options); // eslint-disable-line\n\n    this.pswp = pswp;\n    window.pswp = pswp; // map listeners from Lightbox to PhotoSwipe Core\n\n    /** @type {(keyof PhotoSwipeEventsMap)[]} */\n\n    Object.keys(this._listeners).forEach(name => {\n      var _this$_listeners$name;\n\n      (_this$_listeners$name = this._listeners[name]) === null || _this$_listeners$name === void 0 || _this$_listeners$name.forEach(fn => {\n        pswp.on(name,\n        /** @type {EventCallback<typeof name>} */\n        fn);\n      });\n    }); // same with filters\n\n    /** @type {(keyof PhotoSwipeFiltersMap)[]} */\n\n    Object.keys(this._filters).forEach(name => {\n      var _this$_filters$name;\n\n      (_this$_filters$name = this._filters[name]) === null || _this$_filters$name === void 0 || _this$_filters$name.forEach(filter => {\n        pswp.addFilter(name, filter.fn, filter.priority);\n      });\n    });\n\n    if (this._preloadedContent) {\n      pswp.contentLoader.addToCache(this._preloadedContent);\n      this._preloadedContent = undefined;\n    }\n\n    pswp.on('destroy', () => {\n      // clean up public variables\n      this.pswp = undefined;\n      delete window.pswp;\n    });\n    pswp.init();\n  }\n  /**\r\n   * Unbinds all events, closes PhotoSwipe if it's open.\r\n   */\n\n\n  destroy() {\n    var _this$pswp;\n\n    (_this$pswp = this.pswp) === null || _this$pswp === void 0 || _this$pswp.destroy();\n    this.shouldOpen = false;\n    this._listeners = {};\n    getElementsFromOption(this.options.gallery, this.options.gallerySelector).forEach(galleryElement => {\n      galleryElement.removeEventListener('click', this.onThumbnailsClick, false);\n    });\n  }\n\n}\n\nexport { PhotoSwipeLightbox as default };\n//# sourceMappingURL=photoswipe-lightbox.esm.js.map\n","import PhotoSwipeLightbox from 'photoswipe/lightbox';\n\nconst createLightbox = () => {\n    const lightbox = new PhotoSwipeLightbox({\n        gallery: '#pswp-gallery',\n        children: 'a',\n        bgOpacity: 1,\n        showHideAnimationType: 'fade',\n        pswpModule: () => import('photoswipe'),\n    });\n\n    lightbox.init();\n    return lightbox;\n};\n\nexport const init = () => {\n    let lightbox = createLightbox();\n\n    const gallery = document.querySelector('#pswp-gallery');\n    if (gallery) {\n        gallery.addEventListener('d3r.live.replaced', () => {\n            lightbox.destroy();\n            lightbox = createLightbox();\n        });\n    }\n};\n","import {\n    TOGGLE_EVENT,\n    closePanel,\n    initDismiss,\n    isPanelOpen,\n    openPanel,\n} from '../../util/disclosure-panel';\n\nconst TRIGGER_SELECTOR = '[data-panel-trigger][lp-get]';\n\n// Scoped to configurator panels: `[data-panel]` alone also matches the header\n// quick basket and shortlist previews, which would take the active class too.\nconst initActiveStates = () => {\n    const panels = document.querySelectorAll(\n        '.configurator-popover[data-panel]'\n    );\n\n    panels.forEach(panel => {\n        const trigger = document.querySelector(\n            `[data-panel-trigger=\"${panel.id}\"]`\n        );\n        const group = trigger?.closest('.configurator-options__group');\n\n        if (!group) {\n            return;\n        }\n\n        panel.addEventListener(TOGGLE_EVENT, event => {\n            group.classList.toggle(\n                'configurator-options__group--active',\n                event.detail.open\n            );\n        });\n    });\n};\n\nconst initLivePagePanelOpen = () => {\n    const pdp = document.getElementById('pdpV2');\n    if (!pdp) return;\n\n    let observer = null;\n    let livePageReplacedHandler = null;\n\n    const disconnectPendingOpen = () => {\n        if (observer) {\n            observer.disconnect();\n            observer = null;\n        }\n\n        if (livePageReplacedHandler) {\n            document.removeEventListener(\n                'd3r.live.replaced',\n                livePageReplacedHandler\n            );\n            livePageReplacedHandler = null;\n        }\n    };\n\n    const showPendingPanel = panel => {\n        disconnectPendingOpen();\n        openPanel(panel);\n    };\n\n    const panelFor = trigger =>\n        document.getElementById(trigger.getAttribute('data-panel-trigger'));\n\n    // Closing via the trigger should not re-fetch/re-render the panel content, so\n    // this runs in the capture phase and stops the event reaching live-page.\n    document.addEventListener(\n        'click',\n        event => {\n            if (!(event.target instanceof Element)) return;\n\n            const trigger = event.target.closest(TRIGGER_SELECTOR);\n            if (!trigger) return;\n\n            const panel = panelFor(trigger);\n            if (!isPanelOpen(panel)) return;\n\n            event.preventDefault();\n            event.stopPropagation();\n            disconnectPendingOpen();\n            closePanel(panel);\n        },\n        true\n    );\n\n    // Let live-page fetch when opening, then open once the content has landed so the\n    // panel never appears empty.\n    document.addEventListener('click', event => {\n        if (!(event.target instanceof Element)) return;\n\n        const trigger = event.target.closest(TRIGGER_SELECTOR);\n        if (!trigger) return;\n\n        const panel = panelFor(trigger);\n        if (!panel) return;\n\n        const panelInner = panel.querySelector('.configurator-popover__inner');\n\n        disconnectPendingOpen();\n\n        livePageReplacedHandler = replaceEvent => {\n            if (\n                panelInner &&\n                replaceEvent.target !== panelInner &&\n                !panelInner.contains(replaceEvent.target)\n            ) {\n                return;\n            }\n\n            showPendingPanel(panel);\n        };\n\n        document.addEventListener('d3r.live.replaced', livePageReplacedHandler);\n\n        // Fallback for live-page swaps that do not dispatch/bubble the render event.\n        observer = new MutationObserver(() => {\n            showPendingPanel(panel);\n        });\n\n        observer.observe(panelInner || pdp, {\n            attributes: true,\n            childList: true,\n            characterData: true,\n            subtree: true,\n        });\n    });\n};\n\nconst initColourStyleFilters = () => {\n    document.addEventListener('click', event => {\n        if (!(event.target instanceof Element)) return;\n\n        const trigger = event.target.closest('[data-colour-style-select]');\n        if (!trigger) return;\n\n        const panel =\n            trigger.closest('.configurator-popover') ||\n            trigger.closest('[data-dynamic-config-step-content]') ||\n            trigger.closest('[data-dynamic-config-content]') ||\n            trigger.closest('[data-dynamic-config-bar]') ||\n            trigger.closest('#pdpV2');\n        const styleId = trigger.getAttribute('data-colour-style-select');\n        if (!panel || !styleId) return;\n\n        event.preventDefault();\n\n        panel.querySelectorAll('[data-colour-style-select]').forEach(button => {\n            const isActive =\n                button.getAttribute('data-colour-style-select') === styleId;\n            button.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n            button\n                .closest('.configurator-popover__colour-swatch')\n                ?.classList.toggle('is-active', isActive);\n        });\n\n        panel\n            .querySelectorAll(\n                '.configurator-popover__colour-swatch--large[data-style-ids]'\n            )\n            .forEach(swatch => {\n                const styleIds = swatch\n                    .getAttribute('data-style-ids')\n                    .split(',')\n                    .map(id => id.trim())\n                    .filter(Boolean);\n\n                swatch.hidden = !styleIds.includes(styleId);\n            });\n    });\n};\n\n// Gap kept between the sticky header and the top of an open popover, so its close\n// button is always reachable. 1rem.\nconst HEADER_GAP = 16;\n\n// Matching gap below the popover, so it never sits flush to whatever bounds it.\nconst VIEWPORT_GAP = 16;\n\n/**\n * The lowest the popover may reach: the top of the add-to-basket bar when that is on\n * screen, otherwise the bottom of the window.\n *\n * The bar is sticky, so it travels relative to the panel as the page scrolls, and it is\n * display: none until the bar flips out of its customise state. Both are why this is\n * measured on every pass rather than cached.\n *\n * @returns {number}\n */\nconst lowerBound = () => {\n    const bar = document.querySelector('.configuration-bar__add-basket');\n    const rect = bar?.getBoundingClientRect();\n\n    return rect?.height\n        ? Math.min(rect.top, window.innerHeight)\n        : window.innerHeight;\n};\n\n// Half the arrow's height (36px), used to stop it sliding out of the rounded body.\nconst ARROW_HALF = 18;\n\n// Corner radius of the popover body, so the clamped arrow stays off the curve.\nconst BODY_RADIUS = 24;\n\n/**\n * Nudge an open popover into view, clear of the sticky header and the add-to-basket bar.\n *\n * The panel is absolutely positioned against its trigger, so it travels with the\n * page while the header stays put. Measuring the header element rather than\n * --header-height picks up the notice bar and the admin/debug bars too.\n *\n * Clearing the header wins, so a panel too tall for the gap between the header and the\n * add-to-basket bar keeps its top (and its close button) reachable and overlaps the bar\n * instead. Nudging can move the panel, not shrink it.\n *\n * @param {HTMLElement} panel\n * @returns {void}\n */\nconst nudgeIntoView = panel => {\n    const header = document.querySelector('[data-header]');\n\n    // Measure from a clean slate, or each pass compounds the last one's offset.\n    panel.style.setProperty('--popover-nudge', '0px');\n    panel.style.setProperty('--popover-arrow-nudge', '0px');\n\n    const headerBottom = header ? header.getBoundingClientRect().bottom : 0;\n    const panelRect = panel.getBoundingClientRect();\n    const headroom = panelRect.top - (headerBottom + HEADER_GAP);\n    const overflow = panelRect.bottom + VIEWPORT_GAP - lowerBound();\n\n    // Down to clear the header, otherwise up to clear the bar by as much of the\n    // headroom as it takes.\n    const shift =\n        headroom < 0 ? -headroom : -Math.min(Math.max(overflow, 0), headroom);\n\n    if (shift === 0) {\n        return;\n    }\n\n    // The arrow travels against the panel, so cap it before it leaves the body.\n    // Past that point the panel keeps moving and the arrow stops short.\n    const maxArrowTravel = Math.max(\n        0,\n        panelRect.height / 2 - ARROW_HALF - BODY_RADIUS\n    );\n\n    panel.style.setProperty('--popover-nudge', `${shift}px`);\n    panel.style.setProperty(\n        '--popover-arrow-nudge',\n        `${Math.sign(shift) * Math.min(Math.abs(shift), maxArrowTravel)}px`\n    );\n};\n\nconst initPanelClearance = () => {\n    let frame = null;\n\n    // Popovers are rendered on demand by live-page, so nothing can be bound to the\n    // panels themselves at init. TOGGLE_EVENT bubbles, so one document listener\n    // covers every panel however often it is re-rendered.\n    const repositionOpenPanels = () => {\n        frame = null;\n        document\n            .querySelectorAll('.configurator-popover[data-panel-open]')\n            .forEach(nudgeIntoView);\n    };\n\n    const schedule = () => {\n        if (frame === null) {\n            frame = window.requestAnimationFrame(repositionOpenPanels);\n        }\n    };\n\n    // The colour popover renders every swatch and hides most of them, so its height\n    // changes after opening and whenever a style filter is used. Because the panel is\n    // centred on its trigger, a height change moves its top, so size is the signal\n    // that matters, not just open/scroll. Observing also fires once immediately,\n    // which covers the first measurement after paint.\n    const sizeObserver = new ResizeObserver(schedule);\n\n    document.addEventListener(TOGGLE_EVENT, event => {\n        const panel = event.target;\n\n        if (!(panel instanceof HTMLElement)) {\n            return;\n        }\n\n        if (!panel.classList.contains('configurator-popover')) {\n            return;\n        }\n\n        if (!event.detail.open) {\n            sizeObserver.unobserve(panel);\n            panel.style.removeProperty('--popover-nudge');\n            panel.style.removeProperty('--popover-arrow-nudge');\n            return;\n        }\n\n        sizeObserver.observe(panel);\n    });\n\n    // The panel is opened once its content lands, and the swap can change its\n    // height, so re-measure whenever live-page replaces anything.\n    document.addEventListener('d3r.live.replaced', schedule);\n\n    window.addEventListener('scroll', schedule, { passive: true });\n    window.addEventListener('resize', schedule, { passive: true });\n};\n\nexport const init = () => {\n    initDismiss();\n    initActiveStates();\n    initLivePagePanelOpen();\n    initColourStyleFilters();\n    initPanelClearance();\n};\n","// @ts-check\n\n// Restricted-fabric (e.g. Boucle) confirm gates for the PDP v2 configurator.\n//\n// Some fabrics only come in a few colours. Selecting one, or picking a colour it\n// does not come in, resets the other axis, so both are gated behind a confirm\n// bubble before the live-page commit runs.\n//\n// The bubble is the existing chooser popover switched into confirm mode: the\n// swatch grid is hidden and a confirm layer (`[data-gate-confirm]`, rendered by\n// `_confirmGate.twig`) is shown in its place. Continue is itself a live-page\n// button whose URL is copied from the clicked swatch, so the commit still runs\n// through the single canonical path. The commit URL targets the OTHER chooser's\n// endpoint, so the response re-renders and opens that chooser: on mobile via the\n// server `data-auto-open-step` signal, on desktop via the pending-open below.\n\nimport { openPanel } from '../../util/disclosure-panel';\n\nconst GATE_SWATCH_SELECTOR = '[data-gate=\"material\"], [data-gate=\"colour\"]';\n\n// Which chooser to open after a gated commit, keyed by the gate that fired.\nconst TARGET_KIND = {\n    material: 'colour-global',\n    colour: 'material-global',\n};\n\nlet activeConfirm = null;\nlet pendingOpenPanelId = null;\n\n// Find the popover content container whose direct child is the confirm layer,\n// so the same code works for the desktop popover and the mobile step panel.\nconst findGateContext = element => {\n    let node = element;\n    while (node && node !== document) {\n        const layer = node.querySelector?.(':scope > [data-gate-confirm]');\n        if (layer) {\n            return { container: node, layer };\n        }\n        node = node.parentElement;\n    }\n    return null;\n};\n\nconst strong = text => {\n    const el = document.createElement('strong');\n    el.textContent = text;\n    return el;\n};\n\n// Build the confirm copy with the names emphasised, matching the design, without\n// ever routing server-provided names through innerHTML.\nconst buildMessage = messageEl => {\n    messageEl.textContent = '';\n    return segments => {\n        segments.forEach(segment => {\n            if (segment.break) {\n                messageEl.appendChild(document.createElement('br'));\n                return;\n            }\n            messageEl.appendChild(\n                segment.bold\n                    ? strong(segment.text)\n                    : document.createTextNode(segment.text)\n            );\n        });\n    };\n};\n\nconst messageForMaterialGate = swatch => {\n    const material = swatch.getAttribute('data-gate-material-name') ?? '';\n    const colour = swatch.getAttribute('data-gate-current-colour') ?? '';\n    const restricted =\n        swatch.getAttribute('data-gate-fabric-restricted') === '1';\n\n    // Restricted fabric (e.g. Boucle): lead with the fabric's own colour limit.\n    if (restricted) {\n        const count = parseInt(\n            swatch.getAttribute('data-gate-colour-count') ?? '0',\n            10\n        );\n        const colourWord = count === 1 ? 'colour' : 'colours';\n\n        return [\n            { text: material, bold: true },\n            { text: ' is only available in ' },\n            { text: `${count} ${colourWord}`, bold: true },\n            { break: true },\n            { text: `Choosing ${material} will remove ` },\n            { text: colour, bold: true },\n        ];\n    }\n\n    // Normal fabric that does not carry the currently chosen colour.\n    return [\n        { text: colour, bold: true },\n        { text: ' is not available in ' },\n        { text: material, bold: true },\n        { break: true },\n        { text: `Choosing ${material} will reset your colour` },\n    ];\n};\n\nconst messageForColourGate = swatch => {\n    const colour = swatch.getAttribute('data-gate-colour-name') ?? '';\n    const material = swatch.getAttribute('data-gate-material-name') ?? '';\n\n    return [\n        { text: colour, bold: true },\n        { text: ' is not available in ' },\n        { text: material, bold: true },\n        { text: '. ' },\n        { break: true },\n        { text: 'Choosing this colour will reset your fabric' },\n    ];\n};\n\n// Confirm mode is driven by an attribute on the popover content root: CSS hides\n// the grid/header/footer siblings and shows the confirm layer, so the bubble\n// replaces the content. Grandchild swatch state (hidden/revealed) is untouched.\nconst enterConfirmMode = (container, layer) => {\n    container.setAttribute('data-gate-confirming', '');\n    layer.hidden = false;\n};\n\nconst exitConfirmMode = (container, layer) => {\n    container.removeAttribute('data-gate-confirming');\n    layer.hidden = true;\n};\n\nconst closeConfirm = () => {\n    if (!activeConfirm) {\n        return;\n    }\n    exitConfirmMode(activeConfirm.container, activeConfirm.layer);\n    activeConfirm = null;\n};\n\nconst openConfirm = (swatch, gateKind) => {\n    const context = findGateContext(swatch);\n    if (!context) {\n        return;\n    }\n\n    const { container, layer } = context;\n    const continueButton = layer.querySelector('[data-gate-continue]');\n    const messageEl = layer.querySelector('[data-gate-message]');\n    if (!continueButton || !messageEl) {\n        return;\n    }\n\n    const write = buildMessage(messageEl);\n    write(\n        gateKind === 'material'\n            ? messageForMaterialGate(swatch)\n            : messageForColourGate(swatch)\n    );\n\n    // Continue commits through the swatch's own live-page URL.\n    continueButton.setAttribute('lp-get', swatch.getAttribute('lp-get') ?? '');\n\n    enterConfirmMode(container, layer);\n\n    activeConfirm = {\n        container,\n        layer,\n        swatch,\n        gateKind,\n        isMobile: swatch.closest('[data-dynamic-config-bar]') !== null,\n    };\n\n    continueButton.focus();\n};\n\n// Desktop only: open the target chooser once its popover content has been\n// swapped in. Mobile/short-desktop is server-driven via data-auto-open-step.\nconst rememberDesktopOpen = gateKind => {\n    pendingOpenPanelId = `${TARGET_KIND[gateKind]}-configurator-v2`;\n};\n\nconst initPendingOpen = () => {\n    // d3r.live.replaced does not bubble, so listen in the capture phase (it still\n    // reaches document on the way down to the swapped element).\n    document.addEventListener(\n        'd3r.live.replaced',\n        event => {\n            if (!pendingOpenPanelId || !(event.target instanceof Element)) {\n                return;\n            }\n\n            const panel = document.getElementById(pendingOpenPanelId);\n            const inner = panel?.querySelector('.configurator-popover__inner');\n            if (!panel || !inner) {\n                return;\n            }\n\n            if (event.target === inner || inner.contains(event.target)) {\n                openPanel(panel);\n                pendingOpenPanelId = null;\n            }\n        },\n        true\n    );\n};\n\n// Capture phase so we pre-empt live-page's bubble-phase commit for gated swatches.\nconst initInterception = () => {\n    document.addEventListener(\n        'click',\n        event => {\n            if (!(event.target instanceof Element)) {\n                return;\n            }\n\n            const swatch = event.target.closest(GATE_SWATCH_SELECTOR);\n            if (!swatch) {\n                return;\n            }\n\n            const gateKind = swatch.getAttribute('data-gate');\n\n            event.preventDefault();\n            event.stopPropagation();\n            openConfirm(swatch, gateKind);\n        },\n        true\n    );\n};\n\nconst initActions = () => {\n    document.addEventListener('click', event => {\n        if (!(event.target instanceof Element)) {\n            return;\n        }\n\n        const showAll = event.target.closest('[data-gate-show-all]');\n        if (showAll) {\n            event.preventDefault();\n            const context = findGateContext(showAll);\n            if (!context) {\n                return;\n            }\n            const root = context.container;\n            const HIDDEN = 'configurator-popover__colour-selection--hidden';\n            // Switch to the normal, unrestricted chooser: drop the restriction note,\n            // reveal the style-group tabs, and activate the first group so the colours\n            // filter exactly like the standard colour chooser (popover.js handles the\n            // filtering off the tab click). Invalid colours keep their gate data, so\n            // choosing one still opens the fabric confirm.\n            root.querySelector('[data-gate-restriction-note]')?.classList.add(\n                HIDDEN\n            );\n            const tabs = root.querySelector('[data-gate-style-tabs]');\n            tabs?.classList.remove(HIDDEN);\n            // Match the normal chooser: no per-swatch availability badges once\n            // the restriction has been lifted.\n            root.setAttribute('data-gate-showing-all', '');\n            tabs?.querySelector('[data-colour-style-select]')?.click();\n            return;\n        }\n\n        const showAllFabrics = event.target.closest(\n            '[data-gate-show-all-fabrics]'\n        );\n        if (showAllFabrics) {\n            event.preventDefault();\n            const context = findGateContext(showAllFabrics);\n            if (!context) {\n                return;\n            }\n            const root = context.container;\n            // Fabrics have no style groups, so \"Show all fabrics\" just reveals the\n            // hidden (incompatible) fabrics and drops the restriction note/badges,\n            // matching the standard fabric chooser.\n            root.querySelector('[data-gate-restriction-note]')?.classList.add(\n                'configurator-popover__colour-selection--hidden'\n            );\n            root.setAttribute('data-gate-showing-all', '');\n            root.querySelectorAll('[data-gate-hidden]').forEach(fabric => {\n                fabric.hidden = false;\n            });\n            return;\n        }\n\n        const cancel = event.target.closest('[data-gate-cancel]');\n        if (cancel && activeConfirm) {\n            event.preventDefault();\n            const swatch = activeConfirm.swatch;\n            closeConfirm();\n            swatch?.focus();\n            return;\n        }\n\n        const continueButton = event.target.closest('[data-gate-continue]');\n        if (continueButton && activeConfirm) {\n            // Let live-page fire; the commit re-renders the popover. Record the\n            // desktop open here since Continue is not a panel trigger.\n            if (!activeConfirm.isMobile) {\n                rememberDesktopOpen(activeConfirm.gateKind);\n            }\n            closeConfirm();\n        }\n    });\n\n    // Escape backs out of the confirm to the grid rather than closing the popover.\n    document.addEventListener(\n        'keydown',\n        event => {\n            if (event.key !== 'Escape' || !activeConfirm) {\n                return;\n            }\n            event.stopPropagation();\n            const swatch = activeConfirm.swatch;\n            closeConfirm();\n            swatch?.focus();\n        },\n        true\n    );\n};\n\nexport const init = () => {\n    initInterception();\n    initActions();\n    initPendingOpen();\n};\n","/**\n * Go to Configurator Button Handler\n * Navigates to the last slide (configurator) when button is clicked.\n * Uses AbortController so init() can be safely re-called after a hero swap\n * without accumulating duplicate listeners on the same button element.\n */\n\nlet controller = new AbortController();\nlet hasCustomSelections = false;\n\nconst gotoConfiguratorSelector = '[data-goto-configurator]';\nconst dynamicConfiguratorSelector = '[data-dynamic-config-customise]';\nconst ctaSelector = `${gotoConfiguratorSelector}, ${dynamicConfiguratorSelector}`;\n\nconst getClosest = (event, selector) =>\n    event.target instanceof Element ? event.target.closest(selector) : null;\n\nconst isConfiguratorSelectionTrigger = trigger => {\n    const requestUrl = trigger.getAttribute('lp-get') ?? '';\n\n    return (\n        requestUrl.includes('/variant') &&\n        !requestUrl.includes('qty-only=1') &&\n        !trigger.matches('[data-qty-lp-trigger]') &&\n        !trigger.closest('.is-active') &&\n        Boolean(\n            trigger.closest('#configurator-hero, [data-dynamic-config-bar]')\n        )\n    );\n};\n\nconst updateCtaLabels = () => {\n    document.querySelectorAll(ctaSelector).forEach(button => {\n        const customiseLabel = button.dataset.labelCustomise ?? 'Customise';\n        const reviewLabel = button.dataset.labelReview ?? 'Review selections';\n\n        button.textContent = hasCustomSelections ? reviewLabel : customiseLabel;\n    });\n};\n\nexport const init = slider => {\n    controller.abort();\n    controller = new AbortController();\n\n    if (!slider) {\n        return;\n    }\n\n    updateCtaLabels();\n\n    document.addEventListener(\n        'click',\n        event => {\n            const selectionTrigger = getClosest(\n                event,\n                '[lp-get][lp-trigger=\"click\"]'\n            );\n\n            if (\n                selectionTrigger &&\n                isConfiguratorSelectionTrigger(selectionTrigger)\n            ) {\n                hasCustomSelections = true;\n                updateCtaLabels();\n                return;\n            }\n\n            const button = getClosest(event, ctaSelector);\n\n            if (!button) {\n                return;\n            }\n\n            const lastSlideIndex = slider.totalSlides - 1;\n            slider.goToSlide(lastSlideIndex);\n            window.scrollTo({ top: 0, behavior: 'smooth' });\n        },\n        { signal: controller.signal, capture: true }\n    );\n\n    document.addEventListener('d3r.live.replaced', updateCtaLabels, {\n        signal: controller.signal,\n        capture: true,\n    });\n};\n","/**\n * Quick Add Overlay\n * Opens a sidebar overlay for quick adding paired products\n */\n\nimport Dialog from 'dialog';\nimport { loadChooserOverlay } from '../chooser/chooser-helpers';\n\nlet initialised = false;\n\n/**\n * Handles click events on the quick add button\n *\n * @param {Event} event\n * @return {void}\n */\nconst handleButtonClick = event => {\n    if (!(event.target instanceof Element)) {\n        return;\n    }\n\n    const button = event.target.closest('[data-upsell]');\n\n    if (!(button instanceof HTMLElement)) {\n        return;\n    }\n\n    if (button.dataset.overlayUrl) {\n        event.preventDefault();\n        loadChooserOverlay(button.dataset.overlayUrl);\n        return;\n    }\n\n    Dialog.render('#upsell-overlay', {\n        modifiers: ['sidebar', 'overlay', 'upsell'],\n    });\n};\n\n/**\n * Initialises the upsell overlay functionality\n */\nexport const init = () => {\n    if (initialised) {\n        return;\n    }\n\n    initialised = true;\n    document.addEventListener('click', handleButtonClick);\n};\n","/**\n * Staged variant selection for upsell chooser cards.\n *\n * A card whose product carries its own options (a mattress tension, say) used to commit\n * on every variant click. Every variant shares the card's price and image, so that round\n * trip only moved the active outline, and it added the upsell before the customer had\n * asked for it. Variants are now staged in the browser and the card's CTA is the only\n * thing that commits.\n */\n\nconst CARD_SELECTOR = '.mattress-chooser__card';\nconst CHOSEN_CLASS = 'mattress-chooser__card--active';\nconst ACTIVE_CLASS = 'mattress-chooser__variant--active';\nconst ACCENT_CLASS = 'button--accent';\n\n/**\n * Build the commit URL for whichever variants are currently staged.\n *\n * Each group contributes its own param, so a card with more than one variant option\n * commits every staged choice rather than only the one last clicked.\n *\n * @param  {HTMLElement} card\n * @param  {HTMLElement} cta\n * @returns {string}\n */\nconst buildCommitUrl = (card, cta) => {\n    const url = new URL(\n        cta.getAttribute('data-upsell-commit-url'),\n        window.location.origin\n    );\n\n    card.querySelectorAll(`.${ACTIVE_CLASS}[data-upsell-variant]`).forEach(\n        active => {\n            url.searchParams.set(\n                active.getAttribute('data-upsell-variant-param'),\n                active.getAttribute('data-upsell-variant-value')\n            );\n        }\n    );\n\n    return `${url.pathname}${url.search}`;\n};\n\n/**\n * Point the CTA at the staged variants, and turn it into a confirm when they differ\n * from what is already on the configuration.\n *\n * Every state is read back off the element rather than cached, because live-page morphs\n * the CTA in place and any remembered \"before\" would survive the swap and go stale.\n *\n * @param  {HTMLElement} card\n * @returns {void}\n */\nconst syncCta = card => {\n    const cta = card.querySelector('[data-upsell-cta]');\n\n    if (!cta) {\n        return;\n    }\n\n    // An unchosen card is not on the configuration yet, so it cannot be out of step with\n    // it: the CTA keeps its \"Add\" wording and only the URL follows the staging.\n    if (!card.classList.contains(CHOSEN_CLASS)) {\n        cta.setAttribute('lp-get', buildCommitUrl(card, cta));\n        return;\n    }\n\n    const isStaged = [\n        ...card.querySelectorAll(`.${ACTIVE_CLASS}[data-upsell-variant]`),\n    ].some(button => !button.hasAttribute('data-upsell-variant-committed'));\n\n    const prefix = isStaged ? 'confirm' : 'remove';\n\n    cta.textContent = cta.getAttribute(`data-upsell-${prefix}-label`);\n    cta.setAttribute(\n        'aria-label',\n        cta.getAttribute(`data-upsell-${prefix}-aria-label`)\n    );\n    cta.setAttribute(\n        'lp-get',\n        isStaged\n            ? buildCommitUrl(card, cta)\n            : cta.getAttribute('data-upsell-remove-url')\n    );\n    cta.classList.toggle(ACCENT_CLASS, isStaged);\n};\n\n/**\n * @param  {HTMLElement} button\n * @returns {void}\n */\nconst stageVariant = button => {\n    const group = button.closest('.mattress-chooser__variants');\n    const card = button.closest(CARD_SELECTOR);\n\n    if (!group || !card) {\n        return;\n    }\n\n    group.querySelectorAll('[data-upsell-variant]').forEach(sibling => {\n        const isActive = sibling === button;\n        sibling.classList.toggle(ACTIVE_CLASS, isActive);\n        sibling.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n    });\n\n    syncCta(card);\n};\n\nexport const init = () => {\n    // Chooser cards are rendered on demand by live-page, in the desktop popover and in the\n    // mobile config bar step, so one delegated listener covers every re-render.\n    document.addEventListener('click', event => {\n        if (!(event.target instanceof Element)) {\n            return;\n        }\n\n        const button = event.target.closest('[data-upsell-variant]');\n\n        if (!button) {\n            return;\n        }\n\n        event.preventDefault();\n        stageVariant(button);\n    });\n};\n","import {\n    addToLocalStorage,\n    handleLocalStorage,\n    MAX_BASKET_SWATCHES,\n} from './local-storage';\nimport { NabASwatch } from './NabASwatch';\n\nconst initialisedContainers = new WeakSet();\n\nexport const initSwatchButtons = container => {\n    const root = document;\n\n    if (initialisedContainers.has(root)) {\n        return;\n    }\n\n    initialisedContainers.add(root);\n\n    root.addEventListener(\n        'click',\n        async event => {\n            const target =\n                event.target instanceof Element\n                    ? event.target\n                    : event.target instanceof Node\n                      ? event.target.parentElement\n                      : null;\n\n            if (!target) {\n                return;\n            }\n\n            const btn = target.closest('[data-add-swatch-slide]');\n            if (!(btn instanceof HTMLElement)) {\n                return;\n            }\n\n            event.stopPropagation();\n\n            const colourGlobalCode = btn.dataset.colourGlobalCode;\n            const materialGlobalCode = btn.dataset.materialGlobalCode;\n            const sku = btn.dataset.stockitem;\n\n            let swatchObject = null;\n\n            if (colourGlobalCode && materialGlobalCode) {\n                try {\n                    const response = await fetch(\n                        `/swatches/resolve-swatch?colour_global=${encodeURIComponent(colourGlobalCode)}&material_global=${encodeURIComponent(materialGlobalCode)}`,\n                        { headers: { 'X-Requested-With': 'XMLHttpRequest' } }\n                    );\n                    const data = await response.json();\n\n                    if (data.result && data.payload?.swatch) {\n                        const swatch = data.payload.swatch;\n                        swatchObject = {\n                            value: JSON.stringify({ colour: swatch.urlname }),\n                            title: swatch.title,\n                            longTitle: swatch.material_global_name,\n                            backgroundCSS: swatch.hex_background_css,\n                            categoryClass: '',\n                            hex: swatch.hex,\n                            imageHtml: swatch.image_html,\n                            colourCode: colourGlobalCode,\n                            materialCode: materialGlobalCode,\n                        };\n                    }\n                } catch (e) {\n                    // Fall through; overlay will still open without pre-adding.\n                }\n            } else {\n                // Legacy fallback: build from data attributes (e.g. config bar)\n                swatchObject = {\n                    value: btn.dataset.optionValues,\n                    title: btn.dataset.title,\n                    longTitle: btn.dataset.longTitle,\n                    url: btn.dataset.url,\n                    hex: btn.dataset.hex,\n                    categoryClass: btn.dataset.categoryClass,\n                    backgroundCSS: btn.dataset.swatchBackground,\n                };\n            }\n\n            const swatches = JSON.parse(localStorage.getItem('swatches')) ?? [];\n\n            const openOverlay = () =>\n                new NabASwatch(colourGlobalCode, materialGlobalCode, sku);\n\n            document.addEventListener(\n                'loaf-swatch-exists',\n                () => {\n                    new NabASwatch(colourGlobalCode, materialGlobalCode, sku);\n                },\n                { once: true }\n            );\n\n            if (swatchObject) {\n                if (swatches.length >= MAX_BASKET_SWATCHES) {\n                    handleLocalStorage(\n                        swatchObject,\n                        'loaf-swatch-exists',\n                        openOverlay,\n                        true\n                    );\n                } else {\n                    addToLocalStorage(swatches, swatchObject);\n                    openOverlay();\n                }\n            } else {\n                openOverlay();\n            }\n        },\n        { capture: true }\n    );\n};\n","/**\n * Watch for changes to the [data-configurator-state] attribute and call\n * the provided callback with the new state value whenever it changes.\n * Also calls the callback immediately with the current state.\n *\n * @param {function(string|null): void} onChange\n */\nexport const watchConfiguratorState = onChange => {\n    const wrapper = document.querySelector('[data-configurator-state]');\n    if (!wrapper) return;\n\n    const observer = new MutationObserver(mutations => {\n        mutations.forEach(mutation => {\n            if (mutation.attributeName === 'data-configurator-state') {\n                onChange(wrapper.getAttribute('data-configurator-state'));\n            }\n        });\n    });\n\n    observer.observe(wrapper, {\n        attributes: true,\n        attributeFilter: ['data-configurator-state'],\n    });\n\n    onChange(wrapper.getAttribute('data-configurator-state'));\n};\n","import { initSwatchButtons } from '../../swatch/initSwatchButton';\nimport { syncEditInCpUrl } from '../../util/url';\nimport { watchConfiguratorState } from './configurator-state';\nimport { isShortDesktopViewport } from './short-desktop-viewport';\n\nconst fixedClassName = 'configuration-bar--fixed';\nconst leavingClassName = 'configuration-bar--leaving';\nconst onConfiguratorClassName = 'configuration-bar--on-configurator';\nconst reducedClassName = 'configuration-bar--reduced';\nconst returningClassName = 'configuration-bar--returning';\n\nlet heroObserver;\nlet currentConfiguratorState = null;\nlet hasConfiguratorStateWatcher = false;\nlet reducedConfigBarResizeFrame = null;\nlet reducedConfigBarResizeController = null;\nlet configBarScrollDirectionController = null;\nlet configBarIsScrollingUp = false;\nlet lastConfigBarScrollY = window.scrollY;\n\nconst getConfigBar = () =>\n    document.querySelector('[data-configuration-bar-v2]');\n\nconst getConfiguratorWrapper = () =>\n    document.querySelector('[data-configurator-state]');\n\nconst isMainConfiguratorHero = () => {\n    const wrapper = getConfiguratorWrapper();\n\n    return (\n        wrapper?.dataset.configuratorStyle === 'main' ||\n        Boolean(\n            document.querySelector(\n                '#configurator-hero:not(.configurator-hero--with-panel)'\n            )\n        )\n    );\n};\n\nconst shouldReduceConfigBar = (state, configBar) =>\n    Boolean(configBar) &&\n    isMainConfiguratorHero() &&\n    isShortDesktopViewport() &&\n    state !== 'on-configurator' &&\n    !configBar.classList.contains(fixedClassName);\n\nconst syncConfigBarState = (\n    state = currentConfiguratorState,\n    configBar = getConfigBar()\n) => {\n    const actions = configBar?.querySelector('.configuration-bar__actions');\n\n    configBar?.classList.toggle(\n        onConfiguratorClassName,\n        state === 'on-configurator'\n    );\n    configBar?.classList.toggle(\n        reducedClassName,\n        shouldReduceConfigBar(state, configBar)\n    );\n    actions?.classList.toggle('is-addBasket', state === 'on-configurator');\n};\n\nconst scheduleConfigBarStateSync = () => {\n    if (reducedConfigBarResizeFrame) {\n        return;\n    }\n\n    reducedConfigBarResizeFrame = window.requestAnimationFrame(() => {\n        reducedConfigBarResizeFrame = null;\n        syncConfigBarState();\n    });\n};\n\nconst initReducedConfigBarViewportWatcher = () => {\n    if (reducedConfigBarResizeController) {\n        scheduleConfigBarStateSync();\n\n        return;\n    }\n\n    reducedConfigBarResizeController = new AbortController();\n\n    window.addEventListener('resize', scheduleConfigBarStateSync, {\n        passive: true,\n        signal: reducedConfigBarResizeController.signal,\n    });\n\n    window.visualViewport?.addEventListener(\n        'resize',\n        scheduleConfigBarStateSync,\n        {\n            passive: true,\n            signal: reducedConfigBarResizeController.signal,\n        }\n    );\n};\n\n// Watch for changes in the configurator state and update the configuration bar accordingly\nconst initConfiguratorStateWatcher = () => {\n    if (hasConfiguratorStateWatcher) {\n        syncConfigBarState();\n\n        return;\n    }\n\n    hasConfiguratorStateWatcher = true;\n\n    watchConfiguratorState(state => {\n        currentConfiguratorState = state;\n        syncConfigBarState(state);\n    });\n};\n\n/**\n * Show the fixed configuration bar and restart the entrance animation.\n */\nconst showConfigBar = configBar => {\n    if (\n        configBar.classList.contains(fixedClassName) &&\n        !configBar.classList.contains(leavingClassName)\n    ) {\n        return;\n    }\n\n    configBar.classList.remove(\n        fixedClassName,\n        leavingClassName,\n        returningClassName\n    );\n    void configBar.offsetWidth;\n    configBar.classList.add(fixedClassName);\n    syncConfigBarState(currentConfiguratorState, configBar);\n};\n\n/**\n * Hide the fixed configuration bar using its exit animation.\n */\nconst hideConfigBar = configBar => {\n    if (!configBar.classList.contains(fixedClassName)) return;\n\n    configBar.classList.remove(returningClassName, leavingClassName);\n    void configBar.offsetWidth;\n    configBar.classList.add(leavingClassName);\n};\n\n/**\n * Keep the animation end listener bound to the current configuration bar.\n */\nconst initConfigBarAnimationWatcher = configBar => {\n    configBar.removeEventListener('animationend', handleConfigBarAnimationEnd);\n    configBar.addEventListener('animationend', handleConfigBarAnimationEnd);\n};\n\n/**\n * Reset the configuration bar classes after fixed/returning animations finish.\n */\nconst handleConfigBarAnimationEnd = event => {\n    if (event.target !== event.currentTarget) return;\n\n    const configBar = event.currentTarget;\n\n    if (event.animationName === 'configuration-bar-slide-down') {\n        configBar.classList.remove(\n            fixedClassName,\n            leavingClassName,\n            returningClassName\n        );\n        syncConfigBarState(currentConfiguratorState, configBar);\n        void configBar.offsetWidth;\n        configBar.classList.add(returningClassName);\n        return;\n    }\n\n    if (event.animationName === 'configuration-bar-fade-in') {\n        configBar.classList.remove(returningClassName);\n    }\n};\n\nconst disconnectScrollWatchers = () => {\n    heroObserver?.disconnect();\n    configBarScrollDirectionController?.abort();\n\n    heroObserver = undefined;\n    configBarScrollDirectionController = null;\n};\n\n/**\n * Tracks whether the page is currently being scrolled upwards.\n */\nconst updateConfigBarScrollDirection = () => {\n    const scrollY = window.scrollY;\n\n    configBarIsScrollingUp = scrollY < lastConfigBarScrollY - 2;\n    lastConfigBarScrollY = scrollY;\n};\n\n/**\n * Starts scroll direction tracking for the fixed bar observer.\n */\nconst initConfigBarScrollDirectionWatcher = () => {\n    configBarScrollDirectionController?.abort();\n\n    configBarScrollDirectionController = new AbortController();\n    configBarIsScrollingUp = false;\n    lastConfigBarScrollY = window.scrollY;\n\n    window.addEventListener('scroll', updateConfigBarScrollDirection, {\n        passive: true,\n        signal: configBarScrollDirectionController.signal,\n    });\n};\n\n// Watch for the hero leaving the viewport to toggle the fixed configuration bar\nconst configBarScrollWatcher = () => {\n    disconnectScrollWatchers();\n\n    const configBar = document.querySelector('[data-configuration-bar-v2]');\n    const hero = document.querySelector('#configurator-hero');\n    if (!configBar || !hero) return;\n\n    initConfigBarScrollDirectionWatcher();\n    initConfigBarAnimationWatcher(configBar);\n\n    heroObserver = new IntersectionObserver(\n        ([entry]) => {\n            if (entry.isIntersecting) {\n                if (configBarIsScrollingUp) {\n                    hideConfigBar(configBar);\n                }\n\n                return;\n            }\n\n            showConfigBar(configBar);\n        },\n        { rootMargin: '-100px 0px 0px 0px' }\n    );\n\n    heroObserver.observe(hero);\n};\n\n// initialisation function to be called on page load\nexport const init = () => {\n    initConfiguratorStateWatcher();\n    initReducedConfigBarViewportWatcher();\n    configBarScrollWatcher();\n    initSwatchButtons(getConfigBar());\n};\n\nconst configBar = getConfigBar();\n\nconfigBar?.addEventListener('d3r.live.replaced', () => {\n    initConfiguratorStateWatcher();\n    initReducedConfigBarViewportWatcher();\n    configBarScrollWatcher();\n    initSwatchButtons(getConfigBar());\n    syncEditInCpUrl();\n});\n\ndocument.addEventListener(\n    'd3r.live.replaced',\n    event => {\n        if (\n            event.target?.matches?.(\n                '[data-configuration-bar-v2], [data-dynamic-config-bar]'\n            )\n        ) {\n            syncEditInCpUrl();\n        }\n    },\n    { capture: true }\n);\n","import Dialog from 'dialog';\nimport { watchConfiguratorState } from './configurator-state.js';\nimport {\n    isDesktopPanelViewport,\n    isShortDesktopViewport,\n} from './short-desktop-viewport.js';\n/**\n * Dynamic Config Bar\n * Mobile-only configuration bar with three view states:\n * 1. Initial: product info + \"Customise\" CTA\n * 2. Steps overview: callout buttons for each config option\n * 3. Step detail: inline option chooser, dismissed by the sticky confirm CTA\n *\n * Step content (colour/fabric/size choosers) loads on-demand via\n * OptionLpHandler when a step is opened. The step buttons carry\n * lp-get attributes so live-page handles the fetch and swap automatically.\n *\n * The bar's outer section is the swap target but is never itself replaced\n * (morph:innerHTML), so it is the only safe home for view state: these classes\n * survive a swap, where anything inside the bar is re-rendered by the server.\n * Server-owned attributes are read back off [data-dynamic-config-state], which\n * the swap does replace.\n */\n\nconst shortDesktopLiteClass = 'dynamic-config-bar--short-lite';\nconst contentLoadingClass = 'dynamic-config-bar__content--loading';\nconst expandedClass = 'dynamic-config-bar--expanded';\nconst stepOpenClass = 'dynamic-config-bar--step-open';\nconst addBasketClass = 'is-addBasket';\nclass DynamicConfigBar {\n    constructor(element, slider) {\n        this.element = element;\n        this.slider = slider;\n        this.isExpanded = element.classList.contains(expandedClass);\n        this.isLitePdp = Boolean(\n            document.querySelector('#pdpV2[data-configurator-style=\"lite\"]')\n        );\n        this.isShortDesktopLite = false;\n        this.configuratorState = document\n            .querySelector('[data-configurator-state]')\n            ?.getAttribute('data-configurator-state');\n\n        this.availableSteps = this.discoverAvailableSteps();\n        this.hasInteracted = false;\n        this.handleResize = () => {\n            this.syncShortDesktopLiteMode();\n        };\n\n        this.cacheElements();\n\n        this.bindEvents();\n        this.watchConfiguratorState();\n    }\n\n    cacheElements() {\n        this.state = this.element.querySelector('[data-dynamic-config-state]');\n        this.currentStep =\n            this.state?.getAttribute('data-auto-open-step') ?? null;\n        this.hasCustomise = this.state?.dataset.hasCustomise === 'true';\n        this.hasBundle = this.state?.dataset.hasBundle === 'true';\n        this.header = this.element.querySelector(\n            '[data-dynamic-config-header]'\n        );\n        this.availability = this.element.querySelector(\n            '[data-dynamic-config-availability]'\n        );\n        this.stepsContainer = this.element.querySelector(\n            '[data-dynamic-config-steps]'\n        );\n        this.contentContainer = this.element.querySelector(\n            '[data-dynamic-config-content]'\n        );\n    }\n\n    discoverAvailableSteps() {\n        const stepElements = this.element.querySelectorAll(\n            '[data-dynamic-config-step-content]'\n        );\n        return Array.from(stepElements).map(\n            el => el.dataset.dynamicConfigStepContent\n        );\n    }\n\n    bindEvents() {\n        this.element.addEventListener('click', event => {\n            const customiseButton = event.target.closest(\n                '[data-dynamic-config-customise]'\n            );\n            const dismissStepButton = event.target.closest(\n                '[data-dynamic-config-step-close], [data-dynamic-config-confirm]'\n            );\n            const stepButton = event.target.closest(\n                '[data-dynamic-config-step]'\n            );\n            const inlineOptionInfoButton = event.target.closest(\n                '.dynamic-config-callout__option-info--inline'\n            );\n\n            const removeUpsellButton = event.target.closest(\n                '[data-dynamic-remove-upsell]'\n            );\n\n            if (inlineOptionInfoButton) {\n                this.openInlineOptionInfoDialog(inlineOptionInfoButton, event);\n                return;\n            } else if (removeUpsellButton) {\n                // LP handles the request via lp-trigger on the span; just prevent the\n                // parent step button from also opening the step chooser.\n                return;\n            } else if (customiseButton) {\n                this.showSteps();\n                this.goToConfiguratorSlide();\n            } else if (dismissStepButton) {\n                const closedStep = this.currentStep;\n                this.showSteps();\n                this.focusStepCallout(closedStep);\n            } else if (stepButton) {\n                // Inline callouts render their choices directly and contain their own\n                // live-page swatch buttons, so a click never needs to open a step —\n                // let the nested button handle the swap. This holds regardless of how\n                // many other steps exist alongside the inline callout.\n                if (this.isInlineStep(stepButton)) {\n                    return;\n                }\n            }\n        });\n\n        this.element.addEventListener('d3r.live.requesting', event => {\n            const stepButton = event.target.closest(\n                '[data-dynamic-config-step]'\n            );\n            const isContentSelection = event.target.closest(\n                '[data-dynamic-config-content]'\n            );\n\n            if (\n                !isContentSelection &&\n                (!stepButton || this.isInlineStep(stepButton))\n            ) {\n                return;\n            }\n\n            this.contentContainer?.classList.add(contentLoadingClass);\n        });\n\n        // A swap brings new server-rendered content into the bar; re-sync the JS view\n        // state against it.\n        this.element.addEventListener('d3r.live.replaced', event => {\n            this.hasInteracted = true;\n\n            // A variant response carries ~20 swaps, most of them inside the bar, and\n            // each bubbles through here. Only the bar's own swap brings a new state\n            // node and step panels, so the re-sync belongs behind this guard.\n            if (event.target === this.element) {\n                this.availableSteps = this.discoverAvailableSteps();\n                // Re-reads currentStep and hasCustomise from the new state node.\n                this.cacheElements();\n                if (this.currentStep) {\n                    this.openStep(this.currentStep);\n                } else if (this.isExpanded) {\n                    // No step named: the response wants the steps overview (qty\n                    // change, upsell removal, inline swatch). The shell keeps its\n                    // classes across a swap, so an open step must be closed here.\n                    this.showSteps();\n                }\n            }\n            this.contentContainer?.classList.remove(contentLoadingClass);\n            this.syncShortDesktopLiteMode();\n            this.syncBasketButtonState();\n        });\n\n        this.element.addEventListener('d3r.live.error', () => {\n            this.contentContainer?.classList.remove(contentLoadingClass);\n        });\n\n        window.addEventListener('resize', this.handleResize);\n    }\n\n    /**\n     * Opens an inline option information dialog without allowing the click to\n     * bubble into the parent LivePage chooser trigger.\n     *\n     * @param {Element} button\n     * @param {Event} event\n     */\n    openInlineOptionInfoDialog(button, event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        const target = button.getAttribute('data-target');\n\n        if (!target) {\n            return;\n        }\n\n        const modifiers =\n            button.getAttribute('data-modifiers')?.split(',').filter(Boolean) ??\n            [];\n\n        Dialog.render(target, {\n            modifiers,\n            wait_for_scripts: true,\n        });\n    }\n\n    syncBasketButtonState() {\n        this.element.classList.toggle(\n            addBasketClass,\n            this.configuratorState === 'on-configurator' ||\n                (this.hasCustomise &&\n                    (this.hasInteracted || this.isShortDesktopLite))\n        );\n    }\n\n    watchConfiguratorState() {\n        watchConfiguratorState(state => {\n            this.configuratorState = state;\n            this.syncShortDesktopLiteMode();\n\n            if (state === 'on-configurator') {\n                this.element?.classList.add('is-on-configurator');\n                if (!this.currentStep) {\n                    this.showSteps();\n                }\n            } else {\n                this.element?.classList.remove('is-on-configurator');\n                if (this.currentStep) {\n                    return;\n                } else if (this.hasCustomise && this.hasInteracted) {\n                    this.showSteps();\n                } else if (this.isShortDesktopLite) {\n                    this.showSteps();\n                } else {\n                    this.showInitial();\n                }\n            }\n\n            this.syncBasketButtonState();\n        });\n    }\n\n    syncShortDesktopLiteMode() {\n        const wasShortDesktopLite = this.isShortDesktopLite;\n        const isShortDesktop = isShortDesktopViewport();\n\n        // A bundle needs the compact chooser rows at any height: the quantity row plus\n        // the companion rows do not fit the tall panel, so bundle products use the\n        // short-lite layout regardless of viewport height. Width still gates it, or the\n        // panel's desktop geometry would land on the mobile card.\n        this.isShortDesktopLite =\n            this.isLitePdp &&\n            isDesktopPanelViewport() &&\n            (isShortDesktop || this.hasBundle);\n        this.element.classList.toggle(\n            shortDesktopLiteClass,\n            this.isShortDesktopLite\n        );\n\n        if (this.isShortDesktopLite) {\n            if (!this.currentStep) {\n                this.showSteps();\n            }\n        } else if (wasShortDesktopLite && !this.currentStep) {\n            if (\n                this.configuratorState === 'on-configurator' ||\n                (this.hasCustomise && this.hasInteracted)\n            ) {\n                this.showSteps();\n            } else {\n                this.showInitial();\n            }\n        }\n\n        this.syncBasketButtonState();\n    }\n\n    showInitial() {\n        this.clearOpenStep();\n        this.isExpanded = false;\n        this.header?.toggleAttribute('hidden', false);\n        // Products without a customise journey always show the steps overview.\n        this.availability?.toggleAttribute('hidden', !this.hasCustomise);\n        this.stepsContainer?.toggleAttribute('hidden', this.hasCustomise);\n        this.contentContainer?.toggleAttribute('hidden', true);\n        this.element.classList.remove(expandedClass, stepOpenClass);\n    }\n\n    showSteps() {\n        this.clearOpenStep();\n        this.isExpanded = true;\n        this.header?.toggleAttribute('hidden', false);\n        this.availability?.toggleAttribute('hidden', true);\n        this.stepsContainer?.toggleAttribute('hidden', false);\n        this.contentContainer?.toggleAttribute('hidden', true);\n\n        this.element.classList.add(expandedClass);\n        this.element.classList.remove(stepOpenClass);\n    }\n\n    /**\n     * Forget the open step, in the DOM as well as in JS. Dismissing a step is a\n     * client-side transition, so without this the state node keeps naming it and any\n     * later swap that bubbles through the bar would re-open it.\n     */\n    clearOpenStep() {\n        this.currentStep = null;\n        this.state?.removeAttribute('data-auto-open-step');\n    }\n\n    openStep(stepName) {\n        if (!this.availableSteps.includes(stepName)) return;\n\n        this.currentStep = stepName;\n        this.isExpanded = true;\n        this.header?.toggleAttribute('hidden', true);\n        this.availability?.toggleAttribute('hidden', true);\n        this.stepsContainer?.toggleAttribute('hidden', true);\n        this.contentContainer?.toggleAttribute('hidden', false);\n\n        const stepContents = this.element.querySelectorAll(\n            '[data-dynamic-config-step-content]'\n        );\n\n        stepContents.forEach(el => {\n            el.toggleAttribute(\n                'hidden',\n                el.dataset.dynamicConfigStepContent !== stepName\n            );\n        });\n\n        this.element.classList.add(expandedClass, stepOpenClass);\n    }\n\n    isInlineStep(stepButton) {\n        return stepButton.dataset.dynamicConfigInline === 'true';\n    }\n\n    /**\n     * Move focus back to the callout a step was opened from, so dismissing the\n     * chooser does not leave focus on the document body.\n     *\n     * @param {string|null} stepName\n     */\n    focusStepCallout(stepName) {\n        if (!stepName) {\n            return;\n        }\n\n        this.element\n            .querySelector(`[data-dynamic-config-step=\"${stepName}\"]`)\n            ?.focus();\n    }\n\n    goToConfiguratorSlide() {\n        if (!this.slider) return;\n\n        const lastSlideIndex = this.slider.totalSlides - 1;\n        this.slider.goToSlide(lastSlideIndex);\n    }\n}\n\nexport const init = slider => {\n    const bar = document.querySelector('[data-dynamic-config-bar]');\n\n    if (bar) {\n        new DynamicConfigBar(bar, slider);\n    }\n};\n","export const init = () => {\n    // Step up/down via delegated clicks — no QuantityStepper instances needed\n    document.addEventListener('click', e => {\n        const btn = e.target.closest(\n            '[data-qty-variant-trigger] [data-quantity]'\n        );\n        if (!btn) return;\n\n        const container = btn.closest('[data-qty-variant-trigger]');\n        const input = container.querySelector('input[type=\"number\"]');\n        if (!input) return;\n\n        if (btn.dataset.quantity === 'increase') {\n            input.stepUp();\n        } else if (btn.dataset.quantity === 'decrease') {\n            input.stepDown();\n        }\n\n        input.dispatchEvent(new Event('change', { bubbles: true }));\n    });\n\n    // Debounced variant reload on change\n    document.addEventListener('change', e => {\n        const container = e.target.closest('[data-qty-variant-trigger]');\n        if (!container) return;\n\n        const bar = container.closest(\n            '[data-configuration-bar-v2], [data-dynamic-config-bar], [data-config-panel]'\n        );\n        if (!bar) return;\n\n        const qty = parseInt(\n            container.querySelector('input[type=\"number\"]')?.value ?? '1',\n            10\n        );\n        const qtyUrlname = container.dataset.qtyUrlname;\n\n        clearTimeout(container._qtyDebounce);\n        container._qtyDebounce = setTimeout(() => {\n            triggerVariantReload(container, qtyUrlname, qty);\n        }, 250);\n    });\n};\n\nconst triggerVariantReload = (container, qtyUrlname, qty) => {\n    const lpTrigger = container.querySelector('[data-qty-lp-trigger]');\n    if (!lpTrigger) return;\n\n    const [url, searchParams] = lpTrigger\n        .closest('[data-qty-variant-trigger]')\n        .getAttribute('data-qty-url')\n        .split('?');\n    const params = new URLSearchParams(searchParams);\n    params.set(qtyUrlname, qty);\n\n    console.log(url);\n    console.log(params.toString());\n    console.log(`${url}?${params.toString()}`);\n\n    lpTrigger.setAttribute('lp-get', `${url}?${params.toString()}`);\n    lpTrigger.click();\n};\n","// @ts-check\n\nimport {\n    getDixaContainer,\n    getDixaToggleWrapper,\n    setDixaOffset,\n} from '../features/dixa';\nimport { handleFragmentInit } from './fragments';\nimport { replaceElementHTML } from './replace';\n\nconst mobileObservedSelector = '.product-details';\nconst nonMobileObservedSelector = '.product-details__action > button';\n\n/**\n * Initialise the quick add bar on the PDP.\n *\n * The quick add / add to basket buttons are initialised separately.\n */\nexport const initQuickAddBar = () => {\n    let headerHeight = 0;\n\n    const header = document.querySelector('.header');\n    if (header instanceof HTMLElement) {\n        headerHeight += header.offsetHeight;\n    }\n\n    const noticeBar = document.querySelector('.notice-bar');\n    if (noticeBar instanceof HTMLElement) {\n        headerHeight += noticeBar.offsetHeight;\n    }\n\n    const observer = new IntersectionObserver(showBar, {\n        rootMargin: `-${headerHeight}px 0px 0px 0px`,\n    });\n    const observerAttentive = new MutationObserver(hideAttentivePopup);\n\n    handleFragmentInit(({ replace }) => {\n        observer.disconnect();\n\n        if (replace?.addToBasketQuick) {\n            replaceElementHTML(\n                '.product-quick-add-bar',\n                replace.addToBasketQuick\n            );\n        }\n\n        const quickAddBar = document.querySelector('.product-quick-add-bar');\n        if (!(quickAddBar instanceof HTMLElement)) {\n            return;\n        }\n\n        /**\n         * This is a little hacky, but done to offset the footer for the bar to fit under\n         * scrollHeight is needed to get content height due to the fact max-height = 0 for the css transtion\n         * offSetHeight is the padding etc\n         */\n        const outerWrap = document.querySelector('#outer-wrapper');\n        const livePagePDP = outerWrap?.querySelector('#pdpV2');\n        if (outerWrap instanceof HTMLElement && !livePagePDP) {\n            outerWrap.style.paddingBottom = `${quickAddBar.scrollHeight + quickAddBar.offsetHeight}px`;\n        }\n\n        for (const selector of [\n            mobileObservedSelector,\n            nonMobileObservedSelector,\n        ]) {\n            const el = document.querySelector(selector);\n            if (el) {\n                observer.observe(el);\n            }\n        }\n    });\n\n    observerAttentive.observe(document.body, {\n        subtree: false,\n        childList: true,\n    });\n};\n\nconst showBar = entries => {\n    const bar = document.querySelector('.product-quick-add-bar');\n\n    for (const entry of entries) {\n        const mobile = isMobile() || window.innerHeight < 800;\n\n        if (\n            !(mobile && entry.target.matches(mobileObservedSelector)) &&\n            !(!mobile && entry.target.matches(nonMobileObservedSelector))\n        ) {\n            continue;\n        }\n\n        let showed = false;\n        if (bar instanceof HTMLElement) {\n            showed = bar.classList.toggle(\n                'product-quick-add-bar--show',\n                !entry.isIntersecting\n            );\n        }\n\n        updateDixaOffset(showed, bar);\n    }\n};\n\nconst isMobile = () => {\n    return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);\n};\n\nconst updateDixaOffset = (barShowing, barEl) => {\n    let offset = 0;\n    if (barShowing && barEl instanceof HTMLElement) {\n        offset += barEl.offsetHeight + barEl.scrollHeight;\n    }\n\n    setDixaOffset(offset);\n    getDixaContainer()?.classList?.add('dixa--quick-add');\n    getDixaToggleWrapper()?.classList?.add('dixa-messenger-wrapper--quick-add');\n};\n\nconst hideAttentivePopup = (mutations_list, observer) => {\n    const attentiveWrapper = document.getElementById('attentive_overlay');\n\n    if (attentiveWrapper instanceof HTMLElement) {\n        observer.disconnect();\n        attentiveWrapper.style.zIndex = '1';\n    }\n};\n","const legacyPdpTabTracking = Object.freeze({\n    materials: {\n        category: 'pdp/need-to-know',\n        action: 'Link Click',\n        label: 'Product',\n    },\n    dimensions: {\n        category: 'pdp/dimensions',\n        action: 'Link Click',\n        label: 'Product',\n    },\n});\n\nconst trackedOptionKinds = Object.freeze([\n    'colour',\n    'colour-global',\n    'finish',\n    'fragrance',\n    'material',\n    'material-global',\n    'option',\n    'size',\n    'variant',\n]);\n\n/**\n * Get the tracking action for the current PDP configurator style.\n *\n * @param {string} action\n * @param {Document|HTMLElement} root\n * @returns {string}\n */\nconst getPdpStyleAction = (action, root = null) => {\n    const selector =\n        '#pdpV2[data-configurator-style]';\n    const pdp = root?.matches?.(selector)\n        ? root\n        : root?.querySelector?.(selector);\n\n    return pdp?.dataset?.configuratorStyle === 'lite'\n        ? `${action}-lite`\n        : action;\n};\n\n/**\n * Get the legacy PDP tracking payload for a PDP v2 tab slug.\n *\n * @param {string} tabSlug\n * @returns {object|null}\n */\nexport const getLegacyPdpTabTracking = tabSlug => {\n    const tracking = legacyPdpTabTracking[tabSlug];\n\n    return tracking ? { ...tracking } : null;\n};\n\n/**\n * Get the legacy PDP chooser event payload for a PDP v2 LivePage option URL.\n *\n * @param {string} requestUrl\n * @param {object} options\n * @param {Document|HTMLElement} options.root\n * @returns {object|null}\n */\nexport const getLegacyPdpOptionSelectTracking = (\n    requestUrl,\n    { root = typeof document !== 'undefined' ? document : null } = {}\n) => {\n    const url = new URL(requestUrl, 'https://www.loaf.test');\n    const match = url.pathname.match(\n        /^\\/_\\/api\\/v2\\/product\\/[^/]+\\/variant\\/([^/]+)$/\n    );\n    const optionKind = match ? decodeURIComponent(match[1]) : null;\n\n    if (!optionKind || !trackedOptionKinds.includes(optionKind)) {\n        return null;\n    }\n\n    const optionValue = url.searchParams.get(optionKind);\n\n    if (!optionValue) {\n        return null;\n    }\n\n    return {\n        category: 'pdp/chooser',\n        action: getPdpStyleAction('select configure', root),\n        label: optionKind,\n        value: optionValue,\n    };\n};\n\n/**\n * Get the legacy PDP chooser open event payload for a PDP v2 LivePage popover URL.\n *\n * @param {string} requestUrl\n * @param {object} options\n * @param {Document|HTMLElement} options.root\n * @returns {object|null}\n */\nexport const getLegacyPdpOptionOpenTracking = (\n    requestUrl,\n    { root = typeof document !== 'undefined' ? document : null } = {}\n) => {\n    const url = new URL(requestUrl, 'https://www.loaf.test');\n    const match = url.pathname.match(\n        /^\\/_\\/api\\/v2\\/product\\/[^/]+\\/variant\\/([^/]+)$/\n    );\n    const optionKind = match ? decodeURIComponent(match[1]) : null;\n\n    if (!optionKind) {\n        return null;\n    }\n\n    return {\n        category: 'pdp/chooser-open',\n        action: getPdpStyleAction('open', root),\n        label: optionKind,\n    };\n};\n\n/**\n * Get the legacy PDP upsell event payload from PDP v2 tracking attributes.\n *\n * @param {HTMLElement|null} element\n * @returns {object|null}\n */\nexport const getLegacyPdpUpsellTracking = element => {\n    if (\n        !element?.dataset ||\n        !('pdpV2UpsellTracking' in element.dataset)\n    ) {\n        return null;\n    }\n\n    const { pdpV2UpsellAction, pdpV2UpsellLabel, pdpV2UpsellValue } =\n        element.dataset;\n\n    if (!pdpV2UpsellAction || !pdpV2UpsellLabel || !pdpV2UpsellValue) {\n        return null;\n    }\n\n    return {\n        category: 'pdp/upsell',\n        action: pdpV2UpsellAction,\n        label: pdpV2UpsellLabel,\n        value: pdpV2UpsellValue,\n    };\n};\n\n/**\n * Get the PDP v2 Customise event payload from tracking attributes.\n *\n * @param {HTMLElement|null} element\n * @returns {object|null}\n */\nexport const getPdpV2CustomiseTracking = element => {\n    if (\n        !element?.dataset ||\n        !('pdpV2CustomiseTracking' in element.dataset)\n    ) {\n        return null;\n    }\n\n    const { pdpV2CustomiseItemCategory, pdpV2CustomiseItemId } =\n        element.dataset;\n\n    if (!pdpV2CustomiseItemCategory || !pdpV2CustomiseItemId) {\n        return null;\n    }\n\n    return {\n        category: 'pdp/customise',\n        action: 'click',\n        label: pdpV2CustomiseItemCategory,\n        value: pdpV2CustomiseItemId,\n    };\n};\n\n/**\n * Find the clicked element matching a selector.\n *\n * @param {Event} event\n * @param {string} selector\n * @returns {HTMLElement|null}\n */\nconst getClickedElement = (event, selector) => {\n    const target = event.target;\n\n    if (!target || typeof target.closest !== 'function') {\n        return null;\n    }\n\n    return target.closest(selector);\n};\n\n/**\n * Initialise PDP v2-specific tracking events that map new UI controls to\n * legacy PDP event payloads.\n *\n * @param {object} options\n * @param {Document|HTMLElement} options.root\n * @param {(event: object) => void} options.trackEvent\n * @returns {void}\n */\nexport const initPdpV2Tracking = ({\n    root = document,\n    trackEvent,\n} = {}) => {\n    if (!root || typeof trackEvent !== 'function') {\n        return;\n    }\n\n    root.addEventListener('click', event => {\n        const upsellTracking = getLegacyPdpUpsellTracking(\n            getClickedElement(event, '[data-pdp-v2-upsell-tracking]')\n        );\n\n        if (upsellTracking) {\n            trackEvent(upsellTracking);\n            return;\n        }\n\n        const customiseTracking = getPdpV2CustomiseTracking(\n            getClickedElement(event, '[data-pdp-v2-customise-tracking]')\n        );\n\n        if (customiseTracking) {\n            trackEvent(customiseTracking);\n            return;\n        }\n\n        const tabButton = getClickedElement(event, '[data-tab-button]');\n        const tabTracking = tabButton?.dataset?.tabButton\n            ? getLegacyPdpTabTracking(tabButton.dataset.tabButton)\n            : null;\n\n        if (tabTracking) {\n            trackEvent(tabTracking);\n            return;\n        }\n\n        const popoverButton = getClickedElement(\n            event,\n            '[data-panel-trigger][lp-get]'\n        );\n        const openTracking = popoverButton?.getAttribute('lp-get')\n            ? getLegacyPdpOptionOpenTracking(\n                  popoverButton.getAttribute('lp-get'),\n                  { root }\n              )\n            : null;\n\n        if (openTracking) {\n            trackEvent(openTracking);\n            return;\n        }\n\n        const livePageButton = getClickedElement(event, '[lp-get]');\n        const optionTracking = livePageButton?.getAttribute('lp-get')\n            ? getLegacyPdpOptionSelectTracking(\n                  livePageButton.getAttribute('lp-get'),\n                  { root }\n              )\n            : null;\n\n        if (optionTracking) {\n            trackEvent(optionTracking);\n        }\n    });\n};\n","import Request, { Options } from 'live-page/request';\n\nconst LOAD_PARAM = 'load';\nconst LOAD_TOP = 'top';\nconst LOAD_BOTTOM = 'bottom';\nconst SCROLL_THRESHOLD = 8;\nconst SWAP_MODES = [\n    'innerHTML',\n    'outerHTML',\n    'beforebegin',\n    'afterend',\n    'afterbegin',\n    'beforeend',\n    'morph:innerHTML',\n    'morph:outerHTML',\n];\n\nlet pendingBottomUrl = null;\nlet scrollStart = 0;\nlet bottomRequest = null;\n\nconst getVariantUrl = element => {\n    if (!(element instanceof Element)) {\n        return null;\n    }\n\n    const requestUrl = element.getAttribute('lp-get') ?? '';\n\n    if (\n        !requestUrl.includes('/variant') ||\n        requestUrl.includes('/variant/qty') ||\n        requestUrl.includes('qty-only=1') ||\n        element.matches('[data-apply-fabric-btn]') ||\n        element.matches('[data-qty-lp-trigger]')\n    ) {\n        return null;\n    }\n\n    const url = new URL(requestUrl, window.location.origin);\n\n    if (url.searchParams.get(LOAD_PARAM) === LOAD_BOTTOM) {\n        return null;\n    }\n\n    return url;\n};\n\nconst stopWaitingForScroll = () => {\n    window.removeEventListener('scroll', loadPendingBottomContent);\n};\n\nconst getSwapMode = target => {\n    const swap = target.getAttribute('lp-swap');\n\n    if (swap && SWAP_MODES.includes(swap)) {\n        return swap;\n    }\n\n    if (swap) {\n        console.error('Invalid lp-swap mode: ' + swap);\n    }\n\n    return 'innerHTML';\n};\n\nconst morphSwap = async (target, html, type) => {\n    const { Idiomorph } = await import('idiomorph@0.7');\n\n    Idiomorph.morph(target, html, {\n        morphStyle: type,\n    });\n};\n\nconst swapTarget = async (target, html, mode) => {\n    try {\n        if (mode === 'morph:innerHTML') {\n            await morphSwap(target, html, 'innerHTML');\n            return;\n        }\n\n        if (mode === 'morph:outerHTML') {\n            await morphSwap(target, html, 'outerHTML');\n            return;\n        }\n    } catch (error) {\n        mode = mode.replace('morph:', '');\n        console.error(\n            'Morph failed, falling back to ' + mode + ' swap.',\n            error\n        );\n    }\n\n    if (mode === 'outerHTML') {\n        target.outerHTML = html;\n        return;\n    }\n\n    if (['beforebegin', 'afterend', 'afterbegin', 'beforeend'].includes(mode)) {\n        target.insertAdjacentHTML(mode, html);\n        return;\n    }\n\n    target.innerHTML = html;\n};\n\n/**\n * Get the connected element that should receive post-swap lifecycle events.\n *\n * @param {Element} target Original swap target.\n * @returns {Element} Connected replacement target.\n */\nconst getConnectedSwapTarget = target => {\n    if (target.isConnected) {\n        return target;\n    }\n\n    const swapId = target.getAttribute('lp-swap-id');\n\n    if (!swapId) {\n        return target;\n    }\n\n    return document.querySelector(`[lp-swap-id=\"${swapId}\"]`) ?? target;\n};\n\nconst replaceSwapTarget = async (target, html) => {\n    const event = new CustomEvent('d3r.live.replace', {\n        cancelable: true,\n        detail: {\n            html,\n            mode: getSwapMode(target),\n        },\n    });\n\n    target.dispatchEvent(event);\n\n    if (event.defaultPrevented) {\n        return;\n    }\n\n    target.classList.toggle('lp-swapping', true);\n    await swapTarget(target, event.detail.html, event.detail.mode);\n    const connectedTarget = getConnectedSwapTarget(target);\n    connectedTarget.classList.toggle('lp-swapping', false);\n    connectedTarget.dispatchEvent(\n        new CustomEvent('d3r.live.replaced', { bubbles: true })\n    );\n    connectedTarget.classList.toggle('lp-settling', true);\n    setTimeout(() => {\n        connectedTarget.classList.toggle('lp-settling', false);\n        connectedTarget.dispatchEvent(\n            new CustomEvent('d3r.live.settled', { bubbles: true })\n        );\n    }, 20);\n};\n\nconst performSwaps = async payload => {\n    const root = document.querySelector('#pdpV2');\n\n    if (!root || !payload?.swaps) {\n        return;\n    }\n\n    for (const [swapId, html] of Object.entries(payload.swaps)) {\n        if (swapId === 'default') {\n            continue;\n        }\n\n        const target = root.querySelector(`[lp-swap-id=\"${swapId}\"]`);\n\n        if (target) {\n            await replaceSwapTarget(target, html);\n        }\n    }\n};\n\nconst cancelBottomRequest = () => {\n    bottomRequest?.cancel();\n    bottomRequest = null;\n};\n\nconst loadPendingBottomContent = () => {\n    if (!pendingBottomUrl || window.scrollY <= scrollStart + SCROLL_THRESHOLD) {\n        return;\n    }\n\n    const url = pendingBottomUrl;\n    pendingBottomUrl = null;\n    stopWaitingForScroll();\n\n    const options = new Options(url.pathname + url.search);\n    const request = new Request(options);\n    bottomRequest = request;\n    request\n        .fire(async json => performSwaps(json.payload))\n        .catch(() => {})\n        .finally(() => {\n            if (bottomRequest === request) {\n                bottomRequest = null;\n            }\n        });\n};\n\nexport const initDeferredVariantContent = () => {\n    // Keep variant selection fast by loading below-the-fold variant content only after scroll.\n    document.addEventListener(\n        'd3r.live.requesting',\n        event => {\n            const url = getVariantUrl(event.target);\n\n            if (!url) {\n                return;\n            }\n\n            cancelBottomRequest();\n\n            event.detail.options.url = withLoadParam(url, LOAD_TOP);\n            url.searchParams.set(LOAD_PARAM, LOAD_BOTTOM);\n            pendingBottomUrl = url;\n            scrollStart = window.scrollY;\n\n            stopWaitingForScroll();\n            window.addEventListener('scroll', loadPendingBottomContent, {\n                passive: true,\n            });\n        },\n        { capture: true }\n    );\n};\n\nconst withLoadParam = (url, load) => {\n    const scopedUrl = new URL(url, window.location.origin);\n    scopedUrl.searchParams.set(LOAD_PARAM, load);\n\n    return scopedUrl.pathname + scopedUrl.search;\n};\n","import VideoPlayer from '../../../vendor/d3r/cloudinary/resources/javascript/src/video-player';\n\nconst initialisedVideos = new WeakSet();\nconst videoSelector = '[data-product-grid-video], .product-grid__video';\n\n/**\n * Initialise Cloudinary video players inside the PDP detail-shot grid.\n */\nexport const initProductGridVideos = () => {\n    initVideos(document);\n\n    document.addEventListener('d3r.live.replaced', event => {\n        if (!(event.target instanceof Element)) {\n            return;\n        }\n\n        initVideos(event.target);\n    });\n};\n\n/**\n * Initialise unprocessed videos within a DOM scope.\n *\n * @param {ParentNode} scope\n */\nconst initVideos = scope => {\n    scope.querySelectorAll(videoSelector).forEach(container => {\n        const video = container.querySelector('.cld-video-player');\n\n        if (!video || initialisedVideos.has(video)) {\n            return;\n        }\n\n        initialisedVideos.add(video);\n        forceAutoplay(video);\n        video.addEventListener(\n            'canplay',\n            () => container.classList.add('product-grid__video--ready'),\n            { once: true }\n        );\n        new VideoPlayer(video);\n    });\n};\n\n/**\n * Force product grid videos to use the autoplay behaviour expected for this slot.\n *\n * @param {HTMLVideoElement} video\n */\nconst forceAutoplay = video => {\n    video.autoplay = true;\n    video.controls = false;\n    video.loop = true;\n    video.muted = true;\n\n    video.setAttribute('autoplay', '');\n    video.setAttribute('data-cld-autoplay', 'true');\n    video.setAttribute('data-cld-controls', 'false');\n    video.setAttribute('loop', '');\n    video.setAttribute('data-cld-loop', 'true');\n    video.setAttribute('muted', '');\n    video.setAttribute('data-cld-muted', 'true');\n\n    const sources = JSON.parse(video.dataset.sources || '{}');\n\n    Object.values(sources).forEach(options => {\n        options.autoplay = true;\n        options.controls = false;\n        options.loop = true;\n        options.muted = true;\n    });\n\n    video.dataset.sources = JSON.stringify(sources);\n};\n","import lightGallery from 'lightgallery';\nimport lgZoom from 'lightgallery/plugins/zoom';\n\nlet bumpGallery = null;\nlet bumpGalleryElement = null;\n\n/**\n * Initialise delegated bump image lightbox handling.\n *\n * PDP v2 can replace the hero and hidden gallery through live swaps, so the\n * gallery instance is created lazily from the current hidden gallery element.\n *\n * @return {void}\n */\nexport const initBumpLightGallery = () => {\n    document.addEventListener('click', event => {\n        const target =\n            event.target instanceof Element\n                ? event.target\n                : event.target?.parentElement;\n        const trigger = target?.closest('[data-lightgallery-bump-button]');\n\n        if (!trigger) {\n            return;\n        }\n\n        const currentGalleryElement = document.querySelector(\n            '[data-lightgallery-bump]'\n        );\n\n        if (!currentGalleryElement) {\n            return;\n        }\n\n        event.preventDefault();\n\n        if (bumpGalleryElement !== currentGalleryElement) {\n            bumpGallery?.destroy();\n            bumpGalleryElement = currentGalleryElement;\n            bumpGallery = lightGallery(bumpGalleryElement, {\n                plugins: [lgZoom],\n                speed: 250,\n                selector: '.lightgallerybump',\n            });\n        }\n\n        bumpGallery.openGallery();\n    });\n};\n","import Dialog from 'dialog';\nimport {\n    initializeShackOverlay,\n    sortShowroomsByPostcode,\n} from './shack-overlay';\n\nlet hasSearchedForShack = false;\nlet lastSearchedShackPostcode = '';\n\nconst openShackOverlay = (\n    url,\n    { postcode = '', geolocate = false, trackSearch = true } = {}\n) => {\n    if (!url) {\n        return;\n    }\n\n    Dialog.load(url, {\n        modifiers: ['sidebar', 'overlay', 'product-info'],\n        transition_duration: 100,\n        callback: function (dialog) {\n            const root = dialog?.content ?? this?.content ?? document;\n            const { showroomsArray, showroomLookupForm } =\n                initializeShackOverlay(root);\n\n            showroomLookupForm?.addEventListener('submit', () => {\n                const value = showroomLookupForm\n                    .querySelector('input[name=\"postcode\"]')\n                    ?.value.trim();\n\n                if (value) {\n                    lastSearchedShackPostcode = value;\n                }\n            });\n\n            if (postcode) {\n                const input = showroomLookupForm?.querySelector(\n                    'input[name=\"postcode\"]'\n                );\n\n                if (input) {\n                    input.value = postcode;\n                }\n\n                window.requestAnimationFrame(() => {\n                    sortShowroomsByPostcode(\n                        showroomLookupForm,\n                        showroomsArray,\n                        root,\n                        trackSearch\n                    );\n                });\n            } else if (geolocate) {\n                window.requestAnimationFrame(() => {\n                    root.querySelector('button[data-geolocation]')?.click();\n                });\n            }\n        },\n        stack: true,\n    });\n};\n\nconst setShackSearchCompleted = (postcode = '') => {\n    hasSearchedForShack = true;\n\n    if (postcode) {\n        lastSearchedShackPostcode = postcode;\n    }\n\n    updateInlineShackSearchState();\n};\n\nconst updateInlineShackSearchState = (root = document) => {\n    root.querySelectorAll('[data-inline-shack-search-container]').forEach(\n        container => {\n            container\n                .querySelector('[data-inline-shack-search]')\n                ?.toggleAttribute('hidden', hasSearchedForShack);\n            container\n                .querySelector('[data-inline-shack-searched-button]')\n                ?.toggleAttribute('hidden', !hasSearchedForShack);\n        }\n    );\n};\n\nconst runInlineShackSearch = search => {\n    const input = search.querySelector('input[name=\"postcode\"]');\n    const postcode = input?.value.trim();\n\n    if (!postcode) {\n        input?.focus();\n        return;\n    }\n\n    setShackSearchCompleted(postcode);\n    openShackOverlay(search.dataset.url, { postcode });\n};\n\nconst handleInlineShackSubmitClick = event => {\n    if (!(event.target instanceof Element)) {\n        return;\n    }\n\n    const button = event.target.closest('[data-inline-shack-submit]');\n\n    if (!button) {\n        return;\n    }\n\n    const search = button.closest('[data-inline-shack-search]');\n\n    if (search) {\n        runInlineShackSearch(search);\n    }\n};\n\nconst handleInlineShackKeydown = event => {\n    if (!(event.target instanceof Element)) {\n        return;\n    }\n\n    const search = event.target.closest('[data-inline-shack-search]');\n\n    if (!search || event.key !== 'Enter') {\n        return;\n    }\n\n    event.preventDefault();\n    runInlineShackSearch(search);\n};\n\nconst handleInlineShackReopenClick = event => {\n    if (!(event.target instanceof Element)) {\n        return;\n    }\n\n    const button = event.target.closest('[data-inline-shack-searched-button]');\n\n    if (!button) {\n        return;\n    }\n\n    const url = button.dataset.url;\n\n    if (!url) {\n        return;\n    }\n\n    openShackOverlay(url, {\n        postcode: lastSearchedShackPostcode,\n        trackSearch: false,\n    });\n};\n\nconst handleInlineShackGeolocationClick = event => {\n    if (!(event.target instanceof Element)) {\n        return;\n    }\n\n    const button = event.target.closest('[data-inline-shack-geolocation]');\n\n    if (!button) {\n        return;\n    }\n\n    const search = button.closest('[data-inline-shack-search]');\n\n    if (!search) {\n        return;\n    }\n\n    setShackSearchCompleted();\n    openShackOverlay(search.dataset.url, { geolocate: true });\n};\n\nconst handleInlineShackFragmentReplace = event => {\n    const root =\n        typeof event.target?.querySelectorAll === 'function'\n            ? event.target\n            : document;\n\n    updateInlineShackSearchState(root);\n};\n\nexport const initInlineShackSearch = () => {\n    updateInlineShackSearchState();\n\n    document.removeEventListener('click', handleInlineShackSubmitClick);\n    document.addEventListener('click', handleInlineShackSubmitClick);\n\n    document.removeEventListener('keydown', handleInlineShackKeydown);\n    document.addEventListener('keydown', handleInlineShackKeydown);\n\n    document.removeEventListener('click', handleInlineShackReopenClick);\n    document.addEventListener('click', handleInlineShackReopenClick);\n\n    document.removeEventListener('click', handleInlineShackGeolocationClick);\n    document.addEventListener('click', handleInlineShackGeolocationClick);\n\n    document.removeEventListener(\n        'd3r.live.replaced',\n        handleInlineShackFragmentReplace\n    );\n    document.addEventListener(\n        'd3r.live.replaced',\n        handleInlineShackFragmentReplace\n    );\n};\n","// @ts-check\n\nimport { onDOMContentLoaded } from './util/loaded';\nimport { syncEditInCpUrl } from './util/url';\nimport ConfiguratorSlider from './pdp/configurator/config-slider';\nimport { initDimensions } from './pdp/dimensions';\nimport { initCylindo } from './pdp/cylindo';\nimport { init as initPhotoSwipe } from './pdp/photoswipe-gallery';\nimport { init as initPopover } from './pdp/configurator/popover';\nimport { init as initConfirmGate } from './pdp/configurator/confirm-gate';\nimport { init as initGotoConfigurator } from './pdp/configurator/goto-configurator';\nimport { init as initUpsellOverlay } from './pdp/configurator/upsell';\nimport { init as initMattressVariant } from './pdp/configurator/mattress-variant';\nimport { init as initConfigurationBar } from './pdp/configurator/configuration-bar';\nimport { init as initDynamicConfigBar } from './pdp/configurator/dynamic-config-bar';\nimport { initSwatchButtons } from './swatch/initSwatchButton';\nimport { init as initLpQtyChooser } from './pdp/lp-qty-chooser';\nimport { initQuickAddBar } from './pdp/quick-add-overlay';\nimport { initFinance } from './pdp/finance/index';\nimport { initPayPalMessaging } from './pdp/paypal-messaging.mjs';\nimport { initBasketFormDelegation } from './features/basket';\nimport { initInfo } from './pdp/info-overlays';\nimport { initTracking } from './pdp/tracking';\nimport { initPdpV2Tracking } from './pdp/v2-tracking.mjs';\nimport { initDeferredVariantContent } from './pdp/deferred-variant-content';\nimport { initProductGridVideos } from './pdp/product-grid-video';\nimport { initBumpLightGallery } from './pdp/bump-light-gallery';\nimport { initInlineShackSearch } from './pdp/inline-shack-search';\nimport { trackD3REvent } from './util/tracking';\n\n// Initialise bits when the DOM and deferred scripts have loaded.\nonDOMContentLoaded(() => {\n    let slider = new ConfiguratorSlider();\n    let pendingVariantSelection = false;\n    let heroReplacementFrame = null;\n    let shouldReturnToFinalSlide = false;\n    let shouldReinitialiseHeroSlider = false;\n    let heroLiveReplacementController = null;\n\n    const isLivePageVariantSelection = trigger => {\n        const requestUrl = trigger.getAttribute('lp-get') ?? '';\n\n        if (\n            !requestUrl.includes('/variant') ||\n            requestUrl.includes('/variant/qty') ||\n            requestUrl.includes('qty-only=1') ||\n            new URL(requestUrl, window.location.origin).searchParams.get(\n                'load'\n            ) === 'bottom' ||\n            trigger.matches('[data-qty-lp-trigger]') ||\n            trigger.closest('.is-active')\n        ) {\n            return false;\n        }\n\n        return true;\n    };\n\n    document.addEventListener(\n        'd3r.live.requesting',\n        event => {\n            if (!(event.target instanceof Element)) {\n                return;\n            }\n\n            if (isLivePageVariantSelection(event.target)) {\n                pendingVariantSelection = true;\n            }\n        },\n        { capture: true }\n    );\n\n    const schedulePostVariantSelectionUpdate = ({\n        reinitialiseHeroSlider = false,\n    } = {}) => {\n        shouldReturnToFinalSlide =\n            shouldReturnToFinalSlide ||\n            slider.getState().isLastSlide ||\n            pendingVariantSelection;\n        shouldReinitialiseHeroSlider =\n            shouldReinitialiseHeroSlider || reinitialiseHeroSlider;\n\n        if (heroReplacementFrame) {\n            window.cancelAnimationFrame(heroReplacementFrame);\n        }\n\n        heroReplacementFrame = window.requestAnimationFrame(() => {\n            heroReplacementFrame = null;\n\n            if (shouldReinitialiseHeroSlider) {\n                slider.destroy();\n                slider = new ConfiguratorSlider();\n                initGotoConfigurator(slider);\n                bindHeroLiveReplacementListeners();\n            }\n\n            const replacedHero = document.querySelector('#configurator-hero');\n            initSwatchButtons(replacedHero);\n\n            if (shouldReturnToFinalSlide && replacedHero) {\n                const finalSlideIndex = slider.totalSlides - 1;\n\n                slider.goToSlide(finalSlideIndex, true);\n                slider.handleSlideChange(finalSlideIndex);\n            }\n\n            syncEditInCpUrl();\n\n            pendingVariantSelection = false;\n            shouldReturnToFinalSlide = false;\n            shouldReinitialiseHeroSlider = false;\n        });\n    };\n\n    /**\n     * Bind direct LivePage replacement listeners for hero swaps that do not bubble.\n     */\n    const bindHeroLiveReplacementListeners = () => {\n        heroLiveReplacementController?.abort();\n        heroLiveReplacementController = new AbortController();\n\n        const options = {\n            signal: heroLiveReplacementController.signal,\n        };\n        const hero = document.querySelector('#configurator-hero');\n        const slides = document.querySelector(\n            '[lp-swap-id=\"configuratorHeroSlides\"]'\n        );\n        const configurator = document.querySelector(\n            '[lp-swap-id=\"configuratorHeroConfigurator\"]'\n        );\n\n        hero?.addEventListener(\n            'd3r.live.replaced',\n            () => {\n                schedulePostVariantSelectionUpdate({\n                    reinitialiseHeroSlider: true,\n                });\n            },\n            options\n        );\n\n        slides?.addEventListener(\n            'd3r.live.replaced',\n            () => {\n                schedulePostVariantSelectionUpdate({\n                    reinitialiseHeroSlider: true,\n                });\n            },\n            options\n        );\n\n        configurator?.addEventListener(\n            'd3r.live.replaced',\n            () => {\n                schedulePostVariantSelectionUpdate({\n                    reinitialiseHeroSlider: true,\n                });\n            },\n            options\n        );\n    };\n\n    const isConfiguratorHeroViewReplacement = target =>\n        target instanceof Element &&\n        (target.matches('[lp-swap-id=\"configuratorHeroSlides\"]') ||\n            target.matches('[lp-swap-id=\"configuratorHeroConfigurator\"]') ||\n            Boolean(target.closest('[lp-swap-id=\"configuratorHeroSlides\"]')) ||\n            Boolean(\n                target.closest('[lp-swap-id=\"configuratorHeroConfigurator\"]')\n            ));\n\n    document.addEventListener(\n        'd3r.live.replaced',\n        event => {\n            if (!pendingVariantSelection) {\n                return;\n            }\n\n            schedulePostVariantSelectionUpdate({\n                reinitialiseHeroSlider: isConfiguratorHeroViewReplacement(\n                    event.target\n                ),\n            });\n        },\n        { capture: true }\n    );\n\n    document.addEventListener(\n        'd3r.live.error',\n        event => {\n            if (!pendingVariantSelection) {\n                return;\n            }\n\n            const error = event.detail?.error;\n            const isPostSwapLivePageError =\n                error instanceof ReferenceError &&\n                error.message.includes('e is not defined');\n\n            if (isPostSwapLivePageError) {\n                schedulePostVariantSelectionUpdate();\n                return;\n            }\n\n            pendingVariantSelection = false;\n        },\n        { capture: true }\n    );\n\n    initBasketFormDelegation();\n    initCylindo();\n    initPhotoSwipe();\n    initPopover();\n    initConfirmGate();\n    initGotoConfigurator(slider);\n    initUpsellOverlay();\n    initMattressVariant();\n    initConfigurationBar();\n    initDynamicConfigBar(slider);\n    initDimensions();\n    initLpQtyChooser();\n    initFinance();\n    initPayPalMessaging();\n    initTracking();\n    initPdpV2Tracking({ trackEvent: trackD3REvent });\n    initQuickAddBar();\n    initInfo();\n    initInlineShackSearch();\n    initDeferredVariantContent();\n    initProductGridVideos();\n    initBumpLightGallery();\n    /**\n     * Re-initialise the configurator slider when the hero content is replaced via D3R live, to ensure it continues to function correctly. If the user was on the last slide before replacement, keep them on the last slide after re-initialisation.\n     */\n    const hero = document.querySelector('#configurator-hero');\n    initSwatchButtons(hero);\n    bindHeroLiveReplacementListeners();\n});\n"],"x_google_ignoreList":[4,5,10],"mappings":"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"}