{
  "version": 3,
  "sources": ["/cdn/shop/t/81/assets/pdp-clean-v4-gallery.js?lly=laley-custom-20260808-release-v313"],
  "sourcesContent": ["/* ============================================================\n   Laley PDP Clean v4 \u2014 gallery\n   Modul\u00E6r PDP-runtime. Den gamle v3-monolitten er kun historisk arkiv.\n   Registrerer metoder p\u00E5 LaleyPDP.prototype via PDP.registerModule.\n   Krever pdp-clean-v4-core.js lastet f\u00F8rst (defer-rekkef\u00F8lge i product-clean-v3-1.liquid).\n   ============================================================ */\n(() => {\n  const PDP = window.LaleyPDPCleanV4;\n  if (!PDP || typeof PDP.registerModule !== 'function') {\n    console.error('[PDP] Kjerne mangler \u2014 hopper over modul: gallery');\n    return;\n  }\n  const { lockRootScroll, unlockRootScroll } = PDP.utils;\n\n  PDP.registerModule('gallery', {\n    bindGalleryZoom() {\n      // High-performance PDP lightbox:\n      // - open instantly with the already-loaded product image\n      // - swap to decoded high-res image when ready\n      // - preload neighbor images so next/prev feels immediate\n      // - one transform pipeline for zoom/pan to avoid mousemove jank\n      if (!this.gallery) return;\n      const getItems = () => Array.from(this.gallery.querySelectorAll('.pdp-clean__gallery-item'))\n        .filter((item) => item.dataset.mediaType === 'image' && item.querySelector('img'));\n      const allGalleryItems = () => Array.from(this.gallery.querySelectorAll('.pdp-clean__gallery-item'));\n      const items = getItems();\n      if (!items.length) return;\n\n      let lightbox = null, lbImg = null, lbCounter = null, lbCloseBtn = null;\n      let lbPrevBtn = null, lbNextBtn = null;\n      let stage = null;\n      let currentIdx = 0, lastFocused = null;\n      let loadToken = 0;\n      let raf = null;\n      let scale = 1;\n      let pan = { x: 0, y: 0 };\n      let ignoreClickUntil = 0;\n      let galleryPointer = null;\n      let pendingGalleryZoomItem = null;\n      let suppressGalleryZoomUntil = 0;\n      let scrollLockToken = null;\n      const ZOOM = 2.5;\n      const MAX_ZOOM = 4;\n      const preloadCache = new Map();\n\n      const normalizedIndex = (idx) => {\n        const count = getItems().length || 1;\n        return (idx + count) % count;\n      };\n\n      const fullSrcFor = (img) => {\n        const src = img?.currentSrc || img?.src || '';\n        if (!src) return '';\n        try {\n          const url = new URL(src, window.location.href);\n          if (url.searchParams.has('width')) {\n            url.searchParams.set('width', '2200');\n            return url.toString();\n          }\n        } catch (error) { /* fall through to string replacement */ }\n        return src\n          .replace(/width=\\d+/i, 'width=2200')\n          .replace(/_(\\d{2,4})x(\\d{0,4})?(\\.|@)/, '_2200x$3');\n      };\n\n      const imageData = (idx) => {\n        const list = getItems();\n        const item = list[normalizedIndex(idx)];\n        const img = item?.querySelector('img');\n        const thumb = img?.currentSrc || img?.src || img?.getAttribute('src') || '';\n        return {\n          alt: img?.alt || '',\n          full: fullSrcFor(img) || thumb,\n          thumb,\n        };\n      };\n\n      const preloadImage = (idx, priority = false) => {\n        const data = imageData(idx);\n        if (!data.full) return Promise.resolve('');\n        const cached = preloadCache.get(data.full);\n        if (cached) {\n          if (priority && cached.image?.fetchPriority) cached.image.fetchPriority = 'high';\n          return cached.promise;\n        }\n\n        const probe = new Image();\n        probe.decoding = 'async';\n        probe.loading = 'eager';\n        if ('fetchPriority' in probe) probe.fetchPriority = priority ? 'high' : 'low';\n\n        const record = { image: probe, loaded: false, promise: null };\n        record.promise = new Promise((resolve) => {\n          probe.onload = () => {\n            if (!probe.decode) {\n              resolve(data.full);\n              return;\n            }\n            probe.decode().then(() => resolve(data.full)).catch(() => resolve(data.full));\n          };\n          probe.onerror = () => resolve('');\n          probe.src = data.full;\n        }).then((src) => {\n          record.loaded = Boolean(src);\n          return src;\n        });\n        preloadCache.set(data.full, record);\n        return record.promise;\n      };\n\n      const warmVisibleImages = () => {\n        [0, 1, 2].forEach((idx) => preloadImage(idx, idx === 0));\n      };\n      // Ytelse (audit #4): idle-warming lastet ~1,4MB 2200px-bilder per\n      // sidevisning uten brukerintensjon. Warm i stedet ved F\u00D8RSTE\n      // pointer-kontakt med galleriet \u2014 god margin f\u00F8r tap/zoom \u00E5pner\n      // lightboxen, og null kost for de som aldri r\u00F8rer galleriet.\n      this.on(\n        this.gallery,\n        window.PointerEvent ? 'pointerdown' : 'touchstart',\n        warmVisibleImages,\n        { once: true, passive: true },\n      );\n\n      const zoomBlockedSelector = [\n        'a',\n        'button',\n        'input',\n        'select',\n        'textarea',\n        'summary',\n        '[contenteditable=\"true\"]',\n        '[data-pdp-gallery-prev]',\n        '[data-pdp-gallery-next]',\n        '[data-pdp-gallery-video]',\n        'video',\n        'iframe',\n        '.pdp-clean__wishlist-slot',\n      ].join(',');\n\n      const itemFromZoomEvent = (event) => {\n        if (!(event.target instanceof Element)) return null;\n        const item = event.target.closest('.pdp-clean__gallery-item');\n        if (!item || !this.gallery.contains(item)) return null;\n        if (item.dataset.mediaType !== 'image' || !item.querySelector('img')) return null;\n        const blocked = event.target.closest(zoomBlockedSelector);\n        if (blocked && blocked !== item && !blocked.classList.contains('pdp-clean__gallery-item')) return null;\n        return item;\n      };\n\n      const clampPan = () => {\n        if (!stage || !lbImg || scale <= 1) {\n          pan = { x: 0, y: 0 };\n          return;\n        }\n        const stageRect = stage.getBoundingClientRect();\n        const baseW = lbImg.offsetWidth || lbImg.getBoundingClientRect().width;\n        const baseH = lbImg.offsetHeight || lbImg.getBoundingClientRect().height;\n        const maxX = Math.max(0, ((baseW * scale) - stageRect.width) / 2);\n        const maxY = Math.max(0, ((baseH * scale) - stageRect.height) / 2);\n        pan.x = Math.max(-maxX, Math.min(maxX, pan.x));\n        pan.y = Math.max(-maxY, Math.min(maxY, pan.y));\n      };\n\n      const applyTransform = (withTransition = true) => {\n        if (!lbImg) return;\n        clampPan();\n        if (withTransition) {\n          lbImg.classList.remove('is-dragging');\n        } else {\n          lbImg.classList.add('is-dragging');\n        }\n        window.cancelAnimationFrame(raf);\n        raf = window.requestAnimationFrame(() => {\n          if (!lbImg) return;\n          lbImg.classList.toggle('is-zoomed', scale > 1);\n          lbImg.style.transform = scale > 1\n            ? `translate3d(${pan.x}px, ${pan.y}px, 0) scale(${scale})`\n            : '';\n        });\n      };\n\n      const resetZoom = () => {\n        scale = 1;\n        pan = { x: 0, y: 0 };\n        if (lbImg) {\n          lbImg.classList.remove('is-zoomed', 'is-dragging');\n          lbImg.style.transform = '';\n        }\n      };\n\n      const zoomAt = (x, y) => {\n        if (!lbImg) return;\n        if (scale > 1) {\n          resetZoom();\n          return;\n        }\n        const rect = lbImg.getBoundingClientRect();\n        if (!rect.width || !rect.height) return;\n        const dx = x - (rect.left + rect.width / 2);\n        const dy = y - (rect.top + rect.height / 2);\n        scale = ZOOM;\n        pan = {\n          x: -dx * (ZOOM - 1),\n          y: -dy * (ZOOM - 1),\n        };\n        applyTransform(true);\n      };\n\n      const ensureLightbox = () => {\n        if (lightbox) return;\n        lightbox = document.createElement('div');\n        lightbox.className = 'pdp-clean__lightbox';\n        lightbox.setAttribute('role', 'dialog');\n        lightbox.setAttribute('aria-modal', 'true');\n        lightbox.setAttribute('aria-label', 'Bildevisning');\n        lightbox.setAttribute('aria-hidden', 'true');\n        lightbox.tabIndex = -1;\n        lightbox.innerHTML = `\n          <button type=\"button\" class=\"pdp-clean__lightbox-close lly-icon-action lly-icon-action--framed\" aria-label=\"Lukk\">\n            <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M5 5l14 14M19 5L5 19\"/></svg>\n          </button>\n          <button type=\"button\" class=\"pdp-clean__lightbox-prev lly-icon-action lly-icon-action--framed\" aria-label=\"Forrige bilde\">\n            <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 6l-6 6 6 6\"/></svg>\n          </button>\n          <button type=\"button\" class=\"pdp-clean__lightbox-next lly-icon-action lly-icon-action--framed\" aria-label=\"Neste bilde\">\n            <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 6l6 6-6 6\"/></svg>\n          </button>\n          <div class=\"pdp-clean__lightbox-stage\">\n            <img class=\"pdp-clean__lightbox-img\" alt=\"\" />\n          </div>\n          <div class=\"pdp-clean__lightbox-counter\" aria-live=\"polite\"></div>\n        `;\n        document.body.appendChild(lightbox);\n        this.lightbox = lightbox;\n        lbImg = lightbox.querySelector('.pdp-clean__lightbox-img');\n        lbCounter = lightbox.querySelector('.pdp-clean__lightbox-counter');\n        lbCloseBtn = lightbox.querySelector('.pdp-clean__lightbox-close');\n        lbPrevBtn = lightbox.querySelector('.pdp-clean__lightbox-prev');\n        lbNextBtn = lightbox.querySelector('.pdp-clean__lightbox-next');\n        stage = lightbox.querySelector('.pdp-clean__lightbox-stage');\n\n        this.on(lbCloseBtn, 'click', close);\n        this.on(lbPrevBtn, 'click', prev);\n        this.on(lbNextBtn, 'click', next);\n        this.on(lightbox, 'click', (e) => { if (e.target === lightbox) close(); });\n\n        this.on(stage, 'click', (e) => {\n          if (e.target !== lbImg && e.target !== stage) return;\n          if (performance.now() < ignoreClickUntil) return;\n          if (e.target === stage) {\n            if (scale > 1) resetZoom();\n            else close();\n            return;\n          }\n          // Touch h\u00E5ndteres av tap/dobbel-tap i pointer-gestene under \u2014\n          // enkelt-tap skal IKKE zoome p\u00E5 mobil (old school-f\u00F8lelsen).\n          if (e.pointerType === 'touch') return;\n          zoomAt(e.clientX, e.clientY);\n        });\n\n        // Moderne touch-modell: pinch-to-zoom (to pekere, skalering rundt\n        // midtpunktet), \u00E9n-finger-pan n\u00E5r zoomet, dobbel-tap inn/ut, swipe\n        // sidelengs = forrige/neste og swipe NED = lukk (uzoomet). Ingen\n        // dekorativ motion \u2014 kun den eksisterende funksjonelle snap-en.\n        const pointers = new Map();\n        let pinch = null;\n        let panAnchor = null;\n        let tapStart = null;\n        let lastTap = 0;\n        let lastTapX = 0;\n        let lastTapY = 0;\n\n        this.on(stage, 'pointerdown', (e) => {\n          if (e.target.closest('button')) return;\n          if (e.pointerType === 'mouse' && e.button !== 0) return;\n          pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n          stage.setPointerCapture?.(e.pointerId);\n          if (pointers.size === 2) {\n            const [a, b] = [...pointers.values()];\n            pinch = {\n              dist: Math.hypot(a.x - b.x, a.y - b.y) || 1,\n              scale,\n              mid: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 },\n              pan: { ...pan },\n            };\n            panAnchor = null;\n            tapStart = null;\n            e.preventDefault();\n          } else if (pointers.size === 1) {\n            panAnchor = { x: e.clientX, y: e.clientY, pan: { ...pan } };\n            tapStart = { x: e.clientX, y: e.clientY, t: performance.now() };\n            if (scale > 1) e.preventDefault();\n          }\n        }, { passive: false });\n\n        this.on(stage, 'pointermove', (e) => {\n          if (!pointers.has(e.pointerId)) return;\n          pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n          if (pinch && pointers.size >= 2) {\n            e.preventDefault();\n            const [a, b] = [...pointers.values()];\n            const dist = Math.hypot(a.x - b.x, a.y - b.y) || 1;\n            const mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n            const nextScale = Math.max(1, Math.min(MAX_ZOOM, pinch.scale * (dist / pinch.dist)));\n            const k = nextScale / pinch.scale;\n            const rect = stage.getBoundingClientRect();\n            const cx = rect.left + rect.width / 2;\n            const cy = rect.top + rect.height / 2;\n            pan = {\n              x: mid.x - cx - k * (pinch.mid.x - cx - pinch.pan.x),\n              y: mid.y - cy - k * (pinch.mid.y - cy - pinch.pan.y),\n            };\n            scale = nextScale;\n            applyTransform(false);\n            return;\n          }\n          if (panAnchor && scale > 1) {\n            e.preventDefault();\n            pan = {\n              x: panAnchor.pan.x + (e.clientX - panAnchor.x),\n              y: panAnchor.pan.y + (e.clientY - panAnchor.y),\n            };\n            applyTransform(false);\n          }\n        }, { passive: false });\n\n        const releasePointer = (e) => {\n          if (!pointers.has(e.pointerId)) return null;\n          const last = { x: e.clientX, y: e.clientY };\n          pointers.delete(e.pointerId);\n          stage.releasePointerCapture?.(e.pointerId);\n          return last;\n        };\n\n        this.on(stage, 'pointerup', (e) => {\n          const last = releasePointer(e);\n          if (!last) return;\n          if (e.pointerType === 'touch') ignoreClickUntil = performance.now() + 400;\n          if (pointers.size === 1) {\n            // Fra pinch til \u00E9n finger: re-forankre pan uten hopp\n            const [rest] = [...pointers.values()];\n            pinch = null;\n            panAnchor = { x: rest.x, y: rest.y, pan: { ...pan } };\n            tapStart = null;\n            return;\n          }\n          if (pointers.size > 0) return;\n          pinch = null;\n          lbImg.classList.remove('is-dragging');\n\n          const start = tapStart;\n          const anchor = panAnchor;\n          tapStart = null;\n          panAnchor = null;\n\n          // TAP / DOBBEL-TAP (touch): to raske tap n\u00E6r hverandre \u2192 zoom inn/ut\n          if (start && e.pointerType === 'touch') {\n            const tapDist = Math.hypot(last.x - start.x, last.y - start.y);\n            const now = performance.now();\n            if (tapDist < 8 && now - start.t < 350) {\n              if (now - lastTap < 300 && Math.hypot(last.x - lastTapX, last.y - lastTapY) < 48) {\n                lastTap = 0;\n                zoomAt(last.x, last.y);\n                return;\n              }\n              lastTap = now;\n              lastTapX = last.x;\n              lastTapY = last.y;\n            }\n          }\n\n          if (anchor) {\n            const dx = last.x - anchor.x;\n            const dy = last.y - anchor.y;\n            if (scale <= 1) {\n              // Swipe ned = lukk; sidelengs = forrige/neste\n              if (dy > 70 && Math.abs(dy) > Math.abs(dx) * 1.4) {\n                ignoreClickUntil = performance.now() + 320;\n                close();\n                return;\n              }\n              if (Math.abs(dx) > 54 && Math.abs(dx) > Math.abs(dy) * 1.45) {\n                ignoreClickUntil = performance.now() + 320;\n                dx < 0 ? next() : prev();\n                return;\n              }\n            }\n            if (Math.abs(dx) > 4 || Math.abs(dy) > 4) ignoreClickUntil = performance.now() + 260;\n          }\n\n          if (scale > 1 && scale < 1.05) {\n            resetZoom();\n            return;\n          }\n          applyTransform(true);\n        });\n\n        this.on(stage, 'pointercancel', (e) => {\n          releasePointer(e);\n          if (pointers.size < 2) pinch = null;\n          if (pointers.size === 0) {\n            panAnchor = null;\n            tapStart = null;\n            lbImg.classList.remove('is-dragging');\n            applyTransform(true);\n          }\n        });\n\n        this.on(lightbox, 'wheel', (e) => {\n          if (!lightbox.classList.contains('is-open')) return;\n          e.preventDefault();\n          const delta = e.deltaY < 0 ? 0.18 : -0.18;\n          const nextScale = Math.max(1, Math.min(MAX_ZOOM, scale + delta));\n          if (nextScale === 1) {\n            resetZoom();\n            return;\n          }\n          if (scale === 1) {\n            const rect = lbImg.getBoundingClientRect();\n            pan = {\n              x: -(e.clientX - (rect.left + rect.width / 2)) * (nextScale - 1),\n              y: -(e.clientY - (rect.top + rect.height / 2)) * (nextScale - 1),\n            };\n          }\n          scale = nextScale;\n          applyTransform(false);\n        }, { passive: false });\n      };\n\n      const show = (idx) => {\n        ensureLightbox();\n        const count = getItems().length;\n        if (!count) return;\n        currentIdx = (idx + count) % count;\n        const token = ++loadToken;\n        const data = imageData(currentIdx);\n        if (!data.thumb && !data.full) return;\n        resetZoom();\n        lbImg.alt = data.alt;\n        if (data.thumb && lbImg.src !== data.thumb) lbImg.src = data.thumb;\n        lightbox.classList.add('is-loading');\n        lightbox.setAttribute('aria-busy', 'true');\n        lbCounter.textContent = `${currentIdx + 1} / ${count}`;\n        [lbPrevBtn, lbNextBtn].forEach((button) => {\n          if (!button) return;\n          button.hidden = count < 2;\n          button.disabled = count < 2;\n        });\n        lightbox.classList.add('is-open');\n        lightbox.setAttribute('aria-hidden', 'false');\n        scrollLockToken = lockRootScroll(scrollLockToken || Symbol('pdp-lightbox-lock'));\n        if (lbCloseBtn) window.requestAnimationFrame(() => lbCloseBtn.focus());\n\n        const cached = preloadCache.get(data.full);\n        const setLoaded = () => {\n          lightbox?.classList.remove('is-loading');\n          lightbox?.setAttribute('aria-busy', 'false');\n        };\n        if (cached?.loaded) {\n          if (lbImg.src !== data.full) lbImg.src = data.full;\n          setLoaded();\n        } else {\n          preloadImage(currentIdx, true).then((fullSrc) => {\n            if (token !== loadToken || currentIdx !== normalizedIndex(idx) || !lightbox?.classList.contains('is-open')) return;\n            if (fullSrc && lbImg.src !== fullSrc) lbImg.src = fullSrc;\n            const done = () => {\n              if (token === loadToken) setLoaded();\n            };\n            if (lbImg.decode) lbImg.decode().then(done).catch(done);\n            else done();\n          });\n        }\n        preloadImage(currentIdx + 1);\n        preloadImage(currentIdx - 1);\n      };\n      const showItem = (item) => {\n        const list = getItems();\n        const idx = list.indexOf(item);\n        if (idx < 0) return;\n        lastFocused = item;\n        show(idx);\n      };\n      const close = () => {\n        if (!lightbox) return;\n        lightbox.classList.remove('is-open');\n        lightbox.classList.remove('is-loading');\n        lightbox.setAttribute('aria-hidden', 'true');\n        lightbox.setAttribute('aria-busy', 'false');\n        resetZoom();\n        unlockRootScroll(scrollLockToken);\n        scrollLockToken = null;\n        if (lastFocused?.focus) lastFocused.focus();\n      };\n      const prev = () => show(currentIdx - 1);\n      const next = () => show(currentIdx + 1);\n\n      this.on(this.gallery, 'pointerdown', (event) => {\n        const item = itemFromZoomEvent(event);\n        if (!item || event.button !== 0) return;\n        galleryPointer = {\n          id: event.pointerId,\n          x: event.clientX,\n          y: event.clientY,\n          item,\n        };\n        pendingGalleryZoomItem = item;\n      }, { capture: true, passive: true });\n\n      this.on(this.gallery, 'pointerup', (event) => {\n        if (!galleryPointer || galleryPointer.id !== event.pointerId) return;\n        const dx = event.clientX - galleryPointer.x;\n        const dy = event.clientY - galleryPointer.y;\n        galleryPointer = null;\n        if (Math.abs(dx) > 8 || Math.abs(dy) > 8) {\n          pendingGalleryZoomItem = null;\n          suppressGalleryZoomUntil = performance.now() + 260;\n        }\n      }, { capture: true, passive: true });\n\n      this.on(this.gallery, 'pointercancel', () => {\n        galleryPointer = null;\n        pendingGalleryZoomItem = null;\n        suppressGalleryZoomUntil = performance.now() + 260;\n      }, { capture: true, passive: true });\n\n      this.on(this.gallery, 'click', (event) => {\n        if (event.defaultPrevented || performance.now() < suppressGalleryZoomUntil) return;\n        const item = itemFromZoomEvent(event) || pendingGalleryZoomItem;\n        pendingGalleryZoomItem = null;\n        if (!item) return;\n        event.__pdpZoomHandled = true;\n        showItem(item);\n      }, { capture: true });\n\n      items.forEach((item) => {\n        const galleryItems = allGalleryItems();\n        const galleryPosition = Math.max(0, galleryItems.indexOf(item)) + 1;\n        item.style.cursor = 'zoom-in';\n        item.tabIndex = window.matchMedia('(min-width: 990px)').matches && !item.classList.contains('is-active') ? -1 : 0;\n        item.setAttribute('role', 'button');\n        item.setAttribute('aria-label', `Forst\u00F8rr bilde ${galleryPosition} av ${galleryItems.length}`);\n        const preloadItem = () => {\n          const dynamicIndex = getItems().indexOf(item);\n          if (dynamicIndex >= 0) preloadImage(dynamicIndex, true);\n        };\n        this.on(item, 'mouseenter', preloadItem, { passive: true });\n        this.on(item, 'focus', preloadItem, { passive: true });\n        this.on(item, 'click', (e) => {\n          if (e.defaultPrevented || e.__pdpZoomHandled || performance.now() < suppressGalleryZoomUntil) return;\n          showItem(item);\n        });\n        this.on(item, 'keydown', (e) => {\n          if (e.key !== 'Enter' && e.key !== ' ') return;\n          e.preventDefault();\n          showItem(item);\n        });\n      });\n\n      this.on(document, 'keydown', (e) => {\n        if (!lightbox || !lightbox.classList.contains('is-open')) return;\n        if (e.key === 'Tab') {\n          const controls = [lbCloseBtn, lbPrevBtn, lbNextBtn]\n            .filter((control) => control && !control.hidden && !control.disabled && control.offsetParent !== null);\n          if (!controls.length) {\n            e.preventDefault();\n            lightbox.focus();\n            return;\n          }\n          const first = controls[0];\n          const last = controls[controls.length - 1];\n          const active = document.activeElement;\n          if (e.shiftKey && (active === first || !lightbox.contains(active))) {\n            e.preventDefault();\n            last.focus();\n          } else if (!e.shiftKey && (active === last || !lightbox.contains(active))) {\n            e.preventDefault();\n            first.focus();\n          }\n          return;\n        }\n        if (e.key === 'Escape') { e.preventDefault(); close(); }\n        else if (e.key === 'ArrowLeft') { e.preventDefault(); prev(); }\n        else if (e.key === 'ArrowRight') { e.preventDefault(); next(); }\n        else if (e.key === '+' || e.key === '=') {\n          e.preventDefault();\n          scale = Math.min(MAX_ZOOM, scale > 1 ? scale + 0.35 : ZOOM);\n          applyTransform(true);\n        } else if (e.key === '-') {\n          e.preventDefault();\n          scale = Math.max(1, scale - 0.35);\n          if (scale === 1) resetZoom();\n          else applyTransform(true);\n        }\n      });\n      this.on(document, 'focusin', (e) => {\n        if (!lightbox?.classList.contains('is-open') || lightbox.contains(e.target)) return;\n        lbCloseBtn?.focus();\n      });\n\n      // Cleanup p\u00E5 destroy\n      this.unsubs.push(() => {\n        window.cancelAnimationFrame(raf);\n        if (lightbox) {\n          lightbox.remove();\n          lightbox = null;\n          this.lightbox = null;\n        }\n        unlockRootScroll(scrollLockToken);\n        scrollLockToken = null;\n      });\n    },\n\n    syncGalleryToVariant(variant, behavior = 'smooth') {\n      if (!this.gallery) return;\n      if (this.section?.dataset?.pdpPreserveMediaOrder === 'true') {\n        this.prepareGalleryItems?.();\n        if (this.refreshGalleryStage) this.refreshGalleryStage(0, behavior);\n        else if (window.matchMedia('(max-width: 749px)').matches) this.gallery.scrollTo({ left: 0, behavior });\n        this.requestGalleryProgressUpdate?.();\n        return;\n      }\n\n      const items = Array.from(this.gallery.querySelectorAll('.pdp-clean__gallery-item'))\n        .sort((a, b) => Number(a.dataset.originalIndex || 0) - Number(b.dataset.originalIndex || 0));\n      const featured = variant?.featuredMediaId\n        ? items.find((item) => String(item.dataset.mediaId) === String(variant.featuredMediaId))\n        : null;\n\n      const orderedItems = featured ? [featured, ...items.filter((item) => item !== featured)] : items;\n      orderedItems.forEach((item) => this.gallery.appendChild(item));\n\n      this.prepareGalleryItems?.();\n      if (this.refreshGalleryStage) this.refreshGalleryStage(0, behavior);\n      else if (window.matchMedia('(max-width: 749px)').matches) this.gallery.scrollTo({ left: 0, behavior });\n      this.requestGalleryProgressUpdate?.();\n    },\n\n    bindGallery() {\n      const isDesktopStage = () => window.matchMedia('(min-width: 990px)').matches;\n      const prevButton = this.section.querySelector('[data-pdp-gallery-prev]');\n      const nextButton = this.section.querySelector('[data-pdp-gallery-next]');\n      const SCROLL_SETTLE_MS = 140;\n      let galleryItemCount = 0;\n\n      const galleryItems = () => this.gallery\n        ? Array.from(this.gallery.querySelectorAll('.pdp-clean__gallery-item'))\n        : [];\n      const refreshGalleryCount = () => {\n        if (!this.gallery) return;\n        galleryItemCount = galleryItems().length;\n      };\n\n      const itemIndex = (item) => {\n        const parsed = Number(item?.dataset?.pdpGalleryRealIndex);\n        return Number.isFinite(parsed) ? parsed : -1;\n      };\n      const prepareGalleryItems = () => {\n        if (!this.gallery) return;\n        const items = galleryItems();\n        items.forEach((item, idx) => {\n          item.dataset.pdpGalleryRealIndex = String(idx);\n        });\n        refreshGalleryCount();\n      };\n      this.prepareGalleryItems = prepareGalleryItems;\n      prepareGalleryItems();\n\n      const clampStageIndex = (index) => Math.max(0, Math.min(galleryItemCount - 1, Number(index) || 0));\n      const wrapStageIndex = (index) => galleryItemCount\n        ? ((Number(index) % galleryItemCount) + galleryItemCount) % galleryItemCount\n        : 0;\n      const stageIndex = () => clampStageIndex(this.galleryStageIndex);\n      const itemForIndex = (index) => galleryItems()[index];\n      const nearestItemFromScroll = (scrollLeft = this.gallery?.scrollLeft || 0) => {\n        const items = galleryItems();\n        if (!items.length) return null;\n        return items.reduce((closest, item) => {\n          if (!closest) return item;\n          return Math.abs(item.offsetLeft - scrollLeft) < Math.abs(closest.offsetLeft - scrollLeft) ? item : closest;\n        }, null);\n      };\n      const realIndexFromScroll = (scrollLeft = this.gallery?.scrollLeft || 0) => {\n        const fallback = stageIndex();\n        const item = nearestItemFromScroll(scrollLeft);\n        const index = itemIndex(item);\n        return index >= 0 ? clampStageIndex(index) : fallback;\n      };\n      const progressIndexFromScroll = () => {\n        const items = galleryItems();\n        if (!this.gallery || galleryItemCount <= 1 || items.length <= 1) return stageIndex();\n        const step = Math.max(1, (items[1]?.offsetLeft || 0) - (items[0]?.offsetLeft || 0) || this.gallery.clientWidth || 1);\n        const raw = (this.gallery.scrollLeft - items[0].offsetLeft) / step;\n        if (raw < 0 || raw > galleryItemCount - 1) return stageIndex();\n        return Math.max(0, Math.min(galleryItemCount - 1, raw));\n      };\n      const reflectActiveStage = (nextIndex) => {\n        const desktop = isDesktopStage();\n        this.gallery?.classList.add('is-stage-ready');\n        galleryItems().forEach((item) => {\n          const active = itemIndex(item) === nextIndex;\n          item.classList.toggle('is-active', active);\n          item.setAttribute('aria-hidden', desktop && !active ? 'true' : 'false');\n          item.tabIndex = desktop ? (active ? 0 : -1) : 0;\n        });\n        this.syncGalleryVideos?.();\n      };\n\n      const setStageIndex = (index = 0, options = {}) => {\n        refreshGalleryCount();\n        if (!galleryItemCount) return;\n        const wrap = options.wrap !== undefined ? options.wrap : false;\n        const nextIndex = wrap ? wrapStageIndex(index) : clampStageIndex(index);\n        this.galleryStageIndex = nextIndex;\n        reflectActiveStage(nextIndex);\n        if (options.scroll !== false) {\n          const activeItem = itemForIndex(nextIndex);\n          if (activeItem) {\n            const left = activeItem.offsetLeft;\n            const behavior = options.behavior || 'smooth';\n            this.gallery.scrollTo({ left, behavior });\n          }\n        }\n        this.requestGalleryProgressUpdate?.();\n      };\n\n      const moveStage = (direction, options = {}) => {\n        refreshGalleryCount();\n        if (galleryItemCount <= 1 || !direction) return false;\n        const current = stageIndex();\n        const wrap = options.wrap !== undefined ? options.wrap : false;\n        const next = wrap ? wrapStageIndex(current + direction) : clampStageIndex(current + direction);\n        if (next === current) return false;\n        setStageIndex(next, options);\n        return true;\n      };\n\n      this.refreshGalleryStage = (index = this.galleryStageIndex || 0, behavior = 'auto') => {\n        this.prepareGalleryItems?.();\n        refreshGalleryCount();\n        setStageIndex(index, { wrap: false, behavior });\n      };\n\n      if (prevButton) {\n        this.on(prevButton, 'click', (event) => {\n          event.preventDefault();\n          event.stopPropagation();\n          moveStage(-1);\n        });\n      }\n      if (nextButton) {\n        this.on(nextButton, 'click', (event) => {\n          event.preventDefault();\n          event.stopPropagation();\n          moveStage(1);\n        });\n      }\n\n      if (!this.gallery || !this.galleryProgressBar) return;\n\n      const interactiveSelector = 'a, button, input, select, textarea, summary, video, iframe, [data-pdp-gallery-video], [role=\"button\"], [contenteditable=\"true\"]';\n      const isRealGalleryControl = (target) => {\n        if (!(target instanceof Element)) return false;\n        const interactive = target.closest(interactiveSelector);\n        if (!interactive) return false;\n        return !interactive.classList.contains('pdp-clean__gallery-item');\n      };\n      const syncStageFromScroll = () => {\n        if (galleryItemCount <= 1) return;\n        const nextIndex = realIndexFromScroll();\n        if (nextIndex === this.galleryStageIndex) return;\n        this.galleryStageIndex = nextIndex;\n        reflectActiveStage(nextIndex);\n      };\n\n      let settleScrollFrame = 0;\n      let touchActive = false;\n      const settleGalleryScroll = () => {\n        window.cancelAnimationFrame(settleScrollFrame);\n        settleScrollFrame = window.requestAnimationFrame(() => {\n          if (touchActive) return;\n          syncStageFromScroll();\n        });\n      };\n\n      this.on(this.gallery, 'wheel', (event) => {\n        if (!isDesktopStage() || galleryItemCount <= 1 || !event.cancelable) return;\n        if (isRealGalleryControl(event.target)) return;\n        const absX = Math.abs(event.deltaX);\n        const absY = Math.abs(event.deltaY);\n        if (absX < 12 || absX < absY * 1.35) return;\n        event.preventDefault();\n        this.gallery.scrollBy({ left: event.deltaX, behavior: 'auto' });\n        this.requestGalleryProgressUpdate?.();\n      }, { passive: false });\n      this.on(this.gallery, 'touchstart', () => {\n        touchActive = true;\n      }, { passive: true });\n      this.on(this.gallery, 'touchend', () => {\n        touchActive = false;\n      }, { passive: true });\n      this.on(this.gallery, 'touchcancel', () => {\n        touchActive = false;\n      }, { passive: true });\n\n      let pointerDrag = null;\n      let lastPointerDown = 0;\n      const dragId = (event) => typeof event.pointerId === 'number' ? event.pointerId : 'mouse';\n      const beginDrag = (event, id) => {\n        pointerDrag = {\n          id,\n          index: stageIndex(),\n          x: event.clientX,\n          y: event.clientY,\n          moved: false,\n          intent: null,\n        };\n        if (id !== 'mouse') this.gallery.setPointerCapture?.(id);\n        this.gallery.classList.add('is-dragging');\n      };\n      const resetDrag = (event) => {\n        if (!pointerDrag || (event && dragId(event) !== pointerDrag.id)) return;\n        if (pointerDrag.id !== 'mouse' && this.gallery.hasPointerCapture?.(pointerDrag.id)) this.gallery.releasePointerCapture(pointerDrag.id);\n        this.gallery.classList.remove('is-dragging');\n        pointerDrag = null;\n      };\n      const updateDrag = (event) => {\n        if (!pointerDrag || dragId(event) !== pointerDrag.id) return;\n        const dx = event.clientX - pointerDrag.x;\n        const dy = event.clientY - pointerDrag.y;\n        if (!pointerDrag.intent && (Math.abs(dx) > 8 || Math.abs(dy) > 8)) {\n          pointerDrag.intent = Math.abs(dx) > Math.abs(dy) * 1.2 ? 'horizontal' : 'vertical';\n        }\n        if (pointerDrag.intent === 'horizontal') {\n          pointerDrag.moved = true;\n          event.preventDefault();\n        }\n      };\n      const finishDrag = (event) => {\n        if (!pointerDrag || dragId(event) !== pointerDrag.id) return;\n        const dx = event.clientX - pointerDrag.x;\n        const dy = event.clientY - pointerDrag.y;\n        const shouldMove = pointerDrag.intent === 'horizontal' && Math.abs(dx) > 44 && Math.abs(dx) > Math.abs(dy) * 1.15;\n        const direction = dx < 0 ? 1 : -1;\n        const dragged = pointerDrag.moved;\n        const targetIndex = pointerDrag.index + direction;\n        resetDrag(event);\n        if (!shouldMove) return;\n        if (dragged) event.preventDefault();\n        setStageIndex(targetIndex);\n      };\n\n      this.on(this.gallery, 'pointerdown', (event) => {\n        if (!isDesktopStage() || galleryItemCount <= 1 || event.button !== 0) return;\n        if (isRealGalleryControl(event.target)) return;\n        lastPointerDown = Date.now();\n        beginDrag(event, event.pointerId);\n      });\n\n      this.on(this.gallery, 'pointermove', updateDrag);\n      this.on(this.gallery, 'pointerup', finishDrag);\n      this.on(this.gallery, 'pointercancel', resetDrag);\n      this.on(this.gallery, 'lostpointercapture', resetDrag);\n\n      this.on(this.gallery, 'mousedown', (event) => {\n        if (!isDesktopStage() || galleryItemCount <= 1 || event.button !== 0) return;\n        if (pointerDrag || Date.now() - lastPointerDown < 120) return;\n        if (isRealGalleryControl(event.target)) return;\n        beginDrag(event, 'mouse');\n      });\n      this.on(document, 'mousemove', updateDrag);\n      this.on(document, 'mouseup', finishDrag);\n\n      this.on(document, 'keydown', (event) => {\n        if (!isDesktopStage() || galleryItemCount <= 1) return;\n        if (this.lightbox?.classList.contains('is-open')) return;\n        if (!['ArrowLeft', 'ArrowRight'].includes(event.key)) return;\n        if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;\n        const active = document.activeElement;\n        const galleryEngaged = this.gallery.matches(':hover')\n          || this.gallery.contains(active)\n          || prevButton === active\n          || nextButton === active;\n        if (!galleryEngaged) return;\n        const target = event.target;\n        if (target && target !== document.body) {\n          if (target.closest('input, textarea, select, [contenteditable=\"true\"], [data-pdp-tabs], [data-pdp-dropdown], .pdp-clean__picker, .pdp-clean__sizeguide')) return;\n        }\n        event.preventDefault();\n        moveStage(event.key === 'ArrowRight' ? 1 : -1);\n      });\n\n      const update = () => {\n        this.raf = null;\n        refreshGalleryCount();\n        syncStageFromScroll();\n        const count = galleryItemCount;\n        if (count <= 1) return;\n        const segment = 100 / count;\n        this.galleryProgressBar.style.width = `${segment}%`;\n        this.galleryProgressBar.style.left = '0';\n        this.galleryProgressBar.style.transform = `translateX(${progressIndexFromScroll() * 100}%)`;\n      };\n\n      this.requestGalleryProgressUpdate = () => {\n        if (this.raf) return;\n        this.raf = window.requestAnimationFrame(update);\n      };\n\n      let scrollEndTimer = 0;\n      this.on(this.gallery, 'scroll', () => {\n        this.requestGalleryProgressUpdate();\n        window.clearTimeout(scrollEndTimer);\n        if (touchActive) return;\n        scrollEndTimer = window.setTimeout(() => {\n          settleGalleryScroll();\n          this.requestGalleryProgressUpdate();\n        }, SCROLL_SETTLE_MS);\n      }, { passive: true });\n      if ('onscrollend' in window) {\n        this.on(this.gallery, 'scrollend', () => {\n          if (touchActive) return;\n          refreshGalleryCount();\n          settleGalleryScroll();\n          this.requestGalleryProgressUpdate();\n        }, { passive: true });\n      }\n      let resizeTimer = 0;\n      let resizeFrame = 0;\n      const scheduleGalleryLayout = () => {\n        window.clearTimeout(resizeTimer);\n        resizeTimer = window.setTimeout(() => {\n          window.cancelAnimationFrame(resizeFrame);\n          resizeFrame = window.requestAnimationFrame(() => {\n            resizeFrame = 0;\n            this.refreshGalleryStage?.();\n            this.requestGalleryProgressUpdate();\n          });\n        }, 100);\n      };\n      this.on(window, 'resize', scheduleGalleryLayout, { passive: true });\n      this.on(window, 'orientationchange', scheduleGalleryLayout, { passive: true });\n      this.unsubs.push(() => {\n        window.clearTimeout(resizeTimer);\n        window.cancelAnimationFrame(resizeFrame);\n      });\n      setStageIndex(0, { behavior: 'auto' });\n      this.requestGalleryProgressUpdate();\n      this.bindGalleryVideoAutoplay?.();\n    },\n\n    bindGalleryVideoAutoplay() {\n      if (!this.gallery) return;\n      const videos = () => this.gallery.querySelectorAll('video');\n      if (!videos().length) return;\n      const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n      let galleryInView = !('IntersectionObserver' in window);\n      const reflectVideo = (video) => {\n        const toggle = video.closest('[data-pdp-gallery-video]')?.querySelector('[data-pdp-video-toggle]');\n        if (!toggle) return;\n        toggle.classList.toggle('is-paused', video.paused);\n        toggle.setAttribute('aria-label', video.paused ? 'Spill video' : 'Pause video');\n      };\n      const bindVideo = (video) => {\n        if (video.dataset.pdpVideoControlReady === 'true') return;\n        video.dataset.pdpVideoControlReady = 'true';\n        video.defaultMuted = true;\n        video.controls = false;\n        video.playsInline = true;\n        video.disablePictureInPicture = true;\n        video.setAttribute('webkit-playsinline', '');\n        video.setAttribute('disablepictureinpicture', '');\n        video.removeAttribute('controls');\n        const toggle = video.closest('[data-pdp-gallery-video]')?.querySelector('[data-pdp-video-toggle]');\n        if (toggle) {\n          this.on(toggle, 'click', () => {\n            if (video.paused) {\n              delete video.dataset.pdpUserPaused;\n              const attempt = video.play();\n              if (attempt?.catch) attempt.catch(() => reflectVideo(video));\n            } else {\n              video.dataset.pdpUserPaused = 'true';\n              video.pause();\n            }\n          });\n        }\n        this.on(video, 'play', () => reflectVideo(video));\n        this.on(video, 'pause', () => reflectVideo(video));\n        ['loadedmetadata', 'loadeddata', 'canplay', 'canplaythrough'].forEach((eventName) => {\n          this.on(video, eventName, () => this.syncGalleryVideos?.());\n        });\n        reflectVideo(video);\n      };\n\n      const sync = () => {\n        videos().forEach((video) => {\n          bindVideo(video);\n          video.removeAttribute('autoplay');\n          video.muted = true;\n          video.defaultMuted = true;\n          video.playsInline = true;\n          video.setAttribute('muted', '');\n          video.setAttribute('playsinline', '');\n          video.setAttribute('webkit-playsinline', '');\n          video.setAttribute('disablepictureinpicture', '');\n          const active = video.closest('.pdp-clean__gallery-item')?.classList.contains('is-active');\n          const shouldPlay = !reducedMotion.matches\n            && !document.hidden\n            && galleryInView\n            && active\n            && video.dataset.pdpUserPaused !== 'true';\n          if (shouldPlay) {\n            const attempt = video.play();\n            if (attempt && typeof attempt.catch === 'function') attempt.catch(() => {});\n          } else if (!video.paused) {\n            video.pause();\n          }\n          reflectVideo(video);\n        });\n      };\n      this.syncGalleryVideos = sync;\n\n      let observer = null;\n      if ('IntersectionObserver' in window) {\n        observer = new IntersectionObserver(([entry]) => {\n          galleryInView = Boolean(entry?.isIntersecting && entry.intersectionRatio > 0.35);\n          sync();\n        }, { root: null, threshold: [0, 0.35] });\n        observer.observe(this.gallery);\n      }\n\n      this.on(document, 'visibilitychange', sync);\n      this.on(window, 'pageshow', sync);\n      this.on(reducedMotion, 'change', sync);\n      const cloneWatcher = new MutationObserver(sync);\n      cloneWatcher.observe(this.gallery, { childList: true, subtree: true });\n      sync();\n      [150, 500, 1200].forEach((delay) => {\n        this.timers.push(window.setTimeout(sync, delay));\n      });\n      this.unsubs.push(() => {\n        observer?.disconnect();\n        cloneWatcher.disconnect();\n        videos().forEach((video) => video.pause());\n        delete this.syncGalleryVideos;\n      });\n    },\n  });\n})();\n"],
  "mappings": "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",
  "names": []
}
