{
  "version": 3,
  "sources": ["/cdn/shop/t/66/assets/flamingo-landing.js?fresh=1783663339924934200"],
  "sourcesContent": ["/* gallery drag v3.1 - scroll freeze */\n/* Petal Green \u2013 Product Landing Purple\n * Behaviour: gallery, pack selection, addon toggle, accordions, stat ring reveal + count-up.\n *\n * Pack/addon/accordion handlers use event delegation so they keep working\n * even when Shopify's theme editor re-renders blocks. */\n(function () {\n  function ready(fn) {\n    if (document.readyState !== 'loading') return fn();\n    document.addEventListener('DOMContentLoaded', fn);\n  }\n\n  ready(function () {\n    var page = document.querySelector('.petal-page');\n    if (!page) return;\n\n    /* ---------- Pack selection (event-delegated) ---------- */\n    page.addEventListener('click', function (e) {\n      // Don't change pack selection when the click was on the addon checkbox.\n      if (e.target.closest('.petal-addon-check')) return;\n      var pack = e.target.closest('.petal-pack');\n      if (!pack || !page.contains(pack)) return;\n      page.querySelectorAll('.petal-pack').forEach(function (item) {\n        item.classList.remove('is-selected');\n      });\n      pack.classList.add('is-selected');\n      setTimeout(function () { try { pack.blur(); } catch (e) {} }, 0);\n    });\n\n    page.addEventListener('touchend', function (e) {\n      var hit = e.target.closest('.petal-pack, .petal-accordion button, .petal-faq__question, .petal-atc, .petal-small-button, .petal-gallery__nav, .petal-belief__videobtn');\n      if (!hit) return;\n      setTimeout(function () { try { hit.blur(); } catch (err) {} }, 0);\n    }, { passive: true });\n\n    /* ---------- Addon checkbox (event-delegated) ---------- */\n    function toggleAddon(el) {\n      var checked = el.getAttribute('aria-checked') === 'true';\n      el.setAttribute('aria-checked', checked ? 'false' : 'true');\n      el.classList.toggle('is-checked');\n    }\n    page.addEventListener('click', function (e) {\n      var el = e.target.closest('.petal-addon-check');\n      if (!el || !page.contains(el)) return;\n      e.stopPropagation();\n      toggleAddon(el);\n    });\n    page.addEventListener('keydown', function (e) {\n      var el = e.target.closest('.petal-addon-check');\n      if (!el) return;\n      if (e.key === ' ' || e.key === 'Enter') {\n        e.preventDefault();\n        toggleAddon(el);\n      }\n    });\n\n    /* ---------- Add to Cart ----------\n       The selected pack carries a comma-separated list of variant IDs in\n       data-petal-pack-variants. Any addons inside that pack with .is-checked\n       contribute their data-addon-variant-id too. We POST all of them at once\n       to /cart/add.js (Shopify's \"items\" array form), then dispatch a\n       petal:cart:open event so the cart drawer shows itself with the new lines. */\n    var atcBtn = page.querySelector('[data-petal-add-to-cart]');\n    if (atcBtn) {\n      atcBtn.addEventListener('click', function () {\n        if (atcBtn.disabled) return;\n        var pack = page.querySelector('.petal-pack.is-selected') || page.querySelector('.petal-pack');\n        if (!pack) return;\n\n        // Collect IDs: pack variants + checked addons inside the pack.\n        // Also collect any discount codes from FREE addons so we can auto-apply\n        // them after the cart-add succeeds.\n        var ids = [];\n        var discountCodes = [];\n        var packVariants = (pack.getAttribute('data-petal-pack-variants') || '').split(',');\n        packVariants.forEach(function (v) {\n          v = (v || '').trim();\n          if (v) ids.push(v);\n        });\n        pack.querySelectorAll('.petal-addon-check.is-checked').forEach(function (addon) {\n          var v = (addon.getAttribute('data-addon-variant-id') || '').trim();\n          if (v) ids.push(v);\n          var code = (addon.getAttribute('data-addon-discount-code') || '').trim();\n          var isFree = addon.getAttribute('data-addon-free') === '1';\n          if (isFree && code && discountCodes.indexOf(code) === -1) {\n            discountCodes.push(code);\n          }\n        });\n\n        // Pack-level discount code: applied whenever the selected pack carries\n        // one. FREE-partner packs use it to zero the free item; discounted\n        // bundles (e.g. the Sweet Spot Bundle) use it to apply the bundle % so\n        // checkout matches the discounted per-product prices shown on the pack.\n        var packCode = (pack.getAttribute('data-pack-discount-code') || '').trim();\n        if (packCode && discountCodes.indexOf(packCode) === -1) {\n          discountCodes.push(packCode);\n        }\n\n        // Deduplicate while collapsing repeats into quantity entries. No line\n        // item properties \u2014 that would break Shopify's natural merge of the\n        // same variant added twice into a single line at qty=2. Instead we\n        // track insertion order client-side in sessionStorage (see below).\n        var qtyByVariant = {};\n        ids.forEach(function (v) {\n          qtyByVariant[v] = (qtyByVariant[v] || 0) + 1;\n        });\n        var items = Object.keys(qtyByVariant).map(function (v) {\n          return { id: parseInt(v, 10), quantity: qtyByVariant[v] };\n        });\n\n        // Record per-variant insertion order in sessionStorage so the cart\n        // drawer can render in stable add-time order even when Shopify shifts\n        // line indices around (e.g., addon-already-in-cart bumping). New\n        // variants get a new sequence number; existing entries keep theirs.\n        try {\n          var orderMap = {};\n          try { orderMap = JSON.parse(sessionStorage.getItem('petal_cart_order') || '{}') || {}; } catch (e) {}\n          var maxSeq = 0;\n          for (var k in orderMap) { if (orderMap[k] > maxSeq) maxSeq = orderMap[k]; }\n          ids.forEach(function (v) {\n            if (orderMap[v] === undefined) {\n              maxSeq += 1;\n              orderMap[v] = maxSeq;\n            }\n          });\n          sessionStorage.setItem('petal_cart_order', JSON.stringify(orderMap));\n        } catch (e) {}\n        if (!items.length) {\n          console.warn('[petal] No variant IDs available on selected pack \u2014 check the section settings.');\n          return;\n        }\n\n        var originalLabel = atcBtn.textContent;\n        atcBtn.disabled = true;\n        atcBtn.textContent = 'Adding\u2026';\n\n        fetch('/cart/add.js', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n          body: JSON.stringify({ items: items })\n        })\n        .then(function (r) {\n          return r.json().then(function (data) { return { ok: r.ok, data: data }; });\n        })\n        .then(function (res) {\n          atcBtn.disabled = false;\n          atcBtn.textContent = originalLabel;\n          if (!res.ok) {\n            console.warn('[petal] /cart/add.js failed', res.data);\n            atcBtn.textContent = (res.data && res.data.description) || 'Couldn\u2019t add \u2014 try again';\n            setTimeout(function () { atcBtn.textContent = originalLabel; }, 2400);\n            return;\n          }\n          // Stash the codes synchronously so the cart drawer can re-apply\n          // them on subsequent visits. Stored as a comma-separated list.\n          try {\n            var existing = (sessionStorage.getItem('petal_discount_codes') || '').split(',').filter(Boolean);\n            discountCodes.forEach(function (c) {\n              if (existing.indexOf(c) === -1) existing.push(c);\n            });\n            sessionStorage.setItem('petal_discount_codes', existing.join(','));\n          } catch (e) {}\n\n          // Open the cart drawer immediately on a successful add. We do NOT\n          // wait for the discount-code cookies to be set \u2014 that work runs in\n          // the background below and the cookie will be in place well before\n          // the customer hits checkout. Blocking the drawer-open on a 302\n          // round-trip per code was adding ~1.5s of perceived latency on the\n          // bundle pack (the only one with FREE addons).\n          document.dispatchEvent(new CustomEvent('petal:cart:open'));\n\n          // Background: auto-apply any discount codes attached to FREE addons\n          // via a hidden iframe. /discount/CODE 302s and sets the cookie on\n          // that response. fetch() with redirect:'manual' is flaky for cookie\n          // setting in modern browsers, so iframe is the reliable path.\n          function applyOne(code) {\n            return new Promise(function (resolve) {\n              var iframe = document.createElement('iframe');\n              iframe.setAttribute('aria-hidden', 'true');\n              iframe.style.cssText = 'position:absolute;width:0;height:0;border:0;visibility:hidden;';\n              var done = false;\n              function finish() {\n                if (done) return;\n                done = true;\n                try { iframe.parentNode && iframe.parentNode.removeChild(iframe); } catch (e) {}\n                resolve();\n              }\n              iframe.addEventListener('load', finish);\n              // 600ms is enough for a 302 + tiny cart-page render in an iframe.\n              // Acts only as a safety net since the drawer is no longer waiting.\n              setTimeout(finish, 600);\n              iframe.src = '/discount/' + encodeURIComponent(code) + '?redirect=' + encodeURIComponent('/cart?petal_applied=' + code);\n              document.body.appendChild(iframe);\n            });\n          }\n          var applyChain = Promise.resolve();\n          discountCodes.forEach(function (code) {\n            applyChain = applyChain.then(function () { return applyOne(code); });\n          });\n        })\n        .catch(function (err) {\n          atcBtn.disabled = false;\n          atcBtn.textContent = originalLabel;\n          console.warn('[petal] cart add error', err);\n        });\n      });\n    }\n\n    /* ---------- Accordions (event-delegated, smooth max-height anim) ----------\n       Open: measure scrollHeight, pin as inline max-height. Leave it pinned \u2014\n       clearing it would fall back to the base CSS max-height: 0 and trigger a\n       second transition that retracts the body and clips the text.\n       Close: re-pin current scrollHeight, force reflow, animate back to 0. */\n    page.addEventListener('click', function (e) {\n      var btn = e.target.closest('.petal-accordion button');\n      if (!btn) return;\n      var acc = btn.closest('.petal-accordion');\n      if (!acc) return;\n      var body = acc.querySelector('.petal-accordion__body');\n      if (!body) return;\n      var isOpen = acc.classList.contains('is-open');\n      if (isOpen) {\n        body.style.maxHeight = body.scrollHeight + 'px';\n        body.offsetHeight; // commit so the next change animates\n        body.style.maxHeight = '0px';\n        acc.classList.remove('is-open');\n      } else {\n        acc.classList.add('is-open');\n        body.style.maxHeight = body.scrollHeight + 'px';\n      }\n    });\n\n    /* ---------- Gallery thumbs + arrows (filmstrip slide) ----------\n       The track holds the current image. For an arrow click we insert the\n       incoming image next to it (right for \"next\", left for \"prev\"), then\n       translate the whole track so both images move together as one unit.\n       After the transition we drop the old image and reset the track to 0.\n       Boundaries: prev disabled at index 0, next disabled at last index. */\n    var track = page.querySelector('[data-petal-track]');\n    var mainImage = page.querySelector('[data-petal-main-image]');\n    var prevBtn = page.querySelector('[data-petal-gallery-prev]');\n    var nextBtn = page.querySelector('[data-petal-gallery-next]');\n    var slideLock = false;\n    var SLIDE_MS = 450;\n\n    function petalGetThumbs() {\n      return page.querySelectorAll('[data-petal-gallery-thumb]');\n    }\n\n    function petalActiveIndex() {\n      var thumbs = petalGetThumbs();\n      for (var i = 0; i < thumbs.length; i++) {\n        if (thumbs[i].classList.contains('is-active')) return i;\n      }\n      return 0;\n    }\n\n    // Preload the immediate next/prev slide images so navigating the gallery\n    // is instant (no blank while a heavier slide \u2014 e.g. a demo GIF \u2014 downloads).\n    // Deduped, and walks ahead as the user browses (each new active slide\n    // preloads its own neighbors).\n    var petalPreloaded = {};\n    function petalPreloadNeighbors() {\n      var thumbs = petalGetThumbs();\n      if (!thumbs.length) return;\n      var idx = petalActiveIndex();\n      [idx - 1, idx + 1].forEach(function (i) {\n        if (i < 0 || i >= thumbs.length) return;\n        var url = thumbs[i].dataset.petalImage;\n        if (!url || petalPreloaded[url]) return;\n        petalPreloaded[url] = true;\n        var im = new Image();\n        im.src = url;\n      });\n    }\n\n    function petalUpdateArrowState() {\n      var thumbs = petalGetThumbs();\n      if (!thumbs.length) return;\n      var idx = petalActiveIndex();\n      if (prevBtn) prevBtn.setAttribute('aria-disabled', idx <= 0 ? 'true' : 'false');\n      if (nextBtn) nextBtn.setAttribute('aria-disabled', idx >= thumbs.length - 1 ? 'true' : 'false');\n    }\n\n    function petalSetActiveThumb(target) {\n      petalGetThumbs().forEach(function (item) {\n        item.classList.remove('is-active');\n        item.removeAttribute('aria-current');\n      });\n      if (target) {\n        target.classList.add('is-active');\n        target.setAttribute('aria-current', 'true');\n      }\n      petalUpdateArrowState();\n      petalPreloadNeighbors();\n    }\n\n    function petalInstantSwap(thumb) {\n      if (!thumb || !mainImage || !thumb.dataset.petalImage) return;\n      var url = thumb.dataset.petalImage;\n      function apply() {\n        // The initial main image carries srcset/sizes, which override .src \u2014\n        // without removing them the swap silently does nothing.\n        mainImage.removeAttribute('srcset');\n        mainImage.removeAttribute('sizes');\n        mainImage.src = url;\n        mainImage.alt = thumb.dataset.petalAlt || mainImage.alt;\n        petalSetActiveThumb(thumb);\n      }\n      // Decode the new bitmap off-screen first, then swap \u2014 avoids the blank\n      // flash of assigning .src to the visible img before it has painted.\n      var pre = new Image();\n      pre.src = url;\n      if (pre.decode) { pre.decode().then(apply).catch(apply); } else { apply(); }\n    }\n\n    function petalSlideTo(thumb, direction) {\n      if (!thumb || !mainImage || !track || !thumb.dataset.petalImage) return;\n      if (slideLock) return;\n      slideLock = true;\n\n      var incoming = document.createElement('img');\n      incoming.className = 'petal-gallery__photo';\n      incoming.src = thumb.dataset.petalImage;\n      incoming.alt = thumb.dataset.petalAlt || mainImage.alt;\n      incoming.loading = 'eager';\n\n      function start() {\n        // Position the incoming image in the track on the side it's coming from.\n        // Then animate the track so current + incoming drift together.\n        track.style.transition = 'none';\n        if (direction > 0) {\n          track.appendChild(incoming);                 // [current, incoming]\n          track.style.transform = 'translateX(0)';\n        } else {\n          track.insertBefore(incoming, mainImage);     // [incoming, current]\n          track.style.transform = 'translateX(-100%)'; // start with current visible\n        }\n        // Force reflow so the starting transform is committed before we transition\n        void track.offsetWidth;\n\n        track.style.transition = 'transform ' + SLIDE_MS + 'ms cubic-bezier(.22, .61, .36, 1)';\n        track.style.transform = direction > 0 ? 'translateX(-100%)' : 'translateX(0)';\n\n        track.addEventListener('transitionend', onEnd);\n        // Safety net in case transitionend doesn't fire (e.g. tab inactive)\n        setTimeout(function () { if (slideLock) finish(); }, SLIDE_MS + 80);\n      }\n\n      function finish() {\n        track.removeEventListener('transitionend', onEnd);\n        // Drop the outgoing image, reset the track to 0 with no transition,\n        // and promote the incoming image to be the new \"main\".\n        mainImage.parentNode && mainImage.parentNode.removeChild(mainImage);\n        track.style.transition = 'none';\n        track.style.transform = 'translateX(0)';\n        incoming.setAttribute('data-petal-main-image', '');\n        mainImage = incoming;\n        petalSetActiveThumb(thumb);\n        slideLock = false;\n      }\n      function onEnd(ev) {\n        if (ev.propertyName !== 'transform') return;\n        finish();\n      }\n\n      // Decode the incoming bitmap before sliding so it never animates a blank\n      // panel. startOnce + the timeout guard ensure a stalled/rejected decode\n      // can't deadlock the slider (slideLock would otherwise stay true).\n      var started = false;\n      function startOnce() { if (started) return; started = true; start(); }\n      if (incoming.decode) {\n        incoming.decode().then(startOnce).catch(startOnce);\n        setTimeout(startOnce, 350);\n      } else {\n        startOnce();\n      }\n    }\n\n    page.addEventListener('click', function (e) {\n      var thumb = e.target.closest('[data-petal-gallery-thumb]');\n      if (thumb) { petalInstantSwap(thumb); return; }\n\n      var prevHit = e.target.closest('[data-petal-gallery-prev]');\n      var nextHit = e.target.closest('[data-petal-gallery-next]');\n      if (!prevHit && !nextHit) return;\n      e.preventDefault();\n\n      var btn = prevHit || nextHit;\n      if (btn.getAttribute('aria-disabled') === 'true') return;\n\n      var thumbs = petalGetThumbs();\n      if (!thumbs.length) return;\n      var idx = petalActiveIndex();\n      var direction = nextHit ? 1 : -1;\n      var targetIdx = idx + direction;\n      if (targetIdx < 0 || targetIdx >= thumbs.length) return; // hard boundary\n      petalSlideTo(thumbs[targetIdx], direction);\n    });\n\n    /* ---------- Drag/swipe on the main gallery (touch + mouse) ----------\n       The image follows the finger/cursor 1:1 with rubber-band resistance\n       past the ends; release past 20% width (or a fast flick) advances.\n       Touch is driven by raw touch events so that once a drag locks in as\n       horizontal, every following touchmove is preventDefault()ed \u2014 that\n       freezes page scrolling for the rest of the gesture, so an imperfect\n       (slightly diagonal) swipe can no longer scroll the page and break the\n       drag. Gestures that START vertical-leaning are handed to the page\n       immediately and scroll natively. Mouse/pen drags use pointer events. */\n    var galleryMain = page.querySelector('.petal-gallery__main');\n    if (galleryMain && track) {\n      var drag = null;\n\n      galleryMain.addEventListener('dragstart', function (e) { e.preventDefault(); });\n\n      function petalMakeNeighbor(thumb) {\n        if (!thumb || !thumb.dataset.petalImage) return null;\n        var img = document.createElement('img');\n        img.className = 'petal-gallery__photo';\n        img.src = thumb.dataset.petalImage;\n        img.alt = thumb.dataset.petalAlt || '';\n        img.loading = 'eager';\n        img.draggable = false;\n        return img;\n      }\n\n      function petalDragStart(x, y) {\n        if (slideLock || drag) return;\n        if (petalGetThumbs().length < 2) return;\n        drag = {\n          startX: x, startY: y,\n          width: galleryMain.clientWidth || 1,\n          locked: false, base: 0, delta: 0,\n          lastX: x, lastT: 0, vel: 0,\n          idx: petalActiveIndex(),\n          prevImg: null, nextImg: null, prevThumb: null, nextThumb: null,\n          onEnd: null, pointerId: null\n        };\n      }\n\n      function petalDragLock() {\n        var cur = drag;\n        if (!cur || cur.locked) return;\n        cur.locked = true;\n        slideLock = true;\n        galleryMain.classList.add('is-dragging');\n        var thumbs = petalGetThumbs();\n        cur.prevThumb = cur.idx > 0 ? thumbs[cur.idx - 1] : null;\n        cur.nextThumb = cur.idx < thumbs.length - 1 ? thumbs[cur.idx + 1] : null;\n        cur.prevImg = petalMakeNeighbor(cur.prevThumb);\n        cur.nextImg = petalMakeNeighbor(cur.nextThumb);\n        track.style.transition = 'none';\n        if (cur.prevImg) { track.insertBefore(cur.prevImg, mainImage); cur.base = -cur.width; }\n        if (cur.nextImg) track.appendChild(cur.nextImg);\n        track.style.transform = 'translateX(' + cur.base + 'px)';\n      }\n\n      function petalDragMove(x, t) {\n        var cur = drag;\n        if (!cur || !cur.locked) return;\n        var d = x - cur.startX;\n        if ((d > 0 && !cur.prevImg) || (d < 0 && !cur.nextImg)) d = d * 0.3; // rubber band\n        cur.delta = d;\n        if (cur.lastT && t > cur.lastT) {\n          cur.vel = (x - cur.lastX) / (t - cur.lastT);\n        }\n        cur.lastX = x;\n        cur.lastT = t;\n        track.style.transform = 'translateX(' + (cur.base + d) + 'px)';\n      }\n\n      function petalDragCleanup(cur, promote) {\n        if (drag !== cur) return;\n        if (cur.onEnd) track.removeEventListener('transitionend', cur.onEnd);\n        var promoted = promote === 'next' ? cur.nextImg : promote === 'prev' ? cur.prevImg : null;\n        [cur.prevImg, cur.nextImg].forEach(function (img) {\n          if (img && img !== promoted && img.parentNode) img.parentNode.removeChild(img);\n        });\n        if (promoted) {\n          if (mainImage.parentNode) mainImage.parentNode.removeChild(mainImage);\n          promoted.setAttribute('data-petal-main-image', '');\n          mainImage = promoted;\n          petalSetActiveThumb(promote === 'next' ? cur.nextThumb : cur.prevThumb);\n        }\n        track.style.transition = 'none';\n        track.style.transform = 'translateX(0)';\n        galleryMain.classList.remove('is-dragging');\n        slideLock = false;\n        drag = null;\n      }\n\n      function petalDragRelease(cancelled) {\n        var cur = drag;\n        if (!cur) return;\n        if (!cur.locked) { drag = null; return; }\n        var d = cur.delta;\n        var goNext = !cancelled && cur.nextImg && (d < -cur.width * 0.2 || (d < -24 && cur.vel < -0.45));\n        var goPrev = !cancelled && cur.prevImg && (d > cur.width * 0.2 || (d > 24 && cur.vel > 0.45));\n        var promote = goNext ? 'next' : goPrev ? 'prev' : null;\n        var target = cur.base + (goNext ? -cur.width : goPrev ? cur.width : 0);\n\n        // A real drag shouldn't also count as a click on whatever it ends over.\n        if (Math.abs(d) > 8) {\n          var swallow = function (ev) { ev.preventDefault(); ev.stopPropagation(); };\n          galleryMain.addEventListener('click', swallow, true);\n          setTimeout(function () { galleryMain.removeEventListener('click', swallow, true); }, 320);\n        }\n\n        cur.onEnd = function (ev) {\n          if (ev.propertyName !== 'transform') return;\n          petalDragCleanup(cur, promote);\n        };\n        track.addEventListener('transitionend', cur.onEnd);\n        track.style.transition = 'transform 260ms cubic-bezier(.22, .61, .36, 1)';\n        track.style.transform = 'translateX(' + target + 'px)';\n        setTimeout(function () { petalDragCleanup(cur, promote); }, 340);\n      }\n\n      /* --- Touch path (non-passive: a locked drag freezes page scroll) --- */\n      galleryMain.addEventListener('touchstart', function (e) {\n        if (e.touches.length !== 1) { if (drag && !drag.locked) drag = null; return; }\n        if (e.target.closest('.petal-gallery__nav')) return;\n        petalDragStart(e.touches[0].clientX, e.touches[0].clientY);\n      }, { passive: true });\n\n      galleryMain.addEventListener('touchmove', function (e) {\n        var cur = drag;\n        if (!cur || cur.pointerId !== null) return;\n        var t0 = e.touches[0];\n        if (!t0) return;\n        if (!cur.locked) {\n          var dx = t0.clientX - cur.startX;\n          var dy = t0.clientY - cur.startY;\n          if (Math.abs(dy) > Math.abs(dx)) { drag = null; return; }  // vertical intent: let the page scroll\n          if (!e.cancelable) { drag = null; return; }                 // browser already scrolling: too late\n          if (Math.abs(dx) < 4) return;                               // too early to tell\n          petalDragLock();\n        }\n        if (!e.cancelable) { petalDragRelease(true); return; }\n        e.preventDefault(); // gallery owns the gesture \u2014 page scroll is frozen\n        petalDragMove(t0.clientX, e.timeStamp);\n      }, { passive: false });\n\n      galleryMain.addEventListener('touchend', function () {\n        if (drag && drag.pointerId === null) petalDragRelease(false);\n      }, { passive: true });\n      galleryMain.addEventListener('touchcancel', function () {\n        if (drag && drag.pointerId === null) petalDragRelease(true);\n      }, { passive: true });\n\n      /* --- Mouse / pen path --- */\n      galleryMain.addEventListener('pointerdown', function (e) {\n        if (e.pointerType === 'touch') return; // handled by the touch path\n        if (e.pointerType === 'mouse' && e.button !== 0) return;\n        if (e.target.closest('.petal-gallery__nav')) return;\n        petalDragStart(e.clientX, e.clientY);\n        if (drag) drag.pointerId = e.pointerId;\n      });\n      galleryMain.addEventListener('pointermove', function (e) {\n        var cur = drag;\n        if (e.pointerType === 'touch' || !cur || cur.pointerId !== e.pointerId) return;\n        if (!cur.locked) {\n          var dx = e.clientX - cur.startX;\n          var dy = e.clientY - cur.startY;\n          if (Math.abs(dx) < 6 || Math.abs(dx) <= Math.abs(dy)) {\n            if (Math.abs(dy) > 14 && Math.abs(dy) > Math.abs(dx)) drag = null;\n            return;\n          }\n          petalDragLock();\n          try { galleryMain.setPointerCapture(e.pointerId); } catch (err) {}\n        }\n        petalDragMove(e.clientX, e.timeStamp);\n      });\n      galleryMain.addEventListener('pointerup', function (e) {\n        if (e.pointerType === 'touch' || !drag || drag.pointerId !== e.pointerId) return;\n        petalDragRelease(false);\n      });\n      galleryMain.addEventListener('pointercancel', function (e) {\n        if (e.pointerType === 'touch' || !drag || drag.pointerId !== e.pointerId) return;\n        petalDragRelease(true);\n      });\n    }\n\n    petalUpdateArrowState();\n    petalPreloadNeighbors();\n\n    /* ---------- Thumbnail strip scroll arrows ---------- */\n    var thumbStrip = page.querySelector('.petal-gallery__thumbs');\n    var thumbArrowL = page.querySelector('.petal-thumb-arrow--left');\n    var thumbArrowR = page.querySelector('.petal-thumb-arrow--right');\n    if (thumbStrip && thumbArrowL && thumbArrowR) {\n      var scrollAmt = function() {\n        var thumb = thumbStrip.querySelector('.petal-thumb');\n        return thumb ? thumb.offsetWidth + 9 : 100;\n      };\n      thumbArrowL.addEventListener('click', function() {\n        thumbStrip.scrollBy({ left: -scrollAmt() * 2, behavior: 'smooth' });\n      });\n      thumbArrowR.addEventListener('click', function() {\n        thumbStrip.scrollBy({ left: scrollAmt() * 2, behavior: 'smooth' });\n      });\n    }\n\n    /* ---------- Stats reveal + count-up ----------\n       Bell-curve easing (ease-in-out cubic) so the count starts gently, runs\n       through the middle, and decelerates into the target \u2014 matching the ring\n       fill animation's cubic-bezier(.65, 0, .35, 1) timing. */\n    function animateCount(el, target, duration, suffix, prefix) {\n      suffix = suffix || '';\n      prefix = prefix || '';\n      var startTime = null;\n      function step(t) {\n        if (!startTime) startTime = t;\n        var p = Math.min((t - startTime) / duration, 1);\n        var eased = p < 0.5\n          ? 4 * p * p * p\n          : 1 - Math.pow(-2 * p + 2, 3) / 2;\n        var v = Math.round(target * eased);\n        el.textContent = prefix + v + suffix;\n        if (p < 1) requestAnimationFrame(step);\n      }\n      requestAnimationFrame(step);\n    }\n\n    /* Each stat card animates independently when it enters the viewport.\n       Adding .is-visible to the card both triggers the CSS ring-fill animation\n       and runs the count-up. Fixed slow duration (2400ms) \u2014 matches the CSS. */\n    var STAT_FILL_MS = 2400;\n\n    function fireStatCard(card) {\n      if (!card || card.classList.contains('is-visible')) return;\n      card.classList.add('is-visible');\n      var el = card.querySelector('[data-petal-stat-target]');\n      if (!el) return;\n      var target = parseFloat(el.getAttribute('data-petal-stat-target')) || 0;\n      var suffix = el.getAttribute('data-petal-stat-suffix') || '';\n      var prefix = el.getAttribute('data-petal-stat-prefix') || '';\n      el.textContent = prefix + '0' + suffix;\n      animateCount(el, target, STAT_FILL_MS, suffix, prefix);\n\n      /* Mellowsleep.com-style: set the SVG progress circle's stroke-dashoffset\n         inline to the target value. The CSS rule on .petal-stat-ring__progress\n         has `transition: stroke-dashoffset 2.4s cubic-bezier(...)`, so the\n         browser smoothly tweens between the initial 100 (empty) and the\n         target (e.g. 25 for a 75% fill). pathLength=100 is set on the circle\n         so values map 1:1 with percentages. */\n      var ring = card.querySelector('.petal-stat-ring__progress');\n      if (ring) {\n        // Force a starting value of 100 and a reflow so the transition picks\n        // up the change even if the browser already painted the element.\n        ring.style.strokeDashoffset = '100';\n        // eslint-disable-next-line no-unused-expressions\n        ring.getBoundingClientRect();\n        requestAnimationFrame(function () {\n          ring.style.strokeDashoffset = String(Math.max(0, 100 - target));\n        });\n      }\n    }\n\n    function observeStatCard(card) {\n      if (!card) return;\n      // Theme editor: fire immediately so the user can see the animation\n      // without scrolling.\n      if (window.Shopify && window.Shopify.designMode) {\n        fireStatCard(card);\n        return;\n      }\n      if ('IntersectionObserver' in window) {\n        var observer = new IntersectionObserver(function (entries, obs) {\n          entries.forEach(function (entry) {\n            if (!entry.isIntersecting) return;\n            fireStatCard(entry.target);\n            obs.unobserve(entry.target);\n          });\n        }, { threshold: 0.4 });\n        observer.observe(card);\n      } else {\n        fireStatCard(card);\n      }\n    }\n\n    document.querySelectorAll('.petal-stat-card').forEach(observeStatCard);\n\n    /* Theme editor: re-attach observers when the section reloads (settings\n       change) or is selected \u2014 the old DOM nodes are replaced. */\n    function reinitStats(e) {\n      var root = e && e.target && e.target.querySelectorAll ? e.target : document;\n      root.querySelectorAll('.petal-stat-card').forEach(observeStatCard);\n    }\n    document.addEventListener('shopify:section:load', reinitStats);\n    document.addEventListener('shopify:section:select', reinitStats);\n\n    /* ---------- Kill hover/transition on pack buttons ----------\n       The Debutify base theme sets `transition: opacity .3s, background .3s,\n       border .3s, box-shadow .3s` on all <button> elements. On product\n       templates the external petal CSS overrides this, but on page templates\n       the cascade doesn't always cooperate. This JS fix sets the inline style\n       directly so it wins regardless of stylesheet order. */\n    function killPackTransitions() {\n      page.querySelectorAll('button.petal-pack, button.petal-atc').forEach(function (btn) {\n        btn.style.setProperty('transition', 'none', 'important');\n        btn.style.setProperty('-webkit-tap-highlight-color', 'transparent');\n      });\n    }\n    killPackTransitions();\n    window.addEventListener('load', function () { setTimeout(killPackTransitions, 200); });\n\n    /* ---------- Sticky \"Get Yours\" CTA ----------\n       Reveals the floating CTA once the main Add-to-Cart has scrolled ABOVE the\n       viewport (shopper scrolled past the buy box) and hides it again when the\n       buy box is back in view. Tapping it smooth-scrolls to the packs (#offer). */\n    (function () {\n      var bar = page.querySelector('[data-petal-sticky-bar]');\n      var link = page.querySelector('[data-petal-sticky-cta]');\n      var atc = page.querySelector('[data-petal-add-to-cart]');\n      if (!bar || !link || !atc) return;\n\n      // Show the bar once the Add-to-Cart has scrolled fully above the viewport;\n      // hide it when back in view. A rAF-throttled scroll check (not Intersection-\n      // Observer) is used so a fast/jump scroll that skips over the ATC still\n      // toggles correctly. getBoundingClientRect().bottom < 0 = ATC scrolled past.\n      var ticking = false;\n      function petalStickyUpdate() {\n        ticking = false;\n        bar.classList.toggle('is-visible', atc.getBoundingClientRect().bottom < 0);\n      }\n      function petalStickyOnScroll() {\n        if (ticking) return;\n        ticking = true;\n        window.requestAnimationFrame(petalStickyUpdate);\n      }\n      window.addEventListener('scroll', petalStickyOnScroll, { passive: true });\n      window.addEventListener('resize', petalStickyOnScroll, { passive: true });\n      petalStickyUpdate();\n\n      // Tap = smooth-scroll to whatever the button's href points at (now the\n      // \"BUY MORE - SAVE MORE\" bundle, #bundle). Offset by any sticky header /\n      // announcement bar so the bundle title isn't hidden behind it.\n      link.addEventListener('click', function (ev) {\n        var hash = (link.getAttribute('href') || '').replace(/^#/, '');\n        var target = hash ? document.getElementById(hash) : null;\n        if (!target) return; // missing target -> let the browser do the default jump\n        ev.preventDefault();\n        var obstruction = 0;\n        ['petal-header', '.petal-header', 'sticky-header', '.header-wrapper', '.petal-announcement--sticky'].forEach(function (sel) {\n          document.querySelectorAll(sel).forEach(function (el) {\n            var cs = window.getComputedStyle(el);\n            if (cs.position === 'fixed' || cs.position === 'sticky') {\n              var r = el.getBoundingClientRect();\n              if (r.top <= 5 && r.bottom > obstruction) obstruction = r.bottom;\n            }\n          });\n        });\n        var y = target.getBoundingClientRect().top + window.pageYOffset - obstruction - 16;\n        window.scrollTo({ top: y < 0 ? 0 : y, behavior: 'smooth' });\n      });\n    })();\n\n    /* ---------- Sticky CTA periodic animation ----------\n       Replays a chosen motion on the floating \"Get Yours\" button every N\n       seconds (Hero Packs section -> \"Sticky CTA - Movement\"), but ONLY while\n       the bar is on screen (.is-visible). Honors prefers-reduced-motion.\n       Re-initializes on Shopify theme-editor events so changing the setting in\n       the Customizer updates the live preview without a full reload. */\n    var petalCtaAnimTimer = null;\n    var petalCtaPrimer = null;\n    function setupStickyCtaAnim() {\n      if (petalCtaAnimTimer) { clearInterval(petalCtaAnimTimer); petalCtaAnimTimer = null; }\n      if (petalCtaPrimer) { clearInterval(petalCtaPrimer); petalCtaPrimer = null; }\n\n      var animPage = document.querySelector('.petal-page');\n      if (!animPage) return;\n      var animBar = animPage.querySelector('[data-petal-sticky-bar]');\n      var cta = animPage.querySelector('[data-petal-sticky-cta]');\n      if (!animBar || !cta) return;\n\n      // clear any motion class from a previous init / setting change\n      cta.className = cta.className.replace(/\\s*petal-cta-anim--\\S+/g, '');\n      cta.classList.remove('is-anim-playing');\n\n      var anim = (cta.getAttribute('data-petal-cta-anim') || 'none').trim();\n      var reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      if (!anim || anim === 'none' || reduce) return;\n\n      var secs = parseFloat(cta.getAttribute('data-petal-cta-interval'));\n      if (!secs || secs < 2) secs = 2;\n      if (secs > 12) secs = 12;\n\n      cta.classList.add('petal-cta-anim--' + anim);\n      if (!cta.dataset.petalAnimBound) {\n        cta.addEventListener('animationend', function () { cta.classList.remove('is-anim-playing'); });\n        cta.dataset.petalAnimBound = '1';\n      }\n\n      function play() {\n        if (!animBar.classList.contains('is-visible')) return;\n        cta.classList.remove('is-anim-playing');\n        void cta.offsetWidth; // force reflow so the animation restarts cleanly\n        cta.classList.add('is-anim-playing');\n      }\n\n      // first play the moment the bar appears, then every N seconds\n      var tries = 0;\n      petalCtaPrimer = setInterval(function () {\n        tries++;\n        if (animBar.classList.contains('is-visible')) {\n          clearInterval(petalCtaPrimer); petalCtaPrimer = null; play();\n        } else if (tries > 120) {\n          clearInterval(petalCtaPrimer); petalCtaPrimer = null; // give up after ~42s\n        }\n      }, 350);\n      petalCtaAnimTimer = setInterval(play, secs * 1000);\n    }\n    setupStickyCtaAnim();\n    document.addEventListener('shopify:section:load', setupStickyCtaAnim);\n    document.addEventListener('shopify:section:select', setupStickyCtaAnim);\n  });\n})();\n"],
  "mappings": "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",
  "names": ["e", "petalMakeNeighbor", "petalDragStart", "petalDragLock", "petalDragMove", "petalDragCleanup", "petalDragRelease"]
}
