{
  "version": 3,
  "sources": ["/cdn/shop/t/92/assets/pdp-clean-v4-gallery.js?lly=laley-custom-20260921-epostsjekk-v860"],
  "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 galleryZoomControl = this.section.querySelector('[data-pdp-gallery-zoom]');\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, lbZoomBtn = null;\n      let stage = null;\n      let currentIdx = 0, lastFocused = null;\n      let originRect = null;\n      let loadToken = 0;\n      let raf = null;\n      let imageMotion = null;\n      let closeTimer = 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      const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\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          const zoomed = scale > 1;\n          lbImg.classList.toggle('is-zoomed', zoomed);\n          lightbox?.classList.toggle('is-zoomed', zoomed);\n          if (lbZoomBtn) {\n            lbZoomBtn.setAttribute('aria-label', zoomed ? 'Tilpass bilde' : 'Zoom inn');\n            lbZoomBtn.setAttribute('aria-pressed', String(zoomed));\n          }\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        lightbox?.classList.remove('is-zoomed');\n        if (lbZoomBtn) {\n          lbZoomBtn.setAttribute('aria-label', 'Zoom inn');\n          lbZoomBtn.setAttribute('aria-pressed', 'false');\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=\"${window.LaleyTranslate(\"close_1949e0\", \"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          <button type=\"button\" class=\"pdp-clean__lightbox-zoom lly-icon-action lly-icon-action--framed\" aria-label=\"Zoom inn\" aria-pressed=\"false\">\n            <svg class=\"pdp-clean__lightbox-zoom-in\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\">\n              <circle cx=\"10.75\" cy=\"10.75\" r=\"6.25\"/><path d=\"M15.25 15.25 20 20M10.75 8v5.5M8 10.75h5.5\"/>\n            </svg>\n            <svg class=\"pdp-clean__lightbox-zoom-out\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\">\n              <circle cx=\"10.75\" cy=\"10.75\" r=\"6.25\"/><path d=\"M15.25 15.25 20 20M8 10.75h5.5\"/>\n            </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        lbZoomBtn = lightbox.querySelector('.pdp-clean__lightbox-zoom');\n        stage = lightbox.querySelector('.pdp-clean__lightbox-stage');\n\n        // iOS kan forsinke eller miste det syntetiske `click`-eventet etter en\n        // pinch/pan-sekvens. De to kritiske mobilkontrollene fullf\u00F8res derfor\n        // direkte p\u00E5 en ren touch/pen pointerup, med click som tastatur/mus-\n        // fallback. Sperren hindrer at samme trykk utf\u00F8rer handlingen to ganger.\n        let controlTouchHandledUntil = 0;\n        const bindTouchControl = (button, action) => {\n          let press = null;\n          this.on(button, 'pointerdown', (e) => {\n            if (e.pointerType !== 'touch' && e.pointerType !== 'pen') return;\n            press = { id: e.pointerId, x: e.clientX, y: e.clientY };\n            e.stopPropagation();\n          }, { passive: true });\n          this.on(button, 'pointerup', (e) => {\n            if (!press || press.id !== e.pointerId) return;\n            const moved = Math.hypot(e.clientX - press.x, e.clientY - press.y);\n            press = null;\n            e.preventDefault();\n            e.stopPropagation();\n            if (moved > 12) return;\n            controlTouchHandledUntil = performance.now() + 500;\n            action();\n          }, { passive: false });\n          this.on(button, 'pointercancel', () => { press = null; });\n          this.on(button, 'click', (e) => {\n            if (performance.now() < controlTouchHandledUntil) {\n              e.preventDefault();\n              e.stopPropagation();\n              return;\n            }\n            action();\n          });\n        };\n\n        bindTouchControl(lbCloseBtn, close);\n        this.on(lbPrevBtn, 'click', prev);\n        this.on(lbNextBtn, 'click', next);\n        bindTouchControl(lbZoomBtn, () => {\n          if (!lbImg) return;\n          const rect = lbImg.getBoundingClientRect();\n          zoomAt(rect.left + rect.width / 2, rect.top + rect.height / 2);\n        });\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): ett rolig tap avslutter aktiv zoom.\n          // N\u00E5r bildet er tilpasset, gir to raske tap fortsatt presis zoom inn.\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 (scale > 1) {\n                lastTap = 0;\n                resetZoom();\n                return;\n              }\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 animateOpenFromGallery = () => {\n        if (reduceMotion || !originRect || !lbImg) return;\n        window.requestAnimationFrame(() => {\n          if (!lbImg || !lightbox?.classList.contains('is-open')) return;\n          const target = lbImg.getBoundingClientRect();\n          if (!target.width || !target.height || !originRect.width || !originRect.height) return;\n          const dx = (originRect.left + originRect.width / 2) - (target.left + target.width / 2);\n          const dy = (originRect.top + originRect.height / 2) - (target.top + target.height / 2);\n          const startScale = Math.max(0.18, Math.min(1, originRect.width / target.width, originRect.height / target.height));\n          imageMotion?.cancel();\n          imageMotion = lbImg.animate([\n            {\n              opacity: 0.72,\n              transform: `translate3d(${dx}px, ${dy}px, 0) scale(${startScale})`,\n            },\n            { opacity: 1, transform: 'translate3d(0, 0, 0) scale(1)' },\n          ], {\n            duration: 420,\n            easing: 'cubic-bezier(.22, 1, .36, 1)',\n          });\n        });\n      };\n\n      const animateImageChange = (direction) => {\n        if (reduceMotion || !lbImg || !direction) return;\n        imageMotion?.cancel();\n        imageMotion = lbImg.animate([\n          {\n            opacity: 0.38,\n            transform: `translate3d(${direction * 18}px, 0, 0) scale(.992)`,\n          },\n          { opacity: 1, transform: 'translate3d(0, 0, 0) scale(1)' },\n        ], {\n          duration: 260,\n          easing: 'cubic-bezier(.22, 1, .36, 1)',\n        });\n      };\n\n      const show = (idx, direction = 0, animateFromGallery = false) => {\n        ensureLightbox();\n        const count = getItems().length;\n        if (!count) return;\n        const wasOpen = lightbox.classList.contains('is-open');\n        window.clearTimeout(closeTimer);\n        lightbox.classList.remove('is-closing');\n        currentIdx = (idx + count) % count;\n        if (wasOpen && direction) {\n          const currentItem = getItems()[currentIdx];\n          const galleryIndex = allGalleryItems().indexOf(currentItem);\n          if (galleryIndex >= 0) this.refreshGalleryStage?.(galleryIndex, 'auto');\n          lastFocused = currentItem || lastFocused;\n          originRect = currentItem?.querySelector('img')?.getBoundingClientRect() || originRect;\n        }\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 = `${String(currentIdx + 1).padStart(2, '0')} / ${String(count).padStart(2, '0')}`;\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        this.syncGalleryVideos?.();\n        lightbox.setAttribute('aria-hidden', 'false');\n        scrollLockToken = lockRootScroll(scrollLockToken || Symbol('pdp-lightbox-lock'));\n        window.requestAnimationFrame(() => lightbox?.focus({ preventScroll: true }));\n        if (animateFromGallery && !wasOpen) animateOpenFromGallery();\n        else if (wasOpen && direction) animateImageChange(direction);\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        originRect = item.querySelector('img')?.getBoundingClientRect() || null;\n        show(idx, 0, true);\n      };\n\n      if (galleryZoomControl) {\n        this.on(galleryZoomControl, 'click', (event) => {\n          event.preventDefault();\n          event.stopPropagation();\n          const activeItem = allGalleryItems().find((item) => item.classList.contains('is-active'))\n            || allGalleryItems()[Number(this.galleryStageIndex) || 0]\n            || getItems()[0];\n          if (activeItem?.dataset.mediaType !== 'image' || !activeItem.querySelector('img')) return;\n          showItem(activeItem);\n        });\n      }\n      const finishClose = () => {\n        if (!lightbox) return;\n        lightbox.classList.remove('is-open', 'is-closing', 'is-zoomed');\n        this.syncGalleryVideos?.();\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({ preventScroll: true });\n      };\n      const close = () => {\n        if (!lightbox?.classList.contains('is-open') || lightbox.classList.contains('is-closing')) return;\n        ++loadToken;\n        resetZoom();\n        imageMotion?.cancel();\n\n        if (reduceMotion || !originRect || !lbImg) {\n          finishClose();\n          return;\n        }\n\n        const target = lbImg.getBoundingClientRect();\n        const currentOrigin = originRect;\n        const dx = (currentOrigin.left + currentOrigin.width / 2) - (target.left + target.width / 2);\n        const dy = (currentOrigin.top + currentOrigin.height / 2) - (target.top + target.height / 2);\n        const endScale = Math.max(0.18, Math.min(1, currentOrigin.width / target.width, currentOrigin.height / target.height));\n        lightbox.classList.add('is-closing');\n        imageMotion = lbImg.animate([\n          { opacity: 1, transform: 'translate3d(0, 0, 0) scale(1)' },\n          {\n            opacity: 0.45,\n            transform: `translate3d(${dx}px, ${dy}px, 0) scale(${endScale})`,\n          },\n        ], {\n          duration: 300,\n          easing: 'cubic-bezier(.4, 0, .2, 1)',\n          fill: 'forwards',\n        });\n        const complete = () => {\n          window.clearTimeout(closeTimer);\n          imageMotion?.cancel();\n          finishClose();\n        };\n        imageMotion.finished.then(complete).catch(() => {});\n        closeTimer = window.setTimeout(complete, 360);\n      };\n      const prev = () => show(currentIdx - 1, -1);\n      const next = () => show(currentIdx + 1, 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', `${window.LaleyTranslate(\"enlarge_image_3321f1\", \"Forst\u00F8rr bilde \")}${galleryPosition}${window.LaleyTranslate(\"of_015bb0\", \" 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, lbZoomBtn]\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        window.clearTimeout(closeTimer);\n        imageMotion?.cancel();\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      // Variantbildet er fasit naar det finnes: NAVIGER til det, aldri stokk om\n      // paa mediene. Den gamle veien hoistet mediet til plass 0, noe som brot den\n      // kuraterte selvpleie-rekkefolgen (2 bilder -> video -> resten) og gjorde\n      // \u00ABBilde 3 av 8\u00BB usant. Derfor ble hoistingen slaatt av globalt med\n      // data-pdp-preserve-media-order=\"true\" \u2014 men den bryteren tok med seg hele\n      // variantbyttet i fallet, og resatte i stedet galleriet til bilde 1 ved\n      // HVERT optionsvalg. Resultat: Duftlys/Duftpinner/Date Night viste feil\n      // duft selv om bildene finnes, og stoerrelsesbytte kastet kunden tilbake\n      // til forste bilde. Naa: naviger naar variant har eget bilde, ellers staa.\n      if (!this.gallery) return;\n      const items = Array.from(this.gallery.querySelectorAll('.pdp-clean__gallery-item'));\n      if (!items.length) return;\n\n      const featuredId = variant?.featuredMediaId;\n      let targetIndex = featuredId\n        ? items.findIndex((item) => String(item.dataset.mediaId) === String(featuredId))\n        : -1;\n\n      // Fallback: temaside fargeslides (data-pdp-color-slide) for produkter der\n      // varianten ikke har eget Shopify-media. Se pdp-gallery-track.liquid.\n      // Naar ekte variantbilder finnes vinner featuredMediaId over dette.\n      const hasColorSlides = items.some((item) => item.dataset.pdpColorSlide);\n      if (targetIndex < 0 && hasColorSlides) {\n        const optionHandles = Array.isArray(variant?.options)\n          ? variant.options.filter(Boolean).map((value) => String(value).trim().toLowerCase())\n          : [];\n        targetIndex = optionHandles.length\n          ? items.findIndex((item) => {\n            const slide = item.dataset.pdpColorSlide;\n            return slide ? optionHandles.includes(slide.toLowerCase()) : false;\n          })\n          : -1;\n        // Farger som HAR ekte fotografi (her: Blush) har ingen egen fargeslide.\n        // Uten dette ble galleriet staaende paa forrige farges slide.\n        if (targetIndex < 0) targetIndex = 0;\n      }\n\n      this.prepareGalleryItems?.();\n\n      if (targetIndex >= 0) {\n        // Fargeslides ligger sist i tracket og rakk ikke aa laste for de ble\n        // aktive, saa ruten viste blank flate. Varm nettleser-cachen uten aa\n        // roere DOM-en: aa sette loading=eager her trigget relayout, og\n        // scroll-settle-handleren snappet stagen tilbake til bilde 1.\n        const targetImage = items[targetIndex].querySelector('img');\n        if (targetImage && !targetImage.complete) {\n          const warm = new Image();\n          warm.src = targetImage.currentSrc || targetImage.src;\n        }\n        if (this.refreshGalleryStage) this.refreshGalleryStage(targetIndex, behavior);\n        else this.gallery.scrollTo({ left: items[targetIndex].offsetLeft, behavior });\n      }\n\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 galleryActions = this.section.querySelector('[data-pdp-gallery-actions]');\n      const galleryZoomControl = this.section.querySelector('[data-pdp-gallery-zoom]');\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\n      // The navigation sits directly on the media rather than in a framed\n      // button. Sample the visible image once so lifestyle imagery gets white\n      // controls while genuinely white/neutral packshots get dark controls.\n      // Both arrows deliberately share one tone: a paired control should never\n      // look like two unrelated icons just because the image sides differ.\n      let arrowContrastFrame = 0;\n      let arrowContrastToken = 0;\n      const setArrowTone = (button, tone) => {\n        if (!button) return;\n        button.dataset.pdpArrowTone = tone;\n      };\n      const setActionTone = (tone) => {\n        if (!galleryActions) return;\n        galleryActions.dataset.pdpActionTone = tone;\n        galleryActions.dataset.pdpActionReady = 'true';\n      };\n      const isNeutralLightImage = (image) => {\n        if (!image?.naturalWidth || !image?.naturalHeight) return null;\n        const imageRect = image.getBoundingClientRect();\n        if (!imageRect.width || !imageRect.height) return null;\n\n        // PDP media is object-fit: cover with a centered object-position.\n        const scale = Math.max(\n          imageRect.width / image.naturalWidth,\n          imageRect.height / image.naturalHeight,\n        );\n        const renderedWidth = image.naturalWidth * scale;\n        const renderedHeight = image.naturalHeight * scale;\n        const renderedLeft = imageRect.left + ((imageRect.width - renderedWidth) / 2);\n        const renderedTop = imageRect.top + ((imageRect.height - renderedHeight) / 2);\n        const sourceX = (imageRect.left - renderedLeft) / scale;\n        const sourceY = (imageRect.top - renderedTop) / scale;\n        const sourceWidth = imageRect.width / scale;\n        const sourceHeight = imageRect.height / scale;\n        const sx = Math.max(0, sourceX);\n        const sy = Math.max(0, sourceY);\n        const sw = Math.min(image.naturalWidth - sx, sourceWidth);\n        const sh = Math.min(image.naturalHeight - sy, sourceHeight);\n        if (sw <= 0 || sh <= 0) return null;\n\n        const canvas = document.createElement('canvas');\n        canvas.width = 48;\n        canvas.height = 48;\n        const context = canvas.getContext('2d', { willReadFrequently: true });\n        if (!context) return null;\n        // Transparent product PNGs are presented on the white gallery surface.\n        context.fillStyle = '#ffffff';\n        context.fillRect(0, 0, canvas.width, canvas.height);\n        try {\n          context.drawImage(image, sx, sy, sw, sh, 0, 0, canvas.width, canvas.height);\n          const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\n          let count = 0;\n          let neutralLight = 0;\n          let brightnessTotal = 0;\n          let chromaTotal = 0;\n          for (let offset = 0; offset < pixels.length; offset += 4) {\n            const red = pixels[offset];\n            const green = pixels[offset + 1];\n            const blue = pixels[offset + 2];\n            const brightness = (red * 0.2126) + (green * 0.7152) + (blue * 0.0722);\n            const chroma = Math.max(red, green, blue) - Math.min(red, green, blue);\n            brightnessTotal += brightness;\n            chromaTotal += chroma;\n            if (brightness >= 224 && chroma <= 34) neutralLight += 1;\n            count += 1;\n          }\n          if (!count) return null;\n          const averageBrightness = brightnessTotal / count;\n          const averageChroma = chromaTotal / count;\n          return (neutralLight / count) >= 0.58\n            || (averageBrightness >= 232 && averageChroma <= 28);\n        } catch (error) {\n          // Cross-origin media can taint canvas in older storefront browsers.\n          // White is the safer fallback over Laley's predominantly photographic\n          // gallery and is already applied in the Liquid markup.\n          return null;\n        }\n      };\n      const updateArrowContrast = async () => {\n        const token = ++arrowContrastToken;\n        const item = itemForIndex(stageIndex());\n        const image = item?.dataset.mediaType === 'image' ? item.querySelector('img') : null;\n        if (!image) {\n          const nativeChartTone = item?.querySelector('.laley-inseam-guide--gallery') ? 'dark' : 'light';\n          setArrowTone(prevButton, nativeChartTone);\n          setArrowTone(nextButton, nativeChartTone);\n          setActionTone(nativeChartTone);\n          if (galleryZoomControl) galleryZoomControl.hidden = true;\n          return;\n        }\n        if (!image.complete || !image.naturalWidth) {\n          if (galleryActions) delete galleryActions.dataset.pdpActionReady;\n          try { await image.decode(); } catch (error) { /* load/error fallback below */ }\n        }\n        if (token !== arrowContrastToken || !image.naturalWidth) return;\n        const sharedTone = isNeutralLightImage(image) === true ? 'dark' : 'light';\n        setArrowTone(prevButton, sharedTone);\n        setArrowTone(nextButton, sharedTone);\n        setActionTone(sharedTone);\n        if (galleryZoomControl) galleryZoomControl.hidden = false;\n      };\n      const scheduleArrowContrast = () => {\n        window.cancelAnimationFrame(arrowContrastFrame);\n        arrowContrastFrame = window.requestAnimationFrame(() => {\n          arrowContrastFrame = 0;\n          void updateArrowContrast();\n        });\n      };\n      this.syncGalleryArrowContrast = scheduleArrowContrast;\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 warmGalleryImage = (item) => {\n        const image = item?.querySelector('img');\n        if (!image || image.complete) return;\n        const warm = new Image();\n        warm.src = image.currentSrc || image.src;\n      };\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 maxScrollLeft = Math.max(0, (this.gallery?.scrollWidth || 0) - (this.gallery?.clientWidth || 0));\n        if (galleryItemCount > 1 && maxScrollLeft - scrollLeft <= 2) return galleryItemCount - 1;\n        const item = nearestItemFromScroll(scrollLeft);\n        const index = itemIndex(item);\n        return index >= 0 ? clampStageIndex(index) : fallback;\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        scheduleArrowContrast();\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        // A smooth scroll from the first slide to the last (or vice versa)\n        // visibly races through every intermediate image. Cross the loop seam\n        // directly; adjacent navigation keeps the normal smooth movement.\n        const crossesLoopSeam = wrap && Math.abs(next - current) > 1;\n        const stageOptions = crossesLoopSeam && options.behavior === undefined\n          ? { ...options, behavior: 'instant' }\n          : options;\n        setStageIndex(next, stageOptions);\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, { wrap: true });\n        });\n      }\n      if (nextButton) {\n        this.on(nextButton, 'click', (event) => {\n          event.preventDefault();\n          event.stopPropagation();\n          moveStage(1, { wrap: true });\n        });\n      }\n\n      // A product can have a single video and therefore no progress bar.\n      // Playback belongs to the media track, not to carousel navigation.\n      this.bindGalleryVideoAutoplay?.();\n      setStageIndex(0, { behavior: 'auto' });\n      const seamWarmTimer = window.setTimeout(() => {\n        warmGalleryImage(itemForIndex(galleryItemCount - 2));\n        warmGalleryImage(itemForIndex(galleryItemCount - 1));\n      }, 250);\n      this.unsubs.push(() => {\n        window.clearTimeout(seamWarmTimer);\n        window.cancelAnimationFrame(arrowContrastFrame);\n        arrowContrastToken += 1;\n        delete this.syncGalleryArrowContrast;\n      });\n      if (!this.gallery || !this.galleryProgressBar) return;\n\n      const interactiveSelector = 'a, button, input, select, textarea, summary, video[controls], iframe, [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        resetDrag(event);\n        if (!shouldMove) return;\n        if (dragged) event.preventDefault();\n        moveStage(direction, { wrap: true });\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, { wrap: true });\n      });\n\n      const update = () => {\n        this.raf = null;\n        refreshGalleryCount();\n        syncStageFromScroll();\n        const count = galleryItemCount;\n        if (count <= 1) return;\n        // The thumb represents the media that is actually visible, not a\n        // hard-coded one-slide segment. This matters on large desktop where\n        // the stage deliberately shows two complete images at once.\n        const scrollWidth = Math.max(1, this.gallery.scrollWidth);\n        const viewportWidth = Math.min(scrollWidth, Math.max(1, this.gallery.clientWidth));\n        const maxScrollLeft = Math.max(0, scrollWidth - viewportWidth);\n        const visibleRatio = Math.max(0, Math.min(1, viewportWidth / scrollWidth));\n        const scrollRatio = maxScrollLeft > 0\n          ? Math.max(0, Math.min(1, this.gallery.scrollLeft / maxScrollLeft))\n          : 0;\n        const thumbWidth = visibleRatio * 100;\n        const thumbLeft = scrollRatio * (100 - thumbWidth);\n        this.galleryProgressBar.style.width = `${thumbWidth}%`;\n        this.galleryProgressBar.style.left = `${thumbLeft}%`;\n        this.galleryProgressBar.style.transform = 'none';\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            scheduleArrowContrast();\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      this.requestGalleryProgressUpdate();\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      const desktop = window.matchMedia('(min-width: 990px)');\n      const visibility = new WeakMap();\n      const attempted = new WeakSet();\n      const boundVideos = new Set();\n      const pendingPlay = new WeakMap();\n      const userStarted = new WeakSet();\n      let pageVisible = true;\n      let disposed = false;\n\n      const videoInView = (video) => {\n        const seen = visibility.get(video);\n        if (seen) return seen.inView && (!desktop.matches || seen.ratio >= 0.5);\n        if ('IntersectionObserver' in window) return false;\n        const box = video.getBoundingClientRect();\n        const track = this.gallery.getBoundingClientRect();\n        const width = Math.max(0, Math.min(box.right, track.right, innerWidth) - Math.max(box.left, track.left, 0));\n        const height = Math.max(0, Math.min(box.bottom, track.bottom, innerHeight) - Math.max(box.top, track.top, 0));\n        return width > 0 && height > 0 && (!desktop.matches || width * height >= box.width * box.height * 0.5);\n      };\n      const visibleFrame = (video) => videoInView(video)\n        && (desktop.matches || video.closest('.pdp-clean__gallery-item')?.classList.contains('is-active'));\n      const playbackContext = (video) => !disposed && pageVisible && !document.hidden\n        && !this.lightbox?.classList.contains('is-open') && visibleFrame(video);\n      const shouldPlay = (video) => playbackContext(video)\n        && ((!reducedMotion.matches && !navigator.connection?.saveData) || userStarted.has(video))\n        && video.dataset.pdpUserPaused !== 'true';\n\n      const reflectVideo = (video) => {\n        const item = video.closest('.pdp-clean__gallery-item');\n        const exposed = visibleFrame(video);\n        if (desktop.matches && item) item.setAttribute('aria-hidden', exposed ? 'false' : 'true');\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        toggle.tabIndex = exposed ? 0 : -1;\n      };\n\n      const prepareVideo = (video, autoplay) => {\n        // Set silent inline playback before requesting play (also on iPhone).\n        // Never reload the source: revisiting a slide resumes its existing media.\n        video.muted = true;\n        video.defaultMuted = true;\n        video.loop = true;\n        video.controls = false;\n        video.playsInline = true;\n        video.disablePictureInPicture = true;\n        video.setAttribute('muted', '');\n        video.setAttribute('loop', '');\n        video.setAttribute('playsinline', '');\n        video.setAttribute('webkit-playsinline', '');\n        video.setAttribute('disablepictureinpicture', '');\n        video.removeAttribute('controls');\n        video.autoplay = autoplay;\n        video.toggleAttribute('autoplay', autoplay);\n      };\n\n      const playVideo = (video) => {\n        if (!video.paused || pendingPlay.has(video) || attempted.has(video)) return;\n        attempted.add(video);\n        const request = {};\n        pendingPlay.set(video, request);\n        const settled = () => {\n          // Teardown can be followed by a new controller on the same element.\n          // An old promise must never pause or overwrite that new playback.\n          if (disposed) return;\n          if (pendingPlay.get(video) === request) pendingPlay.delete(video);\n          // A slow play request may finish after a swipe or page navigation.\n          if (!shouldPlay(video)) video.pause();\n          reflectVideo(video);\n        };\n        try {\n          const attempt = video.play();\n          if (attempt?.then) attempt.then(settled, settled);\n          else settled();\n        } catch (error) {\n          // Low Power Mode/browser policy can reject autoplay. The same small\n          // control becomes a play button; no loader, sound or forced retries.\n          settled();\n        }\n      };\n\n      const bindVideo = (video) => {\n        if (boundVideos.has(video)) return;\n        boundVideos.add(video);\n        observer?.observe(video);\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              attempted.delete(video);\n              // Explicit play must still work with reduced motion enabled.\n              userStarted.add(video);\n            } else {\n              video.dataset.pdpUserPaused = 'true';\n            }\n            sync();\n          });\n        }\n        this.on(video, 'play', () => {\n          if (!shouldPlay(video)) video.pause();\n          reflectVideo(video);\n        });\n        this.on(video, 'pause', () => reflectVideo(video));\n        ['loadedmetadata', 'canplay'].forEach((eventName) => {\n          this.on(video, eventName, () => sync());\n        });\n        reflectVideo(video);\n      };\n\n      const sync = () => {\n        if (disposed) return;\n        videos().forEach((video) => {\n          bindVideo(video);\n          const autoplay = shouldPlay(video);\n          if (!autoplay) attempted.delete(video);\n          prepareVideo(video, autoplay);\n          if (autoplay) {\n            playVideo(video);\n          } else {\n            // pause() aborts a pending play asynchronously. Release our request\n            // immediately so a fast swipe back can start a fresh one; its late\n            // completion must not clear the replacement request above.\n            const wasPending = pendingPlay.delete(video);\n            if (wasPending || !video.paused) 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((entries) => {\n          entries.forEach((entry) => visibility.set(entry.target, {\n            inView: entry.isIntersecting, ratio: entry.intersectionRatio,\n          }));\n          // Desktop requires half the film in view; tall mobile media only needs to intersect the viewport.\n          sync();\n        }, { root: null, threshold: [0, 0.5] });\n      }\n\n      this.on(document, 'visibilitychange', sync);\n      this.on(window, 'pagehide', () => { pageVisible = false; sync(); });\n      this.on(window, 'pageshow', () => { pageVisible = true; sync(); });\n      this.on(desktop, 'change', sync);\n      const preferenceChanged = () => {\n        boundVideos.forEach((video) => {\n          userStarted.delete(video);\n          attempted.delete(video);\n        });\n        sync();\n      };\n      this.on(reducedMotion, 'change', preferenceChanged);\n      if (navigator.connection?.addEventListener) {\n        let saveData = Boolean(navigator.connection.saveData);\n        this.on(navigator.connection, 'change', () => {\n          const next = Boolean(navigator.connection.saveData);\n          if (next === saveData) return;\n          saveData = next;\n          preferenceChanged();\n        });\n      }\n      const cloneWatcher = new MutationObserver(sync);\n      cloneWatcher.observe(this.gallery, { childList: true, subtree: true });\n      sync();\n      this.unsubs.push(() => {\n        disposed = true;\n        observer?.disconnect();\n        cloneWatcher.disconnect();\n        boundVideos.forEach((video) => {\n          video.autoplay = false;\n          video.removeAttribute('autoplay');\n          video.pause();\n        });\n        boundVideos.clear();\n        delete this.syncGalleryVideos;\n      });\n    },\n  });\n})();\n"],
  "mappings": "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",
  "names": []
}
