{
  "version": 3,
  "sources": ["/cdn/shop/t/967/assets/balance-pdp.js?utm_bot_source=7516fd43adaa"],
  "sourcesContent": ["/* ==========================================================================\n   Balance PDP  (DO-3026)\n   Isolated, dependency-free behaviour for the Balance launch product page:\n   gallery thumbnail switching, quantity stepper, one-time/subscribe toggle.\n   Scoped to .balance-pdp markup; touches no shared code.\n   ========================================================================== */\n(function () {\n  'use strict';\n\n  function initGallery(root) {\n    var main = root.querySelector('[data-balance-main]');\n    var thumbs = root.querySelectorAll('[data-balance-thumb]');\n    if (!main || !thumbs.length) return;\n    thumbs.forEach(function (thumb) {\n      thumb.addEventListener('click', function () {\n        var src = thumb.getAttribute('data-media-src');\n        if (src) main.setAttribute('src', src);\n        thumbs.forEach(function (t) { t.setAttribute('aria-current', 'false'); });\n        thumb.setAttribute('aria-current', 'true');\n      });\n    });\n  }\n\n  function initQty(scope) {\n    var qty = scope.querySelector('[data-balance-qty]');\n    if (!qty) return;\n    var input = qty.querySelector('input');\n    var minus = qty.querySelector('[data-balance-qty-minus]');\n    var plus = qty.querySelector('[data-balance-qty-plus]');\n    function clamp() {\n      var v = parseInt(input.value, 10);\n      if (isNaN(v) || v < 1) v = 1;\n      input.value = v;\n    }\n    if (minus) minus.addEventListener('click', function () { input.value = Math.max(1, (parseInt(input.value, 10) || 1) - 1); });\n    if (plus) plus.addEventListener('click', function () { input.value = (parseInt(input.value, 10) || 1) + 1; });\n    input.addEventListener('change', clamp);\n  }\n\n  function initPurchaseOptions(scope) {\n    var wrap = scope.querySelector('[data-balance-purchase]');\n    if (!wrap) return;\n    var sellingPlanInput = scope.querySelector('#balance-pdp-selling-plan');\n    var planBox = wrap.querySelector('[data-balance-plans]');\n    var planSelect = wrap.querySelector('[data-balance-plan-select]');\n    var options = wrap.querySelectorAll('[data-balance-option]');\n\n    function setSellingPlan(isSub) {\n      if (!sellingPlanInput) return;\n      sellingPlanInput.value = (isSub && planSelect) ? planSelect.value : '';\n    }\n\n    options.forEach(function (opt) {\n      var radio = opt.querySelector('input[type=\"radio\"]');\n      opt.addEventListener('click', function () {\n        var isSub = opt.getAttribute('data-balance-option') === 'subscription';\n        if (radio) radio.checked = true;\n        options.forEach(function (o) { o.classList.remove('balance-pdp-purchase__option--active'); });\n        opt.classList.add('balance-pdp-purchase__option--active');\n        if (planBox) planBox.hidden = !isSub;\n        setSellingPlan(isSub);\n      });\n    });\n\n    if (planSelect) {\n      planSelect.addEventListener('change', function () {\n        var subActive = wrap.querySelector('[data-balance-option=\"subscription\"]').classList.contains('balance-pdp-purchase__option--active');\n        setSellingPlan(subActive);\n      });\n    }\n  }\n\n  function initIngredients(section) {\n    var track = section.querySelector('[data-ingredients-track]');\n    if (!track) return;\n    var prev = section.querySelector('[data-ingredients-prev]');\n    var next = section.querySelector('[data-ingredients-next]');\n    var dotsWrap = section.querySelector('[data-ingredients-dots]');\n    var n = track.children.length;\n    var dots = [];\n\n    function current() { return Math.round(track.scrollLeft / track.clientWidth); }\n    function scrollToCard(idx) {\n      idx = Math.max(0, Math.min(n - 1, idx));\n      track.scrollTo({ left: idx * track.clientWidth, behavior: 'smooth' });\n    }\n    function update() {\n      var c = current();\n      dots.forEach(function (d, i) { d.setAttribute('aria-current', i === c ? 'true' : 'false'); });\n    }\n\n    if (dotsWrap && n > 1) {\n      for (var i = 0; i < n; i++) {\n        var d = document.createElement('button');\n        d.type = 'button';\n        d.className = 'balance-pdp-ingredients__dot';\n        d.setAttribute('aria-label', 'Go to ingredient ' + (i + 1));\n        (function (idx) { d.addEventListener('click', function () { scrollToCard(idx); }); })(i);\n        dotsWrap.appendChild(d);\n        dots.push(d);\n      }\n    }\n\n    if (prev) prev.addEventListener('click', function () { scrollToCard(current() - 1); });\n    if (next) next.addEventListener('click', function () { scrollToCard(current() + 1); });\n    track.addEventListener('scroll', function () { window.requestAnimationFrame(update); });\n    update();\n\n    var full = section.querySelector('[data-ingredients-full]');\n    if (full) {\n      // Bold any [bracketed] terms in the INCI list (matches the theme's ingredient pattern).\n      var inci = full.querySelector('.balance-pdp-ingredients__inci');\n      if (inci) inci.innerHTML = inci.innerHTML.replace(/\\[(.*?)\\]/g, '<strong>$1</strong>');\n\n      // Triggers: the desktop header link AND the mobile toggle both reveal/hide the list.\n      var triggers = section.querySelectorAll('[data-ingredients-fulltoggle], [data-ingredients-link]');\n      triggers.forEach(function (t) {\n        t.addEventListener('click', function (e) {\n          e.preventDefault();\n          var open = full.classList.toggle('is-open');\n          triggers.forEach(function (x) { x.setAttribute('aria-expanded', open ? 'true' : 'false'); });\n        });\n      });\n    }\n  }\n\n  function initDetails(section) {\n    // Mobile dropdown: \"See Full Details\" reveals everything below the callout boxes.\n    var more = section.querySelector('[data-details-more]');\n    var toggle = section.querySelector('[data-details-toggle]');\n    if (!more || !toggle) return;\n    toggle.addEventListener('click', function () {\n      var open = more.classList.toggle('is-open');\n      toggle.setAttribute('aria-expanded', open ? 'true' : 'false');\n    });\n  }\n\n  function initReviews(section) {\n    // Placeholder \"Write Review\" button proxies to the off-screen Reviews.io widget's\n    // own write-review trigger (matched by text so it survives Polaris class churn).\n    var btn = section.querySelector('[data-balance-write-review]');\n    var widget = section.querySelector('.balance-pdp-reviews__widget');\n    if (!widget) return;\n\n    // Auto-reveal the live Reviews.io widget once it has rendered \u22651 review (no review-count\n    // metafield exists, so we detect from the Polaris DOM). Until then the custom\n    // \"Reviews Coming Soon\" placeholder stays \u2014 no empty-state flash.\n    // NOTE: keys off Polaris's .ElementsWidget__list markup; may need a tweak if Reviews.io\n    // changes its class names.\n    function hasRenderedReviews() {\n      return !!widget.querySelector('.ElementsWidget__list .R-ReviewsList__item, .ElementsWidget__list > .u-marginBottom--md, [class*=\"ReviewsList__item\"]');\n    }\n    function revealIfReviews() {\n      if (hasRenderedReviews()) { section.classList.add('has-reviews'); return true; }\n      return false;\n    }\n    if (!revealIfReviews()) {\n      var rObs = new MutationObserver(function () { if (revealIfReviews()) rObs.disconnect(); });\n      rObs.observe(widget, { childList: true, subtree: true });\n      setTimeout(function () { rObs.disconnect(); }, 10000);\n    }\n\n    var RX = /write\\s*(a)?\\s*review|leave a review|be the first|escrib/i;\n\n    function findWriteTrigger() {\n      var els = widget.querySelectorAll('button, a, [role=\"button\"]');\n      var anchorFallback = null;\n      for (var i = 0; i < els.length; i++) {\n        var el = els[i];\n        if (!RX.test((el.textContent || '').trim())) continue;\n        // Prefer a real button \u2014 it opens the lightbox without href navigation.\n        if (el.tagName === 'BUTTON' || el.getAttribute('role') === 'button') return el;\n        if (!anchorFallback) anchorFallback = el;\n      }\n      return anchorFallback;\n    }\n\n    function fire(el) {\n      // If it's an anchor (often href=\"#\"), block the default jump-to-top but still\n      // let the widget's own click handler run and open the write-review lightbox.\n      if (el.tagName === 'A') {\n        el.addEventListener('click', function (e) { e.preventDefault(); }, { once: true, capture: true });\n      }\n      el.click();\n    }\n\n    if (btn) btn.addEventListener('click', function () {\n      // Reveal the widget into the visible flow: its write form opens INLINE, so it must\n      // be on-screen. This also forces Polaris to (lazy-)render if it hadn't yet.\n      section.classList.add('is-writing');\n      var trigger = findWriteTrigger();\n      if (trigger) { fire(trigger); return; }\n      // Widget may still be rendering \u2014 watch for it, then fire once it appears.\n      var obs = new MutationObserver(function () {\n        var t = findWriteTrigger();\n        if (t) { obs.disconnect(); fire(t); }\n      });\n      obs.observe(widget, { childList: true, subtree: true });\n      setTimeout(function () { obs.disconnect(); }, 8000);\n    });\n\n    // When the user cancels/closes the Reviews.io write form, revert to the custom\n    // placeholder so the widget's own \"no reviews\" empty state never replaces it.\n    widget.addEventListener('click', function (e) {\n      var t = e.target && e.target.closest ? e.target.closest('button, a, [role=\"button\"]') : null;\n      if (t && /cancel|close|back/i.test((t.textContent || '').trim())) {\n        setTimeout(function () { section.classList.remove('is-writing'); }, 50);\n      }\n    });\n  }\n\n  function init() {\n    // The script can be referenced by more than one Balance section on the page; run once.\n    if (window.__balancePdpInited) return;\n    window.__balancePdpInited = true;\n\n    var sections = document.querySelectorAll('.balance-pdp-buy-box');\n    sections.forEach(function (section) {\n      var gallery = section.querySelector('[data-balance-gallery]');\n      if (gallery) initGallery(gallery);\n      initQty(section);\n      initPurchaseOptions(section);\n    });\n    document.querySelectorAll('.balance-pdp-ingredients').forEach(function (s) { initIngredients(s); });\n    document.querySelectorAll('.balance-pdp-details').forEach(function (s) { initDetails(s); });\n    document.querySelectorAll('.balance-pdp-reviews').forEach(function (s) { initReviews(s); });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n"],
  "mappings": "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",
  "names": ["d", "i"]
}
