{
  "version": 3,
  "sources": ["/cdn/shop/t/5/assets/veylen-cp.js?nocache=1792057568590"],
  "sourcesContent": ["/* Comfort+ v4 product page.\n   One purchase selection shared by every buy box on the page:\n   all prices are rendered server-side, so switching only flips data attributes\n   and keeps each form's hidden fields in step. */\n(() => {\n  const boxes = [...document.querySelectorAll('[data-cp-buybox]')];\n  const states = [...document.querySelectorAll('[data-cp-state]')];\n  let offer = null;\n  try {\n    offer = JSON.parse(boxes[0]?.querySelector('script[data-cp-offer]')?.textContent || 'null');\n  } catch (e) { offer = null; }\n\n  if (boxes.length && offer) {\n    let state = { supply: offer.default_supply, mode: offer.default_mode };\n    try {\n      const saved = JSON.parse(sessionStorage.getItem('cp_sel') || 'null');\n      if (saved && offer.combos[`${saved.supply}_${saved.mode}`]) state = saved;\n    } catch (e) { /* private mode: keep the default */ }\n\n    const combo = () => offer.combos[`${state.supply}_${state.mode}`];\n\n    const render = () => {\n      const c = combo();\n      states.forEach((el) => {\n        el.dataset.supply = state.supply;\n        el.dataset.mode = state.mode;\n      });\n      boxes.forEach((b) => {\n        b.querySelectorAll('input[type=\"radio\"]').forEach((r) => {\n          if (r.name.startsWith('cp_supply')) r.checked = r.value === state.supply;\n          if (r.name.startsWith('cp_mode')) r.checked = r.value === state.mode;\n        });\n        b.querySelectorAll('[data-cp-sub]').forEach((c) => { c.checked = state.mode === 'sub'; });\n        const id = b.querySelector('[data-cp-in=\"id\"]');\n        const plan = b.querySelector('[data-cp-in=\"plan\"]');\n        if (id) id.value = c.id;\n        if (plan) {\n          plan.value = c.plan || '';\n          plan.disabled = !c.plan;\n        }\n        b.querySelectorAll('[data-cp-gift]').forEach((g) => { g.disabled = state.mode !== 'sub'; });\n      });\n      try { sessionStorage.setItem('cp_sel', JSON.stringify(state)); } catch (e) { /* ignore */ }\n    };\n\n    boxes.forEach((b) => b.addEventListener('change', (e) => {\n      const t = e.target;\n      if (!(t instanceof HTMLInputElement)) return;\n      if (t.hasAttribute('data-cp-sub')) {\n        state.mode = t.checked ? 'sub' : 'once';\n        render();\n        return;\n      }\n      if (t.type !== 'radio') return;\n      if (t.name.startsWith('cp_supply')) state.supply = t.value;\n      if (t.name.startsWith('cp_mode')) state.mode = t.value;\n      render();\n    }));\n\n    boxes.forEach((b) => {\n      const form = b.querySelector('[data-cp-form]');\n      const cta = b.querySelector('[data-cp-cta]');\n      if (!form || !cta) return;\n      form.addEventListener('submit', (e) => {\n        if (cta.disabled) { e.preventDefault(); return; }\n        cta.classList.add('is-loading');\n        setTimeout(() => { cta.disabled = true; }, 0);\n        // One free gift per cart: if it is already there, send only Comfort+.\n        const gifts = [...form.querySelectorAll('[data-cp-gift]')].filter((g) => !g.disabled);\n        if (!gifts.length || form.dataset.cpChecked) return;\n        e.preventDefault();\n        const giftId = String(gifts[0].value);\n        fetch((window.Shopify?.routes?.root || '/') + 'cart.js', { headers: { Accept: 'application/json' } })\n          .then((r) => r.json())\n          .then((cart) => {\n            if (cart.items?.some((i) => String(i.variant_id) === giftId)) gifts.forEach((g) => { g.disabled = true; });\n          })\n          .catch(() => {})\n          .finally(() => { form.dataset.cpChecked = '1'; form.submit(); });\n      });\n    });\n    window.addEventListener('pageshow', () => {\n      document.querySelectorAll('[data-cp-cta].is-loading').forEach((c) => {\n        c.classList.remove('is-loading');\n        c.disabled = false;\n      });\n      document.querySelectorAll('[data-cp-form]').forEach((f) => { delete f.dataset.cpChecked; });\n      render();\n    });\n\n    render();\n  }\n\n  /* Gallery: swipe/scroll stage, thumbnails, arrows. No autoplay. */\n  document.querySelectorAll('[data-cp-gallery]').forEach((g) => {\n    const stage = g.querySelector('[data-cp-stage]');\n    const thumbs = [...g.querySelectorAll('[data-cp-thumb]')];\n    if (!stage) return;\n    const slides = [...stage.children];\n    const go = (i) => {\n      const n = Math.max(0, Math.min(slides.length - 1, i));\n      stage.scrollTo({ left: slides[n].offsetLeft - stage.offsetLeft, behavior: 'smooth' });\n    };\n    const current = () => Math.round(stage.scrollLeft / Math.max(1, stage.clientWidth));\n    thumbs.forEach((t) => t.addEventListener('click', () => go(Number(t.dataset.cpThumb))));\n    g.querySelector('[data-cp-prev]')?.addEventListener('click', () => go(current() - 1));\n    g.querySelector('[data-cp-next]')?.addEventListener('click', () => go(current() + 1));\n    let raf = 0;\n    stage.addEventListener('scroll', () => {\n      cancelAnimationFrame(raf);\n      raf = requestAnimationFrame(() => {\n        const i = current();\n        thumbs.forEach((t, k) => t.classList.toggle('is-on', k === i));\n      });\n    }, { passive: true });\n  });\n\n  /* Tap-to-play video: the file only loads on tap. */\n  document.querySelectorAll('[data-cp-video]').forEach((v) => {\n    const btn = v.querySelector('.cp-video__play');\n    btn?.addEventListener('click', () => {\n      const el = document.createElement('video');\n      el.src = v.dataset.cpVideo;\n      el.controls = true;\n      el.playsInline = true;\n      el.autoplay = true;\n      v.classList.add('is-playing');\n      v.appendChild(el);\n      btn.remove();\n    });\n  });\n\n  /* Video testimonials: load the first frame near the viewport, play on tap,\n     and keep only one video playing at a time. */\n  const vids = [...document.querySelectorAll('[data-cp-vid]')];\n  if (vids.length) {\n    const load = (v) => { const el = v.querySelector('video'); if (el && !el.src && el.dataset.src) { el.preload = 'metadata'; el.src = el.dataset.src; } };\n    if ('IntersectionObserver' in window) {\n      const io = new IntersectionObserver((entries) => entries.forEach((en) => {\n        if (!en.isIntersecting) return;\n        // Load the whole rail at once so swiped-in videos already show a frame.\n        const rail = en.target.closest('[data-cp-rail]');\n        (rail ? [...rail.querySelectorAll('[data-cp-vid]')] : [en.target]).forEach((v) => { load(v); io.unobserve(v); });\n      }), { rootMargin: '600px 600px' });\n      vids.forEach((v) => io.observe(v));\n    } else vids.forEach(load);\n    vids.forEach((v) => {\n      const el = v.querySelector('video');\n      v.querySelector('.cp-video__play')?.addEventListener('click', () => {\n        load(v);\n        el.controls = true;\n        v.classList.add('is-playing');\n        el.play().catch(() => {});\n      });\n      el.addEventListener('play', () => vids.forEach((o) => {\n        const ov = o.querySelector('video');\n        if (ov !== el && !ov.paused) ov.pause();\n      }));\n    });\n  }\n\n  /* One open item at a time in exclusive accordion lists. Browsers that\n     support <details name> already do this; this covers the rest. */\n  document.querySelectorAll('[data-cp-exclusive]').forEach((list) => {\n    const items = [...list.querySelectorAll(':scope > details')];\n    items.forEach((d) => d.addEventListener('toggle', () => {\n      if (!d.open) return;\n      items.forEach((o) => { if (o !== d && o.open) o.open = false; });\n    }));\n  });\n\n  /* Horizontal review rails: arrows scroll by one card */\n  document.querySelectorAll('[data-cp-rail]').forEach((rail) => {\n    const wrap = rail.parentElement;\n    const step = () => (rail.firstElementChild ? rail.firstElementChild.getBoundingClientRect().width + 14 : rail.clientWidth);\n    wrap.querySelector('[data-cp-rail-prev]')?.addEventListener('click', () => rail.scrollBy({ left: -step(), behavior: 'smooth' }));\n    wrap.querySelector('[data-cp-rail-next]')?.addEventListener('click', () => rail.scrollBy({ left: step(), behavior: 'smooth' }));\n  });\n\n  /* Review filters */\n  document.querySelectorAll('.cp-rev').forEach((sec) => {\n    const btns = [...sec.querySelectorAll('[data-cp-filter]')];\n    const cards = [...sec.querySelectorAll('.cp-review')];\n    btns.forEach((b) => b.addEventListener('click', () => {\n      const f = b.dataset.cpFilter;\n      btns.forEach((x) => x.classList.toggle('is-on', x === b));\n      cards.forEach((c) => {\n        c.hidden = f !== 'all' && !(` ${c.dataset.tags} `).includes(` ${f} `);\n      });\n    }));\n  });\n})();\n"],
  "mappings": "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",
  "names": ["c"]
}
