{
  "version": 3,
  "sources": ["/cdn/shop/t/3/assets/main.js?torris=20260826-cart-11"],
  "sourcesContent": ["/* Torris storefront \u2014 cache bust: 20260826-cart-11 */\r\nif (typeof gsap !== \"undefined\" && typeof ScrollTrigger !== \"undefined\") {\r\n  gsap.registerPlugin(ScrollTrigger);\r\n}\r\n\r\nlet lenisInstance = null;\r\n\r\nconst brandTitle = document.querySelector(\".brand-title\");\r\nconst envelopeActor = document.querySelector(\".envelope-actor\");\r\nconst envelopeFrames = gsap.utils.toArray(\".envelope-frame\");\r\nconst shopStage = document.querySelector(\".shop-stage\");\r\nconst productCards = gsap.utils.toArray(\".product-card\");\r\nconst scrollHint = document.querySelector(\".scroll-hint\");\r\nconst floor = document.querySelector(\".scroll-story__floor\");\r\n\r\n/* The scroll story only exists on the home page; every other template skips it. */\r\nconst hasStory = Boolean(\r\n  brandTitle && envelopeActor && shopStage && envelopeFrames.length\r\n);\r\n\r\nif (hasStory && \"scrollRestoration\" in history) {\r\n  history.scrollRestoration = \"manual\";\r\n}\r\n\r\nif (hasStory) {\r\n  window.scrollTo(0, 0);\r\n}\r\n\r\nconst reduced = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\r\nconst LAST_FRAME = envelopeFrames.length - 1;\r\nlet packCache = [];\r\n\r\nfunction getStoryMotion() {\r\n  const w = window.innerWidth;\r\n\r\n  if (w <= 480) {\r\n    return { dropY: \"12vh\", dropScale: 0.42, fadeY: \"20vh\", fadeScale: 0.3 };\r\n  }\r\n  if (w <= 768) {\r\n    return { dropY: \"14vh\", dropScale: 0.48, fadeY: \"24vh\", fadeScale: 0.32 };\r\n  }\r\n  if (w <= 1024) {\r\n    return { dropY: \"16vh\", dropScale: 0.54, fadeY: \"28vh\", fadeScale: 0.34 };\r\n  }\r\n  return { dropY: \"18vh\", dropScale: 0.58, fadeY: \"30vh\", fadeScale: 0.36 };\r\n}\r\n\r\nfunction getEnvelopeMouth() {\r\n  const env = envelopeActor.getBoundingClientRect();\r\n  return {\r\n    x: env.left + env.width / 2,\r\n    y: env.top + env.height * 0.14,\r\n  };\r\n}\r\n\r\n/**\r\n * Smooth crossfade between adjacent frames (feels like tear/open, not image swap)\r\n * progress: 0 \u2192 LAST_FRAME (can be fractional)\r\n */\r\nfunction setEnvelopeProgress(progress) {\r\n  const max = LAST_FRAME;\r\n  const p = Math.max(0, Math.min(max, progress));\r\n\r\n  if (p >= max) {\r\n    envelopeFrames.forEach((frame, n) => {\r\n      gsap.set(frame, { opacity: n === max ? 1 : 0 });\r\n    });\r\n    return;\r\n  }\r\n\r\n  const i = Math.floor(p);\r\n  const t = p - i;\r\n\r\n  envelopeFrames.forEach((frame, n) => {\r\n    let opacity = 0;\r\n    if (n === i) opacity = 1 - t;\r\n    else if (n === i + 1) opacity = t;\r\n    gsap.set(frame, { opacity });\r\n  });\r\n}\r\n\r\nfunction textTravelY() {\r\n  const titleBox = brandTitle.getBoundingClientRect();\r\n  const envBox = envelopeActor.getBoundingClientRect();\r\n  return envBox.top + envBox.height * 0.3 - titleBox.top - titleBox.height * 0.5;\r\n}\r\n\r\nfunction packProductsInEnvelope() {\r\n  gsap.set(shopStage, { autoAlpha: 1, visibility: \"visible\" });\r\n\r\n  const mouth = getEnvelopeMouth();\r\n  if (!mouth.x) return;\r\n\r\n  productCards.forEach((card) => {\r\n    gsap.set(card, {\r\n      x: 0,\r\n      y: 0,\r\n      scale: 1,\r\n      autoAlpha: 0,\r\n      visibility: \"visible\",\r\n    });\r\n  });\r\n\r\n  productCards.forEach((card) => {\r\n    const box = card.getBoundingClientRect();\r\n    const cx = box.left + box.width / 2;\r\n    const cy = box.top + box.height / 2;\r\n    gsap.set(card, {\r\n      x: mouth.x - cx,\r\n      y: mouth.y - cy,\r\n      scale: 0.06,\r\n      autoAlpha: 0,\r\n      transformOrigin: \"50% 50%\",\r\n    });\r\n  });\r\n}\r\n\r\nfunction setupLenis() {\r\n  if (reduced || typeof Lenis === \"undefined\") return null;\r\n\r\n  const lenis = new Lenis({ duration: 1.15, smoothWheel: true });\r\n\r\n  lenis.on(\"scroll\", ScrollTrigger.update);\r\n\r\n  ScrollTrigger.scrollerProxy(document.documentElement, {\r\n    scrollTop(value) {\r\n      if (arguments.length) {\r\n        lenis.scrollTo(value, { immediate: true });\r\n      }\r\n      return lenis.scroll;\r\n    },\r\n    getBoundingClientRect() {\r\n      return {\r\n        top: 0,\r\n        left: 0,\r\n        width: window.innerWidth,\r\n        height: window.innerHeight,\r\n      };\r\n    },\r\n  });\r\n\r\n  ScrollTrigger.addEventListener(\"refresh\", () => lenis.resize());\r\n\r\n  gsap.ticker.add((time) => lenis.raf(time * 1000));\r\n  gsap.ticker.lagSmoothing(0);\r\n  return lenis;\r\n}\r\n\r\nfunction preloadImage(img, timeoutMs = 4000) {\r\n  return new Promise((resolve) => {\r\n    if (!img) return resolve();\r\n\r\n    if (img.complete) return resolve();\r\n\r\n    let done = false;\r\n    const finish = () => {\r\n      if (done) return;\r\n      done = true;\r\n      resolve();\r\n    };\r\n\r\n    img.addEventListener(\"load\", finish, { once: true });\r\n    img.addEventListener(\"error\", finish, { once: true });\r\n    window.setTimeout(finish, timeoutMs);\r\n  });\r\n}\r\n\r\nfunction preloadFrameImages() {\r\n  return Promise.all(envelopeFrames.map((img) => preloadImage(img)));\r\n}\r\n\r\nfunction preloadProductImages() {\r\n  const imgs = document.querySelectorAll(\".product-card__media img\");\r\n  return Promise.all(Array.from(imgs).map((img) => preloadImage(img)));\r\n}\r\n\r\nfunction computePack() {\r\n  gsap.set(shopStage, { autoAlpha: 1, visibility: \"visible\" });\r\n  shopStage.classList.add(\"is-active\");\r\n\r\n  productCards.forEach((card) => {\r\n    gsap.set(card, {\r\n      x: 0,\r\n      y: 0,\r\n      scale: 1,\r\n      autoAlpha: 0,\r\n      visibility: \"visible\",\r\n    });\r\n  });\r\n\r\n  void shopStage.offsetHeight;\r\n\r\n  const mouth = getEnvelopeMouth();\r\n\r\n  return productCards.map((card) => {\r\n    const box = card.getBoundingClientRect();\r\n    return {\r\n      x: mouth.x - (box.left + box.width / 2),\r\n      y: mouth.y - (box.top + box.height / 2),\r\n    };\r\n  });\r\n}\r\n\r\nfunction applyBurst(t) {\r\n  const p = Math.max(0, Math.min(1, t));\r\n\r\n  if (p > 0.05) {\r\n    gsap.set(shopStage, { autoAlpha: 1, visibility: \"visible\" });\r\n    enableProductInteraction();\r\n  }\r\n\r\n  productCards.forEach((card, i) => {\r\n    const from = packCache[i] || { x: 0, y: 0 };\r\n    gsap.set(card, {\r\n      x: from.x * (1 - p),\r\n      y: from.y * (1 - p),\r\n      scale: 0.06 + 0.94 * p,\r\n      autoAlpha: p,\r\n      visibility: \"visible\",\r\n    });\r\n  });\r\n}\r\n\r\nconst siteHeader = document.querySelector(\".site-header\");\r\n\r\nfunction setHeaderStuck(stuck) {\r\n  siteHeader?.classList.toggle(\"is-stuck\", stuck);\r\n}\r\n\r\nfunction enableProductInteraction() {\r\n  shopStage?.classList.add(\"is-active\");\r\n}\r\n\r\nfunction disableProductInteraction() {\r\n  shopStage?.classList.remove(\"is-active\");\r\n}\r\n\r\nfunction resetStoryVisualState() {\r\n  packCache = [];\r\n  disableProductInteraction();\r\n  gsap.set(envelopeActor, {\r\n    autoAlpha: 1,\r\n    scale: 1,\r\n    y: 0,\r\n    zIndex: 30,\r\n  });\r\n  packProductsInEnvelope();\r\n}\r\n\r\nfunction initStory() {\r\n  if (!hasStory) return;\r\n\r\n  packCache = [];\r\n\r\n  /* ===== FIRST SCREEN ===== */\r\n  setEnvelopeProgress(0);\r\n  gsap.set(brandTitle, { autoAlpha: 1, y: 0, scale: 1 });\r\n  gsap.set(envelopeActor, {\r\n    transformOrigin: \"50% 20%\",\r\n    autoAlpha: 1,\r\n    scale: 1,\r\n    y: 0,\r\n  });\r\n  gsap.set(shopStage, { autoAlpha: 1, visibility: \"visible\" });\r\n  gsap.set(productCards, { autoAlpha: 0, visibility: \"visible\" });\r\n  if (scrollHint) gsap.set(scrollHint, { autoAlpha: 0.55 });\r\n  if (floor) gsap.set(floor, { opacity: 0.85 });\r\n  shopStage?.classList.remove(\"is-active\");\r\n\r\n  if (reduced) {\r\n    gsap.set(brandTitle, { autoAlpha: 0 });\r\n    gsap.set(envelopeActor, { autoAlpha: 0 });\r\n    if (scrollHint) gsap.set(scrollHint, { autoAlpha: 0 });\r\n    gsap.set(productCards, { clearProps: \"all\", autoAlpha: 1, visibility: \"visible\" });\r\n    setEnvelopeProgress(LAST_FRAME);\r\n    shopStage.classList.add(\"is-active\");\r\n    setHeaderStuck(true);\r\n    return;\r\n  }\r\n\r\n  packProductsInEnvelope();\r\n\r\n  const openState = { frame: 0 };\r\n  const burst = { t: 0 };\r\n  const REVEAL_START = 0.82;\r\n\r\n  function ensurePackCache() {\r\n    if (!packCache.length) {\r\n      packCache = computePack();\r\n    }\r\n  }\r\n\r\n  const tl = gsap.timeline({\r\n    defaults: { ease: \"none\" },\r\n    scrollTrigger: {\r\n      trigger: \".scroll-story\",\r\n      start: \"top top\",\r\n      end: \"bottom bottom\",\r\n      scrub: 0.85,\r\n      pin: \".scroll-story__pin\",\r\n      anticipatePin: 1,\r\n      invalidateOnRefresh: true,\r\n      onUpdate: (self) => {\r\n        if (self.progress >= 0.82) {\r\n          enableProductInteraction();\r\n          setHeaderStuck(true);\r\n        } else if (self.progress < 0.75) {\r\n          disableProductInteraction();\r\n          setHeaderStuck(false);\r\n        }\r\n      },\r\n      onRefresh: (self) => {\r\n        if (self.progress >= 0.9) {\r\n          enableProductInteraction();\r\n        } else if (self.progress < 0.78) {\r\n          resetStoryVisualState();\r\n        } else if (burst.t > 0) {\r\n          packCache = [];\r\n          ensurePackCache();\r\n          applyBurst(burst.t);\r\n        } else {\r\n          packProductsInEnvelope();\r\n        }\r\n      },\r\n    },\r\n  });\r\n\r\n  /* \u2014\u2014 0. Hold first screen \u2014\u2014 */\r\n  if (floor) tl.to(floor, { opacity: 1, duration: 0.04 }, 0);\r\n  tl.to({}, { duration: 0.16 }, 0);\r\n\r\n  /* \u2014\u2014 1. Text goes down \u2014\u2014 */\r\n  if (scrollHint) tl.to(scrollHint, { autoAlpha: 0, duration: 0.06 }, 0.16);\r\n  tl.to(\r\n    brandTitle,\r\n    {\r\n      y: () => textTravelY(),\r\n      scale: 0.7,\r\n      duration: 0.18,\r\n      ease: \"power1.in\",\r\n    },\r\n    0.18\r\n  ).to(brandTitle, { autoAlpha: 0, duration: 0.08, ease: \"power1.in\" }, 0.32);\r\n\r\n  /* \u2014\u2014 2. Envelope opens \u2014\u2014 */\r\n  tl.to(\r\n    openState,\r\n    {\r\n      frame: LAST_FRAME,\r\n      duration: 0.32,\r\n      ease: \"none\",\r\n      onUpdate: () => setEnvelopeProgress(openState.frame),\r\n    },\r\n    0.42\r\n  );\r\n\r\n  /* Hold fully open envelope before reveal scroll \u2014\u2014 */\r\n  tl.to({}, { duration: 0.08 }, 0.74);\r\n\r\n  /* \u2014\u2014 3. One scroll: envelope down + fade, products burst \u2014\u2014 */\r\n  tl.set(envelopeActor, { zIndex: 4 }, REVEAL_START);\r\n\r\n  tl.to(\r\n    envelopeActor,\r\n    {\r\n      y: () => getStoryMotion().fadeY,\r\n      scale: () => getStoryMotion().fadeScale,\r\n      autoAlpha: 0,\r\n      duration: 0.34,\r\n      ease: \"power2.inOut\",\r\n    },\r\n    REVEAL_START\r\n  );\r\n\r\n  tl.to(\r\n    burst,\r\n    {\r\n      t: 1,\r\n      duration: 0.3,\r\n      ease: \"power2.out\",\r\n      onStart: () => {\r\n        packCache = [];\r\n        ensurePackCache();\r\n        applyBurst(0);\r\n      },\r\n      onUpdate: () => applyBurst(burst.t),\r\n      onComplete: enableProductInteraction,\r\n      onReverseComplete: () => {\r\n        resetStoryVisualState();\r\n        burst.t = 0;\r\n      },\r\n    },\r\n    REVEAL_START + 0.08\r\n  );\r\n\r\n  tl.call(enableProductInteraction, null, REVEAL_START + 0.38);\r\n  tl.to({}, { duration: 0.1 }, REVEAL_START + 0.38);\r\n}\r\n\r\n/* Once the hero is fully behind us the header always stays solid. */\r\nfunction initStickyHeader() {\r\n  const storyHero = document.querySelector(\".scroll-story\");\r\n  const imageHero = document.querySelector(\".hero-slider\");\r\n\r\n  if (!siteHeader) return;\r\n\r\n  if (storyHero) {\r\n    ScrollTrigger.create({\r\n      trigger: storyHero,\r\n      start: \"bottom bottom\",\r\n      end: \"max\",\r\n      onEnter: () => setHeaderStuck(true),\r\n    });\r\n    return;\r\n  }\r\n\r\n  if (imageHero) {\r\n    const sync = () => {\r\n      const past = imageHero.getBoundingClientRect().bottom <= siteHeader.offsetHeight + 8;\r\n      setHeaderStuck(past);\r\n    };\r\n    sync();\r\n    window.addEventListener(\"scroll\", sync, { passive: true });\r\n    window.addEventListener(\"resize\", sync);\r\n    return;\r\n  }\r\n\r\n  setHeaderStuck(true);\r\n}\r\n\r\nwindow.addEventListener(\"load\", async () => {\r\n  if (hasStory) {\r\n    window.scrollTo(0, 0);\r\n    document.documentElement.scrollTop = 0;\r\n    document.body.scrollTop = 0;\r\n\r\n    await Promise.all([preloadFrameImages(), preloadProductImages()]);\r\n\r\n    gsap.set(envelopeFrames[0], { opacity: 1 });\r\n    envelopeFrames.slice(1).forEach((f) => gsap.set(f, { opacity: 0 }));\r\n  }\r\n\r\n  ScrollTrigger.getAll().forEach((trigger) => trigger.kill());\r\n\r\n  lenisInstance = setupLenis();\r\n  if (lenisInstance && hasStory) {\r\n    lenisInstance.scrollTo(0, { immediate: true });\r\n  }\r\n\r\n  try {\r\n    initStory();\r\n  } catch (error) {\r\n    console.error(\"Scroll story init failed:\", error);\r\n  }\r\n\r\n  initStickyHeader();\r\n  if (!window.__torrisCartInline) bindProductOpenTriggers();\r\n\r\n  requestAnimationFrame(() => {\r\n    ScrollTrigger.refresh();\r\n    ScrollTrigger.update();\r\n    if (!window.__torrisCartInline) bindProductOpenTriggers();\r\n  });\r\n});\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", () => {\r\n  if (hasStory) window.scrollTo(0, 0);\r\n  syncHeaderHeight();\r\n  initHeroSlider();\r\n  initReviewsSlider();\r\n  initProcessSlider();\r\n  initCatalogSlider();\r\n  if (!window.__torrisCartInline) {\r\n    initCatalogForms();\r\n    initProductQuickView();\r\n    initProductPage();\r\n  }\r\n  initCartPage();\r\n  if (!window.__torrisCartInline) bindProductOpenTriggers();\r\n});\r\n\r\nwindow.addEventListener(\"resize\", syncHeaderHeight);\r\n\r\nwindow.addEventListener(\"pageshow\", (event) => {\r\n  if (hasStory) {\r\n    window.scrollTo(0, 0);\r\n    if (lenisInstance) {\r\n      lenisInstance.scrollTo(0, { immediate: true });\r\n    }\r\n  }\r\n  if (!window.__torrisCartInline) bindProductOpenTriggers();\r\n  if (event.persisted) {\r\n    ScrollTrigger.refresh();\r\n    ScrollTrigger.update();\r\n  }\r\n});\r\n\r\nfunction debounce(fn, wait) {\r\n  let timeoutId = null;\r\n  return (...args) => {\r\n    window.clearTimeout(timeoutId);\r\n    timeoutId = window.setTimeout(() => fn(...args), wait);\r\n  };\r\n}\r\n\r\nwindow.addEventListener(\r\n  \"resize\",\r\n  debounce(() => ScrollTrigger.refresh(), 250)\r\n);\r\n\r\n/* \u2014\u2014 Process slider \u2014\u2014 */\r\nfunction initProcessSlider() {\r\n  const viewport = document.querySelector(\".process-slider__viewport\");\r\n  if (!viewport || viewport.dataset.ready === \"true\") return;\r\n  viewport.dataset.ready = \"true\";\r\n\r\n  const track = viewport.querySelector(\".process-slider__track\");\r\n  const slides = Array.from(viewport.querySelectorAll(\".process-slide\"));\r\n  const prevBtn = viewport.querySelector(\".process-slider__nav--prev\");\r\n  const nextBtn = viewport.querySelector(\".process-slider__nav--next\");\r\n  const currentEl = viewport.querySelector(\".process-slider__current\");\r\n  const totalEl = viewport.querySelector(\".process-slider__total\");\r\n  const AUTOPLAY_MS = 4500;\r\n  const START_INDEX = 0;\r\n  let index = START_INDEX;\r\n  let autoplayId = null;\r\n  let slideWidth = 0;\r\n\r\n  if (!track || !slides.length) return;\r\n\r\n  if (totalEl) totalEl.textContent = String(slides.length).padStart(2, \"0\");\r\n\r\n  function measure() {\r\n    slideWidth = viewport.clientWidth;\r\n    slides.forEach((slide) => {\r\n      slide.style.width = `${slideWidth}px`;\r\n      slide.style.flexBasis = `${slideWidth}px`;\r\n    });\r\n    track.style.width = `${slideWidth * slides.length}px`;\r\n    applyTransform(false);\r\n  }\r\n\r\n  function applyTransform(animate) {\r\n    track.style.transition = animate\r\n      ? \"transform 0.65s cubic-bezier(0.22, 1, 0.36, 1)\"\r\n      : \"none\";\r\n    track.style.transform = `translate3d(${-index * slideWidth}px, 0, 0)`;\r\n\r\n    slides.forEach((slide, i) => slide.classList.toggle(\"is-active\", i === index));\r\n    if (currentEl) currentEl.textContent = String(index + 1).padStart(2, \"0\");\r\n  }\r\n\r\n  function goTo(next, animate = true) {\r\n    index = (next + slides.length) % slides.length;\r\n    applyTransform(animate);\r\n  }\r\n\r\n  function startAutoplay() {\r\n    if (slides.length <= 1 || reduced) return;\r\n    stopAutoplay();\r\n    autoplayId = window.setInterval(() => goTo(index + 1), AUTOPLAY_MS);\r\n  }\r\n\r\n  function stopAutoplay() {\r\n    if (autoplayId) {\r\n      window.clearInterval(autoplayId);\r\n      autoplayId = null;\r\n    }\r\n  }\r\n\r\n  prevBtn?.addEventListener(\"click\", (e) => {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    goTo(index - 1);\r\n    startAutoplay();\r\n  });\r\n\r\n  nextBtn?.addEventListener(\"click\", (e) => {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    goTo(index + 1);\r\n    startAutoplay();\r\n  });\r\n\r\n  viewport.addEventListener(\"mouseenter\", stopAutoplay);\r\n  viewport.addEventListener(\"mouseleave\", startAutoplay);\r\n\r\n  window.addEventListener(\"resize\", () => {\r\n    measure();\r\n  });\r\n\r\n  requestAnimationFrame(() => {\r\n    measure();\r\n    startAutoplay();\r\n  });\r\n}\r\n\r\n/* \u2014\u2014 Homepage hero image slider \u2014\u2014 */\r\nfunction initHeroSlider(root = document) {\r\n  const sections = Array.from(root.querySelectorAll(\"[data-hero-slider]\")).filter(\r\n    (section) => section.dataset.ready !== \"true\"\r\n  );\r\n\r\n  sections.forEach((section) => {\r\n    const track = section.querySelector(\"[data-hero-track]\");\r\n    const slides = Array.from(section.querySelectorAll(\"[data-hero-slide]\"));\r\n    const dots = Array.from(section.querySelectorAll(\"[data-hero-dot]\"));\r\n    const prevBtn = section.querySelector(\"[data-hero-prev]\");\r\n    const nextBtn = section.querySelector(\"[data-hero-next]\");\r\n    if (!track || slides.length < 1) return;\r\n\r\n    section.dataset.ready = \"true\";\r\n    let index = 0;\r\n    let timer = null;\r\n    const autoplay = Math.max(3000, Number(section.dataset.autoplay) || 5000);\r\n    section.style.setProperty(\"--hero-autoplay\", `${autoplay}ms`);\r\n\r\n    function slideOffset() {\r\n      const width = section.querySelector(\"[data-hero-viewport]\")?.clientWidth || section.clientWidth || window.innerWidth;\r\n      return index * width;\r\n    }\r\n\r\n    function goTo(next, restart = true) {\r\n      index = ((next % slides.length) + slides.length) % slides.length;\r\n      track.style.transform = `translate3d(${-slideOffset()}px, 0, 0)`;\r\n      slides.forEach((slide, i) => {\r\n        const on = i === index;\r\n        slide.classList.toggle(\"is-active\", on);\r\n        slide.setAttribute(\"aria-hidden\", on ? \"false\" : \"true\");\r\n      });\r\n      dots.forEach((dot, i) => {\r\n        const on = i === index;\r\n        dot.classList.toggle(\"is-active\", on);\r\n        dot.setAttribute(\"aria-selected\", on ? \"true\" : \"false\");\r\n        const progress = dot.querySelector(\".hero-slider__dot-progress\");\r\n        if (progress) {\r\n          progress.style.animation = \"none\";\r\n          void progress.offsetWidth;\r\n          progress.style.animation = \"\";\r\n        }\r\n      });\r\n      if (restart) start();\r\n    }\r\n\r\n    window.addEventListener(\"resize\", () => {\r\n      track.style.transition = \"none\";\r\n      track.style.transform = `translate3d(${-slideOffset()}px, 0, 0)`;\r\n      requestAnimationFrame(() => {\r\n        track.style.transition = \"\";\r\n      });\r\n    });\r\n\r\n    function start() {\r\n      stop();\r\n      if (slides.length < 2 || window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) return;\r\n      timer = window.setInterval(() => goTo(index + 1), autoplay);\r\n    }\r\n\r\n    function stop() {\r\n      if (timer) window.clearInterval(timer);\r\n      timer = null;\r\n    }\r\n\r\n    prevBtn?.addEventListener(\"click\", () => goTo(index - 1));\r\n    nextBtn?.addEventListener(\"click\", () => goTo(index + 1));\r\n    dots.forEach((dot) => {\r\n      dot.addEventListener(\"click\", () => goTo(Number(dot.dataset.heroDot) || 0));\r\n    });\r\n\r\n    section.addEventListener(\"mouseenter\", () => {\r\n      section.classList.add(\"is-paused\");\r\n      stop();\r\n    });\r\n    section.addEventListener(\"mouseleave\", () => {\r\n      section.classList.remove(\"is-paused\");\r\n      start();\r\n    });\r\n    section.addEventListener(\"focusin\", () => {\r\n      section.classList.add(\"is-paused\");\r\n      stop();\r\n    });\r\n    section.addEventListener(\"focusout\", (event) => {\r\n      if (section.contains(event.relatedTarget)) return;\r\n      section.classList.remove(\"is-paused\");\r\n      start();\r\n    });\r\n\r\n    let touchX = null;\r\n    section.addEventListener(\r\n      \"touchstart\",\r\n      (event) => {\r\n        touchX = event.changedTouches[0]?.clientX ?? null;\r\n        stop();\r\n      },\r\n      { passive: true }\r\n    );\r\n    section.addEventListener(\r\n      \"touchend\",\r\n      (event) => {\r\n        if (touchX == null) return;\r\n        const delta = (event.changedTouches[0]?.clientX ?? touchX) - touchX;\r\n        touchX = null;\r\n        if (Math.abs(delta) > 40) goTo(index + (delta < 0 ? 1 : -1));\r\n        else start();\r\n      },\r\n      { passive: true }\r\n    );\r\n\r\n    goTo(0);\r\n  });\r\n}\r\n\r\n/* \u2014\u2014 Reviews slider (multi-card pages + dots) \u2014\u2014 */\r\nfunction initReviewsSlider(root = document) {\r\n  const sections = Array.from(root.querySelectorAll(\"[data-reviews]\")).filter(\r\n    (section) => section.dataset.ready !== \"true\"\r\n  );\r\n\r\n  sections.forEach((section) => {\r\n    const track = section.querySelector(\"[data-reviews-track]\");\r\n    const viewport = section.querySelector(\"[data-reviews-viewport]\");\r\n    const dotsWrap = section.querySelector(\"[data-reviews-dots]\");\r\n    const slides = Array.from(section.querySelectorAll(\"[data-reviews-slide]\"));\r\n    if (!track || !viewport || slides.length < 1) return;\r\n\r\n    section.dataset.ready = \"true\";\r\n    let index = 0;\r\n    let timer = null;\r\n    let dots = [];\r\n    const autoplay = Math.max(4000, Number(section.dataset.autoplay) || 6000);\r\n\r\n    function perView() {\r\n      const raw = getComputedStyle(section).getPropertyValue(\"--reviews-per-view\").trim();\r\n      const n = Number(raw);\r\n      return Number.isFinite(n) && n > 0 ? n : 1;\r\n    }\r\n\r\n    function pageCount() {\r\n      return Math.max(1, Math.ceil(slides.length / perView()));\r\n    }\r\n\r\n    function buildDots() {\r\n      if (!dotsWrap) return;\r\n      const pages = pageCount();\r\n      dotsWrap.innerHTML = \"\";\r\n      dots = [];\r\n      if (pages < 2) return;\r\n      for (let i = 0; i < pages; i += 1) {\r\n        const dot = document.createElement(\"button\");\r\n        dot.type = \"button\";\r\n        dot.className = \"reviews__dot\";\r\n        dot.dataset.reviewsDot = String(i);\r\n        dot.setAttribute(\"role\", \"tab\");\r\n        dot.setAttribute(\"aria-label\", `Go to reviews page ${i + 1}`);\r\n        dot.addEventListener(\"click\", () => goTo(i));\r\n        dotsWrap.appendChild(dot);\r\n        dots.push(dot);\r\n      }\r\n    }\r\n\r\n    function offset() {\r\n      return index * viewport.clientWidth;\r\n    }\r\n\r\n    function goTo(next, restart = true) {\r\n      const pages = pageCount();\r\n      index = ((next % pages) + pages) % pages;\r\n      track.style.transform = `translate3d(${-offset()}px, 0, 0)`;\r\n      const start = index * perView();\r\n      const end = start + perView();\r\n      slides.forEach((slide, i) => {\r\n        const on = i >= start && i < end;\r\n        slide.classList.toggle(\"is-active\", on);\r\n        slide.setAttribute(\"aria-hidden\", on ? \"false\" : \"true\");\r\n      });\r\n      dots.forEach((dot, i) => {\r\n        const on = i === index;\r\n        dot.classList.toggle(\"is-active\", on);\r\n        dot.setAttribute(\"aria-selected\", on ? \"true\" : \"false\");\r\n      });\r\n      if (restart) startAuto();\r\n    }\r\n\r\n    function startAuto() {\r\n      stop();\r\n      if (pageCount() < 2 || window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) return;\r\n      timer = window.setInterval(() => goTo(index + 1), autoplay);\r\n    }\r\n\r\n    function stop() {\r\n      if (timer) window.clearInterval(timer);\r\n      timer = null;\r\n    }\r\n\r\n    section.addEventListener(\"mouseenter\", stop);\r\n    section.addEventListener(\"mouseleave\", startAuto);\r\n    window.addEventListener(\"resize\", () => {\r\n      buildDots();\r\n      if (index >= pageCount()) index = 0;\r\n      track.style.transition = \"none\";\r\n      track.style.transform = `translate3d(${-offset()}px, 0, 0)`;\r\n      requestAnimationFrame(() => {\r\n        track.style.transition = \"\";\r\n        goTo(index, false);\r\n      });\r\n    });\r\n\r\n    /* Touch / pointer swipe \u2014 continuous forward & back */\r\n    let pointerId = null;\r\n    let startX = 0;\r\n    let startY = 0;\r\n    let dragX = 0;\r\n    let dragging = false;\r\n    let locked = null;\r\n\r\n    function onPointerDown(event) {\r\n      if (pageCount() < 2) return;\r\n      if (event.pointerType === \"mouse\" && event.button !== 0) return;\r\n      pointerId = event.pointerId;\r\n      startX = event.clientX;\r\n      startY = event.clientY;\r\n      dragX = 0;\r\n      dragging = true;\r\n      locked = null;\r\n      stop();\r\n      track.style.transition = \"none\";\r\n      try {\r\n        viewport.setPointerCapture(pointerId);\r\n      } catch (_) {\r\n        /* ignore */\r\n      }\r\n    }\r\n\r\n    function onPointerMove(event) {\r\n      if (!dragging || event.pointerId !== pointerId) return;\r\n      const dx = event.clientX - startX;\r\n      const dy = event.clientY - startY;\r\n      if (locked == null && (Math.abs(dx) > 6 || Math.abs(dy) > 6)) {\r\n        locked = Math.abs(dx) > Math.abs(dy) ? \"x\" : \"y\";\r\n      }\r\n      if (locked !== \"x\") return;\r\n      if (event.cancelable) event.preventDefault();\r\n      dragX = dx;\r\n      track.style.transform = `translate3d(${-(offset() - dragX)}px, 0, 0)`;\r\n    }\r\n\r\n    function onPointerUp(event) {\r\n      if (!dragging || event.pointerId !== pointerId) return;\r\n      dragging = false;\r\n      track.style.transition = \"\";\r\n      try {\r\n        viewport.releasePointerCapture(pointerId);\r\n      } catch (_) {\r\n        /* ignore */\r\n      }\r\n      pointerId = null;\r\n      if (locked === \"x\" && Math.abs(dragX) > 48) {\r\n        goTo(index + (dragX < 0 ? 1 : -1));\r\n      } else {\r\n        goTo(index);\r\n      }\r\n      dragX = 0;\r\n      locked = null;\r\n    }\r\n\r\n    viewport.addEventListener(\"pointerdown\", onPointerDown);\r\n    viewport.addEventListener(\"pointermove\", onPointerMove, { passive: false });\r\n    viewport.addEventListener(\"pointerup\", onPointerUp);\r\n    viewport.addEventListener(\"pointercancel\", onPointerUp);\r\n\r\n    buildDots();\r\n    goTo(0);\r\n  });\r\n}\r\n\r\n/* \u2014\u2014 Catalog slider (Shopify collection grid) \u2014\u2014 */\r\nfunction syncHeaderHeight() {\r\n  const header = document.querySelector(\".site-header\");\r\n  if (!header) return;\r\n  const height = Math.ceil(header.getBoundingClientRect().height);\r\n  if (height > 0) {\r\n    document.documentElement.style.setProperty(\"--header-h\", `${height}px`);\r\n  }\r\n}\r\n\r\nfunction initCatalogSlider() {\r\n  const section = document.querySelector(\"[data-catalog-root], .catalog\");\r\n  if (!section) return;\r\n\r\n  /* Section reorder keeps the same node \u2014 just remeasure. Fresh HTML needs a full bind. */\r\n  if (section.dataset.ready === \"true\") {\r\n    if (typeof section.__catalogMeasure === \"function\") section.__catalogMeasure();\r\n    return;\r\n  }\r\n  section.dataset.ready = \"true\";\r\n\r\n  const viewport = section.querySelector(\".catalog__viewport\");\r\n  const pager = section.querySelector(\"[data-catalog-pager]\");\r\n  const prevBtn = section.querySelector(\".catalog__nav--prev\");\r\n  const nextBtn = section.querySelector(\".catalog__nav--next\");\r\n  const dotsHost = section.querySelector(\"[data-catalog-dots]\");\r\n  const filterLinks = Array.from(section.querySelectorAll(\"[data-catalog-filter], .catalog__filter-link\"));\r\n  const viewAll = section.querySelector(\"[data-catalog-view-all]\");\r\n  let track = section.querySelector(\".catalog__track:not([hidden])\") || section.querySelector(\".catalog__track\");\r\n  let items = [];\r\n  let index = 0;\r\n  let visibleCount = 4;\r\n  let itemWidth = 0;\r\n  let trackGap = 0;\r\n\r\n  if (!viewport || !track) return;\r\n\r\n  function activeTrack() {\r\n    return section.querySelector(\".catalog__track:not([hidden])\") || section.querySelector(\".catalog__track\");\r\n  }\r\n\r\n  function refreshItems() {\r\n    track = activeTrack();\r\n    items = track ? Array.from(track.querySelectorAll(\".catalog__item, .grid__item\")).filter((item) => !item.classList.contains(\"catalog__empty\")) : [];\r\n  }\r\n\r\n  function isGridMode() {\r\n    return window.innerWidth <= 1024;\r\n  }\r\n\r\n  function getVisibleCount() {\r\n    const w = window.innerWidth;\r\n    if (isGridMode()) return Math.max(items.length, 1);\r\n    if (w < 1280) return Math.min(3, Math.max(items.length, 1));\r\n    return Math.min(4, Math.max(items.length, 1));\r\n  }\r\n\r\n  function maxIndex() {\r\n    return Math.max(0, items.length - visibleCount);\r\n  }\r\n\r\n  function slideOffset() {\r\n    return index * (itemWidth + trackGap);\r\n  }\r\n\r\n  function applyTransform(animate) {\r\n    if (!track) return;\r\n    track.style.transition = animate\r\n      ? \"transform 0.55s cubic-bezier(0.22, 1, 0.36, 1)\"\r\n      : \"none\";\r\n    track.style.transform = `translate3d(${-slideOffset()}px, 0, 0)`;\r\n  }\r\n\r\n  function renderDots() {\r\n    if (!dotsHost) return;\r\n    const pages = Math.max(0, maxIndex()) + 1;\r\n    const needPager = !isGridMode() && pages > 1 && items.length > 0;\r\n\r\n    if (pager) pager.hidden = !needPager;\r\n    if (!needPager) {\r\n      dotsHost.innerHTML = \"\";\r\n      return;\r\n    }\r\n\r\n    if (dotsHost.childElementCount !== pages) {\r\n      dotsHost.innerHTML = Array.from({ length: pages }, (_, i) => {\r\n        return `<button type=\"button\" class=\"catalog__dot\" data-catalog-dot=\"${i}\" role=\"tab\" aria-label=\"Go to page ${i + 1}\"></button>`;\r\n      }).join(\"\");\r\n    }\r\n\r\n    Array.from(dotsHost.children).forEach((dot, i) => {\r\n      const on = i === index;\r\n      dot.classList.toggle(\"is-active\", on);\r\n      dot.setAttribute(\"aria-selected\", on ? \"true\" : \"false\");\r\n    });\r\n  }\r\n\r\n  function updateNav() {\r\n    const fitsOnScreen = maxIndex() === 0 || items.length === 0 || isGridMode();\r\n\r\n    if (prevBtn) {\r\n      prevBtn.disabled = index <= 0 || fitsOnScreen;\r\n    }\r\n\r\n    if (nextBtn) {\r\n      nextBtn.disabled = index >= maxIndex() || fitsOnScreen;\r\n    }\r\n\r\n    renderDots();\r\n  }\r\n\r\n  function measure() {\r\n    refreshItems();\r\n    if (!track) return;\r\n    visibleCount = getVisibleCount();\r\n\r\n    if (isGridMode()) {\r\n      track.style.transition = \"none\";\r\n      track.style.transform = \"none\";\r\n      track.style.width = \"100%\";\r\n      items.forEach((item) => {\r\n        item.style.width = \"\";\r\n        item.style.flexBasis = \"\";\r\n      });\r\n      index = 0;\r\n      updateNav();\r\n      return;\r\n    }\r\n\r\n    trackGap = parseFloat(getComputedStyle(track).columnGap || getComputedStyle(track).gap) || 0;\r\n    itemWidth = items.length\r\n      ? (viewport.clientWidth - trackGap * (visibleCount - 1)) / visibleCount\r\n      : viewport.clientWidth;\r\n\r\n    items.forEach((item) => {\r\n      item.style.width = `${itemWidth}px`;\r\n      item.style.flexBasis = `${itemWidth}px`;\r\n    });\r\n\r\n    track.style.width = items.length\r\n      ? `${items.length * itemWidth + (items.length - 1) * trackGap}px`\r\n      : \"100%\";\r\n    index = Math.min(index, maxIndex());\r\n    applyTransform(false);\r\n    updateNav();\r\n  }\r\n\r\n  function goTo(next, animate = true) {\r\n    index = Math.max(0, Math.min(maxIndex(), next));\r\n    applyTransform(animate);\r\n    updateNav();\r\n  }\r\n\r\n  function showPanel(panelId) {\r\n    const panels = Array.from(section.querySelectorAll(\"[data-catalog-panel-track]\"));\r\n    panels.forEach((panel) => {\r\n      const on = panel.id === panelId;\r\n      panel.hidden = !on;\r\n      if (!on) {\r\n        panel.style.transform = \"none\";\r\n        panel.style.width = \"\";\r\n      }\r\n    });\r\n\r\n    const active = section.querySelector(`#${CSS.escape(panelId)}`);\r\n    if (viewAll && active) {\r\n      const url = active.getAttribute(\"data-catalog-view-url\");\r\n      if (url) viewAll.setAttribute(\"href\", url);\r\n    }\r\n\r\n    index = 0;\r\n    requestAnimationFrame(measure);\r\n  }\r\n\r\n  prevBtn?.addEventListener(\"click\", (event) => {\r\n    event.preventDefault();\r\n    goTo(index - 1);\r\n  });\r\n\r\n  nextBtn?.addEventListener(\"click\", (event) => {\r\n    event.preventDefault();\r\n    goTo(index + 1);\r\n  });\r\n\r\n  dotsHost?.addEventListener(\"click\", (event) => {\r\n    const dot = event.target.closest(\"[data-catalog-dot]\");\r\n    if (!dot || !dotsHost.contains(dot)) return;\r\n    event.preventDefault();\r\n    goTo(Number(dot.getAttribute(\"data-catalog-dot\")) || 0);\r\n  });\r\n\r\n  filterLinks.forEach((link) => {\r\n    link.addEventListener(\"click\", (event) => {\r\n      event.preventDefault();\r\n      const panelId = link.getAttribute(\"data-catalog-panel\");\r\n      if (!panelId) return;\r\n\r\n      filterLinks.forEach((item) => {\r\n        const on = item === link;\r\n        item.classList.toggle(\"is-active\", on);\r\n        item.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\r\n      });\r\n\r\n      showPanel(panelId);\r\n    });\r\n  });\r\n\r\n  window.addEventListener(\"resize\", () => {\r\n    measure();\r\n  });\r\n\r\n  section.__catalogMeasure = measure;\r\n  requestAnimationFrame(measure);\r\n}\r\n\r\nfunction refreshCatalogAfterSectionChange(container, forceRebind) {\r\n  const root =\r\n    (container && container.querySelector && container.querySelector(\"[data-catalog-root], .catalog\")) ||\r\n    (container && container.matches && container.matches(\"[data-catalog-root], .catalog\") && container) ||\r\n    document.querySelector(\"[data-catalog-root], .catalog\");\r\n\r\n  if (root && forceRebind) {\r\n    delete root.dataset.ready;\r\n    root.__catalogMeasure = null;\r\n  }\r\n\r\n  if (root) initCatalogSlider();\r\n  syncHeaderHeight();\r\n}\r\n\r\ndocument.addEventListener(\"shopify:section:load\", (event) => {\r\n  refreshCatalogAfterSectionChange(event.target, true);\r\n  const hero = event.target.querySelector?.(\"[data-hero-slider]\");\r\n  if (hero) {\r\n    delete hero.dataset.ready;\r\n    initHeroSlider(event.target);\r\n  } else if (event.target.matches?.(\"[data-hero-slider]\")) {\r\n    delete event.target.dataset.ready;\r\n    initHeroSlider(event.target.parentElement || document);\r\n  }\r\n\r\n  const reviews = event.target.querySelector?.(\"[data-reviews]\");\r\n  if (reviews) {\r\n    delete reviews.dataset.ready;\r\n    initReviewsSlider(event.target);\r\n  } else if (event.target.matches?.(\"[data-reviews]\")) {\r\n    delete event.target.dataset.ready;\r\n    initReviewsSlider(event.target.parentElement || document);\r\n  }\r\n});\r\n\r\ndocument.addEventListener(\"shopify:section:reorder\", () => {\r\n  refreshCatalogAfterSectionChange(document, false);\r\n});\r\n\r\ndocument.addEventListener(\"shopify:section:select\", (event) => {\r\n  refreshCatalogAfterSectionChange(event.target, false);\r\n});\r\n\r\n/* \u2014\u2014 Product quick view \u2014\u2014 */\r\n\r\n/* Used when a card carries no Shopify variant data (static preview / demo store). */\r\nconst DEMO_SIZES = [\"S\", \"M\", \"L\", \"XL\"];\r\nconst DEMO_COLORS = [\"Black\", \"Gray\", \"Navy\"];\r\n\r\nconst COLOR_OPTION_NAMES = [\"color\", \"colour\", \"colours\", \"colors\"];\r\nconst SIZE_ORDER = [\"XXS\", \"XS\", \"S\", \"M\", \"L\", \"XL\", \"XXL\", \"2XL\", \"3XL\", \"4XL\"];\r\n\r\nconst SWATCH_HEX = {\r\n  black: \"#1a1a1a\",\r\n  white: \"#f2efe9\",\r\n  ivory: \"#f4efe6\",\r\n  cream: \"#ebe4d8\",\r\n  beige: \"#d8cbb8\",\r\n  sand: \"#cbbba4\",\r\n  gray: \"#9a9590\",\r\n  grey: \"#9a9590\",\r\n  charcoal: \"#3a3530\",\r\n  brown: \"#5c4f45\",\r\n  tan: \"#b99a76\",\r\n  navy: \"#1e3348\",\r\n  blue: \"#2f4d7a\",\r\n  \"ink blue\": \"#1a2840\",\r\n  ink: \"#1a1a1a\",\r\n  green: \"#3f5f4a\",\r\n  olive: \"#5a5f47\",\r\n  red: \"#8c2f2a\",\r\n  burgundy: \"#5e2230\",\r\n  pink: \"#d9b3b3\",\r\n  yellow: \"#d9bc63\",\r\n  orange: \"#c2703d\",\r\n  purple: \"#5b4570\",\r\n};\r\n\r\nfunction parseJsonAttribute(value) {\r\n  if (!value) return null;\r\n  try {\r\n    return JSON.parse(value);\r\n  } catch {\r\n    return null;\r\n  }\r\n}\r\n\r\nfunction normOptionValue(value) {\r\n  return String(value ?? \"\").trim();\r\n}\r\n\r\nfunction normalizeVariant(variant) {\r\n  return {\r\n    ...variant,\r\n    id: String(variant?.id ?? \"\"),\r\n    price: variant?.price || \"\",\r\n    price_raw: Number(variant?.price_raw ?? 0),\r\n    compare_at_price: variant?.compare_at_price || null,\r\n    compare_at_price_raw: Number(variant?.compare_at_price_raw ?? 0),\r\n    options: (variant?.options || []).map(normOptionValue),\r\n    available: variant?.available !== false,\r\n  };\r\n}\r\n\r\nfunction isSizeOption(name) {\r\n  return String(name || \"\")\r\n    .trim()\r\n    .toLowerCase()\r\n    .includes(\"size\");\r\n}\r\n\r\nfunction sortOptionValues(name, values) {\r\n  if (!isSizeOption(name)) return values;\r\n\r\n  return [...values].sort((a, b) => {\r\n    const aKey = normOptionValue(a).toUpperCase();\r\n    const bKey = normOptionValue(b).toUpperCase();\r\n    const aIndex = SIZE_ORDER.indexOf(aKey);\r\n    const bIndex = SIZE_ORDER.indexOf(bKey);\r\n\r\n    if (aIndex === -1 && bIndex === -1) return aKey.localeCompare(bKey);\r\n    if (aIndex === -1) return 1;\r\n    if (bIndex === -1) return -1;\r\n    return aIndex - bIndex;\r\n  });\r\n}\r\n\r\nfunction variantDiscountPercent(variant) {\r\n  const compare = variant?.compare_at_price_raw || 0;\r\n  const price = variant?.price_raw || 0;\r\n  if (!compare || compare <= price) return null;\r\n  return Math.round(((compare - price) / compare) * 100);\r\n}\r\n\r\nfunction shouldShowOption(option) {\r\n  return !(option.values.length === 1 && normOptionValue(option.values[0]) === \"Default Title\");\r\n}\r\n\r\nfunction buildDemoProduct(card) {\r\n  const baseId = Number(card.dataset.variantId || 0);\r\n  const price = card.dataset.productPrice || \"\";\r\n  const comparePrice = card.dataset.productComparePrice || null;\r\n  const variants = [];\r\n  let offset = 0;\r\n\r\n  DEMO_SIZES.forEach((size) => {\r\n    DEMO_COLORS.forEach((color) => {\r\n      variants.push(\r\n        normalizeVariant({\r\n          id: String(baseId + offset),\r\n          available: true,\r\n          price,\r\n          compare_at_price: comparePrice,\r\n          options: [size, color],\r\n        })\r\n      );\r\n      offset += 1;\r\n    });\r\n  });\r\n\r\n  return {\r\n    options: [\r\n      { name: \"Size\", position: 1, values: DEMO_SIZES },\r\n      { name: \"Color\", position: 2, values: DEMO_COLORS },\r\n    ],\r\n    variants,\r\n    images: {\r\n      primary: card.dataset.productImage || \"\",\r\n      secondary: null,\r\n    },\r\n  };\r\n}\r\n\r\nfunction readProductData(card) {\r\n  const script = card.querySelector(\"[data-product-json]\");\r\n  if (script) {\r\n    try {\r\n      const data = JSON.parse(script.textContent.trim());\r\n      if (Array.isArray(data.options) && data.options.length && Array.isArray(data.variants) && data.variants.length) {\r\n        return {\r\n          options: data.options.map((option) => ({\r\n            ...option,\r\n            values: (option.values || []).map(normOptionValue),\r\n          })),\r\n          variants: data.variants.map(normalizeVariant),\r\n          images: {\r\n            primary: data.featured_image || card.dataset.productImage || \"\",\r\n            secondary: data.secondary_image || null,\r\n          },\r\n        };\r\n      }\r\n    } catch (error) {\r\n      console.warn(\"Product JSON parse failed:\", error);\r\n    }\r\n  }\r\n\r\n  const options = parseJsonAttribute(card.getAttribute(\"data-product-options\"));\r\n  const variants = parseJsonAttribute(card.getAttribute(\"data-product-variants\"));\r\n\r\n  if (Array.isArray(options) && options.length && Array.isArray(variants) && variants.length) {\r\n    return {\r\n      options: options.map((option) => ({\r\n        ...option,\r\n        values: (option.values || []).map(normOptionValue),\r\n      })),\r\n      variants: variants.map(normalizeVariant),\r\n      images: {\r\n        primary: card.dataset.productImage || \"\",\r\n        secondary: null,\r\n      },\r\n    };\r\n  }\r\n\r\n  if (document.body?.dataset.shopifyTheme === \"true\") {\r\n    const fallbackId = card.dataset.variantId || \"\";\r\n    return {\r\n      options: [],\r\n      variants: fallbackId\r\n        ? [\r\n            normalizeVariant({\r\n              id: fallbackId,\r\n              available: true,\r\n              price: card.dataset.productPrice || \"\",\r\n              options: [],\r\n            }),\r\n          ]\r\n        : [],\r\n      images: {\r\n        primary: card.dataset.productImage || \"\",\r\n        secondary: null,\r\n      },\r\n    };\r\n  }\r\n\r\n  return buildDemoProduct(card);\r\n}\r\n\r\nfunction renderModalPrice(el, variant, fallback) {\r\n  if (!el) return;\r\n\r\n  el.innerHTML = \"\";\r\n\r\n  if (!variant?.price) {\r\n    el.textContent = fallback;\r\n    return;\r\n  }\r\n\r\n  if (variant.compare_at_price) {\r\n    const compare = document.createElement(\"s\");\r\n    compare.className = \"product-modal__price-compare\";\r\n    compare.textContent = variant.compare_at_price;\r\n\r\n    const current = document.createElement(\"span\");\r\n    current.className = \"product-modal__price-current\";\r\n    current.textContent = variant.price;\r\n\r\n    el.appendChild(compare);\r\n    el.appendChild(document.createTextNode(\" \"));\r\n    el.appendChild(current);\r\n    return;\r\n  }\r\n\r\n  el.textContent = variant.price;\r\n}\r\n\r\nfunction setModalImages({ primary, secondary, alt, variantImage }) {\r\n  const primaryEl = document.getElementById(\"ProductModalImage\");\r\n  const altEl = document.getElementById(\"ProductModalImageAlt\");\r\n  const wrap = document.getElementById(\"ProductModalHoverImages\");\r\n\r\n  if (!primaryEl) return;\r\n\r\n  const mainImage = variantImage || primary || \"\";\r\n  primaryEl.src = mainImage;\r\n  primaryEl.alt = alt || \"\";\r\n\r\n  const hoverImage = secondary && secondary !== mainImage ? secondary : \"\";\r\n\r\n  if (altEl && hoverImage) {\r\n    altEl.src = hoverImage;\r\n    altEl.hidden = false;\r\n    wrap?.classList.add(\"product-hover-images--swap\");\r\n  } else {\r\n    if (altEl) {\r\n      altEl.removeAttribute(\"src\");\r\n      altEl.hidden = true;\r\n    }\r\n    wrap?.classList.remove(\"product-hover-images--swap\");\r\n  }\r\n}\r\n\r\nfunction isColorOption(name) {\r\n  return COLOR_OPTION_NAMES.includes(String(name || \"\").trim().toLowerCase());\r\n}\r\n\r\nfunction hashToSwatchColor(value) {\r\n  let hash = 0;\r\n  for (let i = 0; i < value.length; i += 1) {\r\n    hash = value.charCodeAt(i) + ((hash << 5) - hash);\r\n  }\r\n  const hue = Math.abs(hash) % 360;\r\n  return `hsl(${hue}, 38%, 32%)`;\r\n}\r\n\r\nfunction swatchColor(value) {\r\n  const raw = String(value || \"\").trim();\r\n  if (!raw) return \"#9a9590\";\r\n\r\n  if (/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(raw)) return raw;\r\n\r\n  const key = raw.toLowerCase();\r\n  if (SWATCH_HEX[key]) return SWATCH_HEX[key];\r\n\r\n  const tokens = key.split(/[\\s\\-/]+/).filter(Boolean);\r\n  for (const token of tokens) {\r\n    if (SWATCH_HEX[token]) return SWATCH_HEX[token];\r\n  }\r\n\r\n  const sortedNames = Object.keys(SWATCH_HEX).sort((a, b) => b.length - a.length);\r\n  for (const name of sortedNames) {\r\n    if (key.includes(name)) return SWATCH_HEX[name];\r\n  }\r\n\r\n  return hashToSwatchColor(raw);\r\n}\r\n\r\n/**\r\n * Renders one pill/swatch group per product option and keeps the selection\r\n * pointing at a real variant. Shared by the quick-view modal and product page.\r\n */\r\nfunction mountVariantPicker({ root, options, variants, onChange }) {\r\n  if (!root) return;\r\n\r\n  const firstAvailable =\r\n    variants.find((variant) => variant.available !== false) || variants[0];\r\n  let selected = firstAvailable ? [...firstAvailable.options] : [];\r\n\r\n  function findVariant() {\r\n    return variants.find(\r\n      (variant) =>\r\n        variant.options.length === selected.length &&\r\n        variant.options.every((value, i) => normOptionValue(value) === normOptionValue(selected[i]))\r\n    );\r\n  }\r\n\r\n  function valueIsAvailable(index, value) {\r\n    const normalized = normOptionValue(value);\r\n    return variants.some(\r\n      (variant) =>\r\n        normOptionValue(variant.options[index]) === normalized && variant.available !== false\r\n    );\r\n  }\r\n\r\n  function sync() {\r\n    let variant = findVariant();\r\n\r\n    if (!variant || variant.available === false) {\r\n      const repaired = variants.find((candidate) => candidate.available !== false);\r\n      if (repaired) {\r\n        selected = [...repaired.options];\r\n        variant = repaired;\r\n      }\r\n    }\r\n\r\n    root.querySelectorAll(\"[data-option-value]\").forEach((button) => {\r\n      const index = Number(button.dataset.optionIndex);\r\n      const isSelected =\r\n        normOptionValue(selected[index]) === normOptionValue(button.dataset.optionValue);\r\n      button.classList.toggle(\"is-selected\", isSelected);\r\n      button.setAttribute(\"aria-checked\", isSelected ? \"true\" : \"false\");\r\n    });\r\n\r\n    onChange?.(variant);\r\n  }\r\n\r\n  function choose(index, value) {\r\n    selected[index] = normOptionValue(value);\r\n\r\n    if (!findVariant()) {\r\n      const normalized = normOptionValue(value);\r\n      const fallback =\r\n        variants.find(\r\n          (variant) =>\r\n            normOptionValue(variant.options[index]) === normalized && variant.available !== false\r\n        ) ||\r\n        variants.find((variant) => normOptionValue(variant.options[index]) === normalized);\r\n\r\n      if (fallback) selected = [...fallback.options];\r\n    }\r\n\r\n    sync();\r\n  }\r\n\r\n  root.innerHTML = \"\";\r\n\r\n  options.forEach((option, index) => {\r\n    if (!shouldShowOption(option)) return;\r\n\r\n    const fieldset = document.createElement(\"fieldset\");\r\n    fieldset.className = \"product-option\";\r\n\r\n    const legend = document.createElement(\"legend\");\r\n    legend.className = \"product-option__label\";\r\n    legend.textContent = option.name;\r\n    fieldset.appendChild(legend);\r\n\r\n    const asColor = isColorOption(option.name);\r\n    const values = document.createElement(\"div\");\r\n    values.className = `product-option__values${asColor ? \" product-option__values--color\" : \"\"}`;\r\n    values.setAttribute(\"role\", \"radiogroup\");\r\n    values.setAttribute(\"aria-label\", option.name);\r\n\r\n    sortOptionValues(option.name, option.values).forEach((value) => {\r\n      const button = document.createElement(\"button\");\r\n      button.type = \"button\";\r\n      button.className = asColor ? \"product-option__swatch\" : \"product-option__size\";\r\n      button.dataset.optionIndex = String(index);\r\n      button.dataset.optionValue = normOptionValue(value);\r\n      button.setAttribute(\"role\", \"radio\");\r\n      button.setAttribute(\"aria-checked\", \"false\");\r\n\r\n      if (asColor) {\r\n        button.style.setProperty(\"--swatch-color\", swatchColor(value));\r\n        button.setAttribute(\"aria-label\", value);\r\n        button.title = value;\r\n      } else {\r\n        button.textContent = value;\r\n      }\r\n\r\n      values.appendChild(button);\r\n    });\r\n\r\n    fieldset.appendChild(values);\r\n    root.appendChild(fieldset);\r\n  });\r\n\r\n  root.onclick = (event) => {\r\n    const button = event.target.closest(\"[data-option-value]\");\r\n    if (!button || !root.contains(button)) return;\r\n    event.preventDefault();\r\n    choose(Number(button.dataset.optionIndex), button.dataset.optionValue);\r\n  };\r\n\r\n  sync();\r\n}\r\n\r\nfunction updatePdpPrice(host, variant, fallbackPrice) {\r\n  const priceEl = host.querySelector(\"[data-product-page-price]\");\r\n  const compareEl = host.querySelector(\"[data-product-page-compare]\");\r\n  const badgeEl = host.querySelector(\"[data-product-page-badge]\");\r\n\r\n  if (priceEl) priceEl.textContent = variant?.price || fallbackPrice;\r\n\r\n  const discount = variant ? variantDiscountPercent(variant) : null;\r\n  const onSale = Boolean(variant?.compare_at_price && discount);\r\n\r\n  if (compareEl) {\r\n    compareEl.hidden = !onSale;\r\n    if (onSale) compareEl.textContent = variant.compare_at_price;\r\n  }\r\n\r\n  if (badgeEl) {\r\n    badgeEl.hidden = !onSale;\r\n    if (onSale) badgeEl.textContent = `${discount}% OFF`;\r\n  }\r\n}\r\n\r\n/* \u2014\u2014 Product page \u2014\u2014 */\r\nfunction isPdpMobileSlider() {\r\n  return window.matchMedia(\"(max-width: 749px)\").matches;\r\n}\r\n\r\nfunction setPdpGalleryIndex(host, index, { scroll = true } = {}) {\r\n  const slides = [...host.querySelectorAll(\".pdp__slide\")];\r\n  if (!slides.length) return;\r\n\r\n  const safeIndex = Math.max(0, Math.min(slides.length - 1, Number(index) || 0));\r\n  const activeSlide = slides[safeIndex];\r\n\r\n  slides.forEach((slide, i) => {\r\n    slide.classList.toggle(\"is-active\", i === safeIndex);\r\n    const img = slide.querySelector(\"img\");\r\n    if (!img) return;\r\n    if (i === safeIndex) img.setAttribute(\"data-product-page-image\", \"\");\r\n    else img.removeAttribute(\"data-product-page-image\");\r\n  });\r\n\r\n  host.querySelectorAll(\".product-gallery__thumb\").forEach((item) => {\r\n    item.classList.toggle(\"is-active\", String(item.dataset.galleryIndex) === String(safeIndex));\r\n  });\r\n\r\n  host.querySelectorAll(\".pdp__dot\").forEach((item) => {\r\n    const match = String(item.dataset.galleryIndex) === String(safeIndex);\r\n    item.classList.toggle(\"is-active\", match);\r\n    item.setAttribute(\"aria-selected\", match ? \"true\" : \"false\");\r\n  });\r\n\r\n  const slider = host.querySelector(\"[data-pdp-slider]\");\r\n  if (scroll && slider && isPdpMobileSlider()) {\r\n    slider.scrollTo({ left: safeIndex * slider.clientWidth, behavior: \"smooth\" });\r\n  }\r\n}\r\n\r\nfunction initProductPage() {\r\n  const host = document.querySelector(\"[data-product-page]\");\r\n  if (!host || host.dataset.ready === \"true\") return;\r\n  host.dataset.ready = \"true\";\r\n\r\n  const root = host.querySelector(\"#ProductPageVariants\");\r\n  const priceEl = host.querySelector(\"[data-product-page-price]\");\r\n  const variantInput = host.querySelector(\"[data-product-page-variant-id]\");\r\n  const submitBtn = host.querySelector(\".product-form__submit\");\r\n  const submitLabel = submitBtn?.querySelector(\"span\");\r\n  const fallbackPrice = priceEl?.textContent || \"\";\r\n  const slider = host.querySelector(\"[data-pdp-slider]\");\r\n  const galleryTriggers = [\r\n    ...host.querySelectorAll(\".product-gallery__thumb\"),\r\n    ...host.querySelectorAll(\".pdp__dot\"),\r\n  ];\r\n\r\n  const { options, variants } = readProductData(host);\r\n\r\n  mountVariantPicker({\r\n    root,\r\n    options,\r\n    variants,\r\n    onChange(variant) {\r\n      if (variantInput) variantInput.value = variant?.id ? String(variant.id) : \"\";\r\n      updatePdpPrice(host, variant, fallbackPrice);\r\n      if (variant?.image) {\r\n        const match = galleryTriggers.find((item) => item.dataset.fullImage === variant.image);\r\n        if (match) setPdpGalleryIndex(host, match.dataset.galleryIndex);\r\n      }\r\n\r\n      const missing = !variant;\r\n      if (submitBtn) submitBtn.disabled = missing;\r\n      if (submitLabel) submitLabel.textContent = missing ? \"Unavailable\" : \"Add to cart\";\r\n    },\r\n  });\r\n\r\n  galleryTriggers.forEach((trigger) => {\r\n    trigger.addEventListener(\"click\", () => {\r\n      setPdpGalleryIndex(host, trigger.dataset.galleryIndex);\r\n    });\r\n  });\r\n\r\n  if (slider) {\r\n    let scrollTimer;\r\n    slider.addEventListener(\"scroll\", () => {\r\n      if (!isPdpMobileSlider()) return;\r\n      window.clearTimeout(scrollTimer);\r\n      scrollTimer = window.setTimeout(() => {\r\n        const index = Math.round(slider.scrollLeft / Math.max(slider.clientWidth, 1));\r\n        setPdpGalleryIndex(host, index, { scroll: false });\r\n      }, 60);\r\n    }, { passive: true });\r\n  }\r\n\r\n  const quantityInput = host.querySelector(\"#ProductPageQuantity\");\r\n  host.querySelector(\".quantity__button--minus\")?.addEventListener(\"click\", () => {\r\n    if (quantityInput) {\r\n      quantityInput.value = String(Math.max(1, Number(quantityInput.value || 1) - 1));\r\n    }\r\n  });\r\n  host.querySelector(\".quantity__button--plus\")?.addEventListener(\"click\", () => {\r\n    if (quantityInput) {\r\n      quantityInput.value = String(Math.max(1, Number(quantityInput.value || 1) + 1));\r\n    }\r\n  });\r\n\r\n  host.querySelector(\".product-page__form\")?.addEventListener(\"submit\", handleAddToCart);\r\n\r\n  host.querySelectorAll(\"[data-open-accordion]\").forEach((link) => {\r\n    link.addEventListener(\"click\", (event) => {\r\n      const target = host.querySelector(link.getAttribute(\"data-open-accordion\") || \"\");\r\n      if (!(target instanceof HTMLDetailsElement)) return;\r\n      event.preventDefault();\r\n      target.open = true;\r\n      target.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\r\n    });\r\n  });\r\n}\r\n\r\n/* Single-variant catalog cards add straight to the cart; everything else opens\r\n   the quick view so a size can be chosen first. */\r\nfunction initCatalogForms() {\r\n  document.querySelectorAll(\"form[data-catalog-add]\").forEach((form) => {\r\n    if (form.dataset.ready === \"true\") return;\r\n    form.dataset.ready = \"true\";\r\n    form.addEventListener(\"submit\", handleAddToCart);\r\n  });\r\n}\r\n\r\nfunction initProductQuickView() {\r\n  const modal = document.getElementById(\"ProductModal\");\r\n  if (!modal || modal.dataset.ready === \"true\") return;\r\n  modal.dataset.ready = \"true\";\r\n\r\n  modal.querySelectorAll(\"[data-product-modal-close]\").forEach((button) => {\r\n    button.addEventListener(\"click\", closeProductModal);\r\n  });\r\n\r\n  document.addEventListener(\"keydown\", (event) => {\r\n    if (!modal.hidden && event.key === \"Escape\") closeProductModal();\r\n  });\r\n\r\n  const quantityInput = modal.querySelector(\"#Quantity\");\r\n\r\n  modal.querySelector(\".quantity__button--minus\")?.addEventListener(\"click\", () => {\r\n    if (quantityInput) {\r\n      quantityInput.value = String(Math.max(1, Number(quantityInput.value || 1) - 1));\r\n    }\r\n  });\r\n\r\n  modal.querySelector(\".quantity__button--plus\")?.addEventListener(\"click\", () => {\r\n    if (quantityInput) {\r\n      quantityInput.value = String(Math.max(1, Number(quantityInput.value || 1) + 1));\r\n    }\r\n  });\r\n\r\n  modal.querySelector(\".product-form\")?.addEventListener(\"submit\", handleAddToCart);\r\n}\r\n\r\n/* \u2014\u2014 Cart \u2014\u2014 */\r\n\r\nfunction isShopifyStorefront() {\r\n  return document.body.dataset.shopifyTheme === \"true\";\r\n}\r\n\r\nfunction cartRoute(name, fallback) {\r\n  return window.theme?.routes?.[name] || fallback;\r\n}\r\n\r\nfunction showFormMessage(form, text, isError) {\r\n  const messageEl =\r\n    form\r\n      ?.closest(\"[data-product-page], .product-modal__info, .catalog-product\")\r\n      ?.querySelector(\"[data-form-message]\") || document.getElementById(\"ProductModalMessage\");\r\n\r\n  if (!messageEl) return;\r\n\r\n  messageEl.hidden = false;\r\n  messageEl.textContent = text;\r\n  messageEl.classList.toggle(\"is-error\", Boolean(isError));\r\n}\r\n\r\nfunction setViewCartVisible(form, visible) {\r\n  const viewCart =\r\n    form?.querySelector(\"[data-view-cart]\") ||\r\n    form?.closest(\"[data-product-page], .product-modal__info\")?.querySelector(\"[data-view-cart]\");\r\n  if (!viewCart) return;\r\n  viewCart.hidden = !visible;\r\n}\r\n\r\nasync function refreshCartCount() {\r\n  const counters = document.querySelectorAll(\"[data-cart-count]\");\r\n  if (!counters.length) return;\r\n\r\n  try {\r\n    const response = await fetch(`${cartRoute(\"cart_url\", \"/cart\")}.js`);\r\n    if (!response.ok) return;\r\n    const cart = await response.json();\r\n    counters.forEach((el) => {\r\n      el.textContent = cart.item_count;\r\n    });\r\n  } catch {\r\n    /* leave the current count in place */\r\n  }\r\n}\r\n\r\n/* Cart page: quantity edits go through the AJAX API, then the page re-renders. */\r\nasync function updateCartLineQuantity(input, quantity) {\r\n  const line = Number(input?.dataset.line);\r\n  if (!input || !line) return;\r\n\r\n  const nextQty = Math.max(0, Number(quantity) || 0);\r\n  input.value = String(nextQty);\r\n  input.disabled = true;\r\n\r\n  const lineRoot = input.closest(\".cart-line\");\r\n  lineRoot?.querySelectorAll(\".quantity__button\").forEach((btn) => {\r\n    btn.disabled = true;\r\n  });\r\n\r\n  try {\r\n    const response = await fetch(`${cartRoute(\"cart_change_url\", \"/cart/change\")}.js`, {\r\n      method: \"POST\",\r\n      headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\r\n      body: JSON.stringify({ line, quantity: nextQty }),\r\n    });\r\n\r\n    if (!response.ok) throw new Error(\"Cart update failed\");\r\n    window.location.reload();\r\n  } catch (error) {\r\n    console.error(error);\r\n    input.disabled = false;\r\n    lineRoot?.querySelectorAll(\".quantity__button\").forEach((btn) => {\r\n      btn.disabled = false;\r\n    });\r\n  }\r\n}\r\n\r\nfunction initCartPage() {\r\n  const cartRoot = document.querySelector(\"[data-cart-page]\");\r\n  if (!cartRoot || cartRoot.dataset.ready === \"true\") return;\r\n  cartRoot.dataset.ready = \"true\";\r\n\r\n  cartRoot.querySelectorAll(\"[data-cart-quantity]\").forEach((input) => {\r\n    input.addEventListener(\"change\", () => {\r\n      updateCartLineQuantity(input, input.value);\r\n    });\r\n  });\r\n\r\n  cartRoot.querySelectorAll(\"[data-cart-qty-change]\").forEach((button) => {\r\n    button.addEventListener(\"click\", () => {\r\n      const input = button.closest(\".quantity\")?.querySelector(\"[data-cart-quantity]\");\r\n      if (!input) return;\r\n      const delta = Number(button.dataset.cartQtyChange || 0);\r\n      updateCartLineQuantity(input, Number(input.value || 0) + delta);\r\n    });\r\n  });\r\n}\r\n\r\nasync function handleAddToCart(event) {\r\n  event.preventDefault();\r\n\r\n  const form = event.currentTarget;\r\n  const submitBtn = form.querySelector(\".product-form__submit\");\r\n  const label = submitBtn?.querySelector(\"span\");\r\n  const originalLabel = label?.textContent || \"Add to cart\";\r\n\r\n  if (submitBtn) submitBtn.disabled = true;\r\n  if (label) label.textContent = \"Adding\u2026\";\r\n  setViewCartVisible(form, false);\r\n\r\n  try {\r\n    if (!isShopifyStorefront()) {\r\n      await new Promise((resolve) => window.setTimeout(resolve, 650));\r\n      showFormMessage(form, \"Added to cart.\");\r\n      setViewCartVisible(form, true);\r\n      return;\r\n    }\r\n\r\n    const variantIdRaw = String(form.querySelector('[name=\"id\"]')?.value || \"\").trim();\r\n    const quantity = Math.max(1, Number(form.querySelector('[name=\"quantity\"]')?.value || 1));\r\n\r\n    if (!/^\\d+$/.test(variantIdRaw)) {\r\n      showFormMessage(form, \"Please select a size.\", true);\r\n      return;\r\n    }\r\n\r\n    const addUrl = cartRoute(\"cart_add_url\", \"/cart/add\");\r\n    const addJsUrl = addUrl.endsWith(\".js\") ? addUrl : `${addUrl}.js`;\r\n    const payload = { items: [{ id: variantIdRaw, quantity }] };\r\n\r\n    let response = await fetch(addJsUrl, {\r\n      method: \"POST\",\r\n      headers: {\r\n        Accept: \"application/json\",\r\n        \"Content-Type\": \"application/json\",\r\n      },\r\n      credentials: \"same-origin\",\r\n      body: JSON.stringify(payload),\r\n    });\r\n\r\n    if (!response.ok && response.status >= 500) {\r\n      const fallback = new FormData();\r\n      fallback.append(\"id\", variantIdRaw);\r\n      fallback.append(\"quantity\", String(quantity));\r\n      response = await fetch(addJsUrl, {\r\n        method: \"POST\",\r\n        headers: { Accept: \"application/json\" },\r\n        credentials: \"same-origin\",\r\n        body: fallback,\r\n      });\r\n    }\r\n\r\n    const data = await response.json();\r\n\r\n    if (!response.ok) {\r\n      const serverMsg = data.description || data.message || \"\";\r\n      const soldOut = /sold out|out of stock|unavailable/i.test(serverMsg);\r\n      showFormMessage(\r\n        form,\r\n        soldOut\r\n          ? \"This size is unavailable right now. Please try another size.\"\r\n          : serverMsg || \"This item could not be added.\",\r\n        true\r\n      );\r\n      return;\r\n    }\r\n\r\n    showFormMessage(form, \"Added to cart.\");\r\n    setViewCartVisible(form, true);\r\n    await refreshCartCount();\r\n  } catch (error) {\r\n    console.error(\"Add to cart failed:\", error);\r\n    showFormMessage(form, \"Something went wrong. Please try again.\", true);\r\n  } finally {\r\n    if (submitBtn) submitBtn.disabled = false;\r\n    if (label) label.textContent = originalLabel;\r\n  }\r\n}\r\n\r\n/* \u2014\u2014 Modal open / close \u2014\u2014 */\r\n\r\nlet lastModalTrigger = null;\r\n\r\nfunction bindProductOpenTriggers() {\r\n  document.querySelectorAll(\".catalog-product__media\").forEach((media) => {\r\n    if (media.dataset.modalBound === \"true\") return;\r\n    media.dataset.modalBound = \"true\";\r\n\r\n    media.addEventListener(\"click\", (event) => {\r\n      if (event.target.closest(\"a\")) return;\r\n      event.preventDefault();\r\n      openProductModal(media.closest(\".catalog-product\"));\r\n    });\r\n  });\r\n}\r\n\r\nfunction openProductModal(card) {\r\n  try {\r\n    openProductModalInner(card);\r\n  } catch (error) {\r\n    console.error(\"Product modal failed to open:\", error);\r\n  }\r\n}\r\n\r\nfunction openProductModalInner(card) {\r\n  const modal = document.getElementById(\"ProductModal\");\r\n  if (!card || !modal) return false;\r\n\r\n  lastModalTrigger = document.activeElement;\r\n\r\n  const titleEl = document.getElementById(\"ProductModalTitle\");\r\n  const collectionEl = document.getElementById(\"ProductModalCollection\");\r\n  const priceEl = document.getElementById(\"ProductModalPrice\");\r\n  const descriptionEl = document.getElementById(\"ProductModalDescription\");\r\n  const variantsRoot = document.getElementById(\"ProductModalVariants\");\r\n  const detailsLink = document.getElementById(\"ProductModalDetailsLink\");\r\n  const variantInput = document.getElementById(\"ProductModalVariantId\");\r\n  const quantityInput = document.getElementById(\"Quantity\");\r\n  const messageEl = document.getElementById(\"ProductModalMessage\");\r\n  const submitBtn = modal.querySelector(\".product-form__submit\");\r\n\r\n  const title = card.dataset.productTitle || \"\";\r\n  const fallbackPrice = card.dataset.productPrice || \"\";\r\n  const image = card.dataset.productImage || \"\";\r\n  const description = card.dataset.productDescription || \"\";\r\n  const collection = card.dataset.productCollection || \"\";\r\n  const productUrl = card.dataset.productUrl || \"#\";\r\n\r\n  const { options, variants, images } = readProductData(card);\r\n\r\n  setModalImages({\r\n    primary: images?.primary || image,\r\n    secondary: images?.secondary || null,\r\n    alt: title,\r\n  });\r\n  if (titleEl) titleEl.textContent = title;\r\n  if (collectionEl) collectionEl.textContent = collection;\r\n  if (descriptionEl) descriptionEl.textContent = description;\r\n  if (detailsLink) detailsLink.href = productUrl;\r\n  if (quantityInput) quantityInput.value = \"1\";\r\n  if (messageEl) {\r\n    messageEl.hidden = true;\r\n    messageEl.textContent = \"\";\r\n    messageEl.classList.remove(\"is-error\");\r\n  }\r\n  setViewCartVisible(modal.querySelector(\".product-form\"), false);\r\n  if (submitBtn) {\r\n    const label = submitBtn.querySelector(\"span\");\r\n    if (label) label.textContent = \"Add to cart\";\r\n    submitBtn.disabled = false;\r\n  }\r\n\r\n  mountVariantPicker({\r\n    root: variantsRoot,\r\n    options,\r\n    variants,\r\n    onChange(variant) {\r\n      if (variantInput) variantInput.value = variant?.id ? String(variant.id) : \"\";\r\n      renderModalPrice(priceEl, variant, fallbackPrice);\r\n      setModalImages({\r\n        primary: images?.primary || image,\r\n        secondary: images?.secondary || null,\r\n        alt: title,\r\n        variantImage: variant?.image || null,\r\n      });\r\n\r\n      const missing = !variant;\r\n      if (submitBtn) {\r\n        submitBtn.disabled = missing;\r\n        const label = submitBtn.querySelector(\"span\");\r\n        if (label) label.textContent = missing ? \"Unavailable\" : \"Add to cart\";\r\n      }\r\n    },\r\n  });\r\n\r\n  modal.classList.add(\"is-open\");\r\n  modal.removeAttribute(\"hidden\");\r\n  modal.hidden = false;\r\n  modal.setAttribute(\"aria-hidden\", \"false\");\r\n  document.body.classList.add(\"is-modal-open\");\r\n  modal.querySelector(\".product-modal__close\")?.focus();\r\n  return true;\r\n}\r\n\r\nfunction closeProductModal() {\r\n  const modal = document.getElementById(\"ProductModal\");\r\n  if (!modal) return;\r\n\r\n  modal.classList.remove(\"is-open\");\r\n  modal.hidden = true;\r\n  modal.setAttribute(\"hidden\", \"\");\r\n  modal.setAttribute(\"aria-hidden\", \"true\");\r\n  document.body.classList.remove(\"is-modal-open\");\r\n  lastModalTrigger?.focus();\r\n}\r\n\r\nwindow.openProductModal = openProductModal;\r\nwindow.closeProductModal = closeProductModal;\r\n\r\nif (!window.__torrisCartInline) {\r\n  document.addEventListener(\r\n    \"click\",\r\n    (event) => {\r\n      const openTrigger = event.target.closest(\"[data-product-open]\");\r\n      if (!openTrigger) return;\r\n\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n      openProductModal(openTrigger.closest(\".product-card, .catalog-product\"));\r\n    },\r\n    true\r\n  );\r\n}\r\n"],
  "mappings": "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",
  "names": []
}
