{"title":"Para Bebidas Calientes","description":"\u003cp\u003eColección de vasos de papel y tapas para bebidas calientes como café y té. Incluye vasos blancos de 4oz a 20oz y tapas viajeras en varios colores, ideales para cafeterías, panaderías, food trucks y negocios de bebidas para llevar. Envases desechables resistentes al calor, reciclables y pensados para servicio profesional.\u003c\/p\u003e","products":[{"product_id":"vaso-papel-bebidas-calientes-4oz-374w","title":"Vaso de papel 4oz para bebidas calientes (caja 1000 pzas)","description":"\u003cp\u003eVaso de papel blanco de \u003cstrong\u003e4 oz\u003c\/strong\u003e para bebidas calientes como café espresso, muestras de café, té o chocolate caliente. Fabricado en \u003cstrong\u003epapel recubierto con PE\u003c\/strong\u003e, resistente al calor y \u003cstrong\u003ereciclable\u003c\/strong\u003e, ideal para servicio para llevar en cafeterías, panaderías, barras de café, oficinas y eventos.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eColor:\u003c\/strong\u003e blanco\u003cbr\u003e\u003cstrong\u003eMaterial:\u003c\/strong\u003e papel recubierto con PE\u003c\/p\u003e\n\u003cp\u003e\n\u003csection class=\"customize-order-section\"\u003e\n  \u003cdiv class=\"customize-order-inner\"\u003e\n    \u003ch2 class=\"customize-order-title\"\u003ePersonaliza tu pedido\u003c\/h2\u003e\n\n    \u003cdiv class=\"customize-order-grid\"\u003e\n      \u003c!-- Columna 1: Subir logo --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003clabel for=\"logo-upload-input\" class=\"customize-upload-box\" id=\"upload-box-label\"\u003e\n          \u003cdiv class=\"upload-plus-wrapper\" id=\"upload-plus-wrapper\"\u003e\n            \u003cspan class=\"upload-icon\"\u003e+\u003c\/span\u003e\n          \u003c\/div\u003e\n\n          \u003cdiv class=\"upload-preview-wrapper\"\u003e\n            \u003cimg id=\"upload-preview-img\" src=\"\" alt=\"Vista previa de tu logo\" class=\"upload-preview-img\" style=\"display:none;\"\u003e\n          \u003c\/div\u003e\n        \u003c\/label\u003e\n\n        \u003cinput id=\"logo-upload-input\" type=\"file\" accept=\"image\/png,image\/jpeg,image\/jpg\" class=\"upload-input\"\u003e\n\n        \u003cbutton type=\"button\" id=\"clear-logo-btn\" class=\"clear-logo-btn\" style=\"display:none;\"\u003e\n          Borrar imagen\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 2: Mockup --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003cdiv class=\"mockup-preview\"\u003e\n          \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/B.C._4oz.png?v=1768508829\" alt=\"Vaso personalizado\" class=\"mockup-base\" width=\"800\" height=\"800\"\u003e\n\n          \u003cdiv class=\"mockup-logo-wrap\" id=\"mockup-logo-wrap\"\u003e\n            \u003cimg id=\"mockup-logo-img\" src=\"\" alt=\"Tu logotipo\" class=\"mockup-logo\" style=\"display:none;\" width=\"600\" height=\"600\"\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 3: Cantidad + botón WhatsApp --\u003e\n      \u003cdiv class=\"customize-step customize-step--quantity\"\u003e\n        \u003ch3 class=\"step-title step-title-top\"\u003eCantidad de cajas para cotizar\u003c\/h3\u003e\n\n        \u003cdiv class=\"qty-block qty-block-top\"\u003e\n          \u003cdiv class=\"qty-control\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-minus\"\u003e−\u003c\/button\u003e\n            \u003cinput type=\"text\" id=\"quote-quantity\" class=\"qty-input\" value=\"1\" inputmode=\"numeric\" pattern=\"[0-9]*\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-plus\"\u003e+\u003c\/button\u003e\n          \u003c\/div\u003e\n          \u003cp class=\"qty-min-text\"\u003eTe cotizamos desde una caja\u003c\/p\u003e\n        \u003c\/div\u003e\n\n        \u003c!-- Botón WhatsApp verde con icono (imagen) --\u003e\n        \u003cbutton type=\"button\" id=\"custom-whatsapp-btn\" class=\"whatsapp-quote-btn\"\u003e\n          \u003cspan class=\"wa-icon-circle\"\u003e\n            \u003cimg src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/6\/6b\/WhatsApp.svg\" alt=\"WhatsApp\" class=\"wa-icon-img\"\u003e\n          \u003c\/span\u003e\n          \u003cspan\u003eCotizar Producto\u003c\/span\u003e\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Fila inferior de pasos --\u003e\n    \u003cdiv class=\"customize-steps-row\"\u003e\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e1\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eAgrega tu logo\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Solo se admiten imágenes en formato .png con fondo transparente. Tamaño máximo: 20 KB.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e2\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eVisualiza cómo se ve\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Esta es una representación digital del producto final. El resultado puede variar ligeramente en color, tamaño o proporciones.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e3\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eHaz tu pedido\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Puedes pedir desde una caja para imprimir tu logo en tu artículo, así de fácil.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Campos ocultos --\u003e\n    \u003cinput type=\"hidden\" id=\"logo-data-input\" name=\"properties[Logo personalizado]\" value=\"\"\u003e\n    \u003cinput type=\"hidden\" id=\"quote-quantity-input\" name=\"properties[Cantidad para cotización]\" value=\"1\"\u003e\n  \u003c\/div\u003e\n\n  \u003cstyle\u003e\n    .customize-order-section {\n      padding: 2.5rem 1.25rem;\n      background-color: #ffffff;\n    }\n    .customize-order-inner {\n      max-width: 1100px;\n      margin: 0 auto;\n    }\n    .customize-order-title {\n      font-size: 1.75rem;\n      font-weight: 700;\n      margin-bottom: 1.75rem;\n      text-align: left;\n      color: #2044A3;\n    }\n\n    .customize-order-grid {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 3rem;\n      align-items: flex-start;\n      margin-bottom: 3rem;\n      justify-content: center;\n    }\n    .customize-step {\n      width: 100%;\n      max-width: 300px;\n      margin: 0 auto;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .customize-upload-box {\n      border: 2px dashed #D4D4D8;\n      border-radius: 1.5rem;\n      padding: 1.5rem;\n      min-height: 220px;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      position: relative;\n      cursor: pointer;\n      box-sizing: border-box;\n    }\n\n    .upload-plus-wrapper {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      pointer-events: none;\n    }\n\n    .upload-icon {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 60px;\n      height: 60px;\n      border-radius: 9999px;\n      border: 2px solid #2044A3;\n      font-size: 1.85rem;\n      font-weight: 600;\n      color: #2044A3;\n      background: #ffffff;\n    }\n\n    .upload-input {\n      display: none;\n    }\n\n    .upload-preview-wrapper {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      min-height: 150px;\n    }\n    .upload-preview-img {\n      max-width: 100%;\n      max-height: 160px;\n      object-fit: contain;\n      display: block;\n    }\n\n    .clear-logo-btn {\n      margin-top: 0.75rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.6rem 1.6rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #FFC800;\n      color: #111111;\n      font-size: 0.9rem;\n      cursor: pointer;\n      white-space: nowrap;\n    }\n    .clear-logo-btn:hover {\n      background-color: #e0ae00;\n    }\n\n    .mockup-preview {\n      position: relative;\n      border-radius: 1.5rem;\n      background-color: #F5F5F7;\n      padding: 1.5rem;\n      min-height: 220px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n    }\n    .mockup-base {\n      max-width: 120%;\n      height: auto;\n      display: block;\n    }\n    .mockup-logo-wrap {\n      position: absolute;\n      top: 55%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      width: 28%;\n      pointer-events: auto;\n      cursor: move;\n      border: 2px solid transparent;\n      border-radius: 4px;\n      box-sizing: border-box;\n    }\n    .mockup-logo-wrap.is-dragging {\n      border-color: #2044A3;\n    }\n    .mockup-logo {\n      width: 100%;\n      height: auto;\n      object-fit: contain;\n      display: block;\n      filter: drop-shadow(0 1px 2px rgba(0,0,0,0.18));\n    }\n\n    .customize-step--quantity {\n      text-align: center;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .step-title-top {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 1.5rem;\n    }\n\n    .qty-min-text {\n      font-size: 0.85rem;\n      color: #6B7280;\n      margin-top: 0.25rem;\n    }\n\n    \/* === FORZAR ALINEACIÓN PERFECTA DE LA PÍLDORA DE CANTIDAD === *\/\n    .customize-order-section .qty-control {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      border-radius: 9999px !important;\n      border: 1px solid #D4D4D8 !important;\n      overflow: hidden !important;\n      background-color: #ffffff !important;\n      padding: 0 !important;\n      line-height: 0 !important;\n    }\n\n    .customize-order-section .qty-btn {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      width: 60px !important;\n      height: 46px !important;\n      background-color: #FFC800 !important;\n      border: none !important;\n      cursor: pointer !important;\n      color: #111111 !important;\n      font-size: 1.6rem !important;\n      line-height: 1 !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-shadow: none !important;\n    }\n\n    .customize-order-section .qty-input {\n      width: 80px !important;\n      height: 46px !important;\n      border: none !important;\n      outline: none !important;\n      text-align: center !important;\n      font-size: 1rem !important;\n      color: #111111 !important;\n      background-color: #ffffff !important;\n      display: flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-sizing: border-box !important;\n      line-height: 1 !important;\n    }\n\n    .customize-order-section .qty-btn span,\n    .customize-order-section .qty-btn,\n    .customize-order-section .qty-control * {\n      line-height: 1 !important;\n    }\n\n    \/* BOTÓN WHATSAPP VERDE *\/\n    .customize-order-section .whatsapp-quote-btn {\n      margin-top: 1.25rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.9rem 2.5rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #25D366 !important; \/* Verde WhatsApp *\/\n      color: #ffffff !important;\n      font-size: 1rem;\n      font-weight: 600;\n      cursor: pointer;\n      white-space: nowrap;\n      box-shadow: 0 8px 20px rgba(0,0,0,0.12);\n      gap: 0.5rem; \/* separa icono y texto *\/\n    }\n    .customize-order-section .whatsapp-quote-btn:hover {\n      background-color: #1eb259 !important;\n    }\n\n    \/* Círculo blanco para el ícono *\/\n    .customize-order-section .wa-icon-circle {\n      width: 22px;\n      height: 22px;\n      border-radius: 9999px;\n      background-color: #ffffff;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n      flex-shrink: 0;\n    }\n\n    \/* Imagen del ícono de WhatsApp *\/\n    .customize-order-section .wa-icon-img {\n      width: 16px;\n      height: 16px;\n      display: block;\n    }\n\n    .customize-order-section .wa-icon-phone,\n    .customize-order-section .wa-icon-phone::after {\n      display: none !important;\n    }\n\n    .customize-steps-row {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 2rem;\n      margin-top: 1rem;\n      max-width: 1100px;\n      margin-left: auto;\n      margin-right: auto;\n    }\n    .customize-step-text {\n      text-align:center;\n      display:flex;\n      flex-direction:column;\n      align-items:center;\n    }\n    .step-circle {\n      width: 40px;\n      height: 40px;\n      border-radius: 9999px;\n      border: 2px solid #D4D4D8;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      margin: 0 auto 0.75rem auto;\n      font-weight: 600;\n      color: #111827;\n    }\n    .step-title {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 0.5rem;\n    }\n    .step-desc {\n      font-size: 0.875rem;\n      color: #6B7280;\n      line-height: 1.4;\n    }\n\n    @media (max-width: 900px) {\n      .customize-order-grid {\n        grid-template-columns: 1fr;\n      }\n      .customize-steps-row {\n        grid-template-columns: 1fr;\n      }\n      .customize-order-title {\n        text-align: center;\n      }\n      .customize-step--quantity {\n        text-align: center;\n        align-items: center;\n      }\n      .customize-order-section .whatsapp-quote-btn {\n        align-self: center;\n      }\n    }\n  \u003c\/style\u003e\n\n  \u003cscript\u003e\n    document.addEventListener('DOMContentLoaded', function() {\n      var fileInput       = document.getElementById('logo-upload-input');\n      var logoImg         = document.getElementById('mockup-logo-img');\n      var uploadPreview   = document.getElementById('upload-preview-img');\n      var clearBtn        = document.getElementById('clear-logo-btn');\n      var logoDataInput   = document.getElementById('logo-data-input');\n      var plusWrapper     = document.getElementById('upload-plus-wrapper');\n\n      var qtyInput  = document.getElementById('quote-quantity');\n      var qtyHidden = document.getElementById('quote-quantity-input');\n      var btnMinus  = document.getElementById('qty-minus');\n      var btnPlus   = document.getElementById('qty-plus');\n\n      var mockupPreview   = document.querySelector('.mockup-preview');\n      var mockupLogoWrap  = document.getElementById('mockup-logo-wrap');\n\n      if (fileInput \u0026\u0026 logoImg \u0026\u0026 logoDataInput) {\n        fileInput.addEventListener('change', function(event) {\n          var file = event.target.files[0];\n          if (!file) return;\n\n          var maxSizeMB = 2;\n          if (file.size \u003e maxSizeMB * 1024 * 1024) {\n            alert('La imagen es demasiado grande. Tamaño máximo: ' + maxSizeMB + ' MB');\n            fileInput.value = '';\n            return;\n          }\n\n          var reader = new FileReader();\n          reader.onload = function(e) {\n            var dataUrl = e.target.result;\n\n            logoImg.src = dataUrl;\n            logoImg.style.display = 'block';\n\n            if (uploadPreview) {\n              uploadPreview.src = dataUrl;\n              uploadPreview.style.display = 'block';\n            }\n\n            if (plusWrapper) plusWrapper.style.display = 'none';\n\n            logoDataInput.value = dataUrl;\n            clearBtn.style.display = 'inline-flex';\n\n            resetLogoPosition();\n          };\n          reader.readAsDataURL(file);\n        });\n\n        clearBtn.addEventListener('click', function() {\n          fileInput.value = '';\n\n          logoImg.src = '';\n          logoImg.style.display = 'none';\n\n          if (uploadPreview) {\n            uploadPreview.src = '';\n            uploadPreview.style.display = 'none';\n          }\n\n          if (plusWrapper) plusWrapper.style.display = 'flex';\n\n          logoDataInput.value = '';\n          clearBtn.style.display = 'none';\n\n          resetLogoPosition();\n        });\n      }\n\n      function resetLogoPosition() {\n        if (!mockupLogoWrap) return;\n        mockupLogoWrap.style.top = '55%';\n        mockupLogoWrap.style.left = '50%';\n        mockupLogoWrap.style.transform = 'translate(-50%, -50%)';\n        mockupLogoWrap.classList.remove('is-dragging');\n      }\n\n      if (mockupPreview \u0026\u0026 mockupLogoWrap) {\n        var isDragging = false;\n        var startX = 0;\n        var startY = 0;\n        var startLeft = 0;\n        var startTop = 0;\n\n        function getBounds() {\n          return mockupPreview.getBoundingClientRect();\n        }\n\n        function onPointerDown(e) {\n          if (!logoImg || logoImg.style.display === 'none') return;\n\n          isDragging = true;\n          mockupLogoWrap.classList.add('is-dragging');\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          startX = clientX;\n          startY = clientY;\n\n          var wrapRect = mockupLogoWrap.getBoundingClientRect();\n          startLeft = wrapRect.left - rect.left;\n          startTop  = wrapRect.top  - rect.top;\n\n          mockupLogoWrap.style.transform = 'none';\n\n          document.addEventListener('mousemove', onPointerMove);\n          document.addEventListener('mouseup', onPointerUp);\n          document.addEventListener('touchmove', onPointerMove, { passive: false });\n          document.addEventListener('touchend', onPointerUp);\n        }\n\n        function onPointerMove(e) {\n          if (!isDragging) return;\n          e.preventDefault();\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          var deltaX = clientX - startX;\n          var deltaY = clientY - startY;\n\n          var newLeft = startLeft + deltaX;\n          var newTop  = startTop + deltaY;\n\n          var wrapRect  = mockupLogoWrap.getBoundingClientRect();\n          var wrapWidth = wrapRect.width;\n          var wrapHeight = wrapRect.height;\n\n          var minLeft = 0;\n          var minTop  = 0;\n          var maxLeft = rect.width  - wrapWidth;\n          var maxTop  = rect.height - wrapHeight;\n\n          if (newLeft \u003c minLeft) newLeft = minLeft;\n          if (newTop  \u003c minTop)  newTop  = minTop;\n          if (newLeft \u003e maxLeft) newLeft = maxLeft;\n          if (newTop  \u003e maxTop)  newTop  = maxTop;\n\n          mockupLogoWrap.style.left = newLeft + 'px';\n          mockupLogoWrap.style.top  = newTop  + 'px';\n        }\n\n        function onPointerUp() {\n          if (!isDragging) return;\n          isDragging = false;\n          mockupLogoWrap.classList.remove('is-dragging');\n\n          document.removeEventListener('mousemove', onPointerMove);\n          document.removeEventListener('mouseup', onPointerUp);\n          document.removeEventListener('touchmove', onPointerMove);\n          document.removeEventListener('touchend', onPointerUp);\n        }\n\n        mockupLogoWrap.addEventListener('mousedown', onPointerDown);\n        mockupLogoWrap.addEventListener('touchstart', onPointerDown, { passive: true });\n      }\n\n      function sanitizeQty() {\n        if (!qtyInput || !qtyHidden) return;\n\n        var value = qtyInput.value.replace(\/[^0-9]\/g, '');\n        if (!value || Number(value) \u003c 1) {\n          value = '1';\n        }\n        qtyInput.value = value;\n        qtyHidden.value = value;\n      }\n\n      if (qtyInput \u0026\u0026 qtyHidden) {\n        qtyInput.addEventListener('change', sanitizeQty);\n        qtyInput.addEventListener('blur', sanitizeQty);\n      }\n\n      if (btnMinus \u0026\u0026 qtyInput) {\n        btnMinus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          if (current \u003e 1) {\n            qtyInput.value = String(current - 1);\n            sanitizeQty();\n          }\n        });\n      }\n\n      if (btnPlus \u0026\u0026 qtyInput) {\n        btnPlus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          qtyInput.value = String(current + 1);\n          sanitizeQty();\n        });\n      }\n\n      sanitizeQty();\n\n      \/* --- BOTÓN WHATSAPP --- *\/\n      var whatsappBtn    = document.getElementById('custom-whatsapp-btn');\n      var whatsappNumber = '525536684089'; \/\/ tu número sin + ni espacios\n\n      \/\/ EDITA ESTAS DOS LÍNEAS EN CADA PRODUCTO:\n      var productTitle   = \"Vaso de papel 4oz para bebidas calientes\";\n      var productUrl     = \"https:\/\/acesainter.com\/products\/vaso-papel-bebidas-calientes-4oz-374w?utm_source=copyToPasteBoard\u0026utm_medium=product-links\u0026utm_content=web\";\n\n      if (whatsappBtn \u0026\u0026 qtyHidden) {\n        whatsappBtn.addEventListener('click', function() {\n          var qty = parseInt(qtyHidden.value || '1', 10);\n          if (isNaN(qty) || qty \u003c 1) qty = 1;\n\n          var message =\n            \"Hola, quiero cotizar este producto personalizado con mi marca.%0A%0A\" +\n            \"Producto: \" + encodeURIComponent(productTitle) + \"%0A\" +\n            \"Cantidad: \" + encodeURIComponent(qty + \" cajas\") + \"%0A\" +\n            \"URL del producto: \" + encodeURIComponent(productUrl) + \"%0A%0A\" +\n            \"Por favor, confírmenme tiempos de producción, precios y opciones de personalización.\";\n\n          var waUrl = \"https:\/\/wa.me\/\" + whatsappNumber + \"?text=\" + message;\n          window.open(waUrl, \"_blank\");\n        });\n      }\n    });\n  \u003c\/script\u003e\n\u003c\/section\u003e\u003c\/p\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48138676797690,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/1.jpg?v=1768503474"},{"product_id":"vaso-papel-bebidas-calientes-8oz-378w","title":"Vaso de papel 8oz para bebidas calientes (caja 1000 pzas)","description":"\u003cp\u003eVaso de papel blanco de \u003cstrong\u003e8 oz\u003c\/strong\u003e para bebidas calientes como café americano chico, capuchino, té y chocolate caliente para llevar. Hecho de \u003cstrong\u003epapel recubierto con PE\u003c\/strong\u003e, resistente al calor y \u003cstrong\u003ereciclable\u003c\/strong\u003e, ideal para \u003cstrong\u003ecafeterías, panaderías, restaurantes y oficinas\u003c\/strong\u003e.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003e378W\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eColor: blanco\u003c\/li\u003e\n\u003cli\u003eMaterial: papel recubierto con PE\u003c\/li\u003e\n\u003cli\u003eCaja con \u003cstrong\u003e1000 vasos\u003c\/strong\u003e (20 mangas de 50 pzas)\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003csection class=\"customize-order-section\"\u003e\n  \u003cdiv class=\"customize-order-inner\"\u003e\n    \u003ch2 class=\"customize-order-title\"\u003ePersonaliza tu pedido\u003c\/h2\u003e\n\n    \u003cdiv class=\"customize-order-grid\"\u003e\n      \u003c!-- Columna 1: Subir logo --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003clabel for=\"logo-upload-input\" class=\"customize-upload-box\" id=\"upload-box-label\"\u003e\n          \u003cdiv class=\"upload-plus-wrapper\" id=\"upload-plus-wrapper\"\u003e\n            \u003cspan class=\"upload-icon\"\u003e+\u003c\/span\u003e\n          \u003c\/div\u003e\n\n          \u003cdiv class=\"upload-preview-wrapper\"\u003e\n            \u003cimg id=\"upload-preview-img\" src=\"\" alt=\"Vista previa de tu logo\" class=\"upload-preview-img\" style=\"display:none;\"\u003e\n          \u003c\/div\u003e\n        \u003c\/label\u003e\n\n        \u003cinput id=\"logo-upload-input\" type=\"file\" accept=\"image\/png,image\/jpeg,image\/jpg\" class=\"upload-input\"\u003e\n\n        \u003cbutton type=\"button\" id=\"clear-logo-btn\" class=\"clear-logo-btn\" style=\"display:none;\"\u003e\n          Borrar imagen\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 2: Mockup --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003cdiv class=\"mockup-preview\"\u003e\n          \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/B.C._8oz.png?v=1768508829\" alt=\"Vaso personalizado\" class=\"mockup-base\" width=\"800\" height=\"800\"\u003e\n\n          \u003cdiv class=\"mockup-logo-wrap\" id=\"mockup-logo-wrap\"\u003e\n            \u003cimg id=\"mockup-logo-img\" src=\"\" alt=\"Tu logotipo\" class=\"mockup-logo\" style=\"display:none;\" width=\"600\" height=\"600\"\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 3: Cantidad + botón WhatsApp --\u003e\n      \u003cdiv class=\"customize-step customize-step--quantity\"\u003e\n        \u003ch3 class=\"step-title step-title-top\"\u003eCantidad de cajas para cotizar\u003c\/h3\u003e\n\n        \u003cdiv class=\"qty-block qty-block-top\"\u003e\n          \u003cdiv class=\"qty-control\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-minus\"\u003e−\u003c\/button\u003e\n            \u003cinput type=\"text\" id=\"quote-quantity\" class=\"qty-input\" value=\"1\" inputmode=\"numeric\" pattern=\"[0-9]*\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-plus\"\u003e+\u003c\/button\u003e\n          \u003c\/div\u003e\n          \u003cp class=\"qty-min-text\"\u003eTe cotizamos desde una caja\u003c\/p\u003e\n        \u003c\/div\u003e\n\n        \u003c!-- Botón WhatsApp verde con icono (imagen) --\u003e\n        \u003cbutton type=\"button\" id=\"custom-whatsapp-btn\" class=\"whatsapp-quote-btn\"\u003e\n          \u003cspan class=\"wa-icon-circle\"\u003e\n            \u003cimg src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/6\/6b\/WhatsApp.svg\" alt=\"WhatsApp\" class=\"wa-icon-img\"\u003e\n          \u003c\/span\u003e\n          \u003cspan\u003eCotizar Producto\u003c\/span\u003e\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Fila inferior de pasos --\u003e\n    \u003cdiv class=\"customize-steps-row\"\u003e\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e1\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eAgrega tu logo\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Solo se admiten imágenes en formato .png con fondo transparente. Tamaño máximo: 20 KB.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e2\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eVisualiza cómo se ve\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Esta es una representación digital del producto final. El resultado puede variar ligeramente en color, tamaño o proporciones.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e3\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eHaz tu pedido\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Puedes pedir desde una caja para imprimir tu logo en tu artículo, así de fácil.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Campos ocultos --\u003e\n    \u003cinput type=\"hidden\" id=\"logo-data-input\" name=\"properties[Logo personalizado]\" value=\"\"\u003e\n    \u003cinput type=\"hidden\" id=\"quote-quantity-input\" name=\"properties[Cantidad para cotización]\" value=\"1\"\u003e\n  \u003c\/div\u003e\n\n  \u003cstyle\u003e\n    .customize-order-section {\n      padding: 2.5rem 1.25rem;\n      background-color: #ffffff;\n    }\n    .customize-order-inner {\n      max-width: 1100px;\n      margin: 0 auto;\n    }\n    .customize-order-title {\n      font-size: 1.75rem;\n      font-weight: 700;\n      margin-bottom: 1.75rem;\n      text-align: left;\n      color: #2044A3;\n    }\n\n    .customize-order-grid {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 3rem;\n      align-items: flex-start;\n      margin-bottom: 3rem;\n      justify-content: center;\n    }\n    .customize-step {\n      width: 100%;\n      max-width: 300px;\n      margin: 0 auto;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .customize-upload-box {\n      border: 2px dashed #D4D4D8;\n      border-radius: 1.5rem;\n      padding: 1.5rem;\n      min-height: 220px;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      position: relative;\n      cursor: pointer;\n      box-sizing: border-box;\n    }\n\n    .upload-plus-wrapper {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      pointer-events: none;\n    }\n\n    .upload-icon {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 60px;\n      height: 60px;\n      border-radius: 9999px;\n      border: 2px solid #2044A3;\n      font-size: 1.85rem;\n      font-weight: 600;\n      color: #2044A3;\n      background: #ffffff;\n    }\n\n    .upload-input {\n      display: none;\n    }\n\n    .upload-preview-wrapper {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      min-height: 150px;\n    }\n    .upload-preview-img {\n      max-width: 100%;\n      max-height: 160px;\n      object-fit: contain;\n      display: block;\n    }\n\n    .clear-logo-btn {\n      margin-top: 0.75rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.6rem 1.6rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #FFC800;\n      color: #111111;\n      font-size: 0.9rem;\n      cursor: pointer;\n      white-space: nowrap;\n    }\n    .clear-logo-btn:hover {\n      background-color: #e0ae00;\n    }\n\n    .mockup-preview {\n      position: relative;\n      border-radius: 1.5rem;\n      background-color: #F5F5F7;\n      padding: 1.5rem;\n      min-height: 220px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n    }\n    .mockup-base {\n      max-width: 120%;\n      height: auto;\n      display: block;\n    }\n    .mockup-logo-wrap {\n      position: absolute;\n      top: 55%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      width: 30%;\n      pointer-events: auto;\n      cursor: move;\n      border: 2px solid transparent;\n      border-radius: 4px;\n      box-sizing: border-box;\n    }\n    .mockup-logo-wrap.is-dragging {\n      border-color: #2044A3;\n    }\n    .mockup-logo {\n      width: 100%;\n      height: auto;\n      object-fit: contain;\n      display: block;\n      filter: drop-shadow(0 1px 2px rgba(0,0,0,0.18));\n    }\n\n    .customize-step--quantity {\n      text-align: center;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .step-title-top {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 1.5rem;\n    }\n\n    .qty-min-text {\n      font-size: 0.85rem;\n      color: #6B7280;\n      margin-top: 0.25rem;\n    }\n\n    \/* === FORZAR ALINEACIÓN PERFECTA DE LA PÍLDORA DE CANTIDAD === *\/\n    .customize-order-section .qty-control {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      border-radius: 9999px !important;\n      border: 1px solid #D4D4D8 !important;\n      overflow: hidden !important;\n      background-color: #ffffff !important;\n      padding: 0 !important;\n      line-height: 0 !important;\n    }\n\n    .customize-order-section .qty-btn {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      width: 60px !important;\n      height: 46px !important;\n      background-color: #FFC800 !important;\n      border: none !important;\n      cursor: pointer !important;\n      color: #111111 !important;\n      font-size: 1.6rem !important;\n      line-height: 1 !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-shadow: none !important;\n    }\n\n    .customize-order-section .qty-input {\n      width: 80px !important;\n      height: 46px !important;\n      border: none !important;\n      outline: none !important;\n      text-align: center !important;\n      font-size: 1rem !important;\n      color: #111111 !important;\n      background-color: #ffffff !important;\n      display: flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-sizing: border-box !important;\n      line-height: 1 !important;\n    }\n\n    .customize-order-section .qty-btn span,\n    .customize-order-section .qty-btn,\n    .customize-order-section .qty-control * {\n      line-height: 1 !important;\n    }\n\n    \/* BOTÓN WHATSAPP VERDE *\/\n    .customize-order-section .whatsapp-quote-btn {\n      margin-top: 1.25rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.9rem 2.5rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #25D366 !important; \/* Verde WhatsApp *\/\n      color: #ffffff !important;\n      font-size: 1rem;\n      font-weight: 600;\n      cursor: pointer;\n      white-space: nowrap;\n      box-shadow: 0 8px 20px rgba(0,0,0,0.12);\n      gap: 0.5rem; \/* separa icono y texto *\/\n    }\n    .customize-order-section .whatsapp-quote-btn:hover {\n      background-color: #1eb259 !important;\n    }\n\n    \/* Círculo blanco para el ícono *\/\n    .customize-order-section .wa-icon-circle {\n      width: 22px;\n      height: 22px;\n      border-radius: 9999px;\n      background-color: #ffffff;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n      flex-shrink: 0;\n    }\n\n    \/* Imagen del ícono de WhatsApp *\/\n    .customize-order-section .wa-icon-img {\n      width: 16px;\n      height: 16px;\n      display: block;\n    }\n\n    .customize-order-section .wa-icon-phone,\n    .customize-order-section .wa-icon-phone::after {\n      display: none !important;\n    }\n\n    .customize-steps-row {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 2rem;\n      margin-top: 1rem;\n      max-width: 1100px;\n      margin-left: auto;\n      margin-right: auto;\n    }\n    .customize-step-text {\n      text-align:center;\n      display:flex;\n      flex-direction:column;\n      align-items:center;\n    }\n    .step-circle {\n      width: 40px;\n      height: 40px;\n      border-radius: 9999px;\n      border: 2px solid #D4D4D8;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      margin: 0 auto 0.75rem auto;\n      font-weight: 600;\n      color: #111827;\n    }\n    .step-title {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 0.5rem;\n    }\n    .step-desc {\n      font-size: 0.875rem;\n      color: #6B7280;\n      line-height: 1.4;\n    }\n\n    @media (max-width: 900px) {\n      .customize-order-grid {\n        grid-template-columns: 1fr;\n      }\n      .customize-steps-row {\n        grid-template-columns: 1fr;\n      }\n      .customize-order-title {\n        text-align: center;\n      }\n      .customize-step--quantity {\n        text-align: center;\n        align-items: center;\n      }\n      .customize-order-section .whatsapp-quote-btn {\n        align-self: center;\n      }\n    }\n  \u003c\/style\u003e\n\n  \u003cscript\u003e\n    document.addEventListener('DOMContentLoaded', function() {\n      var fileInput       = document.getElementById('logo-upload-input');\n      var logoImg         = document.getElementById('mockup-logo-img');\n      var uploadPreview   = document.getElementById('upload-preview-img');\n      var clearBtn        = document.getElementById('clear-logo-btn');\n      var logoDataInput   = document.getElementById('logo-data-input');\n      var plusWrapper     = document.getElementById('upload-plus-wrapper');\n\n      var qtyInput  = document.getElementById('quote-quantity');\n      var qtyHidden = document.getElementById('quote-quantity-input');\n      var btnMinus  = document.getElementById('qty-minus');\n      var btnPlus   = document.getElementById('qty-plus');\n\n      var mockupPreview   = document.querySelector('.mockup-preview');\n      var mockupLogoWrap  = document.getElementById('mockup-logo-wrap');\n\n      if (fileInput \u0026\u0026 logoImg \u0026\u0026 logoDataInput) {\n        fileInput.addEventListener('change', function(event) {\n          var file = event.target.files[0];\n          if (!file) return;\n\n          var maxSizeMB = 2;\n          if (file.size \u003e maxSizeMB * 1024 * 1024) {\n            alert('La imagen es demasiado grande. Tamaño máximo: ' + maxSizeMB + ' MB');\n            fileInput.value = '';\n            return;\n          }\n\n          var reader = new FileReader();\n          reader.onload = function(e) {\n            var dataUrl = e.target.result;\n\n            logoImg.src = dataUrl;\n            logoImg.style.display = 'block';\n\n            if (uploadPreview) {\n              uploadPreview.src = dataUrl;\n              uploadPreview.style.display = 'block';\n            }\n\n            if (plusWrapper) plusWrapper.style.display = 'none';\n\n            logoDataInput.value = dataUrl;\n            clearBtn.style.display = 'inline-flex';\n\n            resetLogoPosition();\n          };\n          reader.readAsDataURL(file);\n        });\n\n        clearBtn.addEventListener('click', function() {\n          fileInput.value = '';\n\n          logoImg.src = '';\n          logoImg.style.display = 'none';\n\n          if (uploadPreview) {\n            uploadPreview.src = '';\n            uploadPreview.style.display = 'none';\n          }\n\n          if (plusWrapper) plusWrapper.style.display = 'flex';\n\n          logoDataInput.value = '';\n          clearBtn.style.display = 'none';\n\n          resetLogoPosition();\n        });\n      }\n\n      function resetLogoPosition() {\n        if (!mockupLogoWrap) return;\n        mockupLogoWrap.style.top = '55%';\n        mockupLogoWrap.style.left = '50%';\n        mockupLogoWrap.style.transform = 'translate(-50%, -50%)';\n        mockupLogoWrap.classList.remove('is-dragging');\n      }\n\n      if (mockupPreview \u0026\u0026 mockupLogoWrap) {\n        var isDragging = false;\n        var startX = 0;\n        var startY = 0;\n        var startLeft = 0;\n        var startTop = 0;\n\n        function getBounds() {\n          return mockupPreview.getBoundingClientRect();\n        }\n\n        function onPointerDown(e) {\n          if (!logoImg || logoImg.style.display === 'none') return;\n\n          isDragging = true;\n          mockupLogoWrap.classList.add('is-dragging');\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          startX = clientX;\n          startY = clientY;\n\n          var wrapRect = mockupLogoWrap.getBoundingClientRect();\n          startLeft = wrapRect.left - rect.left;\n          startTop  = wrapRect.top  - rect.top;\n\n          mockupLogoWrap.style.transform = 'none';\n\n          document.addEventListener('mousemove', onPointerMove);\n          document.addEventListener('mouseup', onPointerUp);\n          document.addEventListener('touchmove', onPointerMove, { passive: false });\n          document.addEventListener('touchend', onPointerUp);\n        }\n\n        function onPointerMove(e) {\n          if (!isDragging) return;\n          e.preventDefault();\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          var deltaX = clientX - startX;\n          var deltaY = clientY - startY;\n\n          var newLeft = startLeft + deltaX;\n          var newTop  = startTop + deltaY;\n\n          var wrapRect  = mockupLogoWrap.getBoundingClientRect();\n          var wrapWidth = wrapRect.width;\n          var wrapHeight = wrapRect.height;\n\n          var minLeft = 0;\n          var minTop  = 0;\n          var maxLeft = rect.width  - wrapWidth;\n          var maxTop  = rect.height - wrapHeight;\n\n          if (newLeft \u003c minLeft) newLeft = minLeft;\n          if (newTop  \u003c minTop)  newTop  = minTop;\n          if (newLeft \u003e maxLeft) newLeft = maxLeft;\n          if (newTop  \u003e maxTop)  newTop  = maxTop;\n\n          mockupLogoWrap.style.left = newLeft + 'px';\n          mockupLogoWrap.style.top  = newTop  + 'px';\n        }\n\n        function onPointerUp() {\n          if (!isDragging) return;\n          isDragging = false;\n          mockupLogoWrap.classList.remove('is-dragging');\n\n          document.removeEventListener('mousemove', onPointerMove);\n          document.removeEventListener('mouseup', onPointerUp);\n          document.removeEventListener('touchmove', onPointerMove);\n          document.removeEventListener('touchend', onPointerUp);\n        }\n\n        mockupLogoWrap.addEventListener('mousedown', onPointerDown);\n        mockupLogoWrap.addEventListener('touchstart', onPointerDown, { passive: true });\n      }\n\n      function sanitizeQty() {\n        if (!qtyInput || !qtyHidden) return;\n\n        var value = qtyInput.value.replace(\/[^0-9]\/g, '');\n        if (!value || Number(value) \u003c 1) {\n          value = '1';\n        }\n        qtyInput.value = value;\n        qtyHidden.value = value;\n      }\n\n      if (qtyInput \u0026\u0026 qtyHidden) {\n        qtyInput.addEventListener('change', sanitizeQty);\n        qtyInput.addEventListener('blur', sanitizeQty);\n      }\n\n      if (btnMinus \u0026\u0026 qtyInput) {\n        btnMinus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          if (current \u003e 1) {\n            qtyInput.value = String(current - 1);\n            sanitizeQty();\n          }\n        });\n      }\n\n      if (btnPlus \u0026\u0026 qtyInput) {\n        btnPlus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          qtyInput.value = String(current + 1);\n          sanitizeQty();\n        });\n      }\n\n      sanitizeQty();\n\n      \/* --- BOTÓN WHATSAPP --- *\/\n      var whatsappBtn    = document.getElementById('custom-whatsapp-btn');\n      var whatsappNumber = '525536684089'; \/\/ tu número sin + ni espacios\n\n      \/\/ EDITA ESTAS DOS LÍNEAS EN CADA PRODUCTO:\n      var productTitle   = \"Vaso de papel 8oz para bebidas calientes\";\n      var productUrl     = \"https:\/\/acesainter.com\/products\/vaso-papel-bebidas-calientes-8oz-378w?utm_source=copyToPasteBoard\u0026utm_medium=product-links\u0026utm_content=web\";\n\n      if (whatsappBtn \u0026\u0026 qtyHidden) {\n        whatsappBtn.addEventListener('click', function() {\n          var qty = parseInt(qtyHidden.value || '1', 10);\n          if (isNaN(qty) || qty \u003c 1) qty = 1;\n\n          var message =\n            \"Hola, quiero cotizar este producto personalizado con mi marca.%0A%0A\" +\n            \"Producto: \" + encodeURIComponent(productTitle) + \"%0A\" +\n            \"Cantidad: \" + encodeURIComponent(qty + \" cajas\") + \"%0A\" +\n            \"URL del producto: \" + encodeURIComponent(productUrl) + \"%0A%0A\" +\n            \"Por favor, confírmenme tiempos de producción, precios y opciones de personalización.\";\n\n          var waUrl = \"https:\/\/wa.me\/\" + whatsappNumber + \"?text=\" + message;\n          window.open(waUrl, \"_blank\");\n        });\n      }\n    });\n  \u003c\/script\u003e\n\u003c\/section\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48138726932730,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/2.jpg?v=1768503558"},{"product_id":"vaso-papel-bebidas-calientes-10oz-370w","title":"Vaso de papel 10oz para bebidas calientes (caja 1000 pzas)","description":"\u003cp\u003eVaso de papel blanco de \u003cstrong\u003e10 oz\u003c\/strong\u003e ideal para café americano, capuchino y té en tamaño mediano, perfecto para servicio para llevar. Fabricado en \u003cstrong\u003epapel recubierto con PE\u003c\/strong\u003e, resistente al calor y \u003cstrong\u003ereciclable\u003c\/strong\u003e, diseñado para \u003cstrong\u003ecafeterías, restaurantes, food trucks y oficinas\u003c\/strong\u003e.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003e370W\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eColor: blanco\u003c\/li\u003e\n\u003cli\u003eMaterial: papel recubierto con PE\u003c\/li\u003e\n\u003cli\u003eCaja con \u003cstrong\u003e1000 vasos\u003c\/strong\u003e (20 mangas de 50 pzas)\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003csection class=\"customize-order-section\"\u003e\n  \u003cdiv class=\"customize-order-inner\"\u003e\n    \u003ch2 class=\"customize-order-title\"\u003ePersonaliza tu pedido\u003c\/h2\u003e\n\n    \u003cdiv class=\"customize-order-grid\"\u003e\n      \u003c!-- Columna 1: Subir logo --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003clabel for=\"logo-upload-input\" class=\"customize-upload-box\" id=\"upload-box-label\"\u003e\n          \u003cdiv class=\"upload-plus-wrapper\" id=\"upload-plus-wrapper\"\u003e\n            \u003cspan class=\"upload-icon\"\u003e+\u003c\/span\u003e\n          \u003c\/div\u003e\n\n          \u003cdiv class=\"upload-preview-wrapper\"\u003e\n            \u003cimg id=\"upload-preview-img\" src=\"\" alt=\"Vista previa de tu logo\" class=\"upload-preview-img\" style=\"display:none;\"\u003e\n          \u003c\/div\u003e\n        \u003c\/label\u003e\n\n        \u003cinput id=\"logo-upload-input\" type=\"file\" accept=\"image\/png,image\/jpeg,image\/jpg\" class=\"upload-input\"\u003e\n\n        \u003cbutton type=\"button\" id=\"clear-logo-btn\" class=\"clear-logo-btn\" style=\"display:none;\"\u003e\n          Borrar imagen\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 2: Mockup --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003cdiv class=\"mockup-preview\"\u003e\n          \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/B.C._10oz.png?v=1768508829\" alt=\"Vaso personalizado\" class=\"mockup-base\" width=\"800\" height=\"800\"\u003e\n\n          \u003cdiv class=\"mockup-logo-wrap\" id=\"mockup-logo-wrap\"\u003e\n            \u003cimg id=\"mockup-logo-img\" src=\"\" alt=\"Tu logotipo\" class=\"mockup-logo\" style=\"display:none;\" width=\"600\" height=\"600\"\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 3: Cantidad + botón WhatsApp --\u003e\n      \u003cdiv class=\"customize-step customize-step--quantity\"\u003e\n        \u003ch3 class=\"step-title step-title-top\"\u003eCantidad de cajas para cotizar\u003c\/h3\u003e\n\n        \u003cdiv class=\"qty-block qty-block-top\"\u003e\n          \u003cdiv class=\"qty-control\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-minus\"\u003e−\u003c\/button\u003e\n            \u003cinput type=\"text\" id=\"quote-quantity\" class=\"qty-input\" value=\"1\" inputmode=\"numeric\" pattern=\"[0-9]*\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-plus\"\u003e+\u003c\/button\u003e\n          \u003c\/div\u003e\n          \u003cp class=\"qty-min-text\"\u003eTe cotizamos desde una caja\u003c\/p\u003e\n        \u003c\/div\u003e\n\n        \u003c!-- Botón WhatsApp verde con icono (imagen) --\u003e\n        \u003cbutton type=\"button\" id=\"custom-whatsapp-btn\" class=\"whatsapp-quote-btn\"\u003e\n          \u003cspan class=\"wa-icon-circle\"\u003e\n            \u003cimg src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/6\/6b\/WhatsApp.svg\" alt=\"WhatsApp\" class=\"wa-icon-img\"\u003e\n          \u003c\/span\u003e\n          \u003cspan\u003eCotizar Producto\u003c\/span\u003e\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Fila inferior de pasos --\u003e\n    \u003cdiv class=\"customize-steps-row\"\u003e\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e1\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eAgrega tu logo\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Solo se admiten imágenes en formato .png con fondo transparente. Tamaño máximo: 20 KB.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e2\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eVisualiza cómo se ve\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Esta es una representación digital del producto final. El resultado puede variar ligeramente en color, tamaño o proporciones.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e3\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eHaz tu pedido\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Puedes pedir desde una caja para imprimir tu logo en tu artículo, así de fácil.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Campos ocultos --\u003e\n    \u003cinput type=\"hidden\" id=\"logo-data-input\" name=\"properties[Logo personalizado]\" value=\"\"\u003e\n    \u003cinput type=\"hidden\" id=\"quote-quantity-input\" name=\"properties[Cantidad para cotización]\" value=\"1\"\u003e\n  \u003c\/div\u003e\n\n  \u003cstyle\u003e\n    .customize-order-section {\n      padding: 2.5rem 1.25rem;\n      background-color: #ffffff;\n    }\n    .customize-order-inner {\n      max-width: 1100px;\n      margin: 0 auto;\n    }\n    .customize-order-title {\n      font-size: 1.75rem;\n      font-weight: 700;\n      margin-bottom: 1.75rem;\n      text-align: left;\n      color: #2044A3;\n    }\n\n    .customize-order-grid {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 3rem;\n      align-items: flex-start;\n      margin-bottom: 3rem;\n      justify-content: center;\n    }\n    .customize-step {\n      width: 100%;\n      max-width: 300px;\n      margin: 0 auto;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .customize-upload-box {\n      border: 2px dashed #D4D4D8;\n      border-radius: 1.5rem;\n      padding: 1.5rem;\n      min-height: 220px;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      position: relative;\n      cursor: pointer;\n      box-sizing: border-box;\n    }\n\n    .upload-plus-wrapper {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      pointer-events: none;\n    }\n\n    .upload-icon {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 60px;\n      height: 60px;\n      border-radius: 9999px;\n      border: 2px solid #2044A3;\n      font-size: 1.85rem;\n      font-weight: 600;\n      color: #2044A3;\n      background: #ffffff;\n    }\n\n    .upload-input {\n      display: none;\n    }\n\n    .upload-preview-wrapper {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      min-height: 150px;\n    }\n    .upload-preview-img {\n      max-width: 100%;\n      max-height: 160px;\n      object-fit: contain;\n      display: block;\n    }\n\n    .clear-logo-btn {\n      margin-top: 0.75rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.6rem 1.6rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #FFC800;\n      color: #111111;\n      font-size: 0.9rem;\n      cursor: pointer;\n      white-space: nowrap;\n    }\n    .clear-logo-btn:hover {\n      background-color: #e0ae00;\n    }\n\n    .mockup-preview {\n      position: relative;\n      border-radius: 1.5rem;\n      background-color: #F5F5F7;\n      padding: 1.5rem;\n      min-height: 220px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n    }\n    .mockup-base {\n      max-width: 120%;\n      height: auto;\n      display: block;\n    }\n    .mockup-logo-wrap {\n      position: absolute;\n      top: 55%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      width: 30%;\n      pointer-events: auto;\n      cursor: move;\n      border: 2px solid transparent;\n      border-radius: 4px;\n      box-sizing: border-box;\n    }\n    .mockup-logo-wrap.is-dragging {\n      border-color: #2044A3;\n    }\n    .mockup-logo {\n      width: 100%;\n      height: auto;\n      object-fit: contain;\n      display: block;\n      filter: drop-shadow(0 1px 2px rgba(0,0,0,0.18));\n    }\n\n    .customize-step--quantity {\n      text-align: center;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .step-title-top {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 1.5rem;\n    }\n\n    .qty-min-text {\n      font-size: 0.85rem;\n      color: #6B7280;\n      margin-top: 0.25rem;\n    }\n\n    \/* === FORZAR ALINEACIÓN PERFECTA DE LA PÍLDORA DE CANTIDAD === *\/\n    .customize-order-section .qty-control {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      border-radius: 9999px !important;\n      border: 1px solid #D4D4D8 !important;\n      overflow: hidden !important;\n      background-color: #ffffff !important;\n      padding: 0 !important;\n      line-height: 0 !important;\n    }\n\n    .customize-order-section .qty-btn {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      width: 60px !important;\n      height: 46px !important;\n      background-color: #FFC800 !important;\n      border: none !important;\n      cursor: pointer !important;\n      color: #111111 !important;\n      font-size: 1.6rem !important;\n      line-height: 1 !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-shadow: none !important;\n    }\n\n    .customize-order-section .qty-input {\n      width: 80px !important;\n      height: 46px !important;\n      border: none !important;\n      outline: none !important;\n      text-align: center !important;\n      font-size: 1rem !important;\n      color: #111111 !important;\n      background-color: #ffffff !important;\n      display: flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-sizing: border-box !important;\n      line-height: 1 !important;\n    }\n\n    .customize-order-section .qty-btn span,\n    .customize-order-section .qty-btn,\n    .customize-order-section .qty-control * {\n      line-height: 1 !important;\n    }\n\n    \/* BOTÓN WHATSAPP VERDE *\/\n    .customize-order-section .whatsapp-quote-btn {\n      margin-top: 1.25rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.9rem 2.5rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #25D366 !important; \/* Verde WhatsApp *\/\n      color: #ffffff !important;\n      font-size: 1rem;\n      font-weight: 600;\n      cursor: pointer;\n      white-space: nowrap;\n      box-shadow: 0 8px 20px rgba(0,0,0,0.12);\n      gap: 0.5rem; \/* separa icono y texto *\/\n    }\n    .customize-order-section .whatsapp-quote-btn:hover {\n      background-color: #1eb259 !important;\n    }\n\n    \/* Círculo blanco para el ícono *\/\n    .customize-order-section .wa-icon-circle {\n      width: 22px;\n      height: 22px;\n      border-radius: 9999px;\n      background-color: #ffffff;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n      flex-shrink: 0;\n    }\n\n    \/* Imagen del ícono de WhatsApp *\/\n    .customize-order-section .wa-icon-img {\n      width: 16px;\n      height: 16px;\n      display: block;\n    }\n\n    .customize-order-section .wa-icon-phone,\n    .customize-order-section .wa-icon-phone::after {\n      display: none !important;\n    }\n\n    .customize-steps-row {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 2rem;\n      margin-top: 1rem;\n      max-width: 1100px;\n      margin-left: auto;\n      margin-right: auto;\n    }\n    .customize-step-text {\n      text-align:center;\n      display:flex;\n      flex-direction:column;\n      align-items:center;\n    }\n    .step-circle {\n      width: 40px;\n      height: 40px;\n      border-radius: 9999px;\n      border: 2px solid #D4D4D8;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      margin: 0 auto 0.75rem auto;\n      font-weight: 600;\n      color: #111827;\n    }\n    .step-title {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 0.5rem;\n    }\n    .step-desc {\n      font-size: 0.875rem;\n      color: #6B7280;\n      line-height: 1.4;\n    }\n\n    @media (max-width: 900px) {\n      .customize-order-grid {\n        grid-template-columns: 1fr;\n      }\n      .customize-steps-row {\n        grid-template-columns: 1fr;\n      }\n      .customize-order-title {\n        text-align: center;\n      }\n      .customize-step--quantity {\n        text-align: center;\n        align-items: center;\n      }\n      .customize-order-section .whatsapp-quote-btn {\n        align-self: center;\n      }\n    }\n  \u003c\/style\u003e\n\n  \u003cscript\u003e\n    document.addEventListener('DOMContentLoaded', function() {\n      var fileInput       = document.getElementById('logo-upload-input');\n      var logoImg         = document.getElementById('mockup-logo-img');\n      var uploadPreview   = document.getElementById('upload-preview-img');\n      var clearBtn        = document.getElementById('clear-logo-btn');\n      var logoDataInput   = document.getElementById('logo-data-input');\n      var plusWrapper     = document.getElementById('upload-plus-wrapper');\n\n      var qtyInput  = document.getElementById('quote-quantity');\n      var qtyHidden = document.getElementById('quote-quantity-input');\n      var btnMinus  = document.getElementById('qty-minus');\n      var btnPlus   = document.getElementById('qty-plus');\n\n      var mockupPreview   = document.querySelector('.mockup-preview');\n      var mockupLogoWrap  = document.getElementById('mockup-logo-wrap');\n\n      if (fileInput \u0026\u0026 logoImg \u0026\u0026 logoDataInput) {\n        fileInput.addEventListener('change', function(event) {\n          var file = event.target.files[0];\n          if (!file) return;\n\n          var maxSizeMB = 2;\n          if (file.size \u003e maxSizeMB * 1024 * 1024) {\n            alert('La imagen es demasiado grande. Tamaño máximo: ' + maxSizeMB + ' MB');\n            fileInput.value = '';\n            return;\n          }\n\n          var reader = new FileReader();\n          reader.onload = function(e) {\n            var dataUrl = e.target.result;\n\n            logoImg.src = dataUrl;\n            logoImg.style.display = 'block';\n\n            if (uploadPreview) {\n              uploadPreview.src = dataUrl;\n              uploadPreview.style.display = 'block';\n            }\n\n            if (plusWrapper) plusWrapper.style.display = 'none';\n\n            logoDataInput.value = dataUrl;\n            clearBtn.style.display = 'inline-flex';\n\n            resetLogoPosition();\n          };\n          reader.readAsDataURL(file);\n        });\n\n        clearBtn.addEventListener('click', function() {\n          fileInput.value = '';\n\n          logoImg.src = '';\n          logoImg.style.display = 'none';\n\n          if (uploadPreview) {\n            uploadPreview.src = '';\n            uploadPreview.style.display = 'none';\n          }\n\n          if (plusWrapper) plusWrapper.style.display = 'flex';\n\n          logoDataInput.value = '';\n          clearBtn.style.display = 'none';\n\n          resetLogoPosition();\n        });\n      }\n\n      function resetLogoPosition() {\n        if (!mockupLogoWrap) return;\n        mockupLogoWrap.style.top = '55%';\n        mockupLogoWrap.style.left = '50%';\n        mockupLogoWrap.style.transform = 'translate(-50%, -50%)';\n        mockupLogoWrap.classList.remove('is-dragging');\n      }\n\n      if (mockupPreview \u0026\u0026 mockupLogoWrap) {\n        var isDragging = false;\n        var startX = 0;\n        var startY = 0;\n        var startLeft = 0;\n        var startTop = 0;\n\n        function getBounds() {\n          return mockupPreview.getBoundingClientRect();\n        }\n\n        function onPointerDown(e) {\n          if (!logoImg || logoImg.style.display === 'none') return;\n\n          isDragging = true;\n          mockupLogoWrap.classList.add('is-dragging');\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          startX = clientX;\n          startY = clientY;\n\n          var wrapRect = mockupLogoWrap.getBoundingClientRect();\n          startLeft = wrapRect.left - rect.left;\n          startTop  = wrapRect.top  - rect.top;\n\n          mockupLogoWrap.style.transform = 'none';\n\n          document.addEventListener('mousemove', onPointerMove);\n          document.addEventListener('mouseup', onPointerUp);\n          document.addEventListener('touchmove', onPointerMove, { passive: false });\n          document.addEventListener('touchend', onPointerUp);\n        }\n\n        function onPointerMove(e) {\n          if (!isDragging) return;\n          e.preventDefault();\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          var deltaX = clientX - startX;\n          var deltaY = clientY - startY;\n\n          var newLeft = startLeft + deltaX;\n          var newTop  = startTop + deltaY;\n\n          var wrapRect  = mockupLogoWrap.getBoundingClientRect();\n          var wrapWidth = wrapRect.width;\n          var wrapHeight = wrapRect.height;\n\n          var minLeft = 0;\n          var minTop  = 0;\n          var maxLeft = rect.width  - wrapWidth;\n          var maxTop  = rect.height - wrapHeight;\n\n          if (newLeft \u003c minLeft) newLeft = minLeft;\n          if (newTop  \u003c minTop)  newTop  = minTop;\n          if (newLeft \u003e maxLeft) newLeft = maxLeft;\n          if (newTop  \u003e maxTop)  newTop  = maxTop;\n\n          mockupLogoWrap.style.left = newLeft + 'px';\n          mockupLogoWrap.style.top  = newTop  + 'px';\n        }\n\n        function onPointerUp() {\n          if (!isDragging) return;\n          isDragging = false;\n          mockupLogoWrap.classList.remove('is-dragging');\n\n          document.removeEventListener('mousemove', onPointerMove);\n          document.removeEventListener('mouseup', onPointerUp);\n          document.removeEventListener('touchmove', onPointerMove);\n          document.removeEventListener('touchend', onPointerUp);\n        }\n\n        mockupLogoWrap.addEventListener('mousedown', onPointerDown);\n        mockupLogoWrap.addEventListener('touchstart', onPointerDown, { passive: true });\n      }\n\n      function sanitizeQty() {\n        if (!qtyInput || !qtyHidden) return;\n\n        var value = qtyInput.value.replace(\/[^0-9]\/g, '');\n        if (!value || Number(value) \u003c 1) {\n          value = '1';\n        }\n        qtyInput.value = value;\n        qtyHidden.value = value;\n      }\n\n      if (qtyInput \u0026\u0026 qtyHidden) {\n        qtyInput.addEventListener('change', sanitizeQty);\n        qtyInput.addEventListener('blur', sanitizeQty);\n      }\n\n      if (btnMinus \u0026\u0026 qtyInput) {\n        btnMinus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          if (current \u003e 1) {\n            qtyInput.value = String(current - 1);\n            sanitizeQty();\n          }\n        });\n      }\n\n      if (btnPlus \u0026\u0026 qtyInput) {\n        btnPlus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          qtyInput.value = String(current + 1);\n          sanitizeQty();\n        });\n      }\n\n      sanitizeQty();\n\n      \/* --- BOTÓN WHATSAPP --- *\/\n      var whatsappBtn    = document.getElementById('custom-whatsapp-btn');\n      var whatsappNumber = '525536684089'; \/\/ tu número sin + ni espacios\n\n      \/\/ EDITA ESTAS DOS LÍNEAS EN CADA PRODUCTO:\n      var productTitle   = \"Vaso de papel 10oz para bebidas calientes\";\n      var productUrl     = \"https:\/\/acesainter.com\/products\/vaso-papel-bebidas-calientes-10oz-370w?utm_source=copyToPasteBoard\u0026utm_medium=product-links\u0026utm_content=web\";\n\n      if (whatsappBtn \u0026\u0026 qtyHidden) {\n        whatsappBtn.addEventListener('click', function() {\n          var qty = parseInt(qtyHidden.value || '1', 10);\n          if (isNaN(qty) || qty \u003c 1) qty = 1;\n\n          var message =\n            \"Hola, quiero cotizar este producto personalizado con mi marca.%0A%0A\" +\n            \"Producto: \" + encodeURIComponent(productTitle) + \"%0A\" +\n            \"Cantidad: \" + encodeURIComponent(qty + \" cajas\") + \"%0A\" +\n            \"URL del producto: \" + encodeURIComponent(productUrl) + \"%0A%0A\" +\n            \"Por favor, confírmenme tiempos de producción, precios y opciones de personalización.\";\n\n          var waUrl = \"https:\/\/wa.me\/\" + whatsappNumber + \"?text=\" + message;\n          window.open(waUrl, \"_blank\");\n        });\n      }\n    });\n  \u003c\/script\u003e\n\u003c\/section\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48138728177914,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/6.jpg?v=1768503607"},{"product_id":"vaso-papel-bebidas-calientes-12oz-412w","title":"Vaso de papel 12oz para bebidas calientes (caja 1000 pzas)","description":"\u003cp\u003eVaso de papel blanco de \u003cstrong\u003e12 oz\u003c\/strong\u003e para bebidas calientes como café grande, lattes, capuchinos y té para llevar. Elaborado en \u003cstrong\u003epapel recubierto con PE\u003c\/strong\u003e, brinda buena resistencia al calor y es \u003cstrong\u003ereciclable\u003c\/strong\u003e, ideal para \u003cstrong\u003ecafeterías, coffee shops, panaderías y restaurantes\u003c\/strong\u003e.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003e412W\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eColor: blanco\u003c\/li\u003e\n\u003cli\u003eMaterial: papel recubierto con PE\u003c\/li\u003e\n\u003cli\u003eCaja con \u003cstrong\u003e1000 vasos\u003c\/strong\u003e (20 mangas de 50 pzas)\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003csection class=\"customize-order-section\"\u003e\n  \u003cdiv class=\"customize-order-inner\"\u003e\n    \u003ch2 class=\"customize-order-title\"\u003ePersonaliza tu pedido\u003c\/h2\u003e\n\n    \u003cdiv class=\"customize-order-grid\"\u003e\n      \u003c!-- Columna 1: Subir logo --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003clabel for=\"logo-upload-input\" class=\"customize-upload-box\" id=\"upload-box-label\"\u003e\n          \u003cdiv class=\"upload-plus-wrapper\" id=\"upload-plus-wrapper\"\u003e\n            \u003cspan class=\"upload-icon\"\u003e+\u003c\/span\u003e\n          \u003c\/div\u003e\n\n          \u003cdiv class=\"upload-preview-wrapper\"\u003e\n            \u003cimg id=\"upload-preview-img\" src=\"\" alt=\"Vista previa de tu logo\" class=\"upload-preview-img\" style=\"display:none;\"\u003e\n          \u003c\/div\u003e\n        \u003c\/label\u003e\n\n        \u003cinput id=\"logo-upload-input\" type=\"file\" accept=\"image\/png,image\/jpeg,image\/jpg\" class=\"upload-input\"\u003e\n\n        \u003cbutton type=\"button\" id=\"clear-logo-btn\" class=\"clear-logo-btn\" style=\"display:none;\"\u003e\n          Borrar imagen\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 2: Mockup --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003cdiv class=\"mockup-preview\"\u003e\n          \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/B.C._12_14oz.png?v=1768508829\" class=\"mockup-base\" width=\"800\" height=\"800\"\u003e\n\n          \u003cdiv class=\"mockup-logo-wrap\" id=\"mockup-logo-wrap\"\u003e\n            \u003cimg id=\"mockup-logo-img\" src=\"\" alt=\"Tu logotipo\" class=\"mockup-logo\" style=\"display:none;\" width=\"600\" height=\"600\"\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 3: Cantidad + botón WhatsApp --\u003e\n      \u003cdiv class=\"customize-step customize-step--quantity\"\u003e\n        \u003ch3 class=\"step-title step-title-top\"\u003eCantidad de cajas para cotizar\u003c\/h3\u003e\n\n        \u003cdiv class=\"qty-block qty-block-top\"\u003e\n          \u003cdiv class=\"qty-control\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-minus\"\u003e−\u003c\/button\u003e\n            \u003cinput type=\"text\" id=\"quote-quantity\" class=\"qty-input\" value=\"1\" inputmode=\"numeric\" pattern=\"[0-9]*\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-plus\"\u003e+\u003c\/button\u003e\n          \u003c\/div\u003e\n          \u003cp class=\"qty-min-text\"\u003eTe cotizamos desde una caja\u003c\/p\u003e\n        \u003c\/div\u003e\n\n        \u003c!-- Botón WhatsApp verde con icono (imagen) --\u003e\n        \u003cbutton type=\"button\" id=\"custom-whatsapp-btn\" class=\"whatsapp-quote-btn\"\u003e\n          \u003cspan class=\"wa-icon-circle\"\u003e\n            \u003cimg src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/6\/6b\/WhatsApp.svg\" alt=\"WhatsApp\" class=\"wa-icon-img\"\u003e\n          \u003c\/span\u003e\n          \u003cspan\u003eCotizar Producto\u003c\/span\u003e\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Fila inferior de pasos --\u003e\n    \u003cdiv class=\"customize-steps-row\"\u003e\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e1\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eAgrega tu logo\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Solo se admiten imágenes en formato .png con fondo transparente. Tamaño máximo: 20 KB.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e2\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eVisualiza cómo se ve\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Esta es una representación digital del producto final. El resultado puede variar ligeramente en color, tamaño o proporciones.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e3\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eHaz tu pedido\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Puedes pedir desde una caja para imprimir tu logo en tu artículo, así de fácil.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Campos ocultos --\u003e\n    \u003cinput type=\"hidden\" id=\"logo-data-input\" name=\"properties[Logo personalizado]\" value=\"\"\u003e\n    \u003cinput type=\"hidden\" id=\"quote-quantity-input\" name=\"properties[Cantidad para cotización]\" value=\"1\"\u003e\n  \u003c\/div\u003e\n\n  \u003cstyle\u003e\n    .customize-order-section {\n      padding: 2.5rem 1.25rem;\n      background-color: #ffffff;\n    }\n    .customize-order-inner {\n      max-width: 1100px;\n      margin: 0 auto;\n    }\n    .customize-order-title {\n      font-size: 1.75rem;\n      font-weight: 700;\n      margin-bottom: 1.75rem;\n      text-align: left;\n      color: #2044A3;\n    }\n\n    .customize-order-grid {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 3rem;\n      align-items: flex-start;\n      margin-bottom: 3rem;\n      justify-content: center;\n    }\n    .customize-step {\n      width: 100%;\n      max-width: 300px;\n      margin: 0 auto;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .customize-upload-box {\n      border: 2px dashed #D4D4D8;\n      border-radius: 1.5rem;\n      padding: 1.5rem;\n      min-height: 220px;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      position: relative;\n      cursor: pointer;\n      box-sizing: border-box;\n    }\n\n    .upload-plus-wrapper {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      pointer-events: none;\n    }\n\n    .upload-icon {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 60px;\n      height: 60px;\n      border-radius: 9999px;\n      border: 2px solid #2044A3;\n      font-size: 1.85rem;\n      font-weight: 600;\n      color: #2044A3;\n      background: #ffffff;\n    }\n\n    .upload-input {\n      display: none;\n    }\n\n    .upload-preview-wrapper {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      min-height: 150px;\n    }\n    .upload-preview-img {\n      max-width: 100%;\n      max-height: 160px;\n      object-fit: contain;\n      display: block;\n    }\n\n    .clear-logo-btn {\n      margin-top: 0.75rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.6rem 1.6rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #FFC800;\n      color: #111111;\n      font-size: 0.9rem;\n      cursor: pointer;\n      white-space: nowrap;\n    }\n    .clear-logo-btn:hover {\n      background-color: #e0ae00;\n    }\n\n    .mockup-preview {\n      position: relative;\n      border-radius: 1.5rem;\n      background-color: #F5F5F7;\n      padding: 1.5rem;\n      min-height: 220px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n    }\n    .mockup-base {\n      max-width: 120%;\n      height: auto;\n      display: block;\n    }\n    .mockup-logo-wrap {\n      position: absolute;\n      top: 55%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      width: 30%;\n      pointer-events: auto;\n      cursor: move;\n      border: 2px solid transparent;\n      border-radius: 4px;\n      box-sizing: border-box;\n    }\n    .mockup-logo-wrap.is-dragging {\n      border-color: #2044A3;\n    }\n    .mockup-logo {\n      width: 100%;\n      height: auto;\n      object-fit: contain;\n      display: block;\n      filter: drop-shadow(0 1px 2px rgba(0,0,0,0.18));\n    }\n\n    .customize-step--quantity {\n      text-align: center;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .step-title-top {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 1.5rem;\n    }\n\n    .qty-min-text {\n      font-size: 0.85rem;\n      color: #6B7280;\n      margin-top: 0.25rem;\n    }\n\n    \/* === FORZAR ALINEACIÓN PERFECTA DE LA PÍLDORA DE CANTIDAD === *\/\n    .customize-order-section .qty-control {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      border-radius: 9999px !important;\n      border: 1px solid #D4D4D8 !important;\n      overflow: hidden !important;\n      background-color: #ffffff !important;\n      padding: 0 !important;\n      line-height: 0 !important;\n    }\n\n    .customize-order-section .qty-btn {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      width: 60px !important;\n      height: 46px !important;\n      background-color: #FFC800 !important;\n      border: none !important;\n      cursor: pointer !important;\n      color: #111111 !important;\n      font-size: 1.6rem !important;\n      line-height: 1 !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-shadow: none !important;\n    }\n\n    .customize-order-section .qty-input {\n      width: 80px !important;\n      height: 46px !important;\n      border: none !important;\n      outline: none !important;\n      text-align: center !important;\n      font-size: 1rem !important;\n      color: #111111 !important;\n      background-color: #ffffff !important;\n      display: flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-sizing: border-box !important;\n      line-height: 1 !important;\n    }\n\n    .customize-order-section .qty-btn span,\n    .customize-order-section .qty-btn,\n    .customize-order-section .qty-control * {\n      line-height: 1 !important;\n    }\n\n    \/* BOTÓN WHATSAPP VERDE *\/\n    .customize-order-section .whatsapp-quote-btn {\n      margin-top: 1.25rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.9rem 2.5rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #25D366 !important; \/* Verde WhatsApp *\/\n      color: #ffffff !important;\n      font-size: 1rem;\n      font-weight: 600;\n      cursor: pointer;\n      white-space: nowrap;\n      box-shadow: 0 8px 20px rgba(0,0,0,0.12);\n      gap: 0.5rem; \/* separa icono y texto *\/\n    }\n    .customize-order-section .whatsapp-quote-btn:hover {\n      background-color: #1eb259 !important;\n    }\n\n    \/* Círculo blanco para el ícono *\/\n    .customize-order-section .wa-icon-circle {\n      width: 22px;\n      height: 22px;\n      border-radius: 9999px;\n      background-color: #ffffff;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n      flex-shrink: 0;\n    }\n\n    \/* Imagen del ícono de WhatsApp *\/\n    .customize-order-section .wa-icon-img {\n      width: 16px;\n      height: 16px;\n      display: block;\n    }\n\n    .customize-order-section .wa-icon-phone,\n    .customize-order-section .wa-icon-phone::after {\n      display: none !important;\n    }\n\n    .customize-steps-row {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 2rem;\n      margin-top: 1rem;\n      max-width: 1100px;\n      margin-left: auto;\n      margin-right: auto;\n    }\n    .customize-step-text {\n      text-align:center;\n      display:flex;\n      flex-direction:column;\n      align-items:center;\n    }\n    .step-circle {\n      width: 40px;\n      height: 40px;\n      border-radius: 9999px;\n      border: 2px solid #D4D4D8;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      margin: 0 auto 0.75rem auto;\n      font-weight: 600;\n      color: #111827;\n    }\n    .step-title {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 0.5rem;\n    }\n    .step-desc {\n      font-size: 0.875rem;\n      color: #6B7280;\n      line-height: 1.4;\n    }\n\n    @media (max-width: 900px) {\n      .customize-order-grid {\n        grid-template-columns: 1fr;\n      }\n      .customize-steps-row {\n        grid-template-columns: 1fr;\n      }\n      .customize-order-title {\n        text-align: center;\n      }\n      .customize-step--quantity {\n        text-align: center;\n        align-items: center;\n      }\n      .customize-order-section .whatsapp-quote-btn {\n        align-self: center;\n      }\n    }\n  \u003c\/style\u003e\n\n  \u003cscript\u003e\n    document.addEventListener('DOMContentLoaded', function() {\n      var fileInput       = document.getElementById('logo-upload-input');\n      var logoImg         = document.getElementById('mockup-logo-img');\n      var uploadPreview   = document.getElementById('upload-preview-img');\n      var clearBtn        = document.getElementById('clear-logo-btn');\n      var logoDataInput   = document.getElementById('logo-data-input');\n      var plusWrapper     = document.getElementById('upload-plus-wrapper');\n\n      var qtyInput  = document.getElementById('quote-quantity');\n      var qtyHidden = document.getElementById('quote-quantity-input');\n      var btnMinus  = document.getElementById('qty-minus');\n      var btnPlus   = document.getElementById('qty-plus');\n\n      var mockupPreview   = document.querySelector('.mockup-preview');\n      var mockupLogoWrap  = document.getElementById('mockup-logo-wrap');\n\n      if (fileInput \u0026\u0026 logoImg \u0026\u0026 logoDataInput) {\n        fileInput.addEventListener('change', function(event) {\n          var file = event.target.files[0];\n          if (!file) return;\n\n          var maxSizeMB = 2;\n          if (file.size \u003e maxSizeMB * 1024 * 1024) {\n            alert('La imagen es demasiado grande. Tamaño máximo: ' + maxSizeMB + ' MB');\n            fileInput.value = '';\n            return;\n          }\n\n          var reader = new FileReader();\n          reader.onload = function(e) {\n            var dataUrl = e.target.result;\n\n            logoImg.src = dataUrl;\n            logoImg.style.display = 'block';\n\n            if (uploadPreview) {\n              uploadPreview.src = dataUrl;\n              uploadPreview.style.display = 'block';\n            }\n\n            if (plusWrapper) plusWrapper.style.display = 'none';\n\n            logoDataInput.value = dataUrl;\n            clearBtn.style.display = 'inline-flex';\n\n            resetLogoPosition();\n          };\n          reader.readAsDataURL(file);\n        });\n\n        clearBtn.addEventListener('click', function() {\n          fileInput.value = '';\n\n          logoImg.src = '';\n          logoImg.style.display = 'none';\n\n          if (uploadPreview) {\n            uploadPreview.src = '';\n            uploadPreview.style.display = 'none';\n          }\n\n          if (plusWrapper) plusWrapper.style.display = 'flex';\n\n          logoDataInput.value = '';\n          clearBtn.style.display = 'none';\n\n          resetLogoPosition();\n        });\n      }\n\n      function resetLogoPosition() {\n        if (!mockupLogoWrap) return;\n        mockupLogoWrap.style.top = '55%';\n        mockupLogoWrap.style.left = '50%';\n        mockupLogoWrap.style.transform = 'translate(-50%, -50%)';\n        mockupLogoWrap.classList.remove('is-dragging');\n      }\n\n      if (mockupPreview \u0026\u0026 mockupLogoWrap) {\n        var isDragging = false;\n        var startX = 0;\n        var startY = 0;\n        var startLeft = 0;\n        var startTop = 0;\n\n        function getBounds() {\n          return mockupPreview.getBoundingClientRect();\n        }\n\n        function onPointerDown(e) {\n          if (!logoImg || logoImg.style.display === 'none') return;\n\n          isDragging = true;\n          mockupLogoWrap.classList.add('is-dragging');\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          startX = clientX;\n          startY = clientY;\n\n          var wrapRect = mockupLogoWrap.getBoundingClientRect();\n          startLeft = wrapRect.left - rect.left;\n          startTop  = wrapRect.top  - rect.top;\n\n          mockupLogoWrap.style.transform = 'none';\n\n          document.addEventListener('mousemove', onPointerMove);\n          document.addEventListener('mouseup', onPointerUp);\n          document.addEventListener('touchmove', onPointerMove, { passive: false });\n          document.addEventListener('touchend', onPointerUp);\n        }\n\n        function onPointerMove(e) {\n          if (!isDragging) return;\n          e.preventDefault();\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          var deltaX = clientX - startX;\n          var deltaY = clientY - startY;\n\n          var newLeft = startLeft + deltaX;\n          var newTop  = startTop + deltaY;\n\n          var wrapRect  = mockupLogoWrap.getBoundingClientRect();\n          var wrapWidth = wrapRect.width;\n          var wrapHeight = wrapRect.height;\n\n          var minLeft = 0;\n          var minTop  = 0;\n          var maxLeft = rect.width  - wrapWidth;\n          var maxTop  = rect.height - wrapHeight;\n\n          if (newLeft \u003c minLeft) newLeft = minLeft;\n          if (newTop  \u003c minTop)  newTop  = minTop;\n          if (newLeft \u003e maxLeft) newLeft = maxLeft;\n          if (newTop  \u003e maxTop)  newTop  = maxTop;\n\n          mockupLogoWrap.style.left = newLeft + 'px';\n          mockupLogoWrap.style.top  = newTop  + 'px';\n        }\n\n        function onPointerUp() {\n          if (!isDragging) return;\n          isDragging = false;\n          mockupLogoWrap.classList.remove('is-dragging');\n\n          document.removeEventListener('mousemove', onPointerMove);\n          document.removeEventListener('mouseup', onPointerUp);\n          document.removeEventListener('touchmove', onPointerMove);\n          document.removeEventListener('touchend', onPointerUp);\n        }\n\n        mockupLogoWrap.addEventListener('mousedown', onPointerDown);\n        mockupLogoWrap.addEventListener('touchstart', onPointerDown, { passive: true });\n      }\n\n      function sanitizeQty() {\n        if (!qtyInput || !qtyHidden) return;\n\n        var value = qtyInput.value.replace(\/[^0-9]\/g, '');\n        if (!value || Number(value) \u003c 1) {\n          value = '1';\n        }\n        qtyInput.value = value;\n        qtyHidden.value = value;\n      }\n\n      if (qtyInput \u0026\u0026 qtyHidden) {\n        qtyInput.addEventListener('change', sanitizeQty);\n        qtyInput.addEventListener('blur', sanitizeQty);\n      }\n\n      if (btnMinus \u0026\u0026 qtyInput) {\n        btnMinus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          if (current \u003e 1) {\n            qtyInput.value = String(current - 1);\n            sanitizeQty();\n          }\n        });\n      }\n\n      if (btnPlus \u0026\u0026 qtyInput) {\n        btnPlus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          qtyInput.value = String(current + 1);\n          sanitizeQty();\n        });\n      }\n\n      sanitizeQty();\n\n      \/* --- BOTÓN WHATSAPP --- *\/\n      var whatsappBtn    = document.getElementById('custom-whatsapp-btn');\n      var whatsappNumber = '525536684089'; \/\/ tu número sin + ni espacios\n\n      \/\/ EDITA ESTAS DOS LÍNEAS EN CADA PRODUCTO:\n      var productTitle   = \"Vaso de papel 12oz para bebidas calientes\";\n      var productUrl     = \"https:\/\/acesainter.com\/products\/vaso-papel-bebidas-calientes-12oz-412w?utm_source=copyToPasteBoard\u0026utm_medium=product-links\u0026utm_content=web\";\n\n      if (whatsappBtn \u0026\u0026 qtyHidden) {\n        whatsappBtn.addEventListener('click', function() {\n          var qty = parseInt(qtyHidden.value || '1', 10);\n          if (isNaN(qty) || qty \u003c 1) qty = 1;\n\n          var message =\n            \"Hola, quiero cotizar este producto personalizado con mi marca.%0A%0A\" +\n            \"Producto: \" + encodeURIComponent(productTitle) + \"%0A\" +\n            \"Cantidad: \" + encodeURIComponent(qty + \" cajas\") + \"%0A\" +\n            \"URL del producto: \" + encodeURIComponent(productUrl) + \"%0A%0A\" +\n            \"Por favor, confírmenme tiempos de producción, precios y opciones de personalización.\";\n\n          var waUrl = \"https:\/\/wa.me\/\" + whatsappNumber + \"?text=\" + message;\n          window.open(waUrl, \"_blank\");\n        });\n      }\n    });\n  \u003c\/script\u003e\n\u003c\/section\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48138732503290,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/3.jpg?v=1768503649"},{"product_id":"vaso-papel-bebidas-calientes-16oz-316w","title":"Vaso de papel 16oz para bebidas calientes (caja 1000 pzas)","description":"\u003cp\u003eVaso de papel blanco de \u003cstrong\u003e16 oz\u003c\/strong\u003e ideal para café extra grande, lattes, capuchinos grandes y bebidas calientes con leche o sabores. Hecho de \u003cstrong\u003epapel recubierto con PE\u003c\/strong\u003e, resistente al calor y \u003cstrong\u003ereciclable\u003c\/strong\u003e, pensado para \u003cstrong\u003ecafeterías de alto volumen, cadenas, panaderías y restaurantes\u003c\/strong\u003e.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003e316W\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eColor: blanco\u003c\/li\u003e\n\u003cli\u003eMaterial: papel recubierto con PE\u003c\/li\u003e\n\u003cli\u003eCaja con \u003cstrong\u003e1000 vasos\u003c\/strong\u003e (40 piezas por manga, 15 mangas por caja)\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003csection class=\"customize-order-section\"\u003e\n  \u003cdiv class=\"customize-order-inner\"\u003e\n    \u003ch2 class=\"customize-order-title\"\u003ePersonaliza tu pedido\u003c\/h2\u003e\n\n    \u003cdiv class=\"customize-order-grid\"\u003e\n      \u003c!-- Columna 1: Subir logo --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003clabel for=\"logo-upload-input\" class=\"customize-upload-box\" id=\"upload-box-label\"\u003e\n          \u003cdiv class=\"upload-plus-wrapper\" id=\"upload-plus-wrapper\"\u003e\n            \u003cspan class=\"upload-icon\"\u003e+\u003c\/span\u003e\n          \u003c\/div\u003e\n\n          \u003cdiv class=\"upload-preview-wrapper\"\u003e\n            \u003cimg id=\"upload-preview-img\" src=\"\" alt=\"Vista previa de tu logo\" class=\"upload-preview-img\" style=\"display:none;\"\u003e\n          \u003c\/div\u003e\n        \u003c\/label\u003e\n\n        \u003cinput id=\"logo-upload-input\" type=\"file\" accept=\"image\/png,image\/jpeg,image\/jpg\" class=\"upload-input\"\u003e\n\n        \u003cbutton type=\"button\" id=\"clear-logo-btn\" class=\"clear-logo-btn\" style=\"display:none;\"\u003e\n          Borrar imagen\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 2: Mockup --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003cdiv class=\"mockup-preview\"\u003e\n          \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/B.C._16oz.png?v=1768508829\" alt=\"Vaso personalizado\" class=\"mockup-base\" width=\"800\" height=\"800\"\u003e\n\n          \u003cdiv class=\"mockup-logo-wrap\" id=\"mockup-logo-wrap\"\u003e\n            \u003cimg id=\"mockup-logo-img\" src=\"\" alt=\"Tu logotipo\" class=\"mockup-logo\" style=\"display:none;\" width=\"600\" height=\"600\"\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 3: Cantidad + botón WhatsApp --\u003e\n      \u003cdiv class=\"customize-step customize-step--quantity\"\u003e\n        \u003ch3 class=\"step-title step-title-top\"\u003eCantidad de cajas para cotizar\u003c\/h3\u003e\n\n        \u003cdiv class=\"qty-block qty-block-top\"\u003e\n          \u003cdiv class=\"qty-control\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-minus\"\u003e−\u003c\/button\u003e\n            \u003cinput type=\"text\" id=\"quote-quantity\" class=\"qty-input\" value=\"1\" inputmode=\"numeric\" pattern=\"[0-9]*\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-plus\"\u003e+\u003c\/button\u003e\n          \u003c\/div\u003e\n          \u003cp class=\"qty-min-text\"\u003eTe cotizamos desde una caja\u003c\/p\u003e\n        \u003c\/div\u003e\n\n        \u003c!-- Botón WhatsApp verde con icono (imagen) --\u003e\n        \u003cbutton type=\"button\" id=\"custom-whatsapp-btn\" class=\"whatsapp-quote-btn\"\u003e\n          \u003cspan class=\"wa-icon-circle\"\u003e\n            \u003cimg src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/6\/6b\/WhatsApp.svg\" alt=\"WhatsApp\" class=\"wa-icon-img\"\u003e\n          \u003c\/span\u003e\n          \u003cspan\u003eCotizar Producto\u003c\/span\u003e\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Fila inferior de pasos --\u003e\n    \u003cdiv class=\"customize-steps-row\"\u003e\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e1\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eAgrega tu logo\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Solo se admiten imágenes en formato .png con fondo transparente. Tamaño máximo: 20 KB.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e2\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eVisualiza cómo se ve\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Esta es una representación digital del producto final. El resultado puede variar ligeramente en color, tamaño o proporciones.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e3\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eHaz tu pedido\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Puedes pedir desde una caja para imprimir tu logo en tu artículo, así de fácil.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Campos ocultos --\u003e\n    \u003cinput type=\"hidden\" id=\"logo-data-input\" name=\"properties[Logo personalizado]\" value=\"\"\u003e\n    \u003cinput type=\"hidden\" id=\"quote-quantity-input\" name=\"properties[Cantidad para cotización]\" value=\"1\"\u003e\n  \u003c\/div\u003e\n\n  \u003cstyle\u003e\n    .customize-order-section {\n      padding: 2.5rem 1.25rem;\n      background-color: #ffffff;\n    }\n    .customize-order-inner {\n      max-width: 1100px;\n      margin: 0 auto;\n    }\n    .customize-order-title {\n      font-size: 1.75rem;\n      font-weight: 700;\n      margin-bottom: 1.75rem;\n      text-align: left;\n      color: #2044A3;\n    }\n\n    .customize-order-grid {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 3rem;\n      align-items: flex-start;\n      margin-bottom: 3rem;\n      justify-content: center;\n    }\n    .customize-step {\n      width: 100%;\n      max-width: 300px;\n      margin: 0 auto;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .customize-upload-box {\n      border: 2px dashed #D4D4D8;\n      border-radius: 1.5rem;\n      padding: 1.5rem;\n      min-height: 220px;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      position: relative;\n      cursor: pointer;\n      box-sizing: border-box;\n    }\n\n    .upload-plus-wrapper {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      pointer-events: none;\n    }\n\n    .upload-icon {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 60px;\n      height: 60px;\n      border-radius: 9999px;\n      border: 2px solid #2044A3;\n      font-size: 1.85rem;\n      font-weight: 600;\n      color: #2044A3;\n      background: #ffffff;\n    }\n\n    .upload-input {\n      display: none;\n    }\n\n    .upload-preview-wrapper {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      min-height: 150px;\n    }\n    .upload-preview-img {\n      max-width: 100%;\n      max-height: 160px;\n      object-fit: contain;\n      display: block;\n    }\n\n    .clear-logo-btn {\n      margin-top: 0.75rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.6rem 1.6rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #FFC800;\n      color: #111111;\n      font-size: 0.9rem;\n      cursor: pointer;\n      white-space: nowrap;\n    }\n    .clear-logo-btn:hover {\n      background-color: #e0ae00;\n    }\n\n    .mockup-preview {\n      position: relative;\n      border-radius: 1.5rem;\n      background-color: #F5F5F7;\n      padding: 1.5rem;\n      min-height: 220px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n    }\n    .mockup-base {\n      max-width: 120%;\n      height: auto;\n      display: block;\n    }\n    .mockup-logo-wrap {\n      position: absolute;\n      top: 55%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      width: 30%;\n      pointer-events: auto;\n      cursor: move;\n      border: 2px solid transparent;\n      border-radius: 4px;\n      box-sizing: border-box;\n    }\n    .mockup-logo-wrap.is-dragging {\n      border-color: #2044A3;\n    }\n    .mockup-logo {\n      width: 100%;\n      height: auto;\n      object-fit: contain;\n      display: block;\n      filter: drop-shadow(0 1px 2px rgba(0,0,0,0.18));\n    }\n\n    .customize-step--quantity {\n      text-align: center;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .step-title-top {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 1.5rem;\n    }\n\n    .qty-min-text {\n      font-size: 0.85rem;\n      color: #6B7280;\n      margin-top: 0.25rem;\n    }\n\n    \/* === FORZAR ALINEACIÓN PERFECTA DE LA PÍLDORA DE CANTIDAD === *\/\n    .customize-order-section .qty-control {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      border-radius: 9999px !important;\n      border: 1px solid #D4D4D8 !important;\n      overflow: hidden !important;\n      background-color: #ffffff !important;\n      padding: 0 !important;\n      line-height: 0 !important;\n    }\n\n    .customize-order-section .qty-btn {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      width: 60px !important;\n      height: 46px !important;\n      background-color: #FFC800 !important;\n      border: none !important;\n      cursor: pointer !important;\n      color: #111111 !important;\n      font-size: 1.6rem !important;\n      line-height: 1 !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-shadow: none !important;\n    }\n\n    .customize-order-section .qty-input {\n      width: 80px !important;\n      height: 46px !important;\n      border: none !important;\n      outline: none !important;\n      text-align: center !important;\n      font-size: 1rem !important;\n      color: #111111 !important;\n      background-color: #ffffff !important;\n      display: flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-sizing: border-box !important;\n      line-height: 1 !important;\n    }\n\n    .customize-order-section .qty-btn span,\n    .customize-order-section .qty-btn,\n    .customize-order-section .qty-control * {\n      line-height: 1 !important;\n    }\n\n    \/* BOTÓN WHATSAPP VERDE *\/\n    .customize-order-section .whatsapp-quote-btn {\n      margin-top: 1.25rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.9rem 2.5rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #25D366 !important; \/* Verde WhatsApp *\/\n      color: #ffffff !important;\n      font-size: 1rem;\n      font-weight: 600;\n      cursor: pointer;\n      white-space: nowrap;\n      box-shadow: 0 8px 20px rgba(0,0,0,0.12);\n      gap: 0.5rem; \/* separa icono y texto *\/\n    }\n    .customize-order-section .whatsapp-quote-btn:hover {\n      background-color: #1eb259 !important;\n    }\n\n    \/* Círculo blanco para el ícono *\/\n    .customize-order-section .wa-icon-circle {\n      width: 22px;\n      height: 22px;\n      border-radius: 9999px;\n      background-color: #ffffff;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n      flex-shrink: 0;\n    }\n\n    \/* Imagen del ícono de WhatsApp *\/\n    .customize-order-section .wa-icon-img {\n      width: 16px;\n      height: 16px;\n      display: block;\n    }\n\n    .customize-order-section .wa-icon-phone,\n    .customize-order-section .wa-icon-phone::after {\n      display: none !important;\n    }\n\n    .customize-steps-row {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 2rem;\n      margin-top: 1rem;\n      max-width: 1100px;\n      margin-left: auto;\n      margin-right: auto;\n    }\n    .customize-step-text {\n      text-align:center;\n      display:flex;\n      flex-direction:column;\n      align-items:center;\n    }\n    .step-circle {\n      width: 40px;\n      height: 40px;\n      border-radius: 9999px;\n      border: 2px solid #D4D4D8;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      margin: 0 auto 0.75rem auto;\n      font-weight: 600;\n      color: #111827;\n    }\n    .step-title {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 0.5rem;\n    }\n    .step-desc {\n      font-size: 0.875rem;\n      color: #6B7280;\n      line-height: 1.4;\n    }\n\n    @media (max-width: 900px) {\n      .customize-order-grid {\n        grid-template-columns: 1fr;\n      }\n      .customize-steps-row {\n        grid-template-columns: 1fr;\n      }\n      .customize-order-title {\n        text-align: center;\n      }\n      .customize-step--quantity {\n        text-align: center;\n        align-items: center;\n      }\n      .customize-order-section .whatsapp-quote-btn {\n        align-self: center;\n      }\n    }\n  \u003c\/style\u003e\n\n  \u003cscript\u003e\n    document.addEventListener('DOMContentLoaded', function() {\n      var fileInput       = document.getElementById('logo-upload-input');\n      var logoImg         = document.getElementById('mockup-logo-img');\n      var uploadPreview   = document.getElementById('upload-preview-img');\n      var clearBtn        = document.getElementById('clear-logo-btn');\n      var logoDataInput   = document.getElementById('logo-data-input');\n      var plusWrapper     = document.getElementById('upload-plus-wrapper');\n\n      var qtyInput  = document.getElementById('quote-quantity');\n      var qtyHidden = document.getElementById('quote-quantity-input');\n      var btnMinus  = document.getElementById('qty-minus');\n      var btnPlus   = document.getElementById('qty-plus');\n\n      var mockupPreview   = document.querySelector('.mockup-preview');\n      var mockupLogoWrap  = document.getElementById('mockup-logo-wrap');\n\n      if (fileInput \u0026\u0026 logoImg \u0026\u0026 logoDataInput) {\n        fileInput.addEventListener('change', function(event) {\n          var file = event.target.files[0];\n          if (!file) return;\n\n          var maxSizeMB = 2;\n          if (file.size \u003e maxSizeMB * 1024 * 1024) {\n            alert('La imagen es demasiado grande. Tamaño máximo: ' + maxSizeMB + ' MB');\n            fileInput.value = '';\n            return;\n          }\n\n          var reader = new FileReader();\n          reader.onload = function(e) {\n            var dataUrl = e.target.result;\n\n            logoImg.src = dataUrl;\n            logoImg.style.display = 'block';\n\n            if (uploadPreview) {\n              uploadPreview.src = dataUrl;\n              uploadPreview.style.display = 'block';\n            }\n\n            if (plusWrapper) plusWrapper.style.display = 'none';\n\n            logoDataInput.value = dataUrl;\n            clearBtn.style.display = 'inline-flex';\n\n            resetLogoPosition();\n          };\n          reader.readAsDataURL(file);\n        });\n\n        clearBtn.addEventListener('click', function() {\n          fileInput.value = '';\n\n          logoImg.src = '';\n          logoImg.style.display = 'none';\n\n          if (uploadPreview) {\n            uploadPreview.src = '';\n            uploadPreview.style.display = 'none';\n          }\n\n          if (plusWrapper) plusWrapper.style.display = 'flex';\n\n          logoDataInput.value = '';\n          clearBtn.style.display = 'none';\n\n          resetLogoPosition();\n        });\n      }\n\n      function resetLogoPosition() {\n        if (!mockupLogoWrap) return;\n        mockupLogoWrap.style.top = '55%';\n        mockupLogoWrap.style.left = '50%';\n        mockupLogoWrap.style.transform = 'translate(-50%, -50%)';\n        mockupLogoWrap.classList.remove('is-dragging');\n      }\n\n      if (mockupPreview \u0026\u0026 mockupLogoWrap) {\n        var isDragging = false;\n        var startX = 0;\n        var startY = 0;\n        var startLeft = 0;\n        var startTop = 0;\n\n        function getBounds() {\n          return mockupPreview.getBoundingClientRect();\n        }\n\n        function onPointerDown(e) {\n          if (!logoImg || logoImg.style.display === 'none') return;\n\n          isDragging = true;\n          mockupLogoWrap.classList.add('is-dragging');\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          startX = clientX;\n          startY = clientY;\n\n          var wrapRect = mockupLogoWrap.getBoundingClientRect();\n          startLeft = wrapRect.left - rect.left;\n          startTop  = wrapRect.top  - rect.top;\n\n          mockupLogoWrap.style.transform = 'none';\n\n          document.addEventListener('mousemove', onPointerMove);\n          document.addEventListener('mouseup', onPointerUp);\n          document.addEventListener('touchmove', onPointerMove, { passive: false });\n          document.addEventListener('touchend', onPointerUp);\n        }\n\n        function onPointerMove(e) {\n          if (!isDragging) return;\n          e.preventDefault();\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          var deltaX = clientX - startX;\n          var deltaY = clientY - startY;\n\n          var newLeft = startLeft + deltaX;\n          var newTop  = startTop + deltaY;\n\n          var wrapRect  = mockupLogoWrap.getBoundingClientRect();\n          var wrapWidth = wrapRect.width;\n          var wrapHeight = wrapRect.height;\n\n          var minLeft = 0;\n          var minTop  = 0;\n          var maxLeft = rect.width  - wrapWidth;\n          var maxTop  = rect.height - wrapHeight;\n\n          if (newLeft \u003c minLeft) newLeft = minLeft;\n          if (newTop  \u003c minTop)  newTop  = minTop;\n          if (newLeft \u003e maxLeft) newLeft = maxLeft;\n          if (newTop  \u003e maxTop)  newTop  = maxTop;\n\n          mockupLogoWrap.style.left = newLeft + 'px';\n          mockupLogoWrap.style.top  = newTop  + 'px';\n        }\n\n        function onPointerUp() {\n          if (!isDragging) return;\n          isDragging = false;\n          mockupLogoWrap.classList.remove('is-dragging');\n\n          document.removeEventListener('mousemove', onPointerMove);\n          document.removeEventListener('mouseup', onPointerUp);\n          document.removeEventListener('touchmove', onPointerMove);\n          document.removeEventListener('touchend', onPointerUp);\n        }\n\n        mockupLogoWrap.addEventListener('mousedown', onPointerDown);\n        mockupLogoWrap.addEventListener('touchstart', onPointerDown, { passive: true });\n      }\n\n      function sanitizeQty() {\n        if (!qtyInput || !qtyHidden) return;\n\n        var value = qtyInput.value.replace(\/[^0-9]\/g, '');\n        if (!value || Number(value) \u003c 1) {\n          value = '1';\n        }\n        qtyInput.value = value;\n        qtyHidden.value = value;\n      }\n\n      if (qtyInput \u0026\u0026 qtyHidden) {\n        qtyInput.addEventListener('change', sanitizeQty);\n        qtyInput.addEventListener('blur', sanitizeQty);\n      }\n\n      if (btnMinus \u0026\u0026 qtyInput) {\n        btnMinus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          if (current \u003e 1) {\n            qtyInput.value = String(current - 1);\n            sanitizeQty();\n          }\n        });\n      }\n\n      if (btnPlus \u0026\u0026 qtyInput) {\n        btnPlus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          qtyInput.value = String(current + 1);\n          sanitizeQty();\n        });\n      }\n\n      sanitizeQty();\n\n      \/* --- BOTÓN WHATSAPP --- *\/\n      var whatsappBtn    = document.getElementById('custom-whatsapp-btn');\n      var whatsappNumber = '525536684089'; \/\/ tu número sin + ni espacios\n\n      \/\/ EDITA ESTAS DOS LÍNEAS EN CADA PRODUCTO:\n      var productTitle   = \"Vaso de papel 16oz para bebidas calientes\";\n      var productUrl     = \"https:\/\/acesainter.com\/products\/vaso-papel-bebidas-calientes-16oz-316w?utm_source=copyToPasteBoard\u0026utm_medium=product-links\u0026utm_content=web\";\n\n      if (whatsappBtn \u0026\u0026 qtyHidden) {\n        whatsappBtn.addEventListener('click', function() {\n          var qty = parseInt(qtyHidden.value || '1', 10);\n          if (isNaN(qty) || qty \u003c 1) qty = 1;\n\n          var message =\n            \"Hola, quiero cotizar este producto personalizado con mi marca.%0A%0A\" +\n            \"Producto: \" + encodeURIComponent(productTitle) + \"%0A\" +\n            \"Cantidad: \" + encodeURIComponent(qty + \" cajas\") + \"%0A\" +\n            \"URL del producto: \" + encodeURIComponent(productUrl) + \"%0A%0A\" +\n            \"Por favor, confírmenme tiempos de producción, precios y opciones de personalización.\";\n\n          var waUrl = \"https:\/\/wa.me\/\" + whatsappNumber + \"?text=\" + message;\n          window.open(waUrl, \"_blank\");\n        });\n      }\n    });\n  \u003c\/script\u003e\n\u003c\/section\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48138735943930,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/4.jpg?v=1768503685"},{"product_id":"vaso-papel-bebidas-calientes-20oz-420w","title":"Vaso de papel 20oz para bebidas calientes (caja 600 pzas)","description":"\u003cp\u003eVaso de papel blanco de \u003cstrong\u003e20 oz\u003c\/strong\u003e para bebidas calientes en formato extra grande: café grande, lattes especiales, chocolate caliente y bebidas de temporada. Fabricado en \u003cstrong\u003epapel recubierto con PE\u003c\/strong\u003e, resistente al calor y \u003cstrong\u003ereciclable\u003c\/strong\u003e, ideal para \u003cstrong\u003ecafeterías, cadenas de café, restaurantes y servicio para llevar\u003c\/strong\u003e que requieren porciones generosas.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003e420W\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eColor: blanco\u003c\/li\u003e\n\u003cli\u003eMaterial: papel recubierto con PE\u003c\/li\u003e\n\u003cli\u003eCaja con \u003cstrong\u003e600 vasos\u003c\/strong\u003e (20 mangas de 50 pzas)\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003csection class=\"customize-order-section\"\u003e\n  \u003cdiv class=\"customize-order-inner\"\u003e\n    \u003ch2 class=\"customize-order-title\"\u003ePersonaliza tu pedido\u003c\/h2\u003e\n\n    \u003cdiv class=\"customize-order-grid\"\u003e\n      \u003c!-- Columna 1: Subir logo --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003clabel for=\"logo-upload-input\" class=\"customize-upload-box\" id=\"upload-box-label\"\u003e\n          \u003cdiv class=\"upload-plus-wrapper\" id=\"upload-plus-wrapper\"\u003e\n            \u003cspan class=\"upload-icon\"\u003e+\u003c\/span\u003e\n          \u003c\/div\u003e\n\n          \u003cdiv class=\"upload-preview-wrapper\"\u003e\n            \u003cimg id=\"upload-preview-img\" src=\"\" alt=\"Vista previa de tu logo\" class=\"upload-preview-img\" style=\"display:none;\"\u003e\n          \u003c\/div\u003e\n        \u003c\/label\u003e\n\n        \u003cinput id=\"logo-upload-input\" type=\"file\" accept=\"image\/png,image\/jpeg,image\/jpg\" class=\"upload-input\"\u003e\n\n        \u003cbutton type=\"button\" id=\"clear-logo-btn\" class=\"clear-logo-btn\" style=\"display:none;\"\u003e\n          Borrar imagen\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 2: Mockup --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003cdiv class=\"mockup-preview\"\u003e\n          \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/B.C._20oz.png?v=1768508829\" alt=\"Vaso personalizado\" class=\"mockup-base\" width=\"800\" height=\"800\"\u003e\n\n          \u003cdiv class=\"mockup-logo-wrap\" id=\"mockup-logo-wrap\"\u003e\n            \u003cimg id=\"mockup-logo-img\" src=\"\" alt=\"Tu logotipo\" class=\"mockup-logo\" style=\"display:none;\" width=\"600\" height=\"600\"\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 3: Cantidad + botón WhatsApp --\u003e\n      \u003cdiv class=\"customize-step customize-step--quantity\"\u003e\n        \u003ch3 class=\"step-title step-title-top\"\u003eCantidad de cajas para cotizar\u003c\/h3\u003e\n\n        \u003cdiv class=\"qty-block qty-block-top\"\u003e\n          \u003cdiv class=\"qty-control\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-minus\"\u003e−\u003c\/button\u003e\n            \u003cinput type=\"text\" id=\"quote-quantity\" class=\"qty-input\" value=\"1\" inputmode=\"numeric\" pattern=\"[0-9]*\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-plus\"\u003e+\u003c\/button\u003e\n          \u003c\/div\u003e\n          \u003cp class=\"qty-min-text\"\u003eTe cotizamos desde una caja\u003c\/p\u003e\n        \u003c\/div\u003e\n\n        \u003c!-- Botón WhatsApp verde con icono (imagen) --\u003e\n        \u003cbutton type=\"button\" id=\"custom-whatsapp-btn\" class=\"whatsapp-quote-btn\"\u003e\n          \u003cspan class=\"wa-icon-circle\"\u003e\n            \u003cimg src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/6\/6b\/WhatsApp.svg\" alt=\"WhatsApp\" class=\"wa-icon-img\"\u003e\n          \u003c\/span\u003e\n          \u003cspan\u003eCotizar Producto\u003c\/span\u003e\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Fila inferior de pasos --\u003e\n    \u003cdiv class=\"customize-steps-row\"\u003e\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e1\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eAgrega tu logo\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Solo se admiten imágenes en formato .png con fondo transparente. Tamaño máximo: 20 KB.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e2\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eVisualiza cómo se ve\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Esta es una representación digital del producto final. El resultado puede variar ligeramente en color, tamaño o proporciones.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e3\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eHaz tu pedido\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Puedes pedir desde una caja para imprimir tu logo en tu artículo, así de fácil.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Campos ocultos --\u003e\n    \u003cinput type=\"hidden\" id=\"logo-data-input\" name=\"properties[Logo personalizado]\" value=\"\"\u003e\n    \u003cinput type=\"hidden\" id=\"quote-quantity-input\" name=\"properties[Cantidad para cotización]\" value=\"1\"\u003e\n  \u003c\/div\u003e\n\n  \u003cstyle\u003e\n    .customize-order-section {\n      padding: 2.5rem 1.25rem;\n      background-color: #ffffff;\n    }\n    .customize-order-inner {\n      max-width: 1100px;\n      margin: 0 auto;\n    }\n    .customize-order-title {\n      font-size: 1.75rem;\n      font-weight: 700;\n      margin-bottom: 1.75rem;\n      text-align: left;\n      color: #2044A3;\n    }\n\n    .customize-order-grid {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 3rem;\n      align-items: flex-start;\n      margin-bottom: 3rem;\n      justify-content: center;\n    }\n    .customize-step {\n      width: 100%;\n      max-width: 300px;\n      margin: 0 auto;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .customize-upload-box {\n      border: 2px dashed #D4D4D8;\n      border-radius: 1.5rem;\n      padding: 1.5rem;\n      min-height: 220px;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      position: relative;\n      cursor: pointer;\n      box-sizing: border-box;\n    }\n\n    .upload-plus-wrapper {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      pointer-events: none;\n    }\n\n    .upload-icon {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 60px;\n      height: 60px;\n      border-radius: 9999px;\n      border: 2px solid #2044A3;\n      font-size: 1.85rem;\n      font-weight: 600;\n      color: #2044A3;\n      background: #ffffff;\n    }\n\n    .upload-input {\n      display: none;\n    }\n\n    .upload-preview-wrapper {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      min-height: 150px;\n    }\n    .upload-preview-img {\n      max-width: 100%;\n      max-height: 160px;\n      object-fit: contain;\n      display: block;\n    }\n\n    .clear-logo-btn {\n      margin-top: 0.75rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.6rem 1.6rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #FFC800;\n      color: #111111;\n      font-size: 0.9rem;\n      cursor: pointer;\n      white-space: nowrap;\n    }\n    .clear-logo-btn:hover {\n      background-color: #e0ae00;\n    }\n\n    .mockup-preview {\n      position: relative;\n      border-radius: 1.5rem;\n      background-color: #F5F5F7;\n      padding: 1.5rem;\n      min-height: 220px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n    }\n    .mockup-base {\n      max-width: 120%;\n      height: auto;\n      display: block;\n    }\n    .mockup-logo-wrap {\n      position: absolute;\n      top: 55%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      width: 30%;\n      pointer-events: auto;\n      cursor: move;\n      border: 2px solid transparent;\n      border-radius: 4px;\n      box-sizing: border-box;\n    }\n    .mockup-logo-wrap.is-dragging {\n      border-color: #2044A3;\n    }\n    .mockup-logo {\n      width: 100%;\n      height: auto;\n      object-fit: contain;\n      display: block;\n      filter: drop-shadow(0 1px 2px rgba(0,0,0,0.18));\n    }\n\n    .customize-step--quantity {\n      text-align: center;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .step-title-top {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 1.5rem;\n    }\n\n    .qty-min-text {\n      font-size: 0.85rem;\n      color: #6B7280;\n      margin-top: 0.25rem;\n    }\n\n    \/* === FORZAR ALINEACIÓN PERFECTA DE LA PÍLDORA DE CANTIDAD === *\/\n    .customize-order-section .qty-control {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      border-radius: 9999px !important;\n      border: 1px solid #D4D4D8 !important;\n      overflow: hidden !important;\n      background-color: #ffffff !important;\n      padding: 0 !important;\n      line-height: 0 !important;\n    }\n\n    .customize-order-section .qty-btn {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      width: 60px !important;\n      height: 46px !important;\n      background-color: #FFC800 !important;\n      border: none !important;\n      cursor: pointer !important;\n      color: #111111 !important;\n      font-size: 1.6rem !important;\n      line-height: 1 !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-shadow: none !important;\n    }\n\n    .customize-order-section .qty-input {\n      width: 80px !important;\n      height: 46px !important;\n      border: none !important;\n      outline: none !important;\n      text-align: center !important;\n      font-size: 1rem !important;\n      color: #111111 !important;\n      background-color: #ffffff !important;\n      display: flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-sizing: border-box !important;\n      line-height: 1 !important;\n    }\n\n    .customize-order-section .qty-btn span,\n    .customize-order-section .qty-btn,\n    .customize-order-section .qty-control * {\n      line-height: 1 !important;\n    }\n\n    \/* BOTÓN WHATSAPP VERDE *\/\n    .customize-order-section .whatsapp-quote-btn {\n      margin-top: 1.25rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.9rem 2.5rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #25D366 !important; \/* Verde WhatsApp *\/\n      color: #ffffff !important;\n      font-size: 1rem;\n      font-weight: 600;\n      cursor: pointer;\n      white-space: nowrap;\n      box-shadow: 0 8px 20px rgba(0,0,0,0.12);\n      gap: 0.5rem; \/* separa icono y texto *\/\n    }\n    .customize-order-section .whatsapp-quote-btn:hover {\n      background-color: #1eb259 !important;\n    }\n\n    \/* Círculo blanco para el ícono *\/\n    .customize-order-section .wa-icon-circle {\n      width: 22px;\n      height: 22px;\n      border-radius: 9999px;\n      background-color: #ffffff;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n      flex-shrink: 0;\n    }\n\n    \/* Imagen del ícono de WhatsApp *\/\n    .customize-order-section .wa-icon-img {\n      width: 16px;\n      height: 16px;\n      display: block;\n    }\n\n    .customize-order-section .wa-icon-phone,\n    .customize-order-section .wa-icon-phone::after {\n      display: none !important;\n    }\n\n    .customize-steps-row {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 2rem;\n      margin-top: 1rem;\n      max-width: 1100px;\n      margin-left: auto;\n      margin-right: auto;\n    }\n    .customize-step-text {\n      text-align:center;\n      display:flex;\n      flex-direction:column;\n      align-items:center;\n    }\n    .step-circle {\n      width: 40px;\n      height: 40px;\n      border-radius: 9999px;\n      border: 2px solid #D4D4D8;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      margin: 0 auto 0.75rem auto;\n      font-weight: 600;\n      color: #111827;\n    }\n    .step-title {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 0.5rem;\n    }\n    .step-desc {\n      font-size: 0.875rem;\n      color: #6B7280;\n      line-height: 1.4;\n    }\n\n    @media (max-width: 900px) {\n      .customize-order-grid {\n        grid-template-columns: 1fr;\n      }\n      .customize-steps-row {\n        grid-template-columns: 1fr;\n      }\n      .customize-order-title {\n        text-align: center;\n      }\n      .customize-step--quantity {\n        text-align: center;\n        align-items: center;\n      }\n      .customize-order-section .whatsapp-quote-btn {\n        align-self: center;\n      }\n    }\n  \u003c\/style\u003e\n\n  \u003cscript\u003e\n    document.addEventListener('DOMContentLoaded', function() {\n      var fileInput       = document.getElementById('logo-upload-input');\n      var logoImg         = document.getElementById('mockup-logo-img');\n      var uploadPreview   = document.getElementById('upload-preview-img');\n      var clearBtn        = document.getElementById('clear-logo-btn');\n      var logoDataInput   = document.getElementById('logo-data-input');\n      var plusWrapper     = document.getElementById('upload-plus-wrapper');\n\n      var qtyInput  = document.getElementById('quote-quantity');\n      var qtyHidden = document.getElementById('quote-quantity-input');\n      var btnMinus  = document.getElementById('qty-minus');\n      var btnPlus   = document.getElementById('qty-plus');\n\n      var mockupPreview   = document.querySelector('.mockup-preview');\n      var mockupLogoWrap  = document.getElementById('mockup-logo-wrap');\n\n      if (fileInput \u0026\u0026 logoImg \u0026\u0026 logoDataInput) {\n        fileInput.addEventListener('change', function(event) {\n          var file = event.target.files[0];\n          if (!file) return;\n\n          var maxSizeMB = 2;\n          if (file.size \u003e maxSizeMB * 1024 * 1024) {\n            alert('La imagen es demasiado grande. Tamaño máximo: ' + maxSizeMB + ' MB');\n            fileInput.value = '';\n            return;\n          }\n\n          var reader = new FileReader();\n          reader.onload = function(e) {\n            var dataUrl = e.target.result;\n\n            logoImg.src = dataUrl;\n            logoImg.style.display = 'block';\n\n            if (uploadPreview) {\n              uploadPreview.src = dataUrl;\n              uploadPreview.style.display = 'block';\n            }\n\n            if (plusWrapper) plusWrapper.style.display = 'none';\n\n            logoDataInput.value = dataUrl;\n            clearBtn.style.display = 'inline-flex';\n\n            resetLogoPosition();\n          };\n          reader.readAsDataURL(file);\n        });\n\n        clearBtn.addEventListener('click', function() {\n          fileInput.value = '';\n\n          logoImg.src = '';\n          logoImg.style.display = 'none';\n\n          if (uploadPreview) {\n            uploadPreview.src = '';\n            uploadPreview.style.display = 'none';\n          }\n\n          if (plusWrapper) plusWrapper.style.display = 'flex';\n\n          logoDataInput.value = '';\n          clearBtn.style.display = 'none';\n\n          resetLogoPosition();\n        });\n      }\n\n      function resetLogoPosition() {\n        if (!mockupLogoWrap) return;\n        mockupLogoWrap.style.top = '55%';\n        mockupLogoWrap.style.left = '50%';\n        mockupLogoWrap.style.transform = 'translate(-50%, -50%)';\n        mockupLogoWrap.classList.remove('is-dragging');\n      }\n\n      if (mockupPreview \u0026\u0026 mockupLogoWrap) {\n        var isDragging = false;\n        var startX = 0;\n        var startY = 0;\n        var startLeft = 0;\n        var startTop = 0;\n\n        function getBounds() {\n          return mockupPreview.getBoundingClientRect();\n        }\n\n        function onPointerDown(e) {\n          if (!logoImg || logoImg.style.display === 'none') return;\n\n          isDragging = true;\n          mockupLogoWrap.classList.add('is-dragging');\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          startX = clientX;\n          startY = clientY;\n\n          var wrapRect = mockupLogoWrap.getBoundingClientRect();\n          startLeft = wrapRect.left - rect.left;\n          startTop  = wrapRect.top  - rect.top;\n\n          mockupLogoWrap.style.transform = 'none';\n\n          document.addEventListener('mousemove', onPointerMove);\n          document.addEventListener('mouseup', onPointerUp);\n          document.addEventListener('touchmove', onPointerMove, { passive: false });\n          document.addEventListener('touchend', onPointerUp);\n        }\n\n        function onPointerMove(e) {\n          if (!isDragging) return;\n          e.preventDefault();\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          var deltaX = clientX - startX;\n          var deltaY = clientY - startY;\n\n          var newLeft = startLeft + deltaX;\n          var newTop  = startTop + deltaY;\n\n          var wrapRect  = mockupLogoWrap.getBoundingClientRect();\n          var wrapWidth = wrapRect.width;\n          var wrapHeight = wrapRect.height;\n\n          var minLeft = 0;\n          var minTop  = 0;\n          var maxLeft = rect.width  - wrapWidth;\n          var maxTop  = rect.height - wrapHeight;\n\n          if (newLeft \u003c minLeft) newLeft = minLeft;\n          if (newTop  \u003c minTop)  newTop  = minTop;\n          if (newLeft \u003e maxLeft) newLeft = maxLeft;\n          if (newTop  \u003e maxTop)  newTop  = maxTop;\n\n          mockupLogoWrap.style.left = newLeft + 'px';\n          mockupLogoWrap.style.top  = newTop  + 'px';\n        }\n\n        function onPointerUp() {\n          if (!isDragging) return;\n          isDragging = false;\n          mockupLogoWrap.classList.remove('is-dragging');\n\n          document.removeEventListener('mousemove', onPointerMove);\n          document.removeEventListener('mouseup', onPointerUp);\n          document.removeEventListener('touchmove', onPointerMove);\n          document.removeEventListener('touchend', onPointerUp);\n        }\n\n        mockupLogoWrap.addEventListener('mousedown', onPointerDown);\n        mockupLogoWrap.addEventListener('touchstart', onPointerDown, { passive: true });\n      }\n\n      function sanitizeQty() {\n        if (!qtyInput || !qtyHidden) return;\n\n        var value = qtyInput.value.replace(\/[^0-9]\/g, '');\n        if (!value || Number(value) \u003c 1) {\n          value = '1';\n        }\n        qtyInput.value = value;\n        qtyHidden.value = value;\n      }\n\n      if (qtyInput \u0026\u0026 qtyHidden) {\n        qtyInput.addEventListener('change', sanitizeQty);\n        qtyInput.addEventListener('blur', sanitizeQty);\n      }\n\n      if (btnMinus \u0026\u0026 qtyInput) {\n        btnMinus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          if (current \u003e 1) {\n            qtyInput.value = String(current - 1);\n            sanitizeQty();\n          }\n        });\n      }\n\n      if (btnPlus \u0026\u0026 qtyInput) {\n        btnPlus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          qtyInput.value = String(current + 1);\n          sanitizeQty();\n        });\n      }\n\n      sanitizeQty();\n\n      \/* --- BOTÓN WHATSAPP --- *\/\n      var whatsappBtn    = document.getElementById('custom-whatsapp-btn');\n      var whatsappNumber = '525536684089'; \/\/ tu número sin + ni espacios\n\n      \/\/ EDITA ESTAS DOS LÍNEAS EN CADA PRODUCTO:\n      var productTitle   = \"Vaso de papel 20oz para bebidas calientes\";\n      var productUrl     = \"https:\/\/acesainter.com\/products\/vaso-papel-bebidas-calientes-20oz-420w?utm_source=copyToPasteBoard\u0026utm_medium=product-links\u0026utm_content=web\";\n\n      if (whatsappBtn \u0026\u0026 qtyHidden) {\n        whatsappBtn.addEventListener('click', function() {\n          var qty = parseInt(qtyHidden.value || '1', 10);\n          if (isNaN(qty) || qty \u003c 1) qty = 1;\n\n          var message =\n            \"Hola, quiero cotizar este producto personalizado con mi marca.%0A%0A\" +\n            \"Producto: \" + encodeURIComponent(productTitle) + \"%0A\" +\n            \"Cantidad: \" + encodeURIComponent(qty + \" cajas\") + \"%0A\" +\n            \"URL del producto: \" + encodeURIComponent(productUrl) + \"%0A%0A\" +\n            \"Por favor, confírmenme tiempos de producción, precios y opciones de personalización.\";\n\n          var waUrl = \"https:\/\/wa.me\/\" + whatsappNumber + \"?text=\" + message;\n          window.open(waUrl, \"_blank\");\n        });\n      }\n    });\n  \u003c\/script\u003e\n\u003c\/section\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48138736926970,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/5.jpg?v=1768503721"},{"product_id":"tapa-viajera-negra-8oz-tl38rn","title":"Tapa viajera negra para vaso 8 oz bebidas calientes (caja 1000 pzas)","description":"\u003cp\u003eTapa viajera color \u003cstrong\u003enegro\u003c\/strong\u003e para vasos de \u003cstrong\u003e8 oz\u003c\/strong\u003e de bebidas calientes como café, té o chocolate. Diseñada para ofrecer un \u003cstrong\u003ecierre hermético\u003c\/strong\u003e, evitar derrames y soportar el calor. Fabricada en \u003cstrong\u003eplástico duradero y reciclable\u003c\/strong\u003e, ideal para \u003cstrong\u003ecafeterías, panaderías, food trucks, restaurantes y servicio para llevar\u003c\/strong\u003e.\u003cbr\u003eCaja con \u003cstrong\u003e1000 tapas\u003c\/strong\u003e, práctica para consumo al mayoreo.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003eTL38RN\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eCapacidad compatible: vasos 8 oz para bebidas calientes\u003c\/li\u003e\n\u003cli\u003eColor: negro\u003c\/li\u003e\n\u003cli\u003eMaterial: plástico\u003c\/li\u003e\n\u003cli\u003eProducto reciclable\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48147536445690,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/7.jpg?v=1768503791"},{"product_id":"tapa-viajera-blanca-8oz-tl38b","title":"Tapa viajera blanca para vaso 8 oz bebidas calientes (caja 1000 pzas)","description":"\u003cp\u003eTapa viajera color \u003cstrong\u003eblanco\u003c\/strong\u003e para vasos de \u003cstrong\u003e8 oz\u003c\/strong\u003e de bebidas calientes. Diseñada para \u003cstrong\u003eresistir el calor\u003c\/strong\u003e y ofrecer un \u003cstrong\u003ecierre hermético\u003c\/strong\u003e, evitando goteos y derrames durante el consumo o el traslado. Elaborada en \u003cstrong\u003eplástico duradero y reciclable\u003c\/strong\u003e, perfecta para \u003cstrong\u003ecafeterías, coffee shops, panaderías y oficinas\u003c\/strong\u003e.\u003cbr\u003ePresentación en \u003cstrong\u003ecaja con 1000 tapas\u003c\/strong\u003e para uso intensivo al mayoreo.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003eTL38B\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eCapacidad compatible: vasos 8 oz para bebidas calientes\u003c\/li\u003e\n\u003cli\u003eColor: blanco\u003c\/li\u003e\n\u003cli\u003eMaterial: plástico\u003c\/li\u003e\n\u003cli\u003eProducto reciclable\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48147539722490,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/8.jpg?v=1768503826"},{"product_id":"tapa-viajera-negra-10oz-tl31rn","title":"Tapa viajera negra para vaso 10 oz bebidas calientes (caja 1000 pzas)","description":"\u003cp\u003eTapa viajera \u003cstrong\u003enegra\u003c\/strong\u003e para vasos de \u003cstrong\u003e10 oz\u003c\/strong\u003e de bebidas calientes, ideal para café mediano, té y chocolate caliente para llevar. Diseñada para ofrecer \u003cstrong\u003ecierre hermético\u003c\/strong\u003e y \u003cstrong\u003esoportar el calor\u003c\/strong\u003e sin deformarse. Hecha de \u003cstrong\u003eplástico duradero y reciclable\u003c\/strong\u003e, recomendada para \u003cstrong\u003ecafeterías, panaderías, restaurantes y food trucks\u003c\/strong\u003e.\u003cbr\u003ePresentación en \u003cstrong\u003ecaja con 1000 tapas\u003c\/strong\u003e para operación diaria al mayoreo.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003eTL31RN\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eCapacidad compatible: vasos 10 oz para bebidas calientes\u003c\/li\u003e\n\u003cli\u003eColor: negro\u003c\/li\u003e\n\u003cli\u003eMaterial: plástico\u003c\/li\u003e\n\u003cli\u003eProducto reciclable\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48147543294202,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/7.jpg?v=1768503791"},{"product_id":"tapa-viajera-blanca-10oz-tlr31rb","title":"Tapa viajera blanca para vaso 10 oz bebidas calientes (caja 1000 pzas)","description":"\u003cp\u003eTapa viajera \u003cstrong\u003eblanca\u003c\/strong\u003e para vasos de \u003cstrong\u003e10 oz\u003c\/strong\u003e de bebidas calientes. Diseñada para \u003cstrong\u003eresistir el calor\u003c\/strong\u003e y proporcionar un \u003cstrong\u003ecierre hermético\u003c\/strong\u003e, ideal para café mediano, té y chocolate caliente para llevar. Fabricada en \u003cstrong\u003eplástico duradero y reciclable\u003c\/strong\u003e, pensada para \u003cstrong\u003ecafeterías, panaderías, restaurantes y oficinas\u003c\/strong\u003e.\u003cbr\u003eIncluye \u003cstrong\u003e1000 tapas por caja\u003c\/strong\u003e, óptimo para consumo al mayoreo.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003eTLR31RB\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eCapacidad compatible: vasos 10 oz para bebidas calientes\u003c\/li\u003e\n\u003cli\u003eColor: blanco\u003c\/li\u003e\n\u003cli\u003eMaterial: plástico\u003c\/li\u003e\n\u003cli\u003eProducto reciclable\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48147544244474,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/8.jpg?v=1768503826"},{"product_id":"tapa-viajera-negra-12-16-20oz-tlp316n","title":"Tapa viajera negra para vasos 12, 16 y 20 oz bebidas calientes (caja 1000 pzas)","description":"\u003cp\u003eTapa viajera \u003cstrong\u003enegra\u003c\/strong\u003e compatible con vasos de \u003cstrong\u003e12 oz, 16 oz y 20 oz\u003c\/strong\u003e para bebidas calientes. Diseñada para brindar \u003cstrong\u003ecierre hermético\u003c\/strong\u003e y \u003cstrong\u003eresistencia al calor\u003c\/strong\u003e, evitando derrames durante el traslado. Producida en \u003cstrong\u003eplástico duradero y reciclable\u003c\/strong\u003e, ideal para \u003cstrong\u003ecafeterías, cadenas de café, panaderías, restaurantes y servicio para llevar\u003c\/strong\u003e.\u003cbr\u003eSe presenta en \u003cstrong\u003ecaja con 1000 tapas\u003c\/strong\u003e, adecuada para consumo intensivo.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003eTLP316N\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eCapacidad compatible: vasos 12 oz \/ 16 oz \/ 20 oz\u003c\/li\u003e\n\u003cli\u003eColor: negro\u003c\/li\u003e\n\u003cli\u003eMaterial: plástico\u003c\/li\u003e\n\u003cli\u003eProducto reciclable\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48147545620730,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/9.jpg?v=1768503902"},{"product_id":"tapa-viajera-blanca-12-16-20oz-tlp316b","title":"Tapa viajera blanca para vasos 12, 16 y 20 oz bebidas calientes (caja 1000 pzas)","description":"\u003cp\u003eTapa viajera \u003cstrong\u003eblanca\u003c\/strong\u003e compatible con vasos de \u003cstrong\u003e12 oz, 16 oz y 20 oz\u003c\/strong\u003e de bebidas calientes. Ofrece \u003cstrong\u003ecierre hermético\u003c\/strong\u003e y \u003cstrong\u003eresistencia al calor\u003c\/strong\u003e, ideal para café grande, lattes y chocolate caliente para llevar. Fabricada en \u003cstrong\u003eplástico duradero y reciclable\u003c\/strong\u003e, recomendada para \u003cstrong\u003ecafeterías, panaderías y negocios de bebidas\u003c\/strong\u003e.\u003cbr\u003eLa presentación en \u003cstrong\u003ecaja con 1000 tapas\u003c\/strong\u003e facilita la compra al mayoreo.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003eTLP316B\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eCapacidad compatible: vasos 12 oz \/ 16 oz \/ 20 oz\u003c\/li\u003e\n\u003cli\u003eColor: blanco\u003c\/li\u003e\n\u003cli\u003eMaterial: plástico\u003c\/li\u003e\n\u003cli\u003eProducto reciclable\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48147546734842,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/10.jpg?v=1768503902"},{"product_id":"tapa-viajera-gris-12-16-20oz-lhrdsc-16g","title":"Tapa viajera gris para vasos 12, 16 y 20 oz bebidas calientes (caja 1000 pzas)","description":"\u003cp\u003eTapa viajera \u003cstrong\u003egris\u003c\/strong\u003e para vasos de \u003cstrong\u003e12 oz, 16 oz y 20 oz\u003c\/strong\u003e de bebidas calientes. Diseñada para ofrecer \u003cstrong\u003ecierre hermético\u003c\/strong\u003e y evitar derrames, con \u003cstrong\u003eplástico duradero\u003c\/strong\u003e que resiste el calor. Su color gris agrega un toque distintivo a la presentación de tus bebidas. Fabricada en \u003cstrong\u003eplástico reciclable\u003c\/strong\u003e, ideal para \u003cstrong\u003ecafeterías, panaderías, coffee shops y cadenas de café\u003c\/strong\u003e.\u003cbr\u003eIncluye \u003cstrong\u003e1000 tapas por caja\u003c\/strong\u003e.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003eLHRDSC-16G\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eCapacidad compatible: vasos 12 oz \/ 16 oz \/ 20 oz\u003c\/li\u003e\n\u003cli\u003eColor: gris\u003c\/li\u003e\n\u003cli\u003eMaterial: plástico\u003c\/li\u003e\n\u003cli\u003eProducto reciclable\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48147561545978,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/11.jpg?v=1768503902"},{"product_id":"tapa-viajera-rosa-12-16-20oz-lhrdsp-16","title":"Tapa viajera rosa para vasos 12, 16 y 20 oz bebidas calientes (caja 1200 pzas)","description":"\u003cp\u003eTapa viajera \u003cstrong\u003erosa\u003c\/strong\u003e compatible con vasos de \u003cstrong\u003e12 oz, 16 oz y 20 oz\u003c\/strong\u003e de bebidas calientes. Aporta un \u003cstrong\u003etoque de color y diferenciación\u003c\/strong\u003e a tus bebidas, manteniendo un \u003cstrong\u003ecierre hermético\u003c\/strong\u003e y buena \u003cstrong\u003eresistencia al calor\u003c\/strong\u003e. Elaborada en \u003cstrong\u003eplástico duradero y reciclable\u003c\/strong\u003e, perfecta para \u003cstrong\u003ecafeterías, conceptos temáticos, pastelerías y negocios que buscan destacar su marca\u003c\/strong\u003e.\u003cbr\u003eCaja con \u003cstrong\u003e1200 tapas\u003c\/strong\u003e, ideal para alto volumen.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003eLHRDSP-16\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eCapacidad compatible: vasos 12 oz \/ 16 oz \/ 20 oz\u003c\/li\u003e\n\u003cli\u003eColor: rosa\u003c\/li\u003e\n\u003cli\u003eMaterial: plástico\u003c\/li\u003e\n\u003cli\u003eProducto reciclable\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48147561709818,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/12.jpg?v=1768503902"},{"product_id":"tapa-viajera-roja-12-16-20oz-lhrdsc-16r","title":"Tapa viajera roja para vasos 12, 16 y 20 oz bebidas calientes (caja 1200 pzas)","description":"\u003cp\u003eTapa viajera \u003cstrong\u003eroja\u003c\/strong\u003e para vasos de \u003cstrong\u003e12 oz, 16 oz y 20 oz\u003c\/strong\u003e de bebidas calientes. Ofrece \u003cstrong\u003ecierre hermético\u003c\/strong\u003e y \u003cstrong\u003eplástico duradero\u003c\/strong\u003e para soportar el calor, agregando un \u003cstrong\u003ecolor llamativo\u003c\/strong\u003e a la presentación de tus bebidas. Fabricada en \u003cstrong\u003eplástico reciclable\u003c\/strong\u003e, ideal para \u003cstrong\u003ecafeterías, cadenas de café, food trucks y eventos especiales\u003c\/strong\u003e.\u003cbr\u003ePresentación en \u003cstrong\u003ecaja con 1200 tapas\u003c\/strong\u003e para consumo de alto volumen.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003eLHRDSC-16R\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eCapacidad compatible: vasos 12 oz \/ 16 oz \/ 20 oz\u003c\/li\u003e\n\u003cli\u003eColor: rojo\u003c\/li\u003e\n\u003cli\u003eMaterial: plástico\u003c\/li\u003e\n\u003cli\u003eProducto reciclable\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48147562037498,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/13.jpg?v=1768503902"},{"product_id":"tapa-viajera-cafe-12-16-20oz-lhrdsn-16c","title":"Tapa viajera color café para vasos 12, 16 y 20 oz bebidas calientes (caja 1200 pzas)","description":"\u003cp\u003eTapa viajera \u003cstrong\u003ecolor café\u003c\/strong\u003e compatible con vasos de \u003cstrong\u003e12 oz, 16 oz y 20 oz\u003c\/strong\u003e para bebidas calientes. Diseñada para ofrecer \u003cstrong\u003ecierre hermético\u003c\/strong\u003e, evitar derrames y resistir el calor, además de complementar estéticamente los vasos de café. Fabricada en \u003cstrong\u003eplástico duradero y reciclable\u003c\/strong\u003e, ideal para \u003cstrong\u003ecafeterías, panaderías y negocios de café de especialidad\u003c\/strong\u003e.\u003cbr\u003eIncluye \u003cstrong\u003e1200 tapas por caja\u003c\/strong\u003e, pensada para consumo al mayoreo.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003eLHRDSN-16C\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eCapacidad compatible: vasos 12 oz \/ 16 oz \/ 20 oz\u003c\/li\u003e\n\u003cli\u003eColor: café\u003c\/li\u003e\n\u003cli\u003eMaterial: plástico\u003c\/li\u003e\n\u003cli\u003eProducto reciclable\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48147562692858,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/14.jpg?v=1768503902"},{"product_id":"fajilla-microcorrugada-faj-1","title":"Fajilla microcorrugada FAJ-1 para vaso de papel café caliente color kraft","description":"\u003cp\u003eLa \u003cstrong\u003efajilla microcorrugada FAJ-1\u003c\/strong\u003e es el complemento ideal para \u003cstrong\u003evasos de papel para café y bebidas calientes\u003c\/strong\u003e. Proporciona \u003cstrong\u003eprotección térmica\u003c\/strong\u003e, mejorando el agarre y evitando que el calor moleste a tus clientes al sostener el vaso.\u003c\/p\u003e\n\u003cp\u003eAdemás de su función de \u003cstrong\u003eaislamiento térmico\u003c\/strong\u003e, aporta una \u003cstrong\u003epresentación premium\u003c\/strong\u003e a tus bebidas y es una excelente opción para \u003cstrong\u003epersonalizar con tu marca\u003c\/strong\u003e mediante impresión o sello. Fabricada en \u003cstrong\u003ecartón microcorrugado resistente\u003c\/strong\u003e, en color \u003cstrong\u003ekraft natural\u003c\/strong\u003e, combina estética y funcionalidad en cafeterías y negocios de bebidas calientes.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLAVE: \u003cstrong\u003eFAJ-1\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003cli\u003eUso: aislamiento térmico para vasos de papel con bebidas calientes\u003c\/li\u003e\n\u003cli\u003eBeneficios: protección térmica, mejor agarre, presentación premium\u003c\/li\u003e\n\u003cli\u003ePersonalización: opción de personalizar con tu marca\u003c\/li\u003e\n\u003cli\u003eColor: kraft natural\u003c\/li\u003e\n\u003cli\u003eMaterial: cartón microcorrugado resistente\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003csection class=\"customize-order-section\"\u003e\n  \u003cdiv class=\"customize-order-inner\"\u003e\n    \u003ch2 class=\"customize-order-title\"\u003ePersonaliza tu pedido\u003c\/h2\u003e\n\n    \u003cdiv class=\"customize-order-grid\"\u003e\n      \u003c!-- Columna 1: Subir logo --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003clabel for=\"logo-upload-input\" class=\"customize-upload-box\" id=\"upload-box-label\"\u003e\n          \u003cdiv class=\"upload-plus-wrapper\" id=\"upload-plus-wrapper\"\u003e\n            \u003cspan class=\"upload-icon\"\u003e+\u003c\/span\u003e\n          \u003c\/div\u003e\n\n          \u003cdiv class=\"upload-preview-wrapper\"\u003e\n            \u003cimg id=\"upload-preview-img\" src=\"\" alt=\"Vista previa de tu logo\" class=\"upload-preview-img\" style=\"display:none;\"\u003e\n          \u003c\/div\u003e\n        \u003c\/label\u003e\n\n        \u003cinput id=\"logo-upload-input\" type=\"file\" accept=\"image\/png,image\/jpeg,image\/jpg\" class=\"upload-input\"\u003e\n\n        \u003cbutton type=\"button\" id=\"clear-logo-btn\" class=\"clear-logo-btn\" style=\"display:none;\"\u003e\n          Borrar imagen\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 2: Mockup --\u003e\n      \u003cdiv class=\"customize-step\"\u003e\n        \u003cdiv class=\"mockup-preview\"\u003e\n          \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/FAJILLAS.png?v=1768528015\" alt=\"Vaso personalizado\" class=\"mockup-base\" width=\"800\" height=\"800\"\u003e\n\n          \u003cdiv class=\"mockup-logo-wrap\" id=\"mockup-logo-wrap\"\u003e\n            \u003cimg id=\"mockup-logo-img\" src=\"\" alt=\"Tu logotipo\" class=\"mockup-logo\" style=\"display:none;\" width=\"600\" height=\"600\"\u003e\n          \u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Columna 3: Cantidad + botón WhatsApp --\u003e\n      \u003cdiv class=\"customize-step customize-step--quantity\"\u003e\n        \u003ch3 class=\"step-title step-title-top\"\u003eCantidad de cajas para cotizar\u003c\/h3\u003e\n\n        \u003cdiv class=\"qty-block qty-block-top\"\u003e\n          \u003cdiv class=\"qty-control\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-minus\"\u003e−\u003c\/button\u003e\n            \u003cinput type=\"text\" id=\"quote-quantity\" class=\"qty-input\" value=\"1\" inputmode=\"numeric\" pattern=\"[0-9]*\"\u003e\n            \u003cbutton type=\"button\" class=\"qty-btn\" id=\"qty-plus\"\u003e+\u003c\/button\u003e\n          \u003c\/div\u003e\n          \u003cp class=\"qty-min-text\"\u003eTe cotizamos desde una caja\u003c\/p\u003e\n        \u003c\/div\u003e\n\n        \u003c!-- Botón WhatsApp verde con icono (imagen) --\u003e\n        \u003cbutton type=\"button\" id=\"custom-whatsapp-btn\" class=\"whatsapp-quote-btn\"\u003e\n          \u003cspan class=\"wa-icon-circle\"\u003e\n            \u003cimg src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/6\/6b\/WhatsApp.svg\" alt=\"WhatsApp\" class=\"wa-icon-img\"\u003e\n          \u003c\/span\u003e\n          \u003cspan\u003eCotizar Producto\u003c\/span\u003e\n        \u003c\/button\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Fila inferior de pasos --\u003e\n    \u003cdiv class=\"customize-steps-row\"\u003e\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e1\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eAgrega tu logo\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Solo se admiten imágenes en formato .png con fondo transparente. Tamaño máximo: 20 KB.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e2\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eVisualiza cómo se ve\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Esta es una representación digital del producto final. El resultado puede variar ligeramente en color, tamaño o proporciones.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"customize-step-text\"\u003e\n        \u003cdiv class=\"step-circle\"\u003e3\u003c\/div\u003e\n        \u003ch3 class=\"step-title\"\u003eHaz tu pedido\u003c\/h3\u003e\n        \u003cp class=\"step-desc\"\u003e\n          Puedes pedir desde una caja para imprimir tu logo en tu artículo, así de fácil.\n        \u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Campos ocultos --\u003e\n    \u003cinput type=\"hidden\" id=\"logo-data-input\" name=\"properties[Logo personalizado]\" value=\"\"\u003e\n    \u003cinput type=\"hidden\" id=\"quote-quantity-input\" name=\"properties[Cantidad para cotización]\" value=\"1\"\u003e\n  \u003c\/div\u003e\n\n  \u003cstyle\u003e\n    .customize-order-section {\n      padding: 2.5rem 1.25rem;\n      background-color: #ffffff;\n    }\n    .customize-order-inner {\n      max-width: 1100px;\n      margin: 0 auto;\n    }\n    .customize-order-title {\n      font-size: 1.75rem;\n      font-weight: 700;\n      margin-bottom: 1.75rem;\n      text-align: left;\n      color: #2044A3;\n    }\n\n    .customize-order-grid {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 3rem;\n      align-items: flex-start;\n      margin-bottom: 3rem;\n      justify-content: center;\n    }\n    .customize-step {\n      width: 100%;\n      max-width: 300px;\n      margin: 0 auto;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .customize-upload-box {\n      border: 2px dashed #D4D4D8;\n      border-radius: 1.5rem;\n      padding: 1.5rem;\n      min-height: 220px;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      position: relative;\n      cursor: pointer;\n      box-sizing: border-box;\n    }\n\n    .upload-plus-wrapper {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      pointer-events: none;\n    }\n\n    .upload-icon {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 60px;\n      height: 60px;\n      border-radius: 9999px;\n      border: 2px solid #2044A3;\n      font-size: 1.85rem;\n      font-weight: 600;\n      color: #2044A3;\n      background: #ffffff;\n    }\n\n    .upload-input {\n      display: none;\n    }\n\n    .upload-preview-wrapper {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      min-height: 150px;\n    }\n    .upload-preview-img {\n      max-width: 100%;\n      max-height: 160px;\n      object-fit: contain;\n      display: block;\n    }\n\n    .clear-logo-btn {\n      margin-top: 0.75rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.6rem 1.6rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #FFC800;\n      color: #111111;\n      font-size: 0.9rem;\n      cursor: pointer;\n      white-space: nowrap;\n    }\n    .clear-logo-btn:hover {\n      background-color: #e0ae00;\n    }\n\n    .mockup-preview {\n      position: relative;\n      border-radius: 1.5rem;\n      background-color: #F5F5F7;\n      padding: 1.5rem;\n      min-height: 220px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n    }\n    .mockup-base {\n      max-width: 120%;\n      height: auto;\n      display: block;\n    }\n    .mockup-logo-wrap {\n      position: absolute;\n      top: 55%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      width: 30%;\n      pointer-events: auto;\n      cursor: move;\n      border: 2px solid transparent;\n      border-radius: 4px;\n      box-sizing: border-box;\n    }\n    .mockup-logo-wrap.is-dragging {\n      border-color: #2044A3;\n    }\n    .mockup-logo {\n      width: 100%;\n      height: auto;\n      object-fit: contain;\n      display: block;\n      filter: drop-shadow(0 1px 2px rgba(0,0,0,0.18));\n    }\n\n    .customize-step--quantity {\n      text-align: center;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .step-title-top {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 1.5rem;\n    }\n\n    .qty-min-text {\n      font-size: 0.85rem;\n      color: #6B7280;\n      margin-top: 0.25rem;\n    }\n\n    \/* === FORZAR ALINEACIÓN PERFECTA DE LA PÍLDORA DE CANTIDAD === *\/\n    .customize-order-section .qty-control {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      border-radius: 9999px !important;\n      border: 1px solid #D4D4D8 !important;\n      overflow: hidden !important;\n      background-color: #ffffff !important;\n      padding: 0 !important;\n      line-height: 0 !important;\n    }\n\n    .customize-order-section .qty-btn {\n      display: inline-flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      width: 60px !important;\n      height: 46px !important;\n      background-color: #FFC800 !important;\n      border: none !important;\n      cursor: pointer !important;\n      color: #111111 !important;\n      font-size: 1.6rem !important;\n      line-height: 1 !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-shadow: none !important;\n    }\n\n    .customize-order-section .qty-input {\n      width: 80px !important;\n      height: 46px !important;\n      border: none !important;\n      outline: none !important;\n      text-align: center !important;\n      font-size: 1rem !important;\n      color: #111111 !important;\n      background-color: #ffffff !important;\n      display: flex !important;\n      align-items: center !important;\n      justify-content: center !important;\n      padding: 0 !important;\n      margin: 0 !important;\n      box-sizing: border-box !important;\n      line-height: 1 !important;\n    }\n\n    .customize-order-section .qty-btn span,\n    .customize-order-section .qty-btn,\n    .customize-order-section .qty-control * {\n      line-height: 1 !important;\n    }\n\n    \/* BOTÓN WHATSAPP VERDE *\/\n    .customize-order-section .whatsapp-quote-btn {\n      margin-top: 1.25rem;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      align-self: center;\n      padding: 0.9rem 2.5rem;\n      border-radius: 9999px;\n      border: none;\n      background-color: #25D366 !important; \/* Verde WhatsApp *\/\n      color: #ffffff !important;\n      font-size: 1rem;\n      font-weight: 600;\n      cursor: pointer;\n      white-space: nowrap;\n      box-shadow: 0 8px 20px rgba(0,0,0,0.12);\n      gap: 0.5rem; \/* separa icono y texto *\/\n    }\n    .customize-order-section .whatsapp-quote-btn:hover {\n      background-color: #1eb259 !important;\n    }\n\n    \/* Círculo blanco para el ícono *\/\n    .customize-order-section .wa-icon-circle {\n      width: 22px;\n      height: 22px;\n      border-radius: 9999px;\n      background-color: #ffffff;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      overflow: hidden;\n      flex-shrink: 0;\n    }\n\n    \/* Imagen del ícono de WhatsApp *\/\n    .customize-order-section .wa-icon-img {\n      width: 16px;\n      height: 16px;\n      display: block;\n    }\n\n    .customize-order-section .wa-icon-phone,\n    .customize-order-section .wa-icon-phone::after {\n      display: none !important;\n    }\n\n    .customize-steps-row {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 2rem;\n      margin-top: 1rem;\n      max-width: 1100px;\n      margin-left: auto;\n      margin-right: auto;\n    }\n    .customize-step-text {\n      text-align:center;\n      display:flex;\n      flex-direction:column;\n      align-items:center;\n    }\n    .step-circle {\n      width: 40px;\n      height: 40px;\n      border-radius: 9999px;\n      border: 2px solid #D4D4D8;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      margin: 0 auto 0.75rem auto;\n      font-weight: 600;\n      color: #111827;\n    }\n    .step-title {\n      font-size: 1rem;\n      font-weight: 700;\n      margin-bottom: 0.5rem;\n    }\n    .step-desc {\n      font-size: 0.875rem;\n      color: #6B7280;\n      line-height: 1.4;\n    }\n\n    @media (max-width: 900px) {\n      .customize-order-grid {\n        grid-template-columns: 1fr;\n      }\n      .customize-steps-row {\n        grid-template-columns: 1fr;\n      }\n      .customize-order-title {\n        text-align: center;\n      }\n      .customize-step--quantity {\n        text-align: center;\n        align-items: center;\n      }\n      .customize-order-section .whatsapp-quote-btn {\n        align-self: center;\n      }\n    }\n  \u003c\/style\u003e\n\n  \u003cscript\u003e\n    document.addEventListener('DOMContentLoaded', function() {\n      var fileInput       = document.getElementById('logo-upload-input');\n      var logoImg         = document.getElementById('mockup-logo-img');\n      var uploadPreview   = document.getElementById('upload-preview-img');\n      var clearBtn        = document.getElementById('clear-logo-btn');\n      var logoDataInput   = document.getElementById('logo-data-input');\n      var plusWrapper     = document.getElementById('upload-plus-wrapper');\n\n      var qtyInput  = document.getElementById('quote-quantity');\n      var qtyHidden = document.getElementById('quote-quantity-input');\n      var btnMinus  = document.getElementById('qty-minus');\n      var btnPlus   = document.getElementById('qty-plus');\n\n      var mockupPreview   = document.querySelector('.mockup-preview');\n      var mockupLogoWrap  = document.getElementById('mockup-logo-wrap');\n\n      if (fileInput \u0026\u0026 logoImg \u0026\u0026 logoDataInput) {\n        fileInput.addEventListener('change', function(event) {\n          var file = event.target.files[0];\n          if (!file) return;\n\n          var maxSizeMB = 2;\n          if (file.size \u003e maxSizeMB * 1024 * 1024) {\n            alert('La imagen es demasiado grande. Tamaño máximo: ' + maxSizeMB + ' MB');\n            fileInput.value = '';\n            return;\n          }\n\n          var reader = new FileReader();\n          reader.onload = function(e) {\n            var dataUrl = e.target.result;\n\n            logoImg.src = dataUrl;\n            logoImg.style.display = 'block';\n\n            if (uploadPreview) {\n              uploadPreview.src = dataUrl;\n              uploadPreview.style.display = 'block';\n            }\n\n            if (plusWrapper) plusWrapper.style.display = 'none';\n\n            logoDataInput.value = dataUrl;\n            clearBtn.style.display = 'inline-flex';\n\n            resetLogoPosition();\n          };\n          reader.readAsDataURL(file);\n        });\n\n        clearBtn.addEventListener('click', function() {\n          fileInput.value = '';\n\n          logoImg.src = '';\n          logoImg.style.display = 'none';\n\n          if (uploadPreview) {\n            uploadPreview.src = '';\n            uploadPreview.style.display = 'none';\n          }\n\n          if (plusWrapper) plusWrapper.style.display = 'flex';\n\n          logoDataInput.value = '';\n          clearBtn.style.display = 'none';\n\n          resetLogoPosition();\n        });\n      }\n\n      function resetLogoPosition() {\n        if (!mockupLogoWrap) return;\n        mockupLogoWrap.style.top = '55%';\n        mockupLogoWrap.style.left = '50%';\n        mockupLogoWrap.style.transform = 'translate(-50%, -50%)';\n        mockupLogoWrap.classList.remove('is-dragging');\n      }\n\n      if (mockupPreview \u0026\u0026 mockupLogoWrap) {\n        var isDragging = false;\n        var startX = 0;\n        var startY = 0;\n        var startLeft = 0;\n        var startTop = 0;\n\n        function getBounds() {\n          return mockupPreview.getBoundingClientRect();\n        }\n\n        function onPointerDown(e) {\n          if (!logoImg || logoImg.style.display === 'none') return;\n\n          isDragging = true;\n          mockupLogoWrap.classList.add('is-dragging');\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          startX = clientX;\n          startY = clientY;\n\n          var wrapRect = mockupLogoWrap.getBoundingClientRect();\n          startLeft = wrapRect.left - rect.left;\n          startTop  = wrapRect.top  - rect.top;\n\n          mockupLogoWrap.style.transform = 'none';\n\n          document.addEventListener('mousemove', onPointerMove);\n          document.addEventListener('mouseup', onPointerUp);\n          document.addEventListener('touchmove', onPointerMove, { passive: false });\n          document.addEventListener('touchend', onPointerUp);\n        }\n\n        function onPointerMove(e) {\n          if (!isDragging) return;\n          e.preventDefault();\n\n          var rect = getBounds();\n          var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n          var clientY = e.touches ? e.touches[0].clientY : e.clientY;\n\n          var deltaX = clientX - startX;\n          var deltaY = clientY - startY;\n\n          var newLeft = startLeft + deltaX;\n          var newTop  = startTop + deltaY;\n\n          var wrapRect  = mockupLogoWrap.getBoundingClientRect();\n          var wrapWidth = wrapRect.width;\n          var wrapHeight = wrapRect.height;\n\n          var minLeft = 0;\n          var minTop  = 0;\n          var maxLeft = rect.width  - wrapWidth;\n          var maxTop  = rect.height - wrapHeight;\n\n          if (newLeft \u003c minLeft) newLeft = minLeft;\n          if (newTop  \u003c minTop)  newTop  = minTop;\n          if (newLeft \u003e maxLeft) newLeft = maxLeft;\n          if (newTop  \u003e maxTop)  newTop  = maxTop;\n\n          mockupLogoWrap.style.left = newLeft + 'px';\n          mockupLogoWrap.style.top  = newTop  + 'px';\n        }\n\n        function onPointerUp() {\n          if (!isDragging) return;\n          isDragging = false;\n          mockupLogoWrap.classList.remove('is-dragging');\n\n          document.removeEventListener('mousemove', onPointerMove);\n          document.removeEventListener('mouseup', onPointerUp);\n          document.removeEventListener('touchmove', onPointerMove);\n          document.removeEventListener('touchend', onPointerUp);\n        }\n\n        mockupLogoWrap.addEventListener('mousedown', onPointerDown);\n        mockupLogoWrap.addEventListener('touchstart', onPointerDown, { passive: true });\n      }\n\n      function sanitizeQty() {\n        if (!qtyInput || !qtyHidden) return;\n\n        var value = qtyInput.value.replace(\/[^0-9]\/g, '');\n        if (!value || Number(value) \u003c 1) {\n          value = '1';\n        }\n        qtyInput.value = value;\n        qtyHidden.value = value;\n      }\n\n      if (qtyInput \u0026\u0026 qtyHidden) {\n        qtyInput.addEventListener('change', sanitizeQty);\n        qtyInput.addEventListener('blur', sanitizeQty);\n      }\n\n      if (btnMinus \u0026\u0026 qtyInput) {\n        btnMinus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          if (current \u003e 1) {\n            qtyInput.value = String(current - 1);\n            sanitizeQty();\n          }\n        });\n      }\n\n      if (btnPlus \u0026\u0026 qtyInput) {\n        btnPlus.addEventListener('click', function() {\n          var current = Number(qtyInput.value || 1);\n          qtyInput.value = String(current + 1);\n          sanitizeQty();\n        });\n      }\n\n      sanitizeQty();\n\n      \/* --- BOTÓN WHATSAPP --- *\/\n      var whatsappBtn    = document.getElementById('custom-whatsapp-btn');\n      var whatsappNumber = '525536684089'; \/\/ tu número sin + ni espacios\n\n      \/\/ EDITA ESTAS DOS LÍNEAS EN CADA PRODUCTO:\n      var productTitle   = \"Fajilla microcorrugada FAJ-1\";\n      var productUrl     = \"https:\/\/acesainter.com\/products\/fajilla-microcorrugada-faj-1?utm_source=copyToPasteBoard\u0026utm_medium=product-links\u0026utm_content=web\";\n\n      if (whatsappBtn \u0026\u0026 qtyHidden) {\n        whatsappBtn.addEventListener('click', function() {\n          var qty = parseInt(qtyHidden.value || '1', 10);\n          if (isNaN(qty) || qty \u003c 1) qty = 1;\n\n          var message =\n            \"Hola, quiero cotizar este producto personalizado con mi marca.%0A%0A\" +\n            \"Producto: \" + encodeURIComponent(productTitle) + \"%0A\" +\n            \"Cantidad: \" + encodeURIComponent(qty + \" cajas\") + \"%0A\" +\n            \"URL del producto: \" + encodeURIComponent(productUrl) + \"%0A%0A\" +\n            \"Por favor, confírmenme tiempos de producción, precios y opciones de personalización.\";\n\n          var waUrl = \"https:\/\/wa.me\/\" + whatsappNumber + \"?text=\" + message;\n          window.open(waUrl, \"_blank\");\n        });\n      }\n    });\n  \u003c\/script\u003e\n\u003c\/section\u003e\n","brand":"ACESA INTERABASTO S. A. de C.V.","offers":[{"title":"Default Title","offer_id":48147605225722,"sku":null,"price":10.0,"currency_code":"MXN","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/files\/34.jpg?v=1768505242"}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0794\/9883\/8266\/collections\/Coleccion_Bebida_Caliente_Accesa_interabasto.jpg?v=1766167267","url":"https:\/\/acesainter.com\/collections\/para-bebidas-calientes.oembed?page=3","provider":"ACESA INTERABASTO S. A. de C.V.","version":"1.0","type":"link"}