{
  "version": 3,
  "sources": ["/cdn/shop/t/15/assets/product.js?rev=2"],
  "sourcesContent": ["/* product.js \u2014 variant picker, gallery, qty. Loaded only on product pages. */\n(function () {\n  'use strict';\n  var theme = window.theme || {};\n  var section = document.querySelector('[data-product-section]');\n  if (!section) return;\n\n  var variants = [];\n  var media = [];\n  try { variants = JSON.parse(section.querySelector('[data-variants]').textContent); } catch (e) {}\n  try { media = JSON.parse(section.querySelector('[data-product-media]').textContent); } catch (e) {}\n  var variantMedia = {};\n  try {\n    JSON.parse(section.querySelector('[data-variant-media]').textContent).forEach(function (x) { variantMedia[x.v] = x.m; });\n  } catch (e) {}\n\n  var form = section.querySelector('[data-product-form]');\n  var idInput = section.querySelector('[data-variant-id]');\n  var priceCurrent = section.querySelector('[data-price-current]');\n  var priceCompare = section.querySelector('[data-price-compare]');\n  // The struck amount sits in its own element so a set's \"Separately\" label survives updates.\n  var priceCompareAmt = section.querySelector('[data-price-compare-amount]') || priceCompare;\n  var priceSave = section.querySelector('[data-price-save]');\n  var addBtn = section.querySelector('[data-add-btn]');\n  var addText = section.querySelector('[data-add-text]');\n  var addPrice = section.querySelector('[data-add-price]');\n  var qtyInput = section.querySelector('[data-qty-input]');\n  var stickyBar = section.querySelector('[data-pdp-sticky]');\n  var stickyPrice = section.querySelector('[data-sticky-price]');\n  var stickyCompare = section.querySelector('[data-sticky-compare]');\n  var stickySave = section.querySelector('[data-sticky-save]');\n  var stickyBtn = section.querySelector('[data-sticky-add]');\n  var stickyText = section.querySelector('[data-sticky-add-text]');\n  var ADD_LABEL = (theme.strings && theme.strings.addToCart) || 'Add to cart';\n  var SOLD_LABEL = (theme.strings && theme.strings.soldOut) || 'Sold out';\n  // Prices come from the variant only. The theme used to compute a discount here\n  // from data-sale-percent, mirroring a Shopify automatic discount Liquid could\n  // not see; that discount is gone (2026-08-14) and the sale lives in real\n  // compare-at prices, so there is nothing left to compute.\n  // Percentages are floored to match Liquid \u2014 see savePct below.\n  function savePct(v) { return Math.floor((1 - v.price / v.compare_at_price) * 100); }\n  // \"Save $X (Y%)\" on everything, sets included (Sep 2026 sale system); the\n  // wording comes from the locale via data attributes, like Liquid's first paint.\n  // The short \"\u2212Y%\" form is the per-size chip and the sticky bar.\n  var SAVE_TEXT = section.getAttribute('data-save-text') || 'Save [amount] ([pct]%)';\n  var CHIP_TEXT = section.getAttribute('data-chip-text') || '\u2212[pct]%';\n  // 'sale' | 'set' | 'none' from snippets/product-offer. Chips show only in a sale.\n  var offerKind = section.getAttribute('data-offer-kind') || 'none';\n  function saveText(v) {\n    return SAVE_TEXT.replace('[amount]', formatMoney(v.compare_at_price - v.price)).replace('[pct]', savePct(v));\n  }\n  function chipText(v) { return CHIP_TEXT.replace('[pct]', savePct(v)); }\n  var AMOUNT_TEXT = section.getAttribute('data-amount-text') || 'Save [amount]';\n  // \"In this set\" panel data: per-size one-by-one total, piece prices and the\n  // hung footprint, rendered by Liquid from snippets/bundle-sizes.\n  // Per-size value lines (\"4\u00D7 the art \u00B7 2.1\u00D7 the price\"): Liquid ranks the\n  // sizes, reads each one's area from its name and picks the base (smallest\n  // area) and best (lowest price per unit of area); it renders the first\n  // paint from each size's cheapest variant. This re-renders for the frame\n  // actually selected, so the ratio always uses the price on the row.\n  // Absent on sets and when the section switch is off.\n  var sizeInfo = null;\n  var sizeJson = section.querySelector('[data-size-areas]');\n  if (sizeJson) { try { sizeInfo = JSON.parse(sizeJson.textContent); } catch (e) { sizeInfo = null; } }\n  var pricePct = section.querySelector('[data-price-pct]');\n  var STR_LINE = section.getAttribute('data-value-line-text') || '[art]\u00D7 bigger';\n  var STR_MORE = section.getAttribute('data-value-more-text') || '[pct]% more value';\n  var STR_PCT = section.getAttribute('data-value-pct-text') || '[pct]% less per inch';\n  var STR_BASE = section.getAttribute('data-value-base-text') || 'Starting size';\n  // 4.0 prints as \"4\", 2.09 as \"2.1\" \u2014 the \u00D7 sign is in the locale string. The\n  // number on the page is the number the shopper can check against the two\n  // prices, never rounded to \"2\u00D7\".\n  function timesLabel(n) { var t = n.toFixed(1); return t.slice(-2) === '.0' ? t.slice(0, -2) : t; }\n  // Price of the base size in the current frame; the cheapest variant of that\n  // size when the combination does not exist.\n  function basePrice(opts, pos) {\n    var combo = opts.slice(); combo[pos] = sizeInfo.base;\n    var b = findVariant(combo);\n    if (b) return b.price;\n    var min = 0;\n    variants.forEach(function (x) { if (x.options[pos] === sizeInfo.base && (!min || x.price < min)) min = x.price; });\n    return min;\n  }\n  // \"% less per inch\" for `size` at `price` against the base size in the\n  // current frame: an integer (may be <= 0 on an odd ladder), or null when\n  // there is nothing to compare (the base size, or a size that did not parse).\n  function pctFor(size, price, opts, pos) {\n    if (!sizeInfo) return null;\n    var area = sizeInfo.areas[size], baseArea = sizeInfo.areas[sizeInfo.base];\n    if (!area || !baseArea || area === baseArea) return null;\n    var bp = basePrice(opts, pos);\n    if (!bp) return null;\n    return Math.round(100 - (price / area) / (bp / baseArea) * 100);\n  }\n  function showPct(el, tpl, pct) {\n    if (!el) return;\n    if (pct !== null && pct > 0) { el.textContent = tpl.replace('[pct]', pct); el.hidden = false; }\n    else { el.hidden = true; }\n  }\n  // Writes the row line (\"1.8\u00D7 bigger\", or \"Starting size\") for `size`.\n  function fillValue(el, size) {\n    if (!sizeInfo || !el) return;\n    var area = sizeInfo.areas[size], baseArea = sizeInfo.areas[sizeInfo.base];\n    if (!area || !baseArea) { el.textContent = ''; return; }\n    el.textContent = area === baseArea ? STR_BASE : STR_LINE.replace('[art]', timesLabel(area / baseArea));\n  }\n  var bundleSizes = null;\n  var bundleJson = section.querySelector('[data-bundle-sizes]');\n  if (bundleJson) { try { bundleSizes = JSON.parse(bundleJson.textContent); } catch (e) { bundleSizes = null; } }\n  function updateBundlePanel(opts, v) {\n    if (!bundleSizes) return;\n    var sizeInput = section.querySelector('.size-table [data-option-input]');\n    if (!sizeInput) return;\n    var pos = parseInt(sizeInput.getAttribute('data-option-position'), 10) - 1;\n    var size = opts[pos];\n    var d = bundleSizes[size];\n    var value = section.querySelector('[data-bundle-value]');\n    var wall = section.querySelector('[data-bundle-wall]');\n    if (!d) { if (value) value.hidden = true; if (wall) wall.hidden = true; return; }\n    section.querySelectorAll('[data-bundle-piece]').forEach(function (el) {\n      var p = d.pieces[parseInt(el.getAttribute('data-bundle-piece'), 10)];\n      if (p > 0) { el.textContent = (el.getAttribute('data-bundle-piece-prefix') || '') + ' ' + formatMoney(p); el.hidden = false; }\n      else { el.hidden = true; }\n    });\n    if (value) {\n      var sep = value.querySelector('[data-bundle-sep]');\n      var set = value.querySelector('[data-bundle-set]');\n      if (d.sum > 0 && v) { if (sep) sep.textContent = formatMoney(d.sum); if (set) set.textContent = formatMoney(v.price); value.hidden = false; }\n      else { value.hidden = true; }\n    }\n    if (wall) {\n      var txt = wall.querySelector('[data-bundle-wall-text]');\n      if (d.w > 0 && txt) {\n        var tpl = (theme.strings && theme.strings.bundleWall) || 'Hangs about [w]\\u2033 wide \\u00d7 [h]\\u2033 tall at [size], with 3\\u2033 between frames.';\n        txt.textContent = tpl.replace('[w]', d.w).replace('[h]', d.h).replace('[size]', size);\n        wall.hidden = false;\n      } else { wall.hidden = true; }\n    }\n  }\n\n  /* ---- money ---- */\n  function formatMoney(cents) {\n    var fmt = theme.moneyFormat || '${{amount}}';\n    function fwd(number, precision, thousands, decimal) {\n      precision = precision == null ? 2 : precision;\n      thousands = thousands == null ? ',' : thousands;\n      decimal = decimal == null ? '.' : decimal;\n      if (isNaN(number) || number == null) return '0';\n      number = (number / 100).toFixed(precision);\n      var parts = number.split('.');\n      var dollars = parts[0].replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1' + thousands);\n      var cents = parts[1] ? decimal + parts[1] : '';\n      return dollars + cents;\n    }\n    var m = fmt.match(/\\{\\{\\s*(\\w+)\\s*\\}\\}/);\n    var key = m ? m[1] : 'amount';\n    var val;\n    switch (key) {\n      case 'amount_no_decimals': val = fwd(cents, 0); break;\n      case 'amount_with_comma_separator': val = fwd(cents, 2, '.', ','); break;\n      case 'amount_no_decimals_with_comma_separator': val = fwd(cents, 0, '.', ','); break;\n      case 'amount_with_space_separator': val = fwd(cents, 2, ' ', '.'); break;\n      case 'amount_no_decimals_with_space_separator': val = fwd(cents, 0, ' ', ''); break;\n      default: val = fwd(cents, 2);\n    }\n    // Whole-dollar prices drop \".00\", matching Liquid's money_without_trailing_zeros.\n    return fmt.replace(/\\{\\{\\s*\\w+\\s*\\}\\}/, val.replace(/[.,]00$/, ''));\n  }\n\n  function selectedOptions() {\n    var opts = [];\n    form.querySelectorAll('[data-option-input]:checked').forEach(function (i) {\n      opts[parseInt(i.getAttribute('data-option-position'), 10) - 1] = i.value;\n    });\n    return opts;\n  }\n\n  function findVariant(opts) {\n    return variants.filter(function (v) {\n      return v.options.every(function (o, idx) { return o === opts[idx]; });\n    })[0];\n  }\n\n  /* ---- gallery: scroll-snap slide track + thumbnail rail ---- */\n  var track = section.querySelector('[data-gallery-track]');\n  var slides = toArray(section.querySelectorAll('[data-gallery-slide]'));\n  var thumbsRail = section.querySelector('[data-thumbs]');\n  var thumbBtns = toArray(section.querySelectorAll('[data-gallery-thumb]'));\n  var galleryPrev = section.querySelector('[data-gallery-prev]');\n  var galleryNext = section.querySelector('[data-gallery-next]');\n  var galleryIndexEl = section.querySelector('[data-gallery-index]');\n  var thumbsPrev = section.querySelector('[data-thumbs-prev]');\n  var thumbsNext = section.querySelector('[data-thumbs-next]');\n  var galleryIndex = 0;\n  var uspSync = null; // assigned below when the USP overlay exists\n  var videoSync = null; // assigned below when the gallery holds a video\n  // Picture slides, in lightbox order (data-lb). Videos are slides too but\n  // never open the zoom lightbox, so lightbox index != slide index.\n  var lbSlides = slides.filter(function (s) { return s.hasAttribute('data-lb'); });\n\n  function toArray(list) { return Array.prototype.slice.call(list); }\n\n  function scrollIntoRail(el) {\n    if (!thumbsRail || !el) return;\n    var rail = thumbsRail.getBoundingClientRect();\n    var box = el.getBoundingClientRect();\n    if (box.left < rail.left) thumbsRail.scrollBy({ left: box.left - rail.left - 10, behavior: 'smooth' });\n    else if (box.right > rail.right) thumbsRail.scrollBy({ left: box.right - rail.right + 10, behavior: 'smooth' });\n  }\n\n  function syncRailArrows() {\n    if (!thumbsRail || !thumbsPrev || !thumbsNext) return;\n    var max = thumbsRail.scrollWidth - thumbsRail.clientWidth;\n    thumbsPrev.hidden = thumbsRail.scrollLeft <= 1;\n    thumbsNext.hidden = thumbsRail.scrollLeft >= max - 1;\n  }\n\n  // Reflects the slide the track is parked on; does not move the track itself.\n  function markSlide(i) {\n    if (i < 0 || i >= slides.length) return;\n    galleryIndex = i;\n    thumbBtns.forEach(function (b, n) { b.classList.toggle('is-active', n === i); });\n    if (galleryIndexEl) galleryIndexEl.textContent = i + 1;\n    if (galleryPrev) galleryPrev.disabled = i === 0;\n    if (galleryNext) galleryNext.disabled = i === slides.length - 1;\n    scrollIntoRail(thumbBtns[i]);\n    if (uspSync) uspSync(i);\n    if (videoSync) videoSync(i);\n  }\n\n  function goToSlide(i) {\n    if (!track || i < 0 || i >= slides.length) return;\n    track.scrollTo({ left: i * track.clientWidth, behavior: 'smooth' });\n    markSlide(i);\n  }\n\n  function slideIndexForMedia(mediaId) {\n    for (var i = 0; i < slides.length; i++) {\n      if (parseInt(slides[i].getAttribute('data-media-id'), 10) === mediaId) return i;\n    }\n    return -1;\n  }\n\n  function updateSizePrices(opts) {\n    var rows = section.querySelectorAll('[data-size-price]');\n    if (!rows.length) return;\n    // size option position = position of the input inside .size-table\n    var sizeInput = section.querySelector('.size-table [data-option-input]');\n    if (!sizeInput) return;\n    var pos = parseInt(sizeInput.getAttribute('data-option-position'), 10) - 1;\n    rows.forEach(function (el) {\n      var combo = opts.slice();\n      combo[pos] = el.getAttribute('data-size-price');\n      var v = findVariant(combo);\n      var label = el.closest('label');\n      var save = label ? label.querySelector('[data-size-save]') : null;\n      var val = label ? label.querySelector('[data-size-value]') : null;\n      var pctEl = label ? label.querySelector('[data-size-pct]') : null;\n      var wasEl = label ? label.querySelector('[data-size-was]') : null;\n      var amtEl = label ? label.querySelector('[data-size-amount]') : null;\n      if (!v) { el.textContent = ''; if (save) save.hidden = true; if (val) val.textContent = ''; if (pctEl) pctEl.hidden = true; if (wasEl) wasEl.hidden = true; if (amtEl) amtEl.hidden = true; return; }\n      var vHasCompare = v.compare_at_price && v.compare_at_price > v.price;\n      var now = v.price;\n      el.textContent = formatMoney(now);\n      var rowSize = el.getAttribute('data-size-price');\n      if (val) fillValue(val, rowSize);\n      if (pctEl) showPct(pctEl, STR_PCT, pctFor(rowSize, now, opts, pos));\n      var was = vHasCompare ? v.compare_at_price : 0;\n      if (save) {\n        if (offerKind === 'sale' && was > now) { save.textContent = chipText(v); save.hidden = false; }\n        else { save.hidden = true; }\n      }\n      // Struck compare-at and the green dollar saving: on every size whose variant\n      // has a compare-at above its price (sale items, and sets vs. \"Separately\").\n      if (wasEl) {\n        if (was > now) { wasEl.textContent = formatMoney(was); wasEl.hidden = false; }\n        else { wasEl.hidden = true; }\n      }\n      if (amtEl) {\n        if (was > now) { amtEl.textContent = AMOUNT_TEXT.replace('[amount]', formatMoney(was - now)); amtEl.hidden = false; }\n        else { amtEl.hidden = true; }\n      }\n    });\n  }\n\n  function update(followMedia) {\n    var opts = selectedOptions();\n    form.querySelectorAll('[data-option-input]').forEach(function (i) {\n      var label = i.closest('label');\n      if (label) label.classList.toggle('is-selected', i.checked);\n    });\n    form.querySelectorAll('[data-option-label]').forEach(function (el) {\n      el.textContent = opts[parseInt(el.getAttribute('data-option-label'), 10)] || '';\n    });\n    var v = findVariant(opts);\n    updateSizePrices(opts);\n    if (!v) {\n      addBtn.disabled = true; addText.textContent = SOLD_LABEL; addPrice.textContent = '';\n      if (stickyBtn) { stickyBtn.disabled = true; stickyText.textContent = SOLD_LABEL; }\n      return;\n    }\n    idInput.value = v.id;\n    var qty = parseInt(qtyInput.value, 10) || 1;\n    var hasCompare = v.compare_at_price && v.compare_at_price > v.price;\n    var nowPrice = v.price;\n    priceCurrent.textContent = formatMoney(nowPrice);\n    addPrice.textContent = formatMoney(nowPrice * qty);\n    if (stickyPrice) stickyPrice.textContent = formatMoney(nowPrice);\n    if (stickyCompare) {\n      if (hasCompare) { stickyCompare.textContent = formatMoney(v.compare_at_price); stickyCompare.hidden = false; }\n      else { stickyCompare.hidden = true; }\n    }\n    if (stickySave) {\n      if (hasCompare) { stickySave.textContent = chipText(v); stickySave.hidden = false; }\n      else { stickySave.hidden = true; }\n    }\n    if (hasCompare) {\n      priceCompareAmt.textContent = formatMoney(v.compare_at_price); priceCompare.hidden = false;\n      priceSave.textContent = saveText(v); priceSave.hidden = false;\n    } else { priceCompare.hidden = true; priceSave.hidden = true; }\n    updateBundlePanel(opts, v);\n    if (pricePct && sizeInfo) {\n      var sizeEl = section.querySelector('.size-table [data-option-input]');\n      var sizePos = sizeEl ? parseInt(sizeEl.getAttribute('data-option-position'), 10) - 1 : -1;\n      // Same per-inch figure as the row, worded \"more value\" (merchant's call).\n      showPct(pricePct, STR_MORE, sizePos > -1 ? pctFor(opts[sizePos], v.price, opts, sizePos) : null);\n    }\n    addBtn.disabled = !v.available;\n    addText.textContent = v.available ? ADD_LABEL : SOLD_LABEL;\n    if (stickyBtn) { stickyBtn.disabled = !v.available; stickyText.textContent = v.available ? ADD_LABEL : SOLD_LABEL; }\n    if (window.history && history.replaceState) {\n      var u = new URL(window.location.href); u.searchParams.set('variant', v.id); history.replaceState({}, '', u);\n    }\n    // The gallery only follows the variant once the shopper picks a size or\n    // frame. On first paint (and on qty changes) it stays on image 1, so the\n    // hero shot is what greets them instead of a variant close-up.\n    if (!followMedia) return;\n    // Every size \u00D7 frame variant carries its own mockup, so the variant's\n    // featured media is the only source of truth for which slide to show. A\n    // variant with no media leaves the gallery where it is. (An alt-text\n    // fallback that matched the size string lived here 2026-09-02..07; it\n    // landed on the first slide of that size in whatever frame, so a black\n    // frame could show a wood mockup. Do not bring it back \u2014 and do not add a\n    // \"Shown: <frame>\" caption that echoes the swatch instead of the image.)\n    var mid = variantMedia[v.id];\n    if (!mid) return;\n    var idx = slideIndexForMedia(mid);\n    if (idx > -1) goToSlide(idx);\n  }\n\n  // Only a FRAME change moves the gallery. Every size of a colour shares one\n  // mockup (the largest print) since 2026-09-07, so a size change has nothing\n  // new to show and should leave the shopper on whatever image they were\n  // looking at \u2014 the studio shots are the better pictures anyway.\n  form.addEventListener('change', function (e) {\n    if (!e.target.matches('[data-option-input]')) return;\n    update(!!e.target.closest('.frame-swatches'));\n  });\n\n  /* qty */\n  form.addEventListener('click', function (e) {\n    var minus = e.target.closest('[data-qty-minus]');\n    var plus = e.target.closest('[data-qty-plus]');\n    if (!minus && !plus) return;\n    var val = parseInt(qtyInput.value, 10) || 1;\n    qtyInput.value = plus ? val + 1 : Math.max(1, val - 1);\n    update();\n  });\n  qtyInput.addEventListener('change', update);\n\n  /* gallery wiring */\n  thumbBtns.forEach(function (btn, i) {\n    btn.addEventListener('click', function () { goToSlide(i); });\n  });\n  if (galleryPrev) galleryPrev.addEventListener('click', function () { goToSlide(galleryIndex - 1); });\n  if (galleryNext) galleryNext.addEventListener('click', function () { goToSlide(galleryIndex + 1); });\n\n  if (track) {\n    var scrollTimer = null;\n    track.addEventListener('scroll', function () {\n      clearTimeout(scrollTimer);\n      scrollTimer = setTimeout(function () {\n        if (!track.clientWidth) return;\n        markSlide(Math.round(track.scrollLeft / track.clientWidth));\n      }, 80);\n    }, { passive: true });\n    // Keep the parked slide parked when the stage is resized (orientation change).\n    if ('ResizeObserver' in window) {\n      var lastWidth = track.clientWidth;\n      new ResizeObserver(function () {\n        if (track.clientWidth === lastWidth) return;\n        lastWidth = track.clientWidth;\n        track.scrollLeft = galleryIndex * track.clientWidth;\n      }).observe(track);\n    }\n    // Arrow keys step the gallery when it has focus.\n    track.setAttribute('tabindex', '0');\n    track.addEventListener('keydown', function (e) {\n      if (e.key === 'ArrowLeft') { e.preventDefault(); goToSlide(galleryIndex - 1); }\n      else if (e.key === 'ArrowRight') { e.preventDefault(); goToSlide(galleryIndex + 1); }\n    });\n  }\n\n  if (thumbsRail) {\n    var railStep = function (dir) {\n      thumbsRail.scrollBy({ left: dir * thumbsRail.clientWidth * 0.8, behavior: 'smooth' });\n    };\n    if (thumbsPrev) thumbsPrev.addEventListener('click', function () { railStep(-1); });\n    if (thumbsNext) thumbsNext.addEventListener('click', function () { railStep(1); });\n    thumbsRail.addEventListener('scroll', syncRailArrows, { passive: true });\n    window.addEventListener('resize', syncRailArrows);\n    syncRailArrows();\n  }\n\n  /* ---- gallery videos: the one on screen plays, muted and looping, like a\n     moving photo; every other one is paused. preload=\"none\" in the markup, so\n     a video costs nothing until its slide is reached. The button (and a tap\n     on the video) pauses/resumes; a shopper's pause sticks for that video.\n     Reduced-motion shoppers get the poster and press play themselves. ---- */\n  var videoSlides = slides.filter(function (s) { return s.querySelector('video'); });\n  if (videoSlides.length) {\n    var reduceMotion = !!(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches);\n    var galleryOnScreen = true;\n    var setPlaying = function (s, on) {\n      s.classList.toggle('is-playing', on);\n      var btn = s.querySelector('[data-video-toggle]');\n      if (btn) btn.setAttribute('aria-label', btn.getAttribute(on ? 'data-label-pause' : 'data-label-play'));\n    };\n    var playVideo = function (s) {\n      var v = s.querySelector('video');\n      v.muted = true; // the property, not just the attribute, is what autoplay policy checks\n      var p = v.play();\n      if (p && p.catch) p.catch(function () { setPlaying(s, false); });\n    };\n    videoSlides.forEach(function (s) {\n      var v = s.querySelector('video');\n      v.addEventListener('play', function () { setPlaying(s, true); });\n      v.addEventListener('pause', function () { setPlaying(s, false); });\n      var toggle = function () {\n        if (v.paused) { s.removeAttribute('data-user-paused'); playVideo(s); }\n        else { s.setAttribute('data-user-paused', ''); v.pause(); }\n      };\n      v.addEventListener('click', toggle);\n      var btn = s.querySelector('[data-video-toggle]');\n      if (btn) btn.addEventListener('click', toggle);\n    });\n    videoSync = function (i) {\n      videoSlides.forEach(function (s) {\n        var v = s.querySelector('video');\n        if (s === slides[i] && galleryOnScreen && !reduceMotion && !s.hasAttribute('data-user-paused')) playVideo(s);\n        else if (!v.paused) v.pause();\n      });\n    };\n    // Scrolled past the gallery: stop looping a video nobody can see.\n    if (track && 'IntersectionObserver' in window) {\n      new IntersectionObserver(function (entries) {\n        galleryOnScreen = entries[0].isIntersecting;\n        videoSync(galleryIndex);\n      }, { threshold: 0.25 }).observe(track);\n    }\n    // Chrome rejects play() in a background tab (\"video-only background media\n    // was paused to save power\"); pick the video back up when the tab returns.\n    document.addEventListener('visibilitychange', function () {\n      if (!document.hidden) videoSync(galleryIndex);\n    });\n  }\n\n  markSlide(0);\n\n  /* ---- Full-screen lightbox: wheel/pinch zoom, drag pan, swipe navigate ---- */\n  var lb = section.querySelector('[data-lightbox]');\n  if (lb && media.length) {\n    var lbStage = lb.querySelector('[data-lb-stage]');\n    var lbImg = lb.querySelector('[data-lb-img]');\n    var lbIndexEl = lb.querySelector('[data-lb-index]');\n    var lbPrev = lb.querySelector('[data-lb-prev]');\n    var lbNext = lb.querySelector('[data-lb-next]');\n    var lbCloseBtn = lb.querySelector('[data-lb-close]');\n    var lbHint = lb.querySelector('[data-lb-hint]');\n    var lbThumbs = toArray(lb.querySelectorAll('[data-lb-thumb]'));\n    var lbIndex = 0, lbScale = 1, lbX = 0, lbY = 0;\n    var lastFocus = null, hintHidden = false;\n\n    function lbApply() {\n      lbImg.style.transform = 'translate(' + lbX + 'px,' + lbY + 'px) scale(' + lbScale + ')';\n      lbImg.classList.toggle('is-zoomed', lbScale > 1.01);\n    }\n    function lbClampPan() {\n      var maxX = Math.max(0, (lbImg.clientWidth * lbScale - lbStage.clientWidth) / 2);\n      var maxY = Math.max(0, (lbImg.clientHeight * lbScale - lbStage.clientHeight) / 2);\n      lbX = Math.min(maxX, Math.max(-maxX, lbX));\n      lbY = Math.min(maxY, Math.max(-maxY, lbY));\n    }\n    function lbReset() { lbScale = 1; lbX = 0; lbY = 0; lbApply(); }\n    // The 2400px zoom variants are fetched off-screen and swapped in once\n    // ready, so navigating always paints instantly from an image the browser\n    // already has instead of blocking on a fresh network fetch.\n    var lbBig = {};\n    function lbWarm(i) {\n      if (i < 0 || i >= media.length) return null;\n      var src = media[i].big || media[i].url;\n      var im = lbBig[src];\n      if (!im) { im = new Image(); im.src = src; lbBig[src] = im; }\n      return im;\n    }\n    function lbShow(i) {\n      if (i < 0 || i >= media.length) return;\n      lbIndex = i;\n      lbReset();\n      var big = media[i].big || media[i].url;\n      var warm = lbWarm(i);\n      if (warm.complete && warm.naturalWidth) {\n        lbImg.src = big;\n      } else {\n        // paint what the main gallery already decoded for this slide (or the\n        // preloaded 1400px url), then upgrade in place when the big one lands\n        var slideImg = lbSlides[i] && lbSlides[i].querySelector('.pdp__main-img');\n        lbImg.src = (slideImg && (slideImg.currentSrc || slideImg.src)) || media[i].url;\n        warm.addEventListener('load', function () {\n          if (lbIndex === i && !lb.hidden) lbImg.src = big;\n        }, { once: true });\n      }\n      lbImg.alt = media[i].alt || '';\n      lbWarm(i + 1);\n      lbWarm(i - 1);\n      if (lbIndexEl) lbIndexEl.textContent = i + 1;\n      if (lbPrev) lbPrev.disabled = i === 0;\n      if (lbNext) lbNext.disabled = i === media.length - 1;\n      lbThumbs.forEach(function (b, n) { b.classList.toggle('is-active', n === i); });\n      if (lbThumbs[i] && lbThumbs[i].scrollIntoView) lbThumbs[i].scrollIntoView({ block: 'nearest', inline: 'nearest' });\n    }\n    function hideHint() {\n      if (hintHidden || !lbHint) return;\n      hintHidden = true;\n      lbHint.classList.add('is-hidden');\n    }\n    function lbOpen(i) {\n      lastFocus = document.activeElement;\n      lb.hidden = false;\n      document.body.classList.add('lb-open');\n      lbShow(i);\n      if (lbCloseBtn) lbCloseBtn.focus();\n    }\n    function lbShut() {\n      lb.hidden = true;\n      document.body.classList.remove('lb-open');\n      goToSlide(slides.indexOf(lbSlides[lbIndex])); // main gallery follows where the shopper left off\n      if (lastFocus && lastFocus.focus) lastFocus.focus();\n    }\n    // Zoom keeping the point under the cursor/pinch midpoint fixed.\n    function zoomTo(newScale, cx, cy) {\n      newScale = Math.min(4, Math.max(1, newScale));\n      var r = lbStage.getBoundingClientRect();\n      var px = cx - r.left - r.width / 2;\n      var py = cy - r.top - r.height / 2;\n      var k = newScale / lbScale;\n      lbX = px - (px - lbX) * k;\n      lbY = py - (py - lbY) * k;\n      lbScale = newScale;\n      if (lbScale <= 1.001) { lbX = 0; lbY = 0; }\n      lbClampPan();\n      lbApply();\n      hideHint();\n    }\n\n    lbStage.addEventListener('wheel', function (e) {\n      e.preventDefault();\n      zoomTo(lbScale * (e.deltaY < 0 ? 1.18 : 1 / 1.18), e.clientX, e.clientY);\n    }, { passive: false });\n\n    lbStage.addEventListener('dblclick', function (e) {\n      e.preventDefault();\n      zoomTo(lbScale > 1.01 ? 1 : 2.5, e.clientX, e.clientY);\n    });\n\n    var lbPts = {};\n    var pinchD0 = 0, pinchS0 = 1, lbMoved = false;\n    var downX = 0, downY = 0, imgX0 = 0, imgY0 = 0;\n    lbStage.addEventListener('pointerdown', function (e) {\n      lbStage.setPointerCapture(e.pointerId);\n      lbPts[e.pointerId] = { x: e.clientX, y: e.clientY };\n      var ids = Object.keys(lbPts);\n      if (ids.length === 1) {\n        lbMoved = false;\n        downX = e.clientX; downY = e.clientY; imgX0 = lbX; imgY0 = lbY;\n        if (lbScale > 1.01) lbImg.classList.add('is-dragging');\n      } else if (ids.length === 2) {\n        var a = lbPts[ids[0]], b = lbPts[ids[1]];\n        pinchD0 = Math.hypot(a.x - b.x, a.y - b.y);\n        pinchS0 = lbScale;\n      }\n    });\n    lbStage.addEventListener('pointermove', function (e) {\n      if (!lbPts[e.pointerId]) return;\n      lbPts[e.pointerId] = { x: e.clientX, y: e.clientY };\n      var ids = Object.keys(lbPts);\n      if (ids.length === 2) {\n        var a = lbPts[ids[0]], b = lbPts[ids[1]];\n        var d = Math.hypot(a.x - b.x, a.y - b.y);\n        if (pinchD0 > 0) zoomTo(pinchS0 * d / pinchD0, (a.x + b.x) / 2, (a.y + b.y) / 2);\n        lbMoved = true;\n      } else if (ids.length === 1) {\n        var dx = e.clientX - downX, dy = e.clientY - downY;\n        if (Math.abs(dx) > 4 || Math.abs(dy) > 4) lbMoved = true;\n        if (lbScale > 1.01) {\n          lbX = imgX0 + dx; lbY = imgY0 + dy;\n          lbClampPan();\n          lbApply();\n        }\n      }\n    });\n    function lbPointerEnd(e) {\n      if (!lbPts[e.pointerId]) return;\n      delete lbPts[e.pointerId];\n      lbImg.classList.remove('is-dragging');\n      var remaining = Object.keys(lbPts);\n      if (remaining.length === 1) {\n        // pinch ended with one finger down \u2014 rebase the pan so it doesn't jump\n        pinchD0 = 0;\n        var p = lbPts[remaining[0]];\n        downX = p.x; downY = p.y; imgX0 = lbX; imgY0 = lbY;\n        lbMoved = true;\n        return;\n      }\n      if (remaining.length) return;\n      var dx = e.clientX - downX, dy = e.clientY - downY;\n      if (lbScale <= 1.01 && Math.abs(dx) > 60 && Math.abs(dx) > Math.abs(dy) * 1.5) {\n        lbShow(lbIndex + (dx < 0 ? 1 : -1));\n        hideHint();\n      } else if (!lbMoved && e.target === lbStage) {\n        lbShut(); // tap/click on the backdrop closes\n      }\n    }\n    lbStage.addEventListener('pointerup', lbPointerEnd);\n    lbStage.addEventListener('pointercancel', function (e) {\n      delete lbPts[e.pointerId];\n      lbImg.classList.remove('is-dragging');\n      pinchD0 = 0;\n    });\n\n    if (lbPrev) lbPrev.addEventListener('click', function () { lbShow(lbIndex - 1); });\n    if (lbNext) lbNext.addEventListener('click', function () { lbShow(lbIndex + 1); });\n    if (lbCloseBtn) lbCloseBtn.addEventListener('click', lbShut);\n    lbThumbs.forEach(function (b, n) {\n      b.addEventListener('click', function () { lbShow(n); });\n    });\n    document.addEventListener('keydown', function (e) {\n      if (lb.hidden) return;\n      if (e.key === 'Escape') lbShut();\n      else if (e.key === 'ArrowLeft') lbShow(lbIndex - 1);\n      else if (e.key === 'ArrowRight') lbShow(lbIndex + 1);\n    });\n    lbSlides.forEach(function (s, n) {\n      var img = s.querySelector('.pdp__main-img');\n      if (img) img.addEventListener('click', function () { lbOpen(n); });\n    });\n    // Keyboard path (the expand button was removed): Enter on the focused track\n    if (track) track.addEventListener('keydown', function (e) {\n      if (e.key !== 'Enter') return;\n      var n = lbSlides.indexOf(slides[galleryIndex]);\n      if (n > -1) { e.preventDefault(); lbOpen(n); }\n    });\n  }\n\n  /* ---- USP overlay: ambient, no controls \u2014 the active USP follows the\n     gallery slide (image 1 \u2192 USP 1, image 2 \u2192 USP 2, \u2026, cycling). ---- */\n  var usp = section.querySelector('[data-usp]');\n  if (usp) {\n    var uspSlides = toArray(usp.querySelectorAll('[data-usp-slide]'));\n    if (uspSlides.length) {\n      uspSync = function (i) {\n        var k = i % uspSlides.length;\n        uspSlides.forEach(function (s, n) { s.classList.toggle('is-active', n === k); });\n      };\n      uspSync(galleryIndex);\n      // Single-image products still surface all three: slow ambient rotate.\n      if (slides.length <= 1 && uspSlides.length > 1 && !(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches)) {\n        var uspIdle = 0;\n        setInterval(function () {\n          uspIdle = (uspIdle + 1) % uspSlides.length;\n          uspSlides.forEach(function (s, n) { s.classList.toggle('is-active', n === uspIdle); });\n        }, 5000);\n      }\n    }\n  }\n\n  /* smooth scroll to reviews */\n  section.querySelectorAll('[data-jdgm-scroll]').forEach(function (a) {\n    a.addEventListener('click', function (e) {\n      // sections/reviews.liquid renders id=\"reviews\"; the old product-reviews\n      // section (and its id) is gone.\n      var t = document.getElementById('reviews');\n      if (t) { e.preventDefault(); t.scrollIntoView({ behavior: 'smooth' }); }\n    });\n  });\n\n  update();\n\n  /* Mobile sticky add-to-cart: submit the real form; reveal once the main CTA scrolls away */\n  if (stickyBtn && form) {\n    stickyBtn.addEventListener('click', function () {\n      if (stickyBtn.disabled) return;\n      if (typeof form.requestSubmit === 'function') { form.requestSubmit(); }\n      else { form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true })); }\n    });\n  }\n  if (stickyBar && 'IntersectionObserver' in window) {\n    var cta = section.querySelector('.pdp__cta');\n    if (cta) {\n      new IntersectionObserver(function (entries) {\n        entries.forEach(function (en) { stickyBar.classList.toggle('is-visible', !en.isIntersecting); });\n      }, { rootMargin: '0px 0px -40px 0px' }).observe(cta);\n    }\n  }\n\n  /* Preload variant images so frame/size switches are instant (respects data saver).\n     This used to fetch EVERY media on idle at page load \u2014 on a product with a\n     dozen frame shots that is a dozen full-size images most shoppers never look\n     at, competing with the LCP. Now it waits for the first touch of a variant\n     control and only warms the media whose alt text matches an option the\n     shopper has actually selected (frame colour, size); with no such match it\n     falls back to the first three. Runs again on each change, deduped. */\n  var preloaded = {};\n  function preloadMedia() {\n    if (navigator.connection && navigator.connection.saveData) return;\n    var opts = selectedOptions();\n    // The selected variant's own mockup first: most alts are Gelato UUIDs, so\n    // the alt match below finds nothing on older products and the one image\n    // the shopper is about to see would otherwise never be warmed.\n    var v = findVariant(opts);\n    var mid = v ? variantMedia[v.id] : null;\n    var matches = media.filter(function (m) { return mid && m.id === mid; });\n    matches = matches.concat(media.filter(function (m) {\n      if (!m.url || !m.alt || m.id === mid) return false;\n      var alt = String(m.alt).toLowerCase();\n      return opts.some(function (o) {\n        return o && alt.indexOf(String(o).toLowerCase()) > -1;\n      });\n    }));\n    if (!matches.length) matches = media.slice(0, 3);\n    matches.forEach(function (m) {\n      if (!m.url || preloaded[m.url]) return;\n      preloaded[m.url] = true;\n      var img = new Image();\n      img.src = m.url;\n    });\n  }\n  form.addEventListener('change', function (e) {\n    if (e.target.matches('[data-option-input]')) preloadMedia();\n  });\n})();\n"],
  "mappings": "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",
  "names": ["cents"]
}
