{"version":3,"file":"pdp.js","names":["panelSelector"],"sources":["../resources/modern-javascript/pdp/basket.js","../resources/modern-javascript/pdp/panels.js","../resources/modern-javascript/pdp/modular.js","../resources/modern-javascript/pdp/personalisation.js","../node_modules/photoswipe/dist/photoswipe-lightbox.esm.js","../resources/modern-javascript/pdp/photoswipe.js","../resources/modern-javascript/pdp/quantity-control.js","../resources/modern-javascript/pdp/swatch-storage.js","../resources/modern-javascript/pdp/swatches.js","../resources/modern-javascript/pdp/tabs.js","../resources/modern-javascript/pdp.js"],"sourcesContent":["const primaryFormSelector = '#pdp-live #form.js-basket-form';\nconst stickyFormSelector = '.product-sticky-cta__form.js-basket-form';\nconst generatedFieldSelector = '[data-pdp-basket-field]';\n\nconst state = {\n    modularQuantities: new Map(),\n    personalisation: {\n        colour: '',\n        text: '',\n    },\n};\n\nlet initialised = false;\n\n/**\n * Get the current primary PDP basket form.\n */\nconst getPrimaryForm = () => document.querySelector(primaryFormSelector);\n\n/**\n * Get the sticky PDP basket form.\n */\nconst getStickyForm = () => document.querySelector(stickyFormSelector);\n\n/**\n * Get the scalar product key input from a basket form.\n */\nconst getKeyInput = (form) => form?.querySelector('input[name=\"key\"]');\n\n/**\n * Remove fields generated for a previous submission.\n */\nconst clearGeneratedFields = (form) => {\n    form.querySelectorAll(generatedFieldSelector).forEach((field) => field.remove());\n};\n\n/**\n * Append a hidden field that will be serialised by the legacy basket handler.\n */\nconst appendField = (form, name, value) => {\n    const input = document.createElement('input');\n    input.type = 'hidden';\n    input.name = name;\n    input.value = value;\n    input.dataset.pdpBasketField = '';\n    form.append(input);\n};\n\n/**\n * Return the selected modular items only.\n */\nconst getSelectedModularQuantities = () => Array.from(state.modularQuantities.entries())\n    .filter(([, quantity]) => quantity > 0);\n\n/**\n * Prepare a PDP form before the global quick-basket handler serialises it.\n */\nconst prepareForm = (form) => {\n    const primaryForm = getPrimaryForm();\n    const stickyForm = getStickyForm();\n\n    if (form !== primaryForm && form !== stickyForm) {\n        return;\n    }\n\n    const primaryKey = getKeyInput(primaryForm)?.value;\n    const keyInput = getKeyInput(form);\n\n    clearGeneratedFields(form);\n\n    if (keyInput) {\n        keyInput.disabled = false;\n\n        if (primaryKey) {\n            keyInput.value = primaryKey;\n        }\n    }\n\n    const modularQuantities = getSelectedModularQuantities();\n\n    if (modularQuantities.length) {\n        if (keyInput) {\n            keyInput.disabled = true;\n        }\n\n        modularQuantities.forEach(([key, quantity]) => {\n            appendField(form, `key[${key}]`, quantity);\n        });\n\n        return;\n    }\n\n    const { colour, text } = state.personalisation;\n\n    if (text && colour) {\n        appendField(form, 'persoText', text);\n        appendField(form, 'persoColour', colour);\n    }\n};\n\n/**\n * Prepare PDP basket submissions before delegated bubble handlers run.\n */\nconst handleSubmit = (event) => {\n    if (event.target instanceof HTMLFormElement) {\n        prepareForm(event.target);\n    }\n};\n\n/**\n * Read the current personalisation state.\n */\nexport const getPersonalisation = () => ({ ...state.personalisation });\n\n/**\n * Store the current personalisation state.\n */\nexport const setPersonalisation = ({ colour = '', text = '' }) => {\n    state.personalisation = { colour, text };\n};\n\n/**\n * Read a copy of the modular quantity state.\n */\nexport const getModularQuantities = () => new Map(state.modularQuantities);\n\n/**\n * Store or remove a modular stock-item quantity.\n */\nexport const setModularQuantity = (key, quantity) => {\n    if (quantity > 0) {\n        state.modularQuantities.set(key, quantity);\n\n        return;\n    }\n\n    state.modularQuantities.delete(key);\n};\n\n/**\n * Synchronise the persistent sticky form with the current Live Page form.\n */\nexport const syncStickyBasketForm = () => {\n    const primaryForm = getPrimaryForm();\n    const stickyForm = getStickyForm();\n\n    if (!primaryForm || !stickyForm) {\n        return;\n    }\n\n    const primaryKey = getKeyInput(primaryForm)?.value;\n    const stickyKeyInput = getKeyInput(stickyForm);\n    const primaryButton = primaryForm.querySelector('button[type=\"submit\"]');\n    const stickyButton = stickyForm.querySelector('button[type=\"submit\"]');\n\n    if (primaryKey && stickyKeyInput) {\n        stickyKeyInput.value = primaryKey;\n        stickyKeyInput.disabled = false;\n    }\n\n    if (primaryButton && stickyButton) {\n        stickyButton.disabled = primaryButton.disabled;\n\n        const primaryLabel = primaryButton.querySelector('span')?.textContent;\n        const stickyLabel = stickyButton.querySelector('span');\n\n        if (primaryLabel && stickyLabel) {\n            stickyLabel.textContent = primaryLabel;\n        }\n    }\n};\n\n/**\n * Clear purchase options that belonged to the previous variant.\n */\nexport const resetBasketState = () => {\n    state.modularQuantities.clear();\n    state.personalisation = {\n        colour: '',\n        text: '',\n    };\n\n    [getPrimaryForm(), getStickyForm()].forEach((form) => {\n        if (!form) {\n            return;\n        }\n\n        clearGeneratedFields(form);\n\n        const keyInput = getKeyInput(form);\n\n        if (keyInput) {\n            keyInput.disabled = false;\n        }\n    });\n};\n\n/**\n * Initialise PDP basket state synchronisation.\n */\nexport const initBasket = () => {\n    if (initialised) {\n        return;\n    }\n\n    initialised = true;\n    document.addEventListener('submit', handleSubmit, true);\n    syncStickyBasketForm();\n};\n","import { lock, unlock } from 'tua-body-scroll-lock';\n\nexport const productDetailPanelOpenedEvent = 'pdp:panel-opened';\nexport const productDetailPanelClosedEvent = 'pdp:panel-closed';\n\nconst panelButtonSelector = '[data-product-detail-panel]';\nconst panelCloseSelector = '[data-product-detail-panel-close]';\nconst panelSelector = '.product-detail__panel';\nconst autoOpenPanelSelector = '[data-product-detail-panel-template][data-product-detail-panel-auto-open]';\nconst selectedTabSelector = '[data-pdp-tab][aria-selected=\"true\"]';\nconst panelKeyAttribute = 'data-product-detail-panel-key';\nconst expandedClass = 'product-detail--expanded';\nconst panelOpenClass = 'product-detail--panel-open';\nconst panelClosingClass = 'product-detail--panel-closing';\nconst panelStaticClass = 'product-detail--panel-static';\nconst panelTransitionDuration = 300;\n\n/**\n * Get the element that contains the active slide-out panel.\n */\nconst getTargetElement = () => document.querySelector('.product-detail__extra-content');\n\n/**\n * Sync the expanded modifier on the wrapping product detail section. The\n * expanded layout only applies above the tablet breakpoint.\n */\nconst syncExpanded = () => {\n    const target = getTargetElement();\n    const productDetail = target?.closest('.product-detail');\n    const expanded = !!target && target.innerHTML !== '' && !viewport.matches('tablet');\n\n    productDetail?.classList.toggle(expandedClass, expanded);\n\n    if (!target?.innerHTML) {\n        productDetail?.classList.remove(panelOpenClass);\n    }\n};\n\nlet locked = false;\n\n/**\n * Complete a panel close after its exit transition has finished.\n */\nconst finishPanelClose = (target, key) => {\n    const productDetail = target.closest('.product-detail');\n\n    productDetail?.classList.remove(panelClosingClass);\n    target.innerHTML = '';\n    syncExpanded();\n    unlockViewport();\n    \n    if (viewport.matches('tablet') && window.productStickyCta?.trigger) {\n        productStickyCta.enableCheckPageScroll();\n        productStickyCta.deactivate(productStickyCta.trigger, 'trigger');\n    }\n\n    if (key) {\n        target.dispatchEvent(new CustomEvent(productDetailPanelClosedEvent, {\n            bubbles: true,\n            detail: {\n                key,\n                target,\n            },\n        }));\n    }\n};\n\n/**\n * Capture the open panel and its selected tab before Live Page replaces it.\n */\nexport const getProductDetailPanelState = () => {\n    const panel = getTargetElement()?.querySelector(`${panelSelector}[${panelKeyAttribute}]`);\n    const key = panel?.getAttribute(panelKeyAttribute);\n\n    if (!key) {\n        return null;\n    }\n\n    return {\n        activeTab: panel.querySelector(selectedTabSelector)?.dataset.pdpTab ?? null,\n        key,\n    };\n}\n\n/**\n * Lock the viewport while mobile panel content is open.\n */\nconst lockViewport = () => {\n    if (!locked) {\n        lock(getTargetElement(), {});\n        locked = true;\n    }\n}\n\n/**\n * Unlock the viewport after mobile panel content closes.\n */\nconst unlockViewport = () => {\n    if (locked) {\n        unlock(getTargetElement(), {});\n        locked = false;\n    }\n}\n\n/**\n * Close the active product detail panel and release the mobile scroll lock.\n */\nexport const closeProductDetailPanel = (animate = true) => {\n    const target = getTargetElement();\n    const key = target?.querySelector(`${panelSelector}[${panelKeyAttribute}]`)\n        ?.getAttribute(panelKeyAttribute);\n    const productDetail = target?.closest('.product-detail');\n    const canAnimate = animate\n        && !!key\n        && !viewport.matches('tablet')\n        && !!productDetail?.classList.contains(panelOpenClass)\n        && !window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n    if (!target) {\n        return;\n    }\n\n    if (!canAnimate) {\n        finishPanelClose(target, key);\n\n        return;\n    }\n\n    productDetail.classList.add(panelClosingClass);\n    productDetail.classList.remove(panelOpenClass);\n\n    let complete = false;\n    let timeout;\n    const completeClose = () => {\n        if (complete || productDetail.classList.contains(panelOpenClass)) {\n            return;\n        }\n\n        complete = true;\n        window.clearTimeout(timeout);\n        target.removeEventListener('transitionend', onTransitionEnd);\n\n        const activeKey = target.querySelector(`${panelSelector}[${panelKeyAttribute}]`)\n            ?.getAttribute(panelKeyAttribute);\n\n        if (activeKey !== key) {\n            return;\n        }\n\n        finishPanelClose(target, key);\n    };\n    const onTransitionEnd = (event) => {\n        if (event.target === target && event.propertyName === 'transform') {\n            completeClose();\n        }\n    };\n\n    target.addEventListener('transitionend', onTransitionEnd, { once: true });\n    timeout = window.setTimeout(completeClose, panelTransitionDuration + 50);\n};\n\n/**\n * Open a product detail panel from a matching template.\n */\nexport const openProductDetailPanel = (key, activeTab = null, animate = true) => {\n    const target = getTargetElement();\n    const template = document.querySelector(`[data-product-detail-panel-template=\"${key}\"]`);\n    const productDetail = target?.closest('.product-detail');\n\n    if (!target || !template || !productDetail) {\n        return;\n    }\n\n    productDetail.classList.remove(panelClosingClass);\n    productDetail.classList.toggle(panelStaticClass, !animate);\n\n    const panelAlreadyOpen = target.innerHTML !== ''\n        && productDetail.classList.contains(panelOpenClass);\n    const shouldAnimate = animate && !viewport.matches('tablet') && !panelAlreadyOpen;\n\n    if (shouldAnimate) {\n        productDetail.classList.remove(panelOpenClass);\n    }\n\n    target.innerHTML = '';\n    target.scrollTop = 0;\n    target.append(template.content.cloneNode(true));\n    const panel = target.querySelector(panelSelector);\n\n    panel?.setAttribute(panelKeyAttribute, key);\n    syncExpanded();\n\n    if (shouldAnimate) {\n        // Commit the final grid sizing before transitioning the panel into view.\n        target.getBoundingClientRect();\n    }\n\n    productDetail.classList.add(panelOpenClass);\n\n    if (!animate) {\n        // Commit the restored open state before transitions are enabled again.\n        target.getBoundingClientRect();\n        productDetail.classList.remove(panelStaticClass);\n    }\n\n    target.dispatchEvent(new CustomEvent(productDetailPanelOpenedEvent, {\n        bubbles: true,\n        detail: {\n            activeTab,\n            key,\n            target,\n        },\n    }));\n\n    if (viewport.matches('tablet')) {\n        lockViewport();\n        if (window.productStickyCta?.trigger) {\n            productStickyCta.disableCheckPageScroll();\n            productStickyCta.activate(productStickyCta.trigger, 'trigger');\n        }\n    }\n}\n\n/**\n * Initialise PDP slide-out panel behaviour.\n */\nexport const initPanels = () => {\n    Soho.plugins.delegate(document, 'click', '.product-detail [lp]', () => {\n        if (viewport.matches('tablet')) {\n            lockViewport();\n        }\n    });\n\n    Soho.plugins.delegate(document, 'click', panelButtonSelector, (event) => {\n        const trigger = event.target.closest(panelButtonSelector);\n        const panelKey = trigger?.dataset.productDetailPanel;\n\n        if (!panelKey) {\n            return;\n        }\n\n        event.preventDefault();\n        openProductDetailPanel(panelKey, trigger.dataset.productDetailPanelTab);\n    });\n\n    Soho.plugins.delegate(document, 'click', panelCloseSelector, (event) => {\n        const extraContent = event.target.closest('.product-detail__extra-content');\n\n        if (!extraContent) {\n            return;\n        }\n\n        closeProductDetailPanel();\n    });\n\n    viewport.matchMedia('tablet').addListener((event) => {\n        if (!event.matches && locked) {\n            unlockViewport();\n        } else if (event.matches && getTargetElement().innerHTML !== '') {\n            lockViewport();\n        }\n\n        syncExpanded();\n    });\n\n    const autoOpenPanel = document.querySelector(autoOpenPanelSelector);\n    const panelKey = autoOpenPanel?.dataset.productDetailPanelTemplate;\n\n    if (panelKey) {\n        window.requestAnimationFrame(() => openProductDetailPanel(panelKey));\n    }\n}\n","import { getModularQuantities, setModularQuantity } from './basket';\nimport { productDetailPanelOpenedEvent } from './panels';\n\nconst quantitySelector = '[data-pdp-modular-quantity]';\nconst priceSelector = '[data-pdp-modular-prices]';\nconst summaryValueSelector = '[data-pdp-modular-summary-value]';\n\n/**\n * Format a PDP price in the active storefront currency.\n */\nconst formatPrice = (price) => {\n    const locale = window.locale;\n    const language = locale?.geoLocale?.split('_')[0] ?? document.documentElement.lang;\n    const currency = window.global_e ? 'GBP' : locale?.currency;\n\n    if (!currency) {\n        return price.toFixed(2);\n    }\n\n    return new Intl.NumberFormat(`${language}-${locale?.country ?? 'GB'}`, {\n        currency,\n        minimumFractionDigits: 2,\n        style: 'currency',\n        trailingZeroDisplay: 'stripIfInteger',\n    }).format(price);\n};\n\n/**\n * Update the persistent PDP summary for the selected modular configuration.\n */\nconst updateModularSelection = (root) => {\n    const inputs = Array.from(root.querySelectorAll(quantitySelector));\n    const quantitySelected = inputs.some((input) => getQuantity(input) > 0);\n    const totals = inputs.reduce((prices, input) => {\n        const quantity = getQuantity(input);\n        const regularPrice = Number.parseFloat(input.dataset.price);\n        const memberPrice = Number.parseFloat(input.dataset.membershipPrice);\n\n        prices.regular += Number.isNaN(regularPrice) ? 0 : regularPrice * quantity;\n        prices.member += (Number.isNaN(memberPrice) ? regularPrice : memberPrice) * quantity;\n\n        return prices;\n    }, { member: 0, regular: 0 });\n\n    document.querySelectorAll(priceSelector).forEach((prices) => {\n        prices.querySelectorAll('.product-detail__value:not(.product-detail__value--was)')\n            .forEach((price, index) => {\n                price.dataset.pdpModularOriginalPrice ??= price.textContent;\n                price.textContent = quantitySelected\n                    ? formatPrice(index === 0 ? totals.regular : totals.member)\n                    : price.dataset.pdpModularOriginalPrice;\n            });\n    });\n\n    document.querySelectorAll(summaryValueSelector).forEach((value) => {\n        value.dataset.pdpModularOriginalValue ??= value.textContent.trim();\n        value.textContent = quantitySelected\n            ? value.dataset.pdpModularCustomValue\n            : value.dataset.pdpModularOriginalValue;\n    });\n};\n\n/**\n * Convert a quantity input value to a non-negative integer.\n */\nconst getQuantity = (input) => {\n    const quantity = Number.parseInt(input.value, 10);\n\n    return Number.isNaN(quantity) || quantity < 0 ? 0 : quantity;\n};\n\n/**\n * Wire a modular quantity input into the PDP basket state.\n */\nconst initModularQuantity = (input, quantities) => {\n    const key = input.dataset.pdpModularQuantity;\n\n    if (!key) {\n        return;\n    }\n\n    input.value = quantities.get(key) ?? 0;\n\n    if (input.dataset.pdpModularInitialised) {\n        return;\n    }\n\n    input.dataset.pdpModularInitialised = 'true';\n    input.addEventListener('input', () => {\n        setModularQuantity(key, getQuantity(input));\n        updateModularSelection(input.closest('.product-detail__panel'));\n    });\n    input.addEventListener('change', () => {\n        const quantity = getQuantity(input);\n        input.value = quantity;\n        setModularQuantity(key, quantity);\n        updateModularSelection(input.closest('.product-detail__panel'));\n    });\n};\n\n/**\n * Initialise modular quantities within a root element.\n */\nconst initModularQuantities = (root) => {\n    const quantities = getModularQuantities();\n\n    root.querySelectorAll(quantitySelector).forEach((input) => {\n        initModularQuantity(input, quantities);\n    });\n\n    updateModularSelection(root);\n};\n\n/**\n * Initialise modular picker state, including panels opened on demand.\n */\nexport const initModular = () => {\n    initModularQuantities(document);\n\n    document.addEventListener(productDetailPanelOpenedEvent, (event) => {\n        initModularQuantities(event.detail.target);\n    });\n};\n","import { getPersonalisation, setPersonalisation } from './basket';\nimport {\n    closeProductDetailPanel,\n    getProductDetailPanelState,\n    productDetailPanelClosedEvent,\n    productDetailPanelOpenedEvent,\n} from './panels';\n\nconst rootSelector = '[data-pdp-personalisation]';\nconst fieldSelector = '[data-pdp-personalisation-field]';\nconst textSelector = '[data-pdp-personalisation-text]';\nconst errorSelector = '[data-pdp-personalisation-error]';\nconst noteSelector = '[data-pdp-personalisation-note]';\nconst colourSelector = '[data-pdp-personalisation-colour]';\nconst labelSelector = '[data-pdp-personalisation-label]';\nconst colourInputSelector = '[data-pdp-personalisation-colour-input]';\nconst swatchSelector = '[data-pdp-personalisation-swatch]';\nconst confirmSelector = '[data-pdp-personalisation-confirm]';\nconst summaryActionSelector = '[data-pdp-personalisation-action]';\nconst summarySelector = '[data-pdp-personalisation-summary]';\nconst summarySelectionSelector = '[data-pdp-personalisation-summary-selection]';\nconst summaryTextSelector = '[data-pdp-personalisation-summary-text]';\nconst summaryEditSelector = '[data-pdp-personalisation-summary-edit]';\nconst summarySeparatorSelector = '[data-pdp-personalisation-summary-separator]';\n\n/**\n * Limit personalisation text to the format accepted by the basket endpoint.\n */\nconst normaliseText = (value) => value.toUpperCase().replace(/[^ A-Z]/g, '').slice(0, 3);\n\n/**\n * Get the thread colour inputs within a personalisation section.\n */\nconst getColourInputs = (colour) => Array.from(colour.querySelectorAll(colourInputSelector));\n\n/**\n * Get the swatch associated with a colour input.\n */\nconst getSwatch = (input) => input.parentNode.querySelector(swatchSelector);\n\n/**\n * Get the name of the thread colour associated with an input.\n */\nconst getColourName = (input) => input.dataset.pdpPersonalisationColourName?.trim() ?? '';\n\n/**\n * Reflect the selected thread colour in the summary label.\n */\nconst setLabel = (label, name) => {\n    label.textContent = name ? `${name} thread` : '';\n};\n\n/**\n * Show or clear the personalisation text validation error.\n */\nconst setTextError = (field, text, error, hasError) => {\n    field.toggleAttribute('data-basket-field-error', hasError);\n    text.setAttribute('aria-invalid', String(hasError));\n    error.hidden = !hasError;\n};\n\n/**\n * Reflect the current personalisation text in the PDP summary.\n */\nconst updatePersonalisationSummary = () => {\n    const { text } = getPersonalisation();\n\n    document.querySelectorAll(summarySelector).forEach((summary) => {\n        const action = summary.querySelector(summaryActionSelector);\n        const selection = summary.querySelector(summarySelectionSelector);\n        const value = summary.querySelector(summaryTextSelector);\n        const edit = summary.querySelector(summaryEditSelector);\n        const separator = summary.querySelector(summarySeparatorSelector);\n        const hasText = Boolean(text);\n        const panelOpen = getProductDetailPanelState()?.key === 'personalisation';\n        const showEdit = hasText && !panelOpen;\n\n        action?.toggleAttribute('hidden', hasText);\n        selection?.toggleAttribute('hidden', !hasText);\n        separator?.toggleAttribute('hidden', !showEdit);\n        edit?.toggleAttribute('hidden', !showEdit);\n\n        if (value) {\n            value.textContent = hasText ? `“${text}”` : '';\n        }\n    });\n};\n\n/**\n * Toggle the selected swatch highlight to match the checked input.\n */\nconst updateHighlights = (colour) => {\n    getColourInputs(colour).forEach((input) => {\n        getSwatch(input)?.classList.toggle('swatch--highlight', input.checked);\n    });\n};\n\n/**\n * Keep the thread colours to a single selection and update the label.\n */\nconst selectColour = (input, colour) => {\n    getColourInputs(colour).forEach((other) => {\n        if (other !== input) {\n            other.checked = false;\n        }\n    });\n};\n\n/**\n * Synchronise the personalisation controls and purchase state.\n */\nconst syncPersonalisation = (text, colour, label, note) => {\n    text.value = normaliseText(text.value);\n\n    let selected = colour.querySelector(`${colourInputSelector}:checked`);\n\n    if (!selected) {\n        const first = colour.querySelector(colourInputSelector);\n\n        if (first) {\n            first.checked = true;\n            selected = first;\n        }\n    }\n\n    updateHighlights(colour);\n    setLabel(label, selected ? getColourName(selected) : '');\n    note?.toggleAttribute('hidden', !text.value);\n    setPersonalisation({\n        colour: selected?.value ?? '',\n        text: text.value,\n    });\n    updatePersonalisationSummary();\n};\n\n/**\n * Restore stored personalisation into a newly opened panel.\n */\nconst restorePersonalisation = (text, colour, label, note) => {\n    const personalisation = getPersonalisation();\n    const colourInputs = getColourInputs(colour);\n\n    text.value = personalisation.text;\n    colourInputs.forEach((input) => {\n        input.checked = personalisation.colour !== '' && input.value === personalisation.colour;\n    });\n\n    syncPersonalisation(text, colour, label, note);\n};\n\n/**\n * Wire up a single personalisation section.\n */\nconst initPersonalisationSection = (section) => {\n    if (section.dataset.pdpPersonalisationInitialised) {\n        return;\n    }\n\n    const text = section.querySelector(textSelector);\n    const field = section.querySelector(fieldSelector);\n    const error = section.querySelector(errorSelector);\n    const note = section.querySelector(noteSelector);\n    const colour = section.querySelector(colourSelector);\n    const label = section.querySelector(labelSelector);\n    const confirm = section.querySelector(confirmSelector);\n\n    if (!text || !field || !error || !colour || !label) {\n        return;\n    }\n\n    section.dataset.pdpPersonalisationInitialised = 'true';\n    restorePersonalisation(text, colour, label, note);\n\n    text.addEventListener('input', () => {\n        syncPersonalisation(text, colour, label, note);\n\n        if (text.value) {\n            setTextError(field, text, error, false);\n        }\n    });\n\n    getColourInputs(colour).forEach((input) => {\n        input.addEventListener('change', () => {\n            if (input.checked) {\n                selectColour(input, colour);\n            }\n\n            syncPersonalisation(text, colour, label, note);\n        });\n    });\n\n    confirm?.addEventListener('click', () => {\n        syncPersonalisation(text, colour, label, note);\n\n        if (!text.value) {\n            setTextError(field, text, error, true);\n            text.focus();\n\n            return;\n        }\n\n        setTextError(field, text, error, false);\n        closeProductDetailPanel();\n    });\n};\n\n/**\n * Initialise every personalisation section within a root element.\n */\nconst initPersonalisationSections = (root) => {\n    root.querySelectorAll(rootSelector).forEach(initPersonalisationSection);\n};\n\n/**\n * Initialise PDP personalisation behaviour, including panels opened on demand.\n */\nexport const initPersonalisation = () => {\n    initPersonalisationSections(document);\n    updatePersonalisationSummary();\n\n    document.addEventListener(productDetailPanelOpenedEvent, (event) => {\n        initPersonalisationSections(event.detail.target);\n        updatePersonalisationSummary();\n    });\n\n    document.addEventListener(productDetailPanelClosedEvent, updatePersonalisationSummary);\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 gallerySelector = '[data-product-gallery-lightbox]';\nconst zoomSVG = '<svg aria-hidden=\"true\" class=\"pswp__icn\" xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" fill=\"none\" viewBox=\"0 0 15 15\"><path fill=\"none\" stroke=\"#1e1e1e\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m15 15-3.625-3.625M4.167 6.667h5m4.166 0a6.667 6.667 0 1 1-13.333 0 6.667 6.667 0 0 1 13.333 0\"/><path class=\"pswp__zoom-icn-bar-v\" fill=\"none\" stroke=\"#1e1e1e\" stroke-linecap=\"round\" d=\"M6.667 4.167v5\"/></svg>';\nconst closeSVG = '<svg aria-hidden=\"true\" class=\"pswp__icn\" xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" fill=\"none\" viewBox=\"0 0 15 15\"><path fill=\"#000\" d=\"M7.5 6.744 14.244 0 15 .756 8.256 7.5 15 14.244l-.756.756L7.5 8.256.756 15 0 14.244 6.744 7.5 0 .756.756 0z\"/></svg>';\nconst arrowPrevSVG = '<svg aria-hidden=\"true\" class=\"pswp__icn\" xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"15\" fill=\"none\" viewBox=\"0 0 9 15\"><path fill=\"#000\" d=\"M1.126 0 9 7.5 1.127 15 0 13.927 6.748 7.499 0 1.073z\"/></svg>';\nconst arrowNextSVG = '<svg aria-hidden=\"true\" class=\"pswp__icn\" xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"15\" fill=\"none\" viewBox=\"0 0 9 15\"><path fill=\"#000\" d=\"M1.126 0 9 7.5 1.127 15 0 13.927 6.748 7.499 0 1.073z\"/></svg>';\n\nlet lightbox = null;\n\n/**\n * Initialise the PDP gallery lightbox.\n */\nexport const initPhotoSwipe = () => {\n    const gallery = document.querySelector(gallerySelector);\n\n    lightbox?.destroy();\n    lightbox = null;\n\n    if (!gallery) {\n        return;\n    }\n\n    lightbox = new PhotoSwipeLightbox({\n        gallery,\n        children: 'a',\n        bgOpacity: 1,\n        showHideAnimationType: 'none',\n        arrowPrevSVG,\n        arrowNextSVG,\n        closeSVG,\n        zoomSVG,\n        pswpModule: () => import('photoswipe'),\n    });\n\n    lightbox.init();\n};\n","import { productDetailPanelOpenedEvent } from './panels';\n\nconst quantityControlSelector = '[quantity-control]';\nconst svgRenderer = new window.Svg();\nlet quantityControlId = 0;\n\n/**\n * Keep a quantity input inside its min and max bounds.\n */\nconst normaliseQuantity = (input) => {\n    const min = input.hasAttribute('min') ? Number.parseInt(input.min, 10) : 0;\n    const maxValue = input.hasAttribute('max') ? Number.parseInt(input.max, 10) : null;\n    const max = Number.isNaN(maxValue) ? null : maxValue;\n    let value = Number.parseInt(input.value, 10);\n\n    if (Number.isNaN(value) || value < min) {\n        value = min;\n    }\n\n    if (max !== null && value > max) {\n        value = max;\n    }\n\n    input.value = value;\n}\n\n/**\n * Create a quantity control button.\n */\nconst createQuantityButton = (input, direction) => {\n    const button = document.createElement('button');\n    button.type = 'button';\n    button.classList.add('quantity-control__button', `quantity-control__button--${direction}`);\n    button.innerHTML = svgRenderer.render(direction === 'up' ? 'plus' : 'minus');\n    button.setAttribute('aria-label', direction === 'up' ? 'Add' : 'Remove');\n    button.setAttribute('aria-controls', input.id);\n\n    return button;\n}\n\n/**\n * Update the input when a quantity control button is clicked.\n */\nconst updateQuantity = (input, direction) => {\n    normaliseQuantity(input);\n\n    const step = direction === 'up' ? 1 : -1;\n    input.value = Number.parseInt(input.value, 10) + step;\n    normaliseQuantity(input);\n    input.dispatchEvent(new Event('change', { bubbles: true }));\n}\n\n/**\n * Initialise a single quantity control.\n */\nconst initQuantityControl = (control) => {\n    const input = control.querySelector('input');\n\n    if (!input || input.hasAttribute('quantity-control-active')) {\n        return;\n    }\n\n    quantityControlId += 1;\n    control.classList.add('quantity-control');\n    control.getAttribute('quantity-control').split(',').forEach((modifier) => {\n        const trimmedModifier = modifier.trim();\n\n        if (trimmedModifier) {\n            control.classList.add(`quantity-control--${trimmedModifier}`);\n        }\n    });\n\n    input.type = 'text';\n    input.id = input.id || `quantity-control-${quantityControlId}`;\n    input.setAttribute('quantity-control-active', 'true');\n    input.setAttribute('aria-live', 'assertive');\n    input.addEventListener('change', () => normaliseQuantity(input));\n\n    const downButton = createQuantityButton(input, 'down');\n    const upButton = createQuantityButton(input, 'up');\n\n    downButton.addEventListener('click', () => updateQuantity(input, 'down'));\n    upButton.addEventListener('click', () => updateQuantity(input, 'up'));\n\n    control.insertBefore(downButton, input);\n    control.appendChild(upButton);\n    normaliseQuantity(input);\n}\n\n/**\n * Initialise quantity controls inside a root element.\n */\nexport const refreshQuantityControls = (root = document) => {\n    root.querySelectorAll(quantityControlSelector).forEach(initQuantityControl);\n}\n\n/**\n * Initialise PDP quantity controls.\n */\nexport const initQuantityControls = () => {\n    refreshQuantityControls();\n\n    document.addEventListener(productDetailPanelOpenedEvent, (event) => {\n        refreshQuantityControls(event.detail.target);\n    });\n}\n","export const swatchBasketStorageKey = 'swatch-basket-swatches';\nexport const swatchBasketManualStorageKey = 'swatch-basket-manual-swatches';\nlet storageManager = null;\n\n/**\n * Get the shared local storage manager instance when available.\n */\nconst getStorage = () => {\n    if (storageManager) {\n        return storageManager;\n    }\n\n    if (typeof LocalStorageManager === 'undefined') {\n        return null;\n    }\n\n    storageManager = new LocalStorageManager();\n\n    return storageManager;\n};\n\n/**\n * Read stored swatch values from local storage.\n */\nexport const getStoredSwatchValues = () => {\n    const storage = getStorage();\n\n    if (!storage) {\n        return [];\n    }\n\n    const stored = storage.get(swatchBasketStorageKey, '');\n\n    if (!stored || typeof stored !== 'string') {\n        return [];\n    }\n\n    return stored.split(',').filter(Boolean);\n};\n\n/**\n * Persist swatch values to local storage.\n */\nexport const saveSwatchValues = (values) => {\n    const storage = getStorage();\n\n    if (!storage || values.length === 0) {\n        return;\n    }\n\n    storage.set(swatchBasketStorageKey, values.join(','));\n};\n\n/**\n * Get swatches that the customer selected explicitly rather than as a product default.\n */\nexport const getStoredManualSwatchValues = () => {\n    const storage = getStorage();\n\n    if (!storage) {\n        return [];\n    }\n\n    const stored = storage.get(swatchBasketManualStorageKey, '');\n\n    if (!stored || typeof stored !== 'string') {\n        return [];\n    }\n\n    return stored.split(',').filter(Boolean);\n};\n\n/**\n * Persist the swatches that the customer selected explicitly.\n */\nexport const saveManualSwatchValues = (values) => {\n    const storage = getStorage();\n\n    if (!storage) {\n        return;\n    }\n\n    if (values.length === 0) {\n        storage.remove(swatchBasketManualStorageKey);\n        return;\n    }\n\n    storage.set(swatchBasketManualStorageKey, values.join(','));\n};\n\n/**\n * Clear stored swatch selections.\n */\nexport const clearStoredSwatches = () => {\n    const storage = getStorage();\n\n    if (!storage) {\n        return;\n    }\n\n    storage.remove(swatchBasketStorageKey);\n    storage.remove(swatchBasketManualStorageKey);\n};\n","import { productDetailPanelOpenedEvent } from './panels';\nimport {\n    clearStoredSwatches,\n    getStoredManualSwatchValues,\n    getStoredSwatchValues,\n    saveManualSwatchValues,\n    saveSwatchValues,\n} from './swatch-storage';\n\nconst orderSwatchesSelector = '[data-order-swatches]';\nconst orderSwatchesInputSelector = '[data-order-swatches-input]';\nconst orderSwatchesSlotSelector = '[data-order-swatches-slot]';\nconst orderSwatchesCountSelector = '[data-order-swatches-count]';\nconst orderSwatchesSelectionViewSelector = '[data-order-swatches-selection-view]';\nconst orderSwatchesFormViewSelector = '[data-order-swatches-form-view]';\nconst orderSwatchesFormSelector = '[data-order-swatches-form]';\nconst orderSwatchesOrderViewSelector = '[data-order-swatches-order-view]';\nconst orderSwatchesConfirmSelector = '[data-order-swatches-confirm]';\nconst orderSwatchesActionSelector = '[data-order-swatches-action]';\nconst orderSwatchesActionLabelSelector = '[data-order-swatches-action-label]';\nconst selectedProductSwatchSelector = '[data-pdp-swatch-id][aria-current=\"true\"]';\nconst orderSwatchesLimit = 6;\nconst addressLookupInstances = new WeakMap();\nlet activeDefaultOrderSwatchValue = null;\n\n/**\n * Get the selected swatch inputs from an order swatches panel.\n */\nconst getSelectedOrderSwatches = (panel) => {\n    return Array.from(panel.querySelectorAll(orderSwatchesInputSelector))\n        .filter((input) => input.checked)\n        .slice(0, orderSwatchesLimit);\n};\n\n/**\n * Find a swatch input in a panel from a stored value or legacy input id.\n */\nconst findStoredSwatchInput = (panel, storedValue) => {\n    const valueMatch = Array.from(panel.querySelectorAll(orderSwatchesInputSelector))\n        .find((input) => input.value === storedValue);\n\n    if (valueMatch) {\n        return valueMatch;\n    }\n\n    const idMatch = document.getElementById(storedValue);\n\n    if (idMatch?.matches(orderSwatchesInputSelector) && panel.contains(idMatch)) {\n        return idMatch;\n    }\n\n    return null;\n};\n\n/**\n * Restore swatch selections from local storage into a panel.\n */\nconst restoreOrderSwatches = (panel) => {\n    const stored = getStoredSwatchValues();\n\n    if (!stored.length) {\n        return;\n    }\n\n    panel.querySelectorAll(orderSwatchesInputSelector).forEach((input) => {\n        input.checked = false;\n    });\n\n    let restoredCount = 0;\n\n    stored.forEach((storedValue) => {\n        if (restoredCount >= orderSwatchesLimit) {\n            return;\n        }\n\n        const input = findStoredSwatchInput(panel, storedValue);\n\n        if (!input) {\n            return;\n        }\n\n        input.checked = true;\n        restoredCount += 1;\n    });\n};\n\n/**\n * Remember whether a swatch selection came from the customer rather than the PDP default.\n */\nconst updateManualSwatchSelection = (input) => {\n    const manualValues = new Set(getStoredManualSwatchValues());\n\n    if (input.checked) {\n        manualValues.add(input.value);\n    } else {\n        manualValues.delete(input.value);\n    }\n\n    saveManualSwatchValues(Array.from(manualValues));\n};\n\n/**\n * Replace a stale template default after Live Page changes the product fabric.\n */\nconst syncOrderSwatchesDefault = (panel) => {\n    const currentDefault = document.querySelector(selectedProductSwatchSelector)?.dataset.pdpSwatchId;\n    const templateDefault = Array.from(panel.querySelectorAll(orderSwatchesInputSelector))\n        .find((input) => input.defaultChecked)?.value;\n    const previousDefault = activeDefaultOrderSwatchValue ?? templateDefault;\n    const manualValues = getStoredManualSwatchValues();\n\n    activeDefaultOrderSwatchValue = currentDefault ?? previousDefault;\n\n    if (\n        !currentDefault\n        || !previousDefault\n        || currentDefault === previousDefault\n    ) {\n        return;\n    }\n\n    const currentInput = findStoredSwatchInput(panel, currentDefault);\n\n    if (!currentInput) {\n        return;\n    }\n\n    const previousInput = findStoredSwatchInput(panel, previousDefault);\n\n    if (previousInput && !manualValues.includes(previousDefault)) {\n        previousInput.checked = false;\n    }\n\n    if (\n        !currentInput.checked\n        && panel.querySelectorAll(`${orderSwatchesInputSelector}:checked`).length >= orderSwatchesLimit\n    ) {\n        return;\n    }\n\n    currentInput.checked = true;\n};\n\n/**\n * Persist the current swatch selection for a panel.\n */\nconst persistOrderSwatches = (panel) => {\n    const values = getSelectedOrderSwatches(panel).map((input) => input.value);\n    saveSwatchValues(values);\n};\n\n/**\n * Render the selected swatches into the panel summary.\n */\nconst updateOrderSwatches = (panel) => {\n    const selected = getSelectedOrderSwatches(panel);\n    const slots = panel.querySelectorAll(orderSwatchesSlotSelector);\n    const count = panel.querySelector(orderSwatchesCountSelector);\n    const action = panel.querySelector(orderSwatchesActionSelector);\n\n    slots.forEach((slot, index) => {\n        const input = selected[index];\n        slot.style.backgroundImage = input ? `url(${input.dataset.swatchImage})` : '';\n        slot.toggleAttribute('data-selected', Boolean(input));\n    });\n\n    if (count) {\n        count.textContent = `(${selected.length}/${orderSwatchesLimit})`;\n    }\n\n    if (action) {\n        action.disabled = selected.length === 0;\n    }\n\n    persistOrderSwatches(panel);\n};\n\n/**\n * Initialise the production PCA address lookup for the dynamically inserted form.\n */\nconst initOrderSwatchesAddressLookup = (formView) => {\n    if (typeof window.pca === 'undefined' || addressLookupInstances.has(formView)) {\n        return;\n    }\n\n    const form = formView.querySelector(orderSwatchesFormSelector);\n    const input = form?.querySelector('.field--address-lookup-input');\n    const toggle = form?.querySelector('.field--address-lookup-toggle');\n    const wrap = input?.closest('.field--address-lookup');\n    const key = formView.dataset.addressLookupKey;\n    const country = formView.dataset.addressLookupCountry;\n    const locale = formView.dataset.addressLookupLocale;\n\n    if (!form || !input || !toggle || !wrap || !key) {\n        return;\n    }\n\n    const fieldIdPrefix = 'order_delivery_address_address_';\n    const getField = (name) => form.querySelector(`[id=\"${fieldIdPrefix}${name}\"]`);\n    const getFieldWrap = (element) => form.querySelector(`[id=\"${element.id}_wrap\"]`);\n    const manualFields = Array.from(form.querySelectorAll(`[id^=\"${fieldIdPrefix}\"][id$=\"_wrap\"]`));\n    const province = getField(locale === 'en_US' ? 'state' : 'county');\n    const fields = [\n        { element: input.id, field: '', mode: window.pca.fieldMode.SEARCH },\n        { element: getField('line_1')?.id, field: 'Line1', mode: window.pca.fieldMode.POPULATE },\n        { element: getField('line_2')?.id, field: 'Line2', mode: window.pca.fieldMode.POPULATE },\n        { element: getField('town')?.id, field: 'City', mode: window.pca.fieldMode.POPULATE },\n        { element: province?.id, field: 'Province', mode: window.pca.fieldMode.POPULATE },\n        { element: getField('postcode')?.id, field: 'PostalCode', mode: window.pca.fieldMode.POPULATE },\n        { element: getField('country')?.id, field: 'CountryIso2', mode: window.pca.fieldMode.POPULATE },\n    ].filter((field) => field.element);\n\n    const showManualFields = () => {\n        manualFields.forEach((field) => field.classList.remove('d3r-hidden'));\n        toggle.classList.add('d3r-hidden');\n        wrap.classList.add('field--address-lookup-active');\n    };\n\n    manualFields.forEach((field) => field.classList.add('d3r-hidden'));\n    input.setAttribute('autocomplete', 'soho-prevent-autofill');\n\n    toggle.addEventListener('click', (event) => {\n        event.preventDefault();\n        showManualFields();\n    });\n\n    const addressLookup = new window.pca.Address(fields, {\n        key,\n        setCountryByIP: true,\n        languagePreference: 'eng',\n        search: {\n            countries: country,\n        },\n    });\n\n    addressLookup.listen('populate', () => {\n        input.value = '';\n        fields.forEach((field) => {\n            const fieldElement = form.querySelector(`[id=\"${field.element}\"]`);\n\n            if (field.field !== 'CountryIso2') {\n                fieldElement?.dispatchEvent(new CustomEvent('change'));\n            }\n\n            if (fieldElement) {\n                getFieldWrap(fieldElement)?.classList.remove('d3r-hidden');\n            }\n        });\n        toggle.classList.add('d3r-hidden');\n        wrap.classList.add('field--address-lookup-active');\n    });\n\n    input.addEventListener('keydown', (event) => {\n        if (event.key !== 'Enter') {\n            return;\n        }\n\n        event.preventDefault();\n        toggle.click();\n    });\n\n    addressLookupInstances.set(formView, addressLookup);\n};\n\n/**\n * Remove any existing validation errors from the form.\n */\nconst clearFormErrors = (form) => {\n    form.querySelectorAll('p.error').forEach((error) => {\n        error.textContent = '';\n    });\n\n    form.querySelectorAll('.field-error').forEach((field) => {\n        field.classList.remove('field-error');\n    });\n};\n\n/**\n * Add validation errors returned from the order endpoint.\n */\nconst addFormErrors = (form, errors) => {\n    Object.entries(errors).forEach(([field, message]) => {\n        const wrap = form.querySelector(`#${field}_wrap`);\n\n        if (!wrap) {\n            return;\n        }\n\n        if (wrap.parentElement?.classList.contains('checkout-address-form__address')) {\n            wrap.parentElement.parentElement?.classList.add('checkout-address-form--manual');\n        }\n\n        wrap.classList.add('field-error');\n\n        let error = wrap.querySelector('p.error');\n\n        if (!error) {\n            error = document.createElement('p');\n            error.classList.add('error');\n            wrap.appendChild(error);\n        }\n\n        error.textContent = message;\n    });\n};\n\n/**\n * Replace the ordering flow with its confirmation state.\n */\nconst showConfirmation = (panel) => {\n    panel.querySelector(orderSwatchesOrderViewSelector)?.setAttribute('hidden', '');\n    panel.querySelector(orderSwatchesConfirmSelector)?.removeAttribute('hidden');\n};\n\n/**\n * Replace the swatch selection with the order form and prepare the shared action.\n */\nconst showOrderForm = (event, panel) => {\n    const selectionView = panel.querySelector(orderSwatchesSelectionViewSelector);\n    const formView = panel.querySelector(orderSwatchesFormViewSelector);\n    const form = panel.querySelector(orderSwatchesFormSelector);\n    const action = panel.querySelector(orderSwatchesActionSelector);\n    const actionLabel = action?.querySelector(orderSwatchesActionLabelSelector);\n\n    if (!selectionView || !formView || !form || !action) {\n        return;\n    }\n\n    event.preventDefault();\n    selectionView.setAttribute('hidden', '');\n    formView.removeAttribute('hidden');\n    initOrderSwatchesAddressLookup(formView);\n    action.type = 'submit';\n    action.setAttribute('form', form.id);\n    action.classList.remove('button--border');\n    action.classList.add('button--alt');\n\n    if (actionLabel) {\n        actionLabel.textContent = action.dataset.confirmLabel;\n    }\n};\n\n/**\n * Submit the swatch order form via fetch.\n */\nconst handleFormSubmit = async (event, panel) => {\n    event.preventDefault();\n\n    const form = event.target;\n    const selected = getSelectedOrderSwatches(panel);\n\n    if (!selected.length) {\n        return;\n    }\n\n    const formData = new FormData(form);\n\n    selected.forEach((input) => {\n        formData.append('swatch-basket[]', input.dataset.swatchCode);\n    });\n\n    const action = panel.querySelector(orderSwatchesActionSelector);\n\n    if (action) {\n        action.disabled = true;\n    }\n\n    clearFormErrors(form);\n\n    try {\n        const response = await fetch(`${form.action}?ajax=1`, {\n            body: formData,\n            method: 'POST',\n        });\n        const data = await response.json();\n\n        if (data.payload?.errors) {\n            addFormErrors(form, data.payload.errors);\n            return;\n        }\n\n        if (data.payload?.redirect || data.success) {\n            clearStoredSwatches();\n            showConfirmation(panel);\n        }\n    } catch (error) {\n        console.error('Error:', error);\n    } finally {\n        if (action) {\n            action.disabled = false;\n        }\n    }\n};\n\n/**\n * Initialise swatch selection and ordering behaviour inside a cloned PDP panel.\n */\nconst initOrderSwatches = (root) => {\n    root.querySelectorAll(orderSwatchesSelector).forEach((panel) => {\n        if (panel.dataset.orderSwatchesInitialised) {\n            return;\n        }\n\n        panel.dataset.orderSwatchesInitialised = 'true';\n\n        panel.querySelectorAll(orderSwatchesInputSelector).forEach((input) => {\n            input.addEventListener('change', () => {\n                if (input.checked && panel.querySelectorAll(`${orderSwatchesInputSelector}:checked`).length > orderSwatchesLimit) {\n                    input.checked = false;\n                }\n\n                updateManualSwatchSelection(input);\n                updateOrderSwatches(panel);\n            });\n        });\n\n        panel.querySelector(orderSwatchesActionSelector)?.addEventListener('click', (event) => {\n            if (event.currentTarget.type === 'submit') {\n                return;\n            }\n\n            showOrderForm(event, panel);\n        });\n\n        panel.querySelector(orderSwatchesFormSelector)?.addEventListener('submit', (event) => {\n            handleFormSubmit(event, panel);\n        });\n\n        restoreOrderSwatches(panel);\n        syncOrderSwatchesDefault(panel);\n        updateOrderSwatches(panel);\n    });\n};\n\n/**\n * Initialise PDP order swatch behaviour.\n */\nexport const initSwatches = () => {\n    initOrderSwatches(document);\n\n    document.addEventListener(productDetailPanelOpenedEvent, (event) => {\n        initOrderSwatches(event.detail.target);\n    });\n};\n","import { productDetailPanelOpenedEvent } from './panels';\n\nconst tabsSelector = '[data-pdp-tabs]';\nconst tabSelector = '[data-pdp-tab]';\nconst panelSelector = '[data-pdp-tab-panel]';\n\n/**\n * Return a panel column to the start when its content changes.\n */\nconst resetPanelScroll = (container) => {\n    const extraContent = container.closest('.product-detail__extra-content');\n\n    if (extraContent) {\n        extraContent.scrollTop = 0;\n    }\n};\n\n/**\n * Show the matching tab panel.\n */\nconst setActiveTab = (container, key) => {\n    container.querySelectorAll(tabSelector).forEach((tab) => {\n        const isActive = tab.dataset.pdpTab === key;\n\n        tab.setAttribute('aria-selected', isActive ? 'true' : 'false');\n    });\n\n    container.querySelectorAll(panelSelector).forEach((panel) => {\n        panel.hidden = panel.dataset.pdpTabPanel !== key;\n    });\n\n    resetPanelScroll(container);\n}\n\n/**\n * Initialise a single tab group.\n */\nconst initTabGroup = (container, activeTab = null) => {\n    container.querySelectorAll(tabSelector).forEach((tab) => {\n        tab.addEventListener('click', () => {\n            setActiveTab(container, tab.dataset.pdpTab);\n        });\n    });\n\n    if (activeTab && container.querySelector(`[data-pdp-tab=\"${activeTab}\"]`)) {\n        setActiveTab(container, activeTab);\n    }\n}\n\n/**\n * Initialise tab behaviour inside a root element.\n */\nconst initTabGroups = (root, activeTab = null) => {\n    root.querySelectorAll(tabsSelector).forEach((container) => initTabGroup(container, activeTab));\n}\n\n/**\n * Initialise PDP tab behaviour.\n */\nexport const initTabs = () => {\n    initTabGroups(document);\n\n    document.addEventListener(productDetailPanelOpenedEvent, (event) => {\n        initTabGroups(event.detail.target, event.detail.activeTab);\n    });\n}\n","import { initBasket, resetBasketState, syncStickyBasketForm } from './pdp/basket';\nimport { initModular } from './pdp/modular';\nimport {\n    closeProductDetailPanel,\n    getProductDetailPanelState,\n    initPanels,\n    openProductDetailPanel,\n} from './pdp/panels';\nimport { initPersonalisation } from './pdp/personalisation';\nimport { initPhotoSwipe } from './pdp/photoswipe';\nimport { initQuantityControls, refreshQuantityControls } from './pdp/quantity-control';\nimport { initSwatches } from './pdp/swatches';\nimport { initTabs } from './pdp/tabs';\n\nconst liveVariantSelector = 'select[data-live-page-variant]';\nconst liveRootSelector = '#pdp-live';\nconst liveSwapSelector = '[lp-swap-id]';\nconst closePanelOnMobileSelector = '[data-pdp-close-panel-on-live-page]';\nconst panelReplacementComponents = ['overview', 'panels'];\n\nconst replacedComponents = new Set();\nlet preservedPanelState = null;\n\n/**\n * Add the PDP Live Page flag to a variant URL.\n */\nconst getLiveVariantUrl = (url) => {\n    const separator = url.includes('?') ? '&' : '?';\n\n    return `${url}${separator}live_page=pdp`;\n};\n\n/**\n * Keep a Live Page select request in sync with its selected variant URL.\n */\nconst updateLiveVariantUrl = (event) => {\n    const select = event.target.closest(liveVariantSelector);\n\n    if (!select) {\n        return;\n    }\n\n    select.setAttribute('lp-get', getLiveVariantUrl(select.value));\n};\n\ndocument.addEventListener('change', updateLiveVariantUrl, true);\n\n/**\n * Capture UI state that should carry to the requested product variant.\n */\nconst preserveVariantState = (event) => {\n    if (!(event.target instanceof Element) || !event.target.closest(liveRootSelector)) {\n        return;\n    }\n\n    preservedPanelState = viewport.matches('tablet')\n        && event.target.closest(closePanelOnMobileSelector)\n        ? null\n        : getProductDetailPanelState();\n    replacedComponents.clear();\n};\n\n/**\n * Reset state that cannot carry between product variants.\n */\nconst prepareForVariantReplacement = () => {\n    if (window.Overlay?.opened) {\n        window.Overlay.close();\n    }\n\n    closeProductDetailPanel(false);\n    resetBasketState();\n};\n\n/**\n * Reopen the captured panel once its content and templates are both current.\n */\nconst restoreVariantState = () => {\n    if (\n        !preservedPanelState\n        || !panelReplacementComponents.every((component) => replacedComponents.has(component))\n    ) {\n        return;\n    }\n\n    const { activeTab, key } = preservedPanelState;\n\n    preservedPanelState = null;\n    openProductDetailPanel(key, activeTab, false);\n};\n\n/**\n * Reinitialise behaviour for one permanent Live Page component.\n */\nconst handleLiveComponentReplaced = (event) => {\n    const component = event.currentTarget.getAttribute('lp-swap-id');\n\n    replacedComponents.add(component);\n\n    if (component === 'overview') {\n        prepareForVariantReplacement();\n        refreshQuantityControls(event.currentTarget);\n        window.wishlist?.updateButtons?.();\n        initPhotoSwipe();\n    } else if (component === 'sticky') {\n        syncStickyBasketForm();\n        window.productStickyCta?.refresh?.();\n    } else if (component === 'panels') {\n        window.Soho?.popup?.();\n    }\n\n    restoreVariantState();\n};\n\n/**\n * Bind once to permanent component wrappers. Their contents are replaced, so\n * these lifecycle listeners survive every variant request.\n */\nconst initLiveComponents = () => {\n    const root = document.querySelector(liveRootSelector);\n\n    root?.querySelectorAll(liveSwapSelector).forEach((component) => {\n        component.addEventListener('d3r.live.replaced', handleLiveComponentReplaced);\n    });\n};\n\ndocument.addEventListener('d3r.live.requesting', preserveVariantState);\n\ndocument.addEventListener('d3r.live.error', (event) => {\n    if (!event.target.closest(liveRootSelector)) {\n        return;\n    }\n\n    preservedPanelState = null;\n    replacedComponents.clear();\n    console.error('Unable to update the product variant.', event.detail?.error);\n});\n\ndocument.addEventListener('DOMContentLoaded', () => {\n    initLiveComponents();\n    initBasket();\n    initTabs();\n    initSwatches();\n    initQuantityControls();\n    initPanels();\n    initPersonalisation();\n    initModular();\n    initPhotoSwipe();\n});\n\nSoho.closeProductDetailPanel = closeProductDetailPanel;\n"],"x_google_ignoreList":[4],"mappings":"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"}