{
  "version": 3,
  "sources": ["/cdn/shop/t/20/assets/cart-drawer-v2-bridge.js?sections=cart-drawer%2Ccart-icon-bubble"],
  "sourcesContent": ["/* ============================================================\n   Cart Drawer 2.0 \u2014 Bridge\n   Hace que cualquier bot\u00F3n \"Agregar al carrito\" de la tienda\n   funcione con el drawer 2.0, aunque no use <product-form>:\n\n   1. Intercepta formularios nativos que hacen POST a /cart/add\n      (ej. sections/hot-sale-product-grid.liquid), agrega por AJAX\n      y abre el drawer, en lugar de navegar a la p\u00E1gina /cart.\n   2. Escucha los eventos que disparan secciones con su propio\n      fetch (cart:updated de hot-sale-promo-steps-aov,\n      bundle:added-to-cart de bundle-builder) y refresca el drawer.\n\n   Los carruseles que ya usan <product-form> (card-product,\n   quick-add, weecom-bestsellers\u2026) no pasan por aqu\u00ED: product-form.js\n   ya renderiza y abre el drawer por su cuenta.\n   ============================================================ */\n\n(function () {\n  if (window.__cdv2Bridge) return;\n  window.__cdv2Bridge = true;\n\n  function getDrawer() {\n    return document.querySelector('cart-drawer');\n  }\n\n  /**\n   * Re-renderiza el drawer (y la burbuja del carrito del header) con la\n   * Section Rendering API y, opcionalmente, lo abre.\n   */\n  function refreshDrawer(open) {\n    var drawer = getDrawer();\n    if (!drawer) return Promise.resolve();\n\n    var cartUrl = (window.routes && window.routes.cart_url) || '/cart';\n\n    return fetch(cartUrl + '?sections=cart-drawer,cart-icon-bubble')\n      .then(function (response) {\n        return response.json();\n      })\n      .then(function (sections) {\n        var parser = new DOMParser();\n        var doc = parser.parseFromString(sections['cart-drawer'] || '', 'text/html');\n\n        var itemCount = null;\n        var stateEl = doc.querySelector('[data-cart-drawer-state]');\n        if (stateEl) {\n          try {\n            itemCount = JSON.parse(stateEl.textContent).item_count;\n          } catch (error) {\n            itemCount = null;\n          }\n        }\n\n        var source = doc.querySelector('#CartDrawer');\n        var target = document.getElementById('CartDrawer');\n        if (source && target) target.innerHTML = source.innerHTML;\n\n        if (sections['cart-icon-bubble']) {\n          var bubbleSource = parser\n            .parseFromString(sections['cart-icon-bubble'], 'text/html')\n            .querySelector('.shopify-section');\n          var bubbleTarget = document.getElementById('cart-icon-bubble');\n          if (bubbleSource && bubbleTarget) bubbleTarget.innerHTML = bubbleSource.innerHTML;\n        }\n\n        if (itemCount !== null) {\n          drawer.classList.toggle('is-empty', itemCount === 0);\n          var drawerItems = drawer.querySelector('cart-drawer-items');\n          if (drawerItems) drawerItems.classList.toggle('is-empty', itemCount === 0);\n        }\n\n        var overlay = drawer.querySelector('#CartDrawer-Overlay');\n        if (overlay) overlay.addEventListener('click', drawer.close.bind(drawer));\n\n        if (open) drawer.open();\n      })\n      .catch(function (error) {\n        console.error('[CDV2 bridge]', error);\n      });\n  }\n\n  window.CDV2 = window.CDV2 || {};\n  window.CDV2.refreshDrawer = refreshDrawer;\n\n  /* 1) Formularios nativos de /cart/add que no est\u00E1n dentro de <product-form> */\n  document.addEventListener('submit', function (event) {\n    var form = event.target;\n    if (!form || !form.matches || !form.matches('form')) return;\n\n    var action = form.getAttribute('action') || '';\n    if (action.indexOf('/cart/add') === -1) return;\n\n    if (form.closest('product-form')) return; // lo maneja product-form.js\n    if (form.hasAttribute('data-cdv2-skip')) return; // opt-out por formulario\n    if (event.defaultPrevented) return; // otro script ya lo intercept\u00F3 (ej. AOV)\n    if (!getDrawer()) return;\n\n    event.preventDefault();\n\n    var submitBtn = form.querySelector('[type=\"submit\"]');\n    var originalText = submitBtn ? submitBtn.textContent : '';\n    if (submitBtn) {\n      submitBtn.disabled = true;\n      submitBtn.textContent = submitBtn.dataset.loadingText || 'Agregando...';\n    }\n\n    fetch((window.routes && window.routes.cart_add_url) || '/cart/add', {\n      method: 'POST',\n      credentials: 'same-origin',\n      headers: { Accept: 'application/json' },\n      body: new FormData(form),\n    })\n      .then(function (response) {\n        return response.json();\n      })\n      .then(function (data) {\n        if (data.status) {\n          throw new Error(data.description || data.message || 'No se pudo agregar al carrito.');\n        }\n        return refreshDrawer(true);\n      })\n      .then(function () {\n        if (submitBtn) submitBtn.textContent = originalText;\n      })\n      .catch(function (error) {\n        if (submitBtn) {\n          submitBtn.textContent = error.message || 'Error. Intenta de nuevo.';\n          setTimeout(function () {\n            submitBtn.textContent = originalText;\n          }, 2500);\n        }\n      })\n      .finally(function () {\n        if (submitBtn) submitBtn.disabled = false;\n      });\n  });\n\n  /* 2) Secciones con fetch propio que avisan por eventos */\n\n  // hot-sale-promo-steps-aov: intercepta los /cart/add de la p\u00E1gina y\n  // dispara cart:updated tras agregar \u2192 refrescamos y abrimos el drawer.\n  document.addEventListener('cart:updated', function () {\n    refreshDrawer(true);\n  });\n\n  // bundle-builder: tras agregar el bundle, refrescamos el drawer y lo\n  // abrimos para que el cliente vea los productos reci\u00E9n agregados.\n  document.addEventListener('bundle:added-to-cart', function () {\n    refreshDrawer(true);\n  });\n\n  /* 3) Productos recomendados v\u00EDa la API de recomendaciones de Shopify.\n     El drawer (modo \"api\") deja un contenedor [data-cdv2-api-recs] vac\u00EDo y\n     oculto; aqu\u00ED pedimos la secci\u00F3n cart-drawer-v2-recs a la Product\n     Recommendations API (renderizada server-side, ya filtrada por stock)\n     y la inyectamos. Cada re-render AJAX del drawer repone el contenedor\n     vac\u00EDo, as\u00ED que un MutationObserver vuelve a cargarlo (con cach\u00E9 por\n     producto para no repetir peticiones en cada cambio de cantidad). */\n\n  var apiRecsCache = {};\n  var apiRecsLoading = false;\n\n  function loadApiRecs() {\n    var container = document.querySelector('[data-cdv2-api-recs]');\n    if (!container || container.dataset.loaded === 'true' || apiRecsLoading) return;\n\n    var productId = container.dataset.productId;\n    var baseUrl = container.dataset.url;\n    if (!productId || !baseUrl) {\n      container.hidden = true;\n      container.dataset.loaded = 'true';\n      return;\n    }\n\n    var url =\n      baseUrl +\n      '?section_id=cart-drawer-v2-recs&product_id=' +\n      encodeURIComponent(productId) +\n      '&limit=10&intent=related';\n\n    function inject(markup) {\n      var current = document.querySelector('[data-cdv2-api-recs]');\n      if (!current) return;\n      var target = current.querySelector('[data-cdv2-api-recs-list]');\n      if (markup && target) {\n        target.innerHTML = markup;\n        current.hidden = false;\n      } else {\n        current.hidden = true;\n      }\n      current.dataset.loaded = 'true';\n    }\n\n    if (Object.prototype.hasOwnProperty.call(apiRecsCache, url)) {\n      inject(apiRecsCache[url]);\n      return;\n    }\n\n    apiRecsLoading = true;\n    fetch(url)\n      .then(function (response) {\n        return response.text();\n      })\n      .then(function (text) {\n        var doc = new DOMParser().parseFromString(text, 'text/html');\n        var source = doc.querySelector('[data-cdv2-api-recs-source]');\n        var markup = source && source.children.length > 0 ? source.innerHTML : '';\n        apiRecsCache[url] = markup;\n        inject(markup);\n      })\n      .catch(function (error) {\n        console.error('[CDV2 recs]', error);\n      })\n      .finally(function () {\n        apiRecsLoading = false;\n      });\n  }\n\n  function initApiRecs() {\n    var drawerEl = getDrawer();\n    if (drawerEl && 'MutationObserver' in window) {\n      new MutationObserver(function () {\n        window.requestAnimationFrame(loadApiRecs);\n      }).observe(drawerEl, { childList: true, subtree: true });\n    }\n    loadApiRecs();\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', initApiRecs);\n  } else {\n    initApiRecs();\n  }\n})();\n"],
  "mappings": "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",
  "names": []
}
