{
  "version": 3,
  "sources": ["/cdn/shop/t/410/assets/z__jsCartPromo.js?cb=1781330687"],
  "sourcesContent": ["/**\r\n * z__jsCartPromo.js.liquid\r\n * Manual Free Gift promo (no Kite)\r\n *\r\n * Exposes:\r\n *   window.zCartPromo.init()\r\n *   window.zCartPromo.refresh()\r\n *   window.zCartPromo.claim()\r\n *\r\n * Notes:\r\n * - You cannot add \"tags\" to cart items; uses line item properties instead.\r\n * - Making item $0 requires pricing/discount logic (Shopify cannot set $0 via cart API).\r\n */\r\n\r\nwindow.zCartPromo = window.zCartPromo || {};\r\n\r\n(function () {\r\n  'use strict';\r\n\r\n  let __bound = false;\r\n  let __claiming = false;\r\n\r\n  var SEL = {\r\n    mount: '[data-free-gift-mount]',\r\n    wrapper: '[data-free-gift-wrapper]',\r\n    claim: '[data-free-gift-claim]',\r\n    thresholdText: '[data-free-gift-threshold-text]'\r\n  };\r\n\r\n  function dollarsFromCents(cents) {\r\n    var v = Math.max(0, Number(cents) || 0) / 100;\r\n    return v.toFixed(2);\r\n  }\r\n\r\n  async function getCart() {\r\n    var res = await fetch('/cart.js', { credentials: 'same-origin' });\r\n    if (!res.ok) throw new Error('Failed to fetch /cart.js');\r\n    return await res.json();\r\n  }\r\n\r\n  function getConfig() {\r\n    var wrap = document.querySelector(SEL.wrapper);\r\n    if (!wrap) return null;\r\n\r\n    return {\r\n      wrap: wrap,\r\n      variantId: Number(wrap.getAttribute('data-free-gift-variant-id')) || 0,\r\n      thresholdCents: Number(wrap.getAttribute('data-free-gift-threshold-cents')) || 0,\r\n      message: wrap.getAttribute('data-free-gift-message') || ''\r\n    };\r\n  }\r\n\r\n  function giftInCartAtZero(cart, variantId) {\r\n    if (!cart || !Array.isArray(cart.items)) return false;\r\n    for (var i = 0; i < cart.items.length; i++) {\r\n      var it = cart.items[i];\r\n      if (Number(it.variant_id) === Number(variantId)) {\r\n        return Number(it.final_line_price) === 0;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function eligibleSubtotalCents(cart, variantId) {\r\n    var subtotal = Number(cart.items_subtotal_price) || 0;\r\n\r\n    // subtract gift line if present so it doesn't help qualify\r\n    if (cart && Array.isArray(cart.items)) {\r\n      cart.items.forEach(function (it) {\r\n        if (Number(it.variant_id) === Number(variantId)) {\r\n          subtotal -= Number(it.final_line_price) || 0;\r\n        }\r\n      });\r\n    }\r\n    return Math.max(0, subtotal);\r\n  }\r\n\r\n  function updateUI(config, cart) {\r\n    if (!config || !config.wrap) return;\r\n\r\n    // If gift is already in cart at $0, remove promo block entirely\r\n    if (giftInCartAtZero(cart, config.variantId)) {\r\n      var mount = config.wrap.closest(SEL.mount);\r\n      if (mount) mount.innerHTML = ''; // keep mount, clear content\r\n      else config.wrap.remove();\r\n      return;\r\n    }\r\n\r\n    var eligible = eligibleSubtotalCents(cart, config.variantId);\r\n    var remaining = config.thresholdCents - eligible;\r\n    var unlocked = remaining <= 0;\r\n\r\n    var txt = config.wrap.querySelector(SEL.thresholdText);\r\n    if (txt) {\r\n      txt.textContent = unlocked\r\n        ? 'Free Gift Ready To Claim'\r\n        : ((remaining/100).toLocaleString('en-US', { style:'currency', currency:'USD' }) + ' away to unlock!');\r\n    }\r\n\r\n    var btn = config.wrap.querySelector(SEL.claim);\r\n    if (btn) {\r\n      if (unlocked) {\r\n        btn.disabled = false;\r\n        btn.setAttribute('aria-disabled', 'false');\r\n      } else {\r\n        btn.disabled = true;\r\n        btn.setAttribute('aria-disabled', 'true');\r\n      }\r\n    }\r\n  }\r\n\r\n  async function refresh() {\r\n    var config = getConfig();\r\n    if (!config) return;\r\n\r\n    var cart = await getCart();\r\n    updateUI(config, cart);\r\n  }\r\n\r\nasync function claim() {\r\n  if (__claiming) return;      // \u2705 prevents double add from fast clicks or double events\r\n  __claiming = true;\r\n\r\n  const config = getConfig();\r\n  if (!config || !config.variantId) {\r\n    __claiming = false;\r\n    return;\r\n  }\r\n\r\n  const btn = config.wrap.querySelector('[data-free-gift-claim]');\r\n  if (btn) {\r\n    btn.disabled = true;\r\n    btn.textContent = 'Adding...';\r\n    btn.setAttribute('aria-disabled', 'true');\r\n  }\r\n\r\n  try {\r\n    const payload = {\r\n      items: [{\r\n        id: config.variantId,\r\n        quantity: 1,\r\n        properties: {\r\n          _free_gift: 'true',\r\n          _free_gift_message: config.message || ''\r\n        }\r\n      }]\r\n    };\r\n\r\n    const res = await fetch('/cart/add.js', {\r\n      method: 'POST',\r\n      headers: { 'Content-Type': 'application/json' },\r\n      credentials: 'same-origin',\r\n      body: JSON.stringify(payload)\r\n    });\r\n\r\n    if (!res.ok) throw new Error('Add failed: ' + res.status);\r\n\r\n    // \u2705 Immediately hide promo (don\u2019t wait for cart refresh)\r\n    const mount = config.wrap.closest('[data-free-gift-mount]');\r\n    if (mount) mount.innerHTML = '';\r\n\r\n    // \u2705 Refresh cart UI\r\n    if (window.PXUTheme && window.PXUTheme.jsAjaxCart && typeof window.PXUTheme.jsAjaxCart.updateView === 'function') {\r\n      window.PXUTheme.jsAjaxCart.updateView();\r\n    } else if (window.zCartPromo && typeof window.zCartPromo.refresh === 'function') {\r\n      window.zCartPromo.refresh().catch(() => {});\r\n    }\r\n\r\n  } catch (e) {\r\n    console.error('[zCartPromo] claim error', e);\r\n    if (btn) {\r\n      btn.textContent = 'Claim';\r\n      btn.disabled = false;\r\n      btn.setAttribute('aria-disabled', 'false');\r\n    }\r\n  } finally {\r\n    __claiming = false;\r\n  }\r\n}\r\n\r\n  function bind() {\r\n    if (__bound) return;        // \u2705 prevents duplicate bindings\r\n    __bound = true;\r\n\r\n    document.addEventListener('click', function (e) {\r\n      const btn = e.target && e.target.closest && e.target.closest('[data-free-gift-claim]');\r\n      if (!btn) return;\r\n\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n\r\n      window.zCartPromo.claim();\r\n    }, true); // \u2705 capture phase helps if theme stops bubbling\r\n  }\r\n\r\n  function init() {\r\n    bind();\r\n    refresh().catch(function () {});\r\n  }\r\n\r\n  window.zCartPromo = {\r\n    init: init,\r\n    refresh: refresh,\r\n    claim: claim\r\n  };\r\n})();\r\n\r\n\r\n// auto-init\r\nif (document.readyState === 'loading') {\r\n  document.addEventListener('DOMContentLoaded', function () {\r\n    window.zCartPromo?.init?.();\r\n  });\r\n} else {\r\n  window.zCartPromo?.init?.();\r\n}"],
  "mappings": "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",
  "names": []
}
