{
  "version": 3,
  "sources": ["/cdn/shop/t/1/assets/kallpa-web.js?x=1"],
  "sourcesContent": ["/* KALLPA \u00B7 Pulso \u2014 c\u00E1mara entre cap\u00EDtulos, paneles, carrito, fondo e interacciones. */\r\n(function () {\r\n  'use strict';\r\n\r\n  var K = window.KALLPA;\r\n  var registrar = window.KALLPA_medir || function () {}; // medici\u00F3n (js/medicion.js)\r\n  // Si lleg\u00F3 por el enlace de un anuncio, se guarda el c\u00F3digo de la campa\u00F1a para toda la visita (ver marcarVisita)\r\n  try {\r\n    var utm = (new URLSearchParams(location.search).get('utm_campaign') || '').trim().toLowerCase();\r\n    if (/^[a-z0-9][a-z0-9_-]{1,59}$/.test(utm)) sessionStorage.setItem('kallpa.utm', utm);\r\n  } catch (err) { /* sin almacenamiento: la venta igual se registra, sin campa\u00F1a */ }\r\n  var raiz = document.documentElement;\r\n  var viaje = document.getElementById('viaje');\r\n  var caps = Array.prototype.slice.call(document.querySelectorAll('.cap'));\r\n  var nav = document.querySelector('.pulso');\r\n  var nodos = Array.prototype.slice.call(document.querySelectorAll('.pulso__nodos button'));\r\n  var anuncio = document.getElementById('anuncio');\r\n  var sinMovimiento = window.matchMedia('(prefers-reduced-motion: reduce)');\r\n  var punteroFino = window.matchMedia('(hover: hover) and (pointer: fine)').matches;\r\n\r\n  var $ = function (sel, base) { return (base || document).querySelector(sel); };\r\n  var $$ = function (sel, base) { return Array.prototype.slice.call((base || document).querySelectorAll(sel)); };\r\n  var pesos = function (n) { return '$' + Math.round(n).toLocaleString('es-CO'); };\r\n  var hayDialogo = function () { return !!document.querySelector('dialog[open], [data-clubvista]:not([hidden])'); };\r\n  var azar = function (a, b) { return a + Math.random() * (b - a); };\r\n\r\n  /* ---------- Datos de config en el HTML ---------- */\r\n\r\n  function pintarPrecio() {\r\n    $$('[data-precio]').forEach(function (el) { el.textContent = pesos(K.producto.precio); });\r\n    // Precio tachado: solo si Shopify tiene un \"precio de comparaci\u00F3n\" mayor para la opci\u00F3n elegida\r\n    var opcion = (K.variantes || []).filter(function (v) { return String(v.id) === String(K.producto.variante); })[0];\r\n    var antes = $('[data-antes]');\r\n    antes.hidden = !(opcion && opcion.antes > K.producto.precio);\r\n    if (!antes.hidden) antes.textContent = pesos(opcion.antes);\r\n  }\r\n  // Condiciones de la oferta y tarifas de env\u00EDo: texto que los socios escriben en el panel\r\n  (function () {\r\n    var cond = $('[data-condiciones]');\r\n    if (K.condiciones) { cond.textContent = K.condiciones; cond.hidden = false; }\r\n    var lista = $('[data-envios]');\r\n    // Las tarifas vienen una por departamento: se agrupan las que cuestan lo mismo para que se lean de un vistazo\r\n    var grupos = {}, orden = [];\r\n    (K.envios || []).forEach(function (e) {\r\n      if (!e || typeof e.precio !== 'number') return;\r\n      var llave = (e.condicion || '') + '|' + e.precio;\r\n      if (!grupos[llave]) { grupos[llave] = { condicion: e.condicion || '', precio: e.precio, zonas: [] }; orden.push(llave); }\r\n      if (e.zona && grupos[llave].zonas.indexOf(e.zona) < 0) grupos[llave].zonas.push(e.zona);\r\n    });\r\n    orden.sort(function (x, y) { return (grupos[x].condicion ? 1 : 0) - (grupos[y].condicion ? 1 : 0) || grupos[x].precio - grupos[y].precio; });\r\n    orden.forEach(function (llave) {\r\n      var gr = grupos[llave], li = document.createElement('li'), b = document.createElement('b'), donde = document.createElement('span');\r\n      donde.textContent = gr.condicion\r\n        ? gr.condicion.charAt(0).toUpperCase() + gr.condicion.slice(1) + (gr.zonas.length > 6 ? '' : ' (' + gr.zonas.join(', ') + ')')\r\n        : gr.zonas.length > 6 ? 'Otros ' + gr.zonas.length + ' departamentos' : gr.zonas.join(', ');\r\n      b.textContent = gr.precio === 0 ? 'Gratis' : pesos(gr.precio);\r\n      li.appendChild(donde); li.appendChild(b);\r\n      lista.appendChild(li);\r\n    });\r\n    lista.hidden = !lista.children.length;\r\n  })();\r\n  pintarPrecio();\r\n\r\n  $$('[data-enlace]').forEach(function (a) {\r\n    var url = K.enlaces[a.getAttribute('data-enlace')];\r\n    if (url) a.href = url;\r\n  });\r\n\r\n  var cajaOpiniones = $('[data-opiniones]');\r\n  if (cajaOpiniones) {\r\n    K.opiniones.forEach(function (o) {\r\n      var art = document.createElement('article');\r\n      art.className = 'opinion';\r\n      var p = document.createElement('p');\r\n      p.textContent = '\u00AB' + o.texto + '\u00BB';\r\n      var pie = document.createElement('footer');\r\n      var b = document.createElement('b');\r\n      b.textContent = o.nombre;\r\n      var s = document.createElement('span');\r\n      s.textContent = o.tema + ' \u00B7 Compra presencial, ' + o.fecha;\r\n      pie.appendChild(b); pie.appendChild(s);\r\n      art.appendChild(p); art.appendChild(pie);\r\n      cajaOpiniones.appendChild(art);\r\n    });\r\n  }\r\n\r\n  // Titulares: se parten en palabras para que cada una suba desde su rengl\u00F3n.\r\n  // El texto sigue siendo el mismo para lectores de pantalla.\r\n  function partir(nodo, cuenta) {\r\n    Array.prototype.slice.call(nodo.childNodes).forEach(function (hijo) {\r\n      if (hijo.nodeType === 3) {\r\n        var trozos = hijo.textContent.split(/(\\s+)/);\r\n        var frag = document.createDocumentFragment();\r\n        trozos.forEach(function (t) {\r\n          if (!t) return;\r\n          if (/^\\s+$/.test(t)) { frag.appendChild(document.createTextNode(' ')); return; }\r\n          var caja = document.createElement('span'); caja.className = 'pal';\r\n          var dentro = document.createElement('span'); dentro.textContent = t;\r\n          dentro.style.setProperty('--p', cuenta.n++);\r\n          caja.appendChild(dentro); frag.appendChild(caja);\r\n        });\r\n        nodo.replaceChild(frag, hijo);\r\n      } else if (hijo.nodeType === 1) {\r\n        partir(hijo, cuenta);\r\n      }\r\n    });\r\n  }\r\n  $$('.cap h1, .cap h2').forEach(function (t) { partir(t, { n: 0 }); });\r\n\r\n  /* ---------- C\u00E1mara ---------- */\r\n\r\n  var actual = 0;\r\n  var bloqueado = false;\r\n  var modoPulso = false;\r\n  var impulso = 0; // empuje del fondo al cambiar de cap\u00EDtulo\r\n\r\n  // En pantallas muy bajitas (celular acostado) el contenido no cabe en una\r\n  // sola pantalla: ah\u00ED la p\u00E1gina se queda como scroll normal.\r\n  function cabePulso() { return window.innerHeight >= 520; }\r\n\r\n  function activarModo() {\r\n    var debe = cabePulso();\r\n    if (debe === modoPulso) return;\r\n    modoPulso = debe;\r\n    raiz.classList.toggle('es-pulso', debe);\r\n    if (debe) {\r\n      window.scrollTo(0, 0);\r\n      pintar(false);\r\n    } else {\r\n      raiz.removeAttribute('data-cap');\r\n      caps.forEach(function (c) { c.inert = false; c.classList.remove('es-actual', 'es-pasado'); });\r\n    }\r\n  }\r\n\r\n  // En celular el tarro ocupa el espacio que queda entre la cabecera y el\r\n  // primer texto del cap\u00EDtulo, sea cual sea el alto de la pantalla, para que\r\n  // nunca se monte sobre el texto ni sobre la cabecera.\r\n  var tarroCaja = document.querySelector('.tarro');\r\n  // El bot\u00F3n \"Activar 3D\" ya no existe (en su lugar va \"Ver en 360\u00B0\"): la inclinaci\u00F3n con el tel\u00E9fono se enciende\r\n  // sola donde no pide permiso, o donde la persona ya lo hab\u00EDa dado. Este bot\u00F3n suelto mantiene esa l\u00F3gica sin mostrarse.\r\n  var botonGiro = document.querySelector('[data-giro]') || document.createElement('button');\r\n  var boton360 = document.querySelector('.giro');\r\n  var cabecera = document.querySelector('.hud');\r\n  function ajustarTarro() {\r\n    viaje.style.removeProperty('--ty'); viaje.style.removeProperty('--ts');\r\n    if (!modoPulso || window.innerWidth >= 900 || actual === 1 || actual === 3 || actual === 4) return; // Beneficios, Preparaci\u00F3n y Origen: sin tarro\r\n    var hijos = caps[actual].querySelector('.cap__cuerpo').children, primero = null;\r\n    for (var n = 0; n < hijos.length; n++) { if (hijos[n].offsetParent !== null) { primero = hijos[n]; break; } }\r\n    var base = tarroCaja.offsetHeight;\r\n    if (!primero || !base) return;\r\n    var filaBotones = !!boton360 && getComputedStyle(boton360).display !== 'none'; // \"Ver en 360\u00B0\" ocupa una fila sobre el tarro\r\n    var techo = cabecera.offsetHeight + (filaBotones ? 52 : 0), piso = primero.offsetTop;\r\n    var libre = piso - techo;\r\n    if (libre < 60) return;\r\n    // el margen cubre el vaiv\u00E9n de la flotaci\u00F3n y la inclinaci\u00F3n del tarro\r\n    var altoMax = Math.min((libre - 18) * 0.93, window.innerWidth * 0.86 / 0.809);\r\n    var escala = Math.max(0.35, Math.min(1.25, altoMax / base));\r\n    viaje.style.setProperty('--ty', (techo + (libre - 4) / 2) + 'px');\r\n    viaje.style.setProperty('--ts', escala.toFixed(3));\r\n  }\r\n\r\n  function pintar(anunciar) {\r\n    viaje.setAttribute('data-cap', actual);\r\n    raiz.setAttribute('data-cap', actual);\r\n    nav.style.setProperty('--cap', actual);\r\n    caps.forEach(function (c, i) {\r\n      c.classList.toggle('es-actual', i === actual);\r\n      c.classList.toggle('es-pasado', i < actual);\r\n      c.inert = i !== actual;\r\n    });\r\n    nodos.forEach(function (b, i) {\r\n      if (i === actual) b.setAttribute('aria-current', 'step'); else b.removeAttribute('aria-current');\r\n    });\r\n    alEntrar(actual);\r\n    ajustarTarro();\r\n    pintarSigue();\r\n    registrar('capitulo', { capitulo: caps[actual].id });\r\n    if (anunciar) {\r\n      anuncio.textContent = 'Cap\u00EDtulo ' + (actual + 1) + ' de ' + caps.length + ': ' + caps[actual].getAttribute('data-nombre');\r\n      nav.classList.remove('es-latiendo');\r\n      void nav.offsetWidth;\r\n      nav.classList.add('es-latiendo');\r\n    }\r\n  }\r\n\r\n  // La direcci\u00F3n se mantiene limpia: solo kallpanutrition.com, sin #cap\u00EDtulo ni el ?pb=0 que agrega Shopify\r\n  // al cerrar su barra de vista previa. El cap\u00EDtulo se recuerda aparte, para que recargar no devuelva al inicio.\r\n  var LLAVE_CAP = 'kallpa.cap:' + location.pathname;\r\n  function limpiarDireccion() {\r\n    try {\r\n      var p = new URLSearchParams(location.search);\r\n      p.delete('pb');\r\n      var qs = p.toString();\r\n      var limpia = location.pathname + (qs ? '?' + qs : '');\r\n      if (limpia !== location.pathname + location.search + location.hash) history.replaceState(null, '', limpia);\r\n    } catch (err) { /* navegador sin historial editable */ }\r\n  }\r\n  function recordarCapitulo() {\r\n    try { sessionStorage.setItem(LLAVE_CAP, String(actual)); } catch (err) { /* sin almacenamiento */ }\r\n    limpiarDireccion();\r\n  }\r\n\r\n  function ir(destino) {\r\n    destino = Math.max(0, Math.min(caps.length - 1, destino));\r\n    if (!modoPulso) {\r\n      caps[destino].scrollIntoView({ behavior: sinMovimiento.matches ? 'auto' : 'smooth' });\r\n      return;\r\n    }\r\n    if (destino === actual || bloqueado) return;\r\n    impulso += (destino > actual ? 1 : -1) * 1.5;\r\n    actual = destino;\r\n    bloqueado = true;\r\n    setTimeout(function () { bloqueado = false; }, sinMovimiento.matches ? 150 : 950);\r\n    pintar(true);\r\n    latidoSonoro();\r\n    recordarCapitulo();\r\n  }\r\n\r\n  // Rueda: se acumula para que un trackpad no salte varios cap\u00EDtulos de golpe\r\n  var acumulado = 0;\r\n  var ultimaRueda = 0;\r\n  window.addEventListener('wheel', function (e) {\r\n    if (!modoPulso || hayDialogo()) return;\r\n    e.preventDefault();\r\n    var ahora = Date.now();\r\n    if (ahora - ultimaRueda > 220) acumulado = 0;\r\n    ultimaRueda = ahora;\r\n    if (bloqueado) { acumulado = 0; return; }\r\n    acumulado += e.deltaY;\r\n    if (Math.abs(acumulado) > 40) { ir(actual + (acumulado > 0 ? 1 : -1)); acumulado = 0; }\r\n  }, { passive: false });\r\n\r\n  // Deslizar con el dedo\r\n  var toque = null;\r\n  viaje.addEventListener('touchstart', function (e) {\r\n    if (e.touches.length !== 1) { toque = null; return; }\r\n    toque = { x: e.touches[0].clientX, y: e.touches[0].clientY };\r\n  }, { passive: true });\r\n  viaje.addEventListener('touchend', function (e) {\r\n    if (!toque || !modoPulso) return;\r\n    var dx = e.changedTouches[0].clientX - toque.x;\r\n    var dy = e.changedTouches[0].clientY - toque.y;\r\n    toque = null;\r\n    if (Math.abs(dy) < 48 || Math.abs(dy) < Math.abs(dx) * 1.2) return;\r\n    ir(actual + (dy < 0 ? 1 : -1));\r\n  }, { passive: true });\r\n\r\n  window.addEventListener('keydown', function (e) {\r\n    if (!modoPulso || hayDialogo() || e.altKey || e.ctrlKey || e.metaKey) return;\r\n    var enControl = /^(BUTTON|A|INPUT|SELECT|TEXTAREA|SUMMARY)$/.test(e.target.tagName);\r\n    switch (e.key) {\r\n      case 'ArrowDown': case 'ArrowRight': case 'PageDown': e.preventDefault(); ir(actual + 1); break;\r\n      case 'ArrowUp': case 'ArrowLeft': case 'PageUp': e.preventDefault(); ir(actual - 1); break;\r\n      case ' ': if (!enControl) { e.preventDefault(); ir(actual + (e.shiftKey ? -1 : 1)); } break;\r\n      case 'Home': e.preventDefault(); ir(0); break;\r\n      case 'End': e.preventDefault(); ir(caps.length - 1); break;\r\n    }\r\n  });\r\n\r\n  /* ---------- Lo que pasa al entrar a cada cap\u00EDtulo ---------- */\r\n\r\n  // 01 F\u00F3rmula: los ingredientes se encienden uno a uno; al pasar el puntero\r\n  // o tocar uno, ese manda y ti\u00F1e la escena con su color.\r\n  var orbita = $('.orbita');\r\n  var ingredientes = $$('.orbita__item');\r\n  var rondaFormula = 0, turno = -1;\r\n\r\n  function encender(item) {\r\n    ingredientes.forEach(function (i) { i.classList.toggle('es-activo', i === item); });\r\n    orbita.classList.toggle('hay-activo', !!item);\r\n    if (item && modoPulso) raiz.style.setProperty('--acento', item.style.getPropertyValue('--c'));\r\n    else raiz.style.removeProperty('--acento');\r\n  }\r\n  function rondar() {\r\n    clearInterval(rondaFormula);\r\n    if (sinMovimiento.matches) return;\r\n    rondaFormula = setInterval(function () {\r\n      if (hayDialogo()) return;\r\n      turno = (turno + 1) % ingredientes.length;\r\n      encender(ingredientes[turno]);\r\n    }, 1700);\r\n  }\r\n  function apagarFormula() { clearInterval(rondaFormula); rondaFormula = 0; turno = -1; encender(null); }\r\n\r\n  ingredientes.forEach(function (item, n) {\r\n    item.addEventListener('pointerenter', function (e) { if (e.pointerType === 'mouse') { clearInterval(rondaFormula); encender(item); } });\r\n    item.addEventListener('pointerleave', function (e) { if (e.pointerType === 'mouse' && actual === 2) { turno = n; rondar(); } });\r\n    item.addEventListener('click', function () { clearInterval(rondaFormula); turno = n; encender(item); latirTarro(); });\r\n  });\r\n\r\n  // 03 Origen: las cifras suben\r\n  function subirCifras() {\r\n    $$('[data-sube]').forEach(function (el) {\r\n      var meta = parseInt(el.getAttribute('data-sube'), 10);\r\n      if (sinMovimiento.matches) { el.textContent = meta; return; }\r\n      var inicio = 0;\r\n      el.textContent = '0';\r\n      function paso(t) {\r\n        if (!inicio) inicio = t + 450;\r\n        var k = Math.max(0, Math.min(1, (t - inicio) / 900));\r\n        el.textContent = Math.round(meta * (1 - Math.pow(1 - k, 3)));\r\n        if (k < 1 && actual === 4) requestAnimationFrame(paso); else el.textContent = meta;\r\n      }\r\n      requestAnimationFrame(paso);\r\n    });\r\n  }\r\n\r\n  function alEntrar(cap) {\r\n    if (cap === 2 && modoPulso) { turno = -1; rondar(); } else if (rondaFormula || orbita.classList.contains('hay-activo')) apagarFormula();\r\n    if (cap === 4 && modoPulso) subirCifras();\r\n  }\r\n\r\n  // 02 Preparaci\u00F3n: agua o leche, fr\u00EDo o caliente\r\n  var vaso = $('.vaso');\r\n  $$('[data-vaso]').forEach(function (b) {\r\n    b.addEventListener('click', function () {\r\n      var par = b.getAttribute('data-vaso').split(':');\r\n      vaso.setAttribute('data-' + par[0], par[1]);\r\n      $$('button', b.parentNode).forEach(function (h) { h.setAttribute('aria-pressed', h === b ? 'true' : 'false'); });\r\n    });\r\n  });\r\n\r\n  /* ---------- Entrada a Kallpa Club: video a pantalla completa ---------- */\r\n  // Horizontal en computador (o con el celular acostado) y vertical en celular. Se muestra una vez por visita,\r\n  // se puede saltar y silenciar, y no sale si la persona pidi\u00F3 menos movimiento o ahorro de datos. Si el video\r\n  // no carga, se pasa directo al panel: nunca deja a nadie esperando.\r\n  //\r\n  // Sincron\u00EDa con el ingreso: el panel del club se abre ANTES, debajo del video, y queda listo y quieto. El video\r\n  // es otro di\u00E1logo encima. Faltando FUNDIDO segundos para el final, el video (y su sonido) se desvanecen y dejan\r\n  // ver el ingreso que ya estaba ah\u00ED: el \u00FAltimo cuadro se funde con el formulario, sin pasar por negro.\r\n  var introClub = (function () {\r\n    var capa = $('[data-intro-club]');\r\n    var video = capa && $('[data-intro-video]', capa);\r\n    var LLAVE = 'kallpa.introclub';\r\n    var FUNDIDO = 0.9; // segundos\r\n    var activa = false, saliendo = false, reloj = null, cuadro = 0;\r\n    if (!capa || !video || typeof video.play !== 'function' || typeof capa.showModal !== 'function') return { pendiente: function () { return false; }, mostrar: function (sigue) { sigue(); } };\r\n    var sonido = $('[data-intro-sonido]', capa);\r\n    function vista() { try { return sessionStorage.getItem(LLAVE) === '1'; } catch (err) { return false; } }\r\n    function pendiente() {\r\n      var ahorro = navigator.connection && navigator.connection.saveData;\r\n      // Solo con el club abierto: mientras diga \"Pr\u00F3ximamente\" no hay video (terminar\u00EDa en un aviso, no en el ingreso)\r\n      return clubAbierto && !vista() && !sinMovimiento.matches && !ahorro;\r\n    }\r\n    function pintarSonido() {\r\n      sonido.setAttribute('aria-pressed', video.muted ? 'false' : 'true');\r\n      sonido.setAttribute('aria-label', video.muted ? 'Activar el sonido del video' : 'Silenciar el video');\r\n    }\r\n    // Quita el video de encima. `rapido` = la persona lo salt\u00F3 (fundido corto); si no, es el fundido del final.\r\n    function salir(rapido) {\r\n      if (!activa || saliendo) return;\r\n      saliendo = true;\r\n      clearTimeout(reloj);\r\n      cancelAnimationFrame(cuadro);\r\n      try { sessionStorage.setItem(LLAVE, '1'); } catch (err) { /* sin almacenamiento */ }\r\n      var dura = rapido ? 350 : FUNDIDO * 1000;\r\n      capa.style.setProperty('--fundido', dura + 'ms');\r\n      capa.classList.add('es-saliendo');\r\n      // El sonido baja al mismo ritmo que la imagen\r\n      var inicio = performance.now(), vol = video.volume;\r\n      (function bajar(ahora) {\r\n        var k = Math.min(1, (ahora - inicio) / dura);\r\n        try { video.volume = vol * (1 - k); } catch (err) { /* iPhone no deja cambiar el volumen */ }\r\n        if (k < 1 && activa) cuadro = requestAnimationFrame(bajar);\r\n      })(inicio);\r\n      setTimeout(function () {\r\n        activa = false; saliendo = false;\r\n        if (capa.open) capa.close();\r\n        capa.classList.remove('es-saliendo', 'es-listo');\r\n        try { video.pause(); video.volume = 1; } catch (err) { /* ya detenido */ }\r\n        video.removeAttribute('src');\r\n        try { video.load(); } catch (err) { /* nada que soltar */ }\r\n        var foco = $('dialog[open] input:not([type=hidden])') || $('dialog[open] button');\r\n        if (foco) foco.focus({ preventScroll: true });\r\n      }, dura + 30);\r\n    }\r\n    function mostrar(sigue) {\r\n      if (activa) return;\r\n      activa = true; saliendo = false;\r\n      sigue(); // el panel del club queda abierto debajo, listo\r\n      var vertical = window.matchMedia('(orientation: portrait)').matches;\r\n      video.src = K.video(vertical ? 'vertical' : 'horizontal');\r\n      video.muted = false;\r\n      try { video.volume = 1; } catch (err) { /* sin control de volumen */ }\r\n      capa.showModal(); // encima del panel\r\n      pintarSonido();\r\n      registrar('club_intro', { formato: vertical ? 'vertical' : 'horizontal' });\r\n      var jugar = video.play();\r\n      if (jugar && jugar.catch) {\r\n        jugar.catch(function () {\r\n          // El navegador no dej\u00F3 sonar el video: se intenta en silencio; si tampoco, se sigue de largo\r\n          video.muted = true;\r\n          pintarSonido();\r\n          var otra = video.play();\r\n          if (otra && otra.catch) otra.catch(function () { salir(true); });\r\n        });\r\n      }\r\n      // Si en 6 segundos no ha empezado, no se espera m\u00E1s\r\n      reloj = setTimeout(function () { if (video.currentTime < 0.1) salir(true); }, 6000);\r\n      $('[data-intro-saltar]', capa).focus();\r\n    }\r\n    // El fundido arranca justo antes del final, para que termine con el \u00FAltimo cuadro. Se vigila cuadro a cuadro\r\n    // (el aviso \"timeupdate\" del navegador llega solo unas 4 veces por segundo y lo har\u00EDa empezar tarde).\r\n    function vigilar() {\r\n      if (!activa || saliendo) return;\r\n      if (video.duration && video.duration - video.currentTime <= FUNDIDO) return salir(false);\r\n      requestAnimationFrame(vigilar);\r\n    }\r\n    video.addEventListener('playing', function () { capa.classList.add('es-listo'); vigilar(); });\r\n    video.addEventListener('timeupdate', function () { if (activa && video.duration && video.duration - video.currentTime <= FUNDIDO) salir(false); });\r\n    video.addEventListener('ended', function () { salir(true); });\r\n    video.addEventListener('error', function () { salir(true); });\r\n    capa.addEventListener('cancel', function (e) { e.preventDefault(); salir(true); }); // Escape\r\n    capa.addEventListener('close', function () { if (activa && !saliendo) { activa = false; try { video.pause(); } catch (err) { /* nada */ } } });\r\n    $('[data-intro-saltar]', capa).addEventListener('click', function () { salir(true); });\r\n    sonido.addEventListener('click', function () { video.muted = !video.muted; pintarSonido(); });\r\n    return { pendiente: pendiente, mostrar: mostrar };\r\n  })();\r\n\r\n  /* ---------- Paneles ---------- */\r\n\r\n  function abrir(dialogo) {\r\n    if (!dialogo || dialogo.open) return;\r\n    $$('dialog[open]').forEach(function (d) { d.close(); });\r\n    dialogo.showModal();\r\n    dialogo.scrollTop = 0;\r\n    registrar('panel', { panel: dialogo.id.replace('panel-', '') });\r\n  }\r\n\r\n  // El punto de \"Explorar\" avisa que hay m\u00E1s; se apaga cuando ya se abri\u00F3 el \u00EDndice\r\n  var avisoIndice = $('[data-aviso-indice]');\r\n  try { avisoIndice.hidden = localStorage.getItem('kallpa.indice.visto') === '1'; } catch (err) { /* sin almacenamiento */ }\r\n  document.getElementById('panel-indice').addEventListener('toggle', function () {\r\n    avisoIndice.hidden = true;\r\n    try { localStorage.setItem('kallpa.indice.visto', '1'); } catch (err) { /* sin almacenamiento */ }\r\n  });\r\n\r\n  $$('dialog').forEach(function (d) {\r\n    // Clic en el fondo oscuro (fuera del panel) lo cierra\r\n    if (d.hasAttribute('data-intro-club')) return; // la entrada con video se cierra sola o con \"Saltar\"\r\n    d.addEventListener('click', function (e) { if (e.target === d) d.close(); });\r\n  });\r\n\r\n  document.addEventListener('click', function (e) {\r\n    var el = e.target.closest('[data-panel], [data-cerrar], [data-ir], [data-abrir-carrito]');\r\n    if (!el) return;\r\n    if (el.hasAttribute('data-cerrar')) {\r\n      var d = el.closest('dialog');\r\n      if (d) d.close();\r\n    }\r\n    if (el.hasAttribute('data-panel')) {\r\n      var cual = el.getAttribute('data-panel');\r\n      var panelPedido = document.getElementById('panel-' + cual);\r\n      // Kallpa Club se presenta primero con su video; al terminar, entra el panel\r\n      if (cual === 'club' && introClub.pendiente()) introClub.mostrar(function () { abrir(panelPedido); });\r\n      else abrir(panelPedido);\r\n    }\r\n    if (el.hasAttribute('data-abrir-carrito')) abrir(carrito);\r\n    if (el.hasAttribute('data-ir')) {\r\n      e.preventDefault();\r\n      ir(parseInt(el.getAttribute('data-ir'), 10));\r\n    }\r\n  });\r\n\r\n  /* ---------- Carrito ---------- */\r\n\r\n  var carrito = document.getElementById('carrito');\r\n  var LLAVE = 'kallpa.carrito.v1';\r\n  var max = K.producto.maximo;\r\n  var enCarrito = 0;\r\n  var elegida = 1;\r\n  var disponible = K.producto.disponible !== false;\r\n\r\n  if (!K.shopify) { try { enCarrito = Math.max(0, Math.min(max, parseInt(localStorage.getItem(LLAVE), 10) || 0)); } catch (err) { /* sin almacenamiento */ } }\r\n\r\n  // Oferta por cantidad (solo si est\u00E1 configurada y tiene c\u00F3digo de Shopify)\r\n  function hayOferta(n) {\r\n    var of = K.oferta;\r\n    return !!(of && of.codigo && of.precioUnidad > 0 && of.precioUnidad < K.producto.precio && n >= of.desde);\r\n  }\r\n  function totalDe(n) { return n * (hayOferta(n) ? K.oferta.precioUnidad : K.producto.precio); }\r\n  function enlaceWa(texto) { return 'https://wa.me/' + K.whatsappNumero + '?text=' + encodeURIComponent(texto); }\r\n  function mensajePedido(n) {\r\n    if (K.landing) return 'Hola, quiero pedir COFFEE WORKOUT, ' + (K.opcionTitulo || '1 unidad') + ' (' + pesos(K.producto.precio) + '). \u00BFC\u00F3mo hacemos el pago y el env\u00EDo?';\r\n    return 'Hola, quiero pedir ' + n + (n === 1 ? ' tarro' : ' tarros') + ' de COFFEE WORKOUT (' + pesos(totalDe(n)) + '). \u00BFC\u00F3mo hacemos el pago y el env\u00EDo?';\r\n  }\r\n\r\n  // Fuera de Shopify el carrito vive en este navegador. Dentro, es el carrito real de la tienda:\r\n  // cada cambio se env\u00EDa a Shopify y, si algo falla, se vuelve a leer lo que Shopify tiene.\r\n  var enTienda = 0; // unidades que Shopify tiene de este producto\r\n  var cola = Promise.resolve();\r\n  function pedirJson(url, cuerpo) {\r\n    return fetch(url, cuerpo ? { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify(cuerpo) } : { headers: { Accept: 'application/json' } })\r\n      .then(function (r) { if (!r.ok) throw new Error('carrito ' + r.status); return r.json(); });\r\n  }\r\n  function leerTienda() {\r\n    return pedirJson('/cart.js').then(function (c) {\r\n      var n = 0;\r\n      (c.items || []).forEach(function (i) { if (String(i.variant_id) === String(K.producto.variante)) n += i.quantity; });\r\n      enTienda = n; enCarrito = Math.min(max, n);\r\n      pintarCarrito(false);\r\n    });\r\n  }\r\n  function guardar() {\r\n    if (!K.shopify) { try { localStorage.setItem(LLAVE, String(enCarrito)); } catch (err) { /* sin almacenamiento */ } return; }\r\n    cola = cola.then(function () {\r\n      var quiero = enCarrito;\r\n      if (quiero === enTienda) return null;\r\n      var envio = enTienda === 0\r\n        ? pedirJson('/cart/add.js', { items: [{ id: Number(K.producto.variante), quantity: quiero }] })\r\n        : pedirJson('/cart/change.js', { id: String(K.producto.variante), quantity: quiero });\r\n      return envio.then(function () { enTienda = quiero; marcarVisita(); });\r\n    }).catch(function () { return leerTienda().catch(function () { /* sin conexi\u00F3n */ }); });\r\n  }\r\n  // Una vez por visita, con el carrito ya creado: se le deja el identificador an\u00F3nimo de Google Analytics para que el\r\n  // p\u00EDxel de compras (Shopify \u2192 Eventos de clientes) una la compra con esta visita. Si falla, la compra igual se mide.\r\n  // Tambi\u00E9n el c\u00F3digo de la campa\u00F1a de publicidad por la que lleg\u00F3 (utm_campaign del enlace del anuncio, guardado en\r\n  // la visita): el panel de socios suma esa venta a su campa\u00F1a (Publicidad, 22/10/2026).\r\n  var visitaMarcada = false;\r\n  function marcarVisita() {\r\n    if (visitaMarcada) return;\r\n    visitaMarcada = true;\r\n    var campana = '';\r\n    try { campana = sessionStorage.getItem('kallpa.utm') || ''; } catch (err) { /* sin almacenamiento */ }\r\n    var enviar = function (cid) {\r\n      var datos = {};\r\n      if (cid) datos._ga_cid = cid;\r\n      if (campana) datos._utm_campaign = campana;\r\n      if (cid || campana) pedirJson('/cart/update.js', { attributes: datos }).catch(function () { /* no es indispensable */ });\r\n    };\r\n    if (window.KALLPA_idGoogle) window.KALLPA_idGoogle(enviar);\r\n    else enviar('');\r\n  }\r\n\r\n  function pintarCarrito(esNuevo) {\r\n    var cuenta = $('[data-cuenta]');\r\n    cuenta.textContent = enCarrito;\r\n    cuenta.hidden = enCarrito === 0;\r\n    if (esNuevo) { cuenta.classList.remove('es-nuevo'); void cuenta.offsetWidth; cuenta.classList.add('es-nuevo'); }\r\n    $('[data-abrir-carrito]').setAttribute('aria-label', 'Abrir carrito, ' + enCarrito + (enCarrito === 1 ? ' unidad' : ' unidades'));\r\n    $('[data-carrito-vacio]').hidden = enCarrito > 0;\r\n    $('[data-carrito-lleno]').hidden = enCarrito === 0;\r\n    $('[data-linea-valor]').textContent = enCarrito;\r\n    $('[data-linea=\"-1\"]').disabled = enCarrito <= 1;\r\n    $('[data-linea=\"1\"]').disabled = enCarrito >= max;\r\n    $('[data-subtotal]').textContent = pesos(totalDe(enCarrito));\r\n    // Checkout real de Shopify: enlace directo con variante y cantidad\r\n    $('[data-pagar]').href = (K.shopify ? '/checkout' : K.tienda + '/cart/' + K.producto.variante + ':' + Math.max(1, enCarrito)) +\r\n      (hayOferta(enCarrito) ? '?discount=' + encodeURIComponent(K.oferta.codigo) : '');\r\n    $('[data-wa-carrito]').href = enlaceWa(mensajePedido(Math.max(1, enCarrito)));\r\n    $('[data-pagar]').hidden = !disponible;\r\n    $('[data-agotado]').hidden = disponible;\r\n  }\r\n\r\n  function pintarElegida(conSalto) {\r\n    var valor = $('[data-cant-valor]');\r\n    valor.textContent = elegida;\r\n    if (conSalto) { valor.classList.remove('es-cambio'); void valor.offsetWidth; valor.classList.add('es-cambio'); }\r\n    $('[data-cant=\"-1\"]').disabled = elegida <= 1;\r\n    $('[data-cant=\"1\"]').disabled = elegida >= max;\r\n    var total = $('[data-total]');\r\n    total.hidden = elegida < 2;\r\n    total.textContent = 'Total ' + pesos(totalDe(elegida));\r\n    var oferta = $('[data-oferta]');\r\n    var of = K.oferta;\r\n    oferta.hidden = !(of && of.codigo && of.precioUnidad > 0 && of.precioUnidad < K.producto.precio);\r\n    if (!oferta.hidden) {\r\n      oferta.textContent = hayOferta(elegida)\r\n        ? 'Ahorras ' + pesos(elegida * (K.producto.precio - of.precioUnidad)) + ' llevando ' + elegida + '.'\r\n        : 'Lleva ' + of.desde + ' o m\u00E1s y cada uno queda en ' + pesos(of.precioUnidad) + '.';\r\n    }\r\n    $('[data-wa-pedido]').href = enlaceWa(disponible ? mensajePedido(elegida) : 'Hola, quiero que me avisen cuando COFFEE WORKOUT vuelva a estar disponible.');\r\n    $('[data-wa-texto]').textContent = disponible ? 'Pedir por WhatsApp' : 'Av\u00EDsame cuando vuelva';\r\n    var boton = $('[data-agregar]');\r\n    boton.disabled = !disponible;\r\n    boton.textContent = disponible ? (K.landing ? 'Comprar ahora' : 'Agregar al carrito') : 'Agotado por ahora';\r\n  }\r\n\r\n  $$('[data-cant]').forEach(function (b) {\r\n    b.addEventListener('click', function () {\r\n      elegida = Math.max(1, Math.min(max, elegida + parseInt(b.getAttribute('data-cant'), 10)));\r\n      pintarElegida(true);\r\n    });\r\n  });\r\n\r\n  // El tarro vuela hasta el carrito antes de abrirlo\r\n  function volarAlCarrito(alLlegar) {\r\n    var origen = $('.tarro__img');\r\n    var destino = $('[data-abrir-carrito]');\r\n    if (!modoPulso || sinMovimiento.matches || !origen) { alLlegar(); return; }\r\n    var a = origen.getBoundingClientRect(), b = destino.getBoundingClientRect();\r\n    var copia = document.createElement('img');\r\n    copia.src = K.ruta('tarro-420.webp'); copia.alt = ''; copia.className = 'vuelo';\r\n    copia.style.width = a.width + 'px'; copia.style.height = a.height + 'px';\r\n    copia.style.transform = 'translate(' + a.left + 'px,' + a.top + 'px)';\r\n    document.body.appendChild(copia);\r\n    void copia.offsetWidth;\r\n    var escala = 28 / a.width;\r\n    copia.style.transform = 'translate(' + (b.left + b.width / 2 - 14) + 'px,' + (b.top + b.height / 2 - 17) + 'px) scale(' + escala + ')';\r\n    copia.style.opacity = '0.25';\r\n    setTimeout(alLlegar, 340);\r\n    setTimeout(function () { copia.remove(); }, 460);\r\n  }\r\n\r\n  $('[data-agregar]').addEventListener('click', function () {\r\n    if (!disponible) return;\r\n    if (K.landing) {\r\n      // Landing: una sola acci\u00F3n, directo al pago con la opci\u00F3n elegida\r\n      registrar('begin_checkout', { value: K.producto.precio, currency: 'COP', quantity: 1 });\r\n      location.href = '/cart/' + K.producto.variante + ':1';\r\n      return;\r\n    }\r\n    var cuantas = elegida;\r\n    if (navigator.vibrate) navigator.vibrate(14); // Android; iPhone no lo permite desde la web\r\n    registrar('add_to_cart', { value: totalDe(cuantas), currency: 'COP', quantity: cuantas });\r\n    elegida = 1;\r\n    pintarElegida(false);\r\n    volarAlCarrito(function () {\r\n      enCarrito = Math.min(max, enCarrito + cuantas);\r\n      guardar(); pintarCarrito(true);\r\n      $('[data-tras-agregar]').hidden = false;\r\n      abrir(carrito);\r\n    });\r\n  });\r\n\r\n  $$('[data-linea]').forEach(function (b) {\r\n    b.addEventListener('click', function () {\r\n      enCarrito = Math.max(1, Math.min(max, enCarrito + parseInt(b.getAttribute('data-linea'), 10)));\r\n      guardar(); pintarCarrito(false);\r\n    });\r\n  });\r\n\r\n  $('[data-vaciar]').addEventListener('click', function () { enCarrito = 0; guardar(); pintarCarrito(false); });\r\n\r\n  // Si el carrito cambia en otra pesta\u00F1a, esta se pone al d\u00EDa\r\n  window.addEventListener('storage', function (e) {\r\n    if (e.key !== LLAVE || K.shopify) return;\r\n    enCarrito = Math.max(0, Math.min(max, parseInt(e.newValue, 10) || 0));\r\n    pintarCarrito(false);\r\n  });\r\n\r\n  pintarElegida(false);\r\n  pintarCarrito(false);\r\n  if (K.landing) {\r\n    // ---- Landing de pauta ----\r\n    raiz.classList.add('es-landing');\r\n    var cajaOpciones = $('[data-opciones]');\r\n    var base = K.variantes[0];\r\n    var unidades = function (v) { var m = /^(\\d+)/.exec(v.titulo); return m ? parseInt(m[1], 10) : 1; };\r\n    var elegir = function (v, boton) {\r\n      K.producto.variante = String(v.id); K.producto.precio = v.precio; K.opcionTitulo = v.titulo;\r\n      disponible = v.disponible !== false;\r\n      $$('.opcion', cajaOpciones).forEach(function (b) { b.setAttribute('aria-checked', b === boton ? 'true' : 'false'); });\r\n      pintarPrecio(); pintarElegida(false);\r\n    };\r\n    K.variantes.forEach(function (v, n) {\r\n      var boton = document.createElement('button');\r\n      boton.type = 'button'; boton.className = 'opcion'; boton.setAttribute('role', 'radio');\r\n      var nombre = document.createElement('b'); nombre.textContent = v.titulo;\r\n      var precio = document.createElement('span'); precio.textContent = pesos(v.precio);\r\n      if (v.antes > v.precio) { var tachado = document.createElement('s'); tachado.textContent = pesos(v.antes); precio.appendChild(document.createTextNode(' ')); precio.insertBefore(tachado, precio.firstChild); precio.insertBefore(document.createTextNode(' '), tachado.nextSibling); }\r\n      boton.appendChild(nombre); boton.appendChild(precio);\r\n      // El ahorro sale de comparar con el precio de una unidad en Shopify; no se escribe a mano\r\n      var ahorro = unidades(v) * base.precio - v.precio;\r\n      if (n > 0 && ahorro > 0) { var nota = document.createElement('small'); nota.textContent = 'Ahorras ' + pesos(ahorro); boton.appendChild(nota); }\r\n      if (v.disponible === false) boton.disabled = true;\r\n      boton.addEventListener('click', function () { elegir(v, boton); });\r\n      cajaOpciones.appendChild(boton);\r\n    });\r\n    cajaOpciones.hidden = K.variantes.length < 2;\r\n    var primera = K.variantes.findIndex(function (v) { return v.disponible !== false; });\r\n    elegir(K.variantes[Math.max(0, primera)], cajaOpciones.children[Math.max(0, primera)]);\r\n  } else if (K.shopify) {\r\n    leerTienda().catch(function () { /* sin conexi\u00F3n */ });\r\n    // Antes de ir a pagar, se espera a que Shopify tenga la \u00FAltima cantidad\r\n    $('[data-pagar]').addEventListener('click', function (e) {\r\n      e.preventDefault();\r\n      var destino = this.href;\r\n      cola.then(function () { location.href = destino; });\r\n    });\r\n    // Al volver con el bot\u00F3n \"atr\u00E1s\" desde el pago, se relee el carrito\r\n    window.addEventListener('pageshow', function (e) { if (e.persisted) leerTienda().catch(function () {}); });\r\n  }\r\n\r\n  // Shopify en vivo: precio, variante y disponibilidad. Si la consulta falla\r\n  // (sin conexi\u00F3n, o abierto como archivo), se queda con los datos de config.js.\r\n  if (location.protocol !== 'file:' && !K.shopify) {\r\n    fetch('/api/producto').then(function (r) { return r.ok ? r.json() : null; }).then(function (d) {\r\n      if (!d || !d.precio || !d.variante) return;\r\n      K.producto.precio = d.precio;\r\n      K.producto.variante = d.variante;\r\n      disponible = d.disponible !== false;\r\n      pintarPrecio(); pintarElegida(false); pintarCarrito(false);\r\n    }).catch(function () { /* se mantiene el respaldo */ });\r\n  }\r\n\r\n  /* ---------- Fondo: granos, frutos rojos y polvo en gravedad cero ---------- */\r\n\r\n  var lienzo = document.getElementById('campo');\r\n  var ctx = lienzo.getContext('2d');\r\n  var ancho = 0, alto = 0, dpr = 1;\r\n  var granos = [], frutos = [], polvo = [], ondas = [];\r\n  var mira = { x: 0, y: 0, tx: 0, ty: 0 };\r\n  var raton = { x: -999, y: -999, activo: false };\r\n  // Color del polvo por cap\u00EDtulo (el mismo acento de vivo.css)\r\n  var TINTES = [[226, 202, 150], [226, 202, 150], [240, 98, 109], [240, 160, 60], [157, 187, 92], [241, 215, 154]];\r\n  var tinte = TINTES[0].slice();\r\n  var pesoFrutos = 0.35;\r\n\r\n  function sembrar() {\r\n    var chico = window.innerWidth < 900;\r\n    granos = []; frutos = []; polvo = [];\r\n    for (var i = 0; i < (chico ? 7 : 14); i++) {\r\n      granos.push({ x: azar(-1.1, 1.1), y: azar(-1.1, 1.1), z: azar(0.12, 1), giro: azar(0, 6.28), vg: azar(-0.25, 0.25), dx: azar(-0.01, 0.01), dy: azar(-0.012, 0.004), t: azar(0.85, 1.25) });\r\n    }\r\n    for (var f = 0; f < (chico ? 4 : 8); f++) {\r\n      frutos.push({ x: azar(-1.1, 1.1), y: azar(-1.1, 1.1), z: azar(0.14, 1), giro: azar(0, 6.28), vg: azar(-0.2, 0.2), dx: azar(-0.01, 0.01), dy: azar(-0.012, 0.004), t: azar(0.8, 1.15) });\r\n    }\r\n    for (var j = 0; j < (chico ? 50 : 110); j++) {\r\n      polvo.push({ x: azar(-1.3, 1.3), y: azar(-1.3, 1.3), z: azar(0.08, 1), dx: azar(-0.008, 0.008), dy: azar(-0.014, 0.002), b: azar(0.3, 1) });\r\n    }\r\n  }\r\n\r\n  function medir() {\r\n    dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n    ancho = window.innerWidth; alto = window.innerHeight;\r\n    lienzo.width = Math.round(ancho * dpr); lienzo.height = Math.round(alto * dpr);\r\n    ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n  }\r\n\r\n  function envolver(p) {\r\n    if (p.z < 0.06) { p.z += 0.98; p.x = azar(-1.2, 1.2); p.y = azar(-1.2, 1.2); }\r\n    else if (p.z > 1.04) { p.z -= 0.98; }\r\n    if (p.y < -1.4) p.y += 2.8; else if (p.y > 1.4) p.y -= 2.8;\r\n    if (p.x < -1.4) p.x += 2.8; else if (p.x > 1.4) p.x -= 2.8;\r\n  }\r\n\r\n  function niebla(z) { return Math.min(1, (z - 0.06) / 0.14) * Math.min(1, (1.04 - z) / 0.3); }\r\n\r\n  // El puntero aparta lo que flota cerca\r\n  function apartar(p, px, py, foco, dt) {\r\n    if (!raton.activo) return;\r\n    var ex = px - raton.x, ey = py - raton.y;\r\n    var d = Math.sqrt(ex * ex + ey * ey);\r\n    if (d > 150 || d < 1) return;\r\n    var f = (1 - d / 150) * 260 * dt * p.z / foco;\r\n    p.x += (ex / d) * f; p.y += (ey / d) * f;\r\n  }\r\n\r\n  function dibujarGrano(g, px, py) {\r\n    var r = (11 * g.t) / g.z;\r\n    if (r > 34 || px < -r * 2 || px > ancho + r * 2 || py < -r * 2 || py > alto + r * 2) return;\r\n    var cerca = Math.min(1, (34 - r) / 12);\r\n    ctx.save();\r\n    ctx.translate(px, py); ctx.rotate(g.giro);\r\n    ctx.globalAlpha = niebla(g.z) * 0.9 * cerca;\r\n    var tono = ctx.createLinearGradient(-r, -r, r, r);\r\n    tono.addColorStop(0, '#4a2e19'); tono.addColorStop(1, '#0d0805');\r\n    ctx.fillStyle = tono;\r\n    ctx.beginPath(); ctx.ellipse(0, 0, r, r * 0.68, 0, 0, 6.2832); ctx.fill();\r\n    ctx.lineWidth = Math.max(0.6, r * 0.05);\r\n    ctx.strokeStyle = 'rgba(226,202,150,0.38)'; ctx.stroke();\r\n    ctx.strokeStyle = 'rgba(0,0,0,0.75)'; ctx.lineWidth = Math.max(0.8, r * 0.09);\r\n    ctx.beginPath(); ctx.moveTo(-r * 0.82, 0);\r\n    ctx.bezierCurveTo(-r * 0.3, -r * 0.24, r * 0.3, r * 0.24, r * 0.82, 0); ctx.stroke();\r\n    ctx.restore();\r\n  }\r\n\r\n  function dibujarFruto(g, px, py) {\r\n    var r = (9 * g.t) / g.z;\r\n    if (r > 26 || px < -r * 2 || px > ancho + r * 2 || py < -r * 2 || py > alto + r * 2) return;\r\n    var cerca = Math.min(1, (26 - r) / 9);\r\n    ctx.save();\r\n    ctx.translate(px, py); ctx.rotate(g.giro);\r\n    ctx.globalAlpha = niebla(g.z) * 0.92 * pesoFrutos * cerca;\r\n    var tono = ctx.createRadialGradient(-r * 0.35, -r * 0.4, r * 0.1, 0, 0, r);\r\n    tono.addColorStop(0, '#ff8a93'); tono.addColorStop(0.35, '#d12a3d'); tono.addColorStop(1, '#4d0712');\r\n    ctx.fillStyle = tono;\r\n    ctx.beginPath(); ctx.arc(0, 0, r, 0, 6.2832); ctx.fill();\r\n    if (r > 7) { // gajos de la frambuesa\r\n      ctx.strokeStyle = 'rgba(60,4,14,0.55)'; ctx.lineWidth = Math.max(0.6, r * 0.06);\r\n      for (var k = 0; k < 5; k++) {\r\n        var an = k * 1.2566;\r\n        ctx.beginPath(); ctx.arc(Math.cos(an) * r * 0.5, Math.sin(an) * r * 0.5, r * 0.36, 0, 6.2832); ctx.stroke();\r\n      }\r\n    }\r\n    ctx.restore();\r\n  }\r\n\r\n  var ultimo = 0, cuadro = 0;\r\n\r\n  function animar(t) {\r\n    cuadro = requestAnimationFrame(animar);\r\n    var dt = Math.min(0.05, (t - ultimo) / 1000 || 0.016); ultimo = t;\r\n    var vz = 0.012 + impulso; // deriva suave + empuje del cambio de cap\u00EDtulo\r\n    impulso *= Math.exp(-3.4 * dt);\r\n    if (Math.abs(impulso) < 0.001) impulso = 0;\r\n    mira.x += (mira.tx - mira.x) * 0.05; mira.y += (mira.ty - mira.y) * 0.05;\r\n\r\n    var meta = TINTES[modoPulso ? actual : 0];\r\n    for (var c = 0; c < 3; c++) tinte[c] += (meta[c] - tinte[c]) * Math.min(1, dt * 2.2);\r\n    pesoFrutos += ((modoPulso && actual === 2 ? 1 : 0.4) - pesoFrutos) * Math.min(1, dt * 2);\r\n    var rgb = Math.round(tinte[0]) + ',' + Math.round(tinte[1]) + ',' + Math.round(tinte[2]);\r\n\r\n    ctx.clearRect(0, 0, ancho, alto);\r\n    var cx = ancho / 2 - mira.x * 26, cy = alto / 2 - mira.y * 18;\r\n    var foco = Math.max(ancho, alto) * 0.5;\r\n    var estira = Math.min(1, Math.abs(impulso) * 1.2);\r\n\r\n    ctx.lineCap = 'round';\r\n    for (var i = 0; i < polvo.length; i++) {\r\n      var p = polvo[i];\r\n      var zAntes = p.z, xAntes = p.x, yAntes = p.y;\r\n      p.z -= vz * dt; p.x += p.dx * dt; p.y += p.dy * dt;\r\n      var px = cx + (p.x / p.z) * foco, py = cy + (p.y / p.z) * foco;\r\n      apartar(p, px, py, foco, dt);\r\n      envolver(p);\r\n      px = cx + (p.x / p.z) * foco; py = cy + (p.y / p.z) * foco;\r\n      if (px < -20 || px > ancho + 20 || py < -20 || py > alto + 20) continue;\r\n      var a = niebla(p.z) * p.b * 0.8;\r\n      var r = 0.95 / p.z;\r\n      if (estira > 0.04 && Math.abs(p.z - zAntes) < 0.5) {\r\n        // Durante el viaje el polvo deja una estela\r\n        ctx.strokeStyle = 'rgba(' + rgb + ',' + (a * 0.85).toFixed(3) + ')';\r\n        ctx.lineWidth = Math.min(3, r * 1.4);\r\n        ctx.beginPath();\r\n        ctx.moveTo(cx + (xAntes / zAntes) * foco, cy + (yAntes / zAntes) * foco);\r\n        ctx.lineTo(px, py); ctx.stroke();\r\n      } else {\r\n        ctx.fillStyle = 'rgba(' + rgb + ',' + a.toFixed(3) + ')';\r\n        ctx.beginPath(); ctx.arc(px, py, Math.min(3.4, r), 0, 6.2832); ctx.fill();\r\n      }\r\n    }\r\n\r\n    var cuerpos = granos.concat(frutos).sort(function (m, n) { return n.z - m.z; });\r\n    for (var j = 0; j < cuerpos.length; j++) {\r\n      var g = cuerpos[j];\r\n      g.z -= vz * dt; g.x += g.dx * dt; g.y += g.dy * dt; g.giro += g.vg * dt;\r\n      var gx = cx + (g.x / g.z) * foco, gy = cy + (g.y / g.z) * foco;\r\n      apartar(g, gx, gy, foco, dt);\r\n      envolver(g);\r\n      gx = cx + (g.x / g.z) * foco; gy = cy + (g.y / g.z) * foco;\r\n      if (frutos.indexOf(g) > -1) dibujarFruto(g, gx, gy); else dibujarGrano(g, gx, gy);\r\n    }\r\n\r\n    // Ondas de cada toque\r\n    for (var o = ondas.length - 1; o >= 0; o--) {\r\n      var w = ondas[o];\r\n      w.t += dt / 0.9;\r\n      if (w.t >= 1) { ondas.splice(o, 1); continue; }\r\n      var facil = 1 - Math.pow(1 - w.t, 3);\r\n      ctx.strokeStyle = 'rgba(' + rgb + ',' + ((1 - w.t) * 0.7).toFixed(3) + ')';\r\n      ctx.lineWidth = 1.5;\r\n      ctx.beginPath(); ctx.arc(w.x, w.y, 12 + facil * w.r, 0, 6.2832); ctx.stroke();\r\n      ctx.strokeStyle = 'rgba(' + rgb + ',' + ((1 - w.t) * 0.3).toFixed(3) + ')';\r\n      ctx.beginPath(); ctx.arc(w.x, w.y, 6 + facil * w.r * 0.6, 0, 6.2832); ctx.stroke();\r\n    }\r\n  }\r\n\r\n  // Un toque en el vac\u00EDo: onda que empuja lo que flota alrededor\r\n  function onda(x, y, radio) {\r\n    if (sinMovimiento.matches || !cuadro) return;\r\n    ondas.push({ x: x, y: y, t: 0, r: radio || 240 });\r\n    var cx = ancho / 2, cy = alto / 2, foco = Math.max(ancho, alto) * 0.5;\r\n    granos.concat(frutos, polvo).forEach(function (p) {\r\n      var px = cx + (p.x / p.z) * foco, py = cy + (p.y / p.z) * foco;\r\n      var ex = px - x, ey = py - y, d = Math.sqrt(ex * ex + ey * ey);\r\n      if (d > 260 || d < 1) return;\r\n      var f = (1 - d / 260) * 70 * p.z / foco;\r\n      p.x += (ex / d) * f; p.y += (ey / d) * f;\r\n    });\r\n  }\r\n\r\n  function cuadroFijo() { ultimo = performance.now(); animar(ultimo); cancelAnimationFrame(cuadro); cuadro = 0; }\r\n\r\n  // El fondo se detiene cuando hay un panel o el carrito abierto, o la pesta\u00F1a oculta\r\n  function gobernarFondo() {\r\n    var debe = !sinMovimiento.matches && !document.hidden && !hayDialogo();\r\n    if (debe && !cuadro) { ultimo = performance.now(); cuadro = requestAnimationFrame(animar); }\r\n    else if (!debe && cuadro) { cancelAnimationFrame(cuadro); cuadro = 0; }\r\n  }\r\n\r\n  $$('dialog').forEach(function (d) {\r\n    d.addEventListener('close', gobernarFondo);\r\n    d.addEventListener('toggle', gobernarFondo);\r\n  });\r\n  document.addEventListener('visibilitychange', gobernarFondo);\r\n  if (sinMovimiento.addEventListener) sinMovimiento.addEventListener('change', gobernarFondo);\r\n\r\n  /* ---------- Tarro: late cuando lo tocas ---------- */\r\n\r\n  var tarro = $('.tarro');\r\n  var tarroImg = $('.tarro__img');\r\n\r\n  function latirTarro() {\r\n    if (sinMovimiento.matches || !modoPulso) return;\r\n    var flota = $('.tarro__flota');\r\n    for (var n = 0; n < 2; n++) {\r\n      var aro = document.createElement('span');\r\n      aro.className = 'tarro__onda';\r\n      flota.insertBefore(aro, flota.firstChild);\r\n      (function (el) { setTimeout(function () { el.remove(); }, 1200); })(aro);\r\n    }\r\n    tarro.classList.remove('es-golpe'); void tarro.offsetWidth; tarro.classList.add('es-golpe');\r\n    var caja = tarroImg.getBoundingClientRect();\r\n    onda(caja.left + caja.width / 2, caja.top + caja.height / 2, Math.max(caja.width, 260));\r\n  }\r\n  tarroImg.addEventListener('click', latirTarro);\r\n\r\n  viaje.addEventListener('pointerdown', function (e) {\r\n    if (!modoPulso || e.target.closest('a, button, .orbita__item, .tarro__img')) return;\r\n    onda(e.clientX, e.clientY);\r\n  });\r\n\r\n  /* ---------- Puntero: paralaje, estela e im\u00E1n en los botones ---------- */\r\n\r\n  var estela = $('.estela');\r\n  var puntero = { x: 0, y: 0, ex: 0, ey: 0, activo: false, cuadro: 0 };\r\n  var iman = null;\r\n\r\n  function seguir() {\r\n    puntero.ex += (puntero.x - puntero.ex) * 0.2; puntero.ey += (puntero.y - puntero.ey) * 0.2;\r\n    estela.style.transform = 'translate3d(' + puntero.ex.toFixed(1) + 'px,' + puntero.ey.toFixed(1) + 'px,0)';\r\n    if (Math.abs(puntero.x - puntero.ex) + Math.abs(puntero.y - puntero.ey) > 0.3) puntero.cuadro = requestAnimationFrame(seguir);\r\n    else puntero.cuadro = 0;\r\n  }\r\n\r\n  if (punteroFino) {\r\n    window.addEventListener('pointermove', function (e) {\r\n      if (e.pointerType !== 'mouse') return;\r\n      puntero.x = e.clientX; puntero.y = e.clientY;\r\n      raton.x = e.clientX; raton.y = e.clientY; raton.activo = !hayDialogo();\r\n      mira.tx = e.clientX / ancho * 2 - 1; mira.ty = e.clientY / alto * 2 - 1;\r\n      if (!puntero.activo) { puntero.activo = true; puntero.ex = puntero.x; puntero.ey = puntero.y; }\r\n      estela.classList.toggle('es-visible', !hayDialogo());\r\n      estela.classList.toggle('es-sobre', !!e.target.closest('a, button, summary, .orbita__item, .tarro__img'));\r\n      if (sinMovimiento.matches) { puntero.ex = puntero.x; puntero.ey = puntero.y; seguir(); return; }\r\n\r\n      raiz.style.setProperty('--mx', mira.tx.toFixed(3));\r\n      raiz.style.setProperty('--my', mira.ty.toFixed(3));\r\n      inclinar(mira.tx, mira.ty, 9, 6);\r\n      if (!puntero.cuadro) puntero.cuadro = requestAnimationFrame(seguir);\r\n\r\n      // Los botones principales se acercan un poco al puntero\r\n      var objetivo = e.target.closest('.btn--oro, .hud__boton, .abre');\r\n      if (iman && iman !== objetivo) { iman.style.translate = ''; iman = null; }\r\n      if (objetivo && !objetivo.disabled) {\r\n        var c = objetivo.getBoundingClientRect();\r\n        var mx = (e.clientX - (c.left + c.width / 2)) / c.width, my = (e.clientY - (c.top + c.height / 2)) / c.height;\r\n        objetivo.style.translate = (mx * 10).toFixed(1) + 'px ' + (my * 8).toFixed(1) + 'px';\r\n        iman = objetivo;\r\n      }\r\n    }, { passive: true });\r\n    document.documentElement.addEventListener('pointerleave', function () {\r\n      estela.classList.remove('es-visible'); raton.activo = false;\r\n      if (iman) { iman.style.translate = ''; iman = null; }\r\n    });\r\n  }\r\n\r\n  /* ---------- Medici\u00F3n de pago y contacto ---------- */\r\n\r\n  $('[data-pagar]').addEventListener('click', function () {\r\n    registrar('begin_checkout', { value: totalDe(enCarrito), currency: 'COP', quantity: enCarrito });\r\n  });\r\n  document.addEventListener('click', function (e) {\r\n    var a = e.target.closest('a[href*=\"wa.me\"]');\r\n    if (a) registrar('contact', { medio: 'whatsapp', origen: a.hasAttribute('data-wa-pedido') ? 'producto' : a.hasAttribute('data-wa-carrito') ? 'carrito' : 'contacto' });\r\n  });\r\n\r\n  /* ---------- Invitaci\u00F3n a deslizar ---------- */\r\n\r\n  var sigue = $('[data-sigue]');\r\n  function pintarSigue() {\r\n    var fin = actual === caps.length - 1;\r\n    sigue.classList.toggle('es-fin', fin);\r\n    sigue.firstElementChild.firstChild.textContent = fin ? 'Volver \u00B7 ' : 'Desliza \u00B7 ';\r\n    $('[data-sigue-texto]').textContent = fin ? 'Inicio' : caps[actual + 1].getAttribute('data-nombre');\r\n  }\r\n  sigue.addEventListener('click', function () { ir(actual === caps.length - 1 ? 0 : actual + 1); });\r\n\r\n  /* ---------- Opiniones a la vista y formulario ---------- */\r\n\r\n  var voz = $('[data-voz]');\r\n  var turnoVoz = Math.floor(Math.random() * K.opiniones.length);\r\n  function pintarVoz() {\r\n    var o = K.opiniones[turnoVoz % K.opiniones.length];\r\n    // primera frase de la opini\u00F3n real, sin recortar palabras\r\n    // (sin \"lookbehind\": Safari anterior a 16.4 no lo entiende y romper\u00EDa todo el archivo)\r\n    var corte = o.texto.match(/^.*?[.!?](?=\\s|$)/);\r\n    var frase = corte ? corte[0] : o.texto;\r\n    $('[data-voz-texto]').textContent = '\u00AB' + frase + '\u00BB';\r\n    $('[data-voz-autor]').textContent = o.nombre + ' \u00B7 compra presencial';\r\n  }\r\n  pintarVoz();\r\n  setInterval(function () {\r\n    if (actual !== 5 || hayDialogo() || document.hidden || sinMovimiento.matches) return;\r\n    voz.classList.add('es-cambio');\r\n    setTimeout(function () { turnoVoz++; pintarVoz(); voz.classList.remove('es-cambio'); }, 420);\r\n  }, 6500);\r\n\r\n  $('[data-forma-opinion]').addEventListener('submit', function (e) {\r\n    e.preventDefault();\r\n    var nombre = this.elements.nombre.value.trim(), texto = this.elements.texto.value.trim();\r\n    if (!nombre || !texto) return;\r\n    window.open(enlaceWa('Hola, soy ' + nombre + ' y quiero dejar mi opini\u00F3n sobre COFFEE WORKOUT:\\n\\n' + texto), '_blank', 'noopener');\r\n    registrar('contact', { medio: 'whatsapp', origen: 'opinion' });\r\n  });\r\n\r\n  /* ---------- Sonido opcional ---------- */\r\n\r\n  var conSonido = false, audio = null;\r\n  var casillaSonido = $('[data-sonido]');\r\n  try { conSonido = localStorage.getItem('kallpa.sonido') === '1'; } catch (err) { /* sin almacenamiento */ }\r\n  casillaSonido.checked = conSonido;\r\n  casillaSonido.addEventListener('change', function () {\r\n    conSonido = casillaSonido.checked;\r\n    try { localStorage.setItem('kallpa.sonido', conSonido ? '1' : '0'); } catch (err) { /* sin almacenamiento */ }\r\n    latidoSonoro();\r\n  });\r\n  // Dos golpes graves, como un latido\r\n  function latidoSonoro() {\r\n    if (!conSonido) return;\r\n    try {\r\n      audio = audio || new (window.AudioContext || window.webkitAudioContext)();\r\n      if (audio.state === 'suspended') audio.resume();\r\n      var t = audio.currentTime;\r\n      [0, 0.17].forEach(function (d, n) {\r\n        var o = audio.createOscillator(), v = audio.createGain();\r\n        o.type = 'sine';\r\n        o.frequency.setValueAtTime(n ? 120 : 150, t + d);\r\n        o.frequency.exponentialRampToValueAtTime(55, t + d + 0.15);\r\n        v.gain.setValueAtTime(0.0001, t + d);\r\n        v.gain.exponentialRampToValueAtTime(n ? 0.2 : 0.3, t + d + 0.012);\r\n        v.gain.exponentialRampToValueAtTime(0.0001, t + d + 0.2);\r\n        o.connect(v); v.connect(audio.destination);\r\n        o.start(t + d); o.stop(t + d + 0.22);\r\n      });\r\n    } catch (err) { /* sin audio */ }\r\n  }\r\n\r\n  /* ---------- Tarro en 360\u00B0: cilindro armado con el arte real de la etiqueta ---------- */\r\n\r\n  var visor = $('[data-visor]'), visorTarro = $('[data-visor-tarro]'), visorGira = $('[data-visor-gira]');\r\n  // u = fracci\u00F3n del ancho de la etiqueta que queda de frente (0,53 = cara principal)\r\n  var V = { d: 0, ang: -0.53 * 360, vel: 0, auto: true, meta: null, arrastre: null, cuadro: 0, antes: 0 };\r\n\r\n  function anillo(destino, clase, n, radio, arriba, alto, solape, pintarTira) {\r\n    var w = 2 * radio * Math.tan(Math.PI / n) + solape;\r\n    for (var i = 0; i < n; i++) {\r\n      var tira = document.createElement('i'), s = tira.style;\r\n      tira.className = clase;\r\n      s.width = w + 'px'; s.height = (alto + 0.5) + 'px'; s.top = arriba + 'px'; s.marginLeft = (-w / 2) + 'px';\r\n      s.transform = 'rotateY(' + (i * 360 / n) + 'deg) translateZ(' + radio + 'px)';\r\n      pintarTira(s, i, w);\r\n      destino.appendChild(tira);\r\n    }\r\n  }\r\n\r\n  // Dos cilindros: el de adentro gira con la etiqueta; el de afuera no gira y\r\n  // lleva la luz (sombra hacia los bordes, brillo a un lado), as\u00ED el tarro se\r\n  // ve redondo sin recalcular nada en cada cuadro.\r\n  function armarVisor() {\r\n    var d = Math.round(Math.min(visor.clientWidth * 0.56, visor.clientHeight * 0.6, 300));\r\n    if (!d || d === V.d) return;\r\n    V.d = d;\r\n    var r = d / 2, circ = Math.PI * d, altoEtiqueta = circ * 564 / 2400;\r\n    var tapa = d * 0.25, cuello = d * 0.07, base = d * 0.06, alto = tapa + cuello + altoEtiqueta + base;\r\n    var partes = [\r\n      { radio: r * 1.035, arriba: 0, alto: tapa, tono: '#2c2c2c' },\r\n      { radio: r * 0.97, arriba: tapa, alto: cuello, tono: '#141414' },\r\n      { radio: r, arriba: tapa + cuello, alto: altoEtiqueta, etiqueta: true },\r\n      { radio: r * 0.99, arriba: tapa + cuello + altoEtiqueta, alto: base, tono: '#161616' }\r\n    ];\r\n    visorGira.innerHTML = '';\r\n    $$('.visor__sombra', visorTarro).forEach(function (el) { el.remove(); });\r\n    visorTarro.style.width = d + 'px'; visorTarro.style.height = alto + 'px';\r\n    partes.forEach(function (p) {\r\n      anillo(visorGira, 'visor__tira', p.etiqueta ? 72 : 40, p.radio, p.arriba, p.alto, 0.7, function (s, i, w) {\r\n        if (!p.etiqueta) { s.background = p.tono; return; }\r\n        s.backgroundImage = 'url(' + K.ruta('etiqueta-plana.webp') + ')';\r\n        s.backgroundSize = circ + 'px ' + (altoEtiqueta + 0.5) + 'px';\r\n        s.backgroundPosition = (w / 2 - (i / 72) * circ) + 'px 0';\r\n      });\r\n      // Luz fija: desde la izquierda y un poco de frente\r\n      anillo(visorTarro, 'visor__sombra', 60, p.radio + 0.8, p.arriba, p.alto, 0.25, function (s, i) {\r\n        var tono = function (fi) {\r\n          if (fi > 180) fi -= 360;\r\n          var luz = Math.max(0, Math.cos((fi + 32) * Math.PI / 180));\r\n          var sombra = Math.min(0.94, Math.max(0.86 * (1 - luz), 0.92 * Math.pow(Math.abs(fi) / 90, 5)));\r\n          var brillo = Math.pow(luz, 40) * (p.etiqueta ? 0.09 : 0.2);\r\n          return brillo > sombra ? 'rgba(255,255,255,' + (brillo - sombra).toFixed(3) + ')' : 'rgba(0,0,0,' + (sombra - brillo).toFixed(3) + ')';\r\n        };\r\n        s.background = 'linear-gradient(90deg,' + tono(i * 6 - 3) + ',' + tono(i * 6 + 3) + ')';\r\n      });\r\n    });\r\n    var disco = document.createElement('i'), R = r * 1.035, ds = disco.style;\r\n    disco.className = 'visor__tira';\r\n    ds.width = ds.height = (2 * R) + 'px'; ds.marginLeft = (-R) + 'px'; ds.top = (-R) + 'px';\r\n    ds.borderRadius = '50%'; ds.background = 'radial-gradient(circle at 38% 40%, #4a4a4a, #262626 70%, #1d1d1d)';\r\n    ds.transform = 'rotateX(90deg)'; ds.backfaceVisibility = 'visible'; ds.webkitBackfaceVisibility = 'visible';\r\n    visorGira.appendChild(disco);\r\n  }\r\n\r\n  function girarVisor(t) {\r\n    V.cuadro = requestAnimationFrame(girarVisor);\r\n    var dt = Math.min(0.05, (t - V.antes) / 1000 || 0.016); V.antes = t;\r\n    if (V.meta !== null) {\r\n      var falta = ((V.meta - V.ang) % 360 + 540) % 360 - 180;\r\n      V.ang += falta * Math.min(1, dt * 6);\r\n      if (Math.abs(falta) < 0.3) V.meta = null;\r\n    } else if (!V.arrastre) {\r\n      V.ang += V.vel * dt;\r\n      V.vel *= Math.exp(-2.6 * dt);\r\n      if (V.auto && !sinMovimiento.matches) V.ang += 16 * dt;\r\n    }\r\n    visorGira.style.setProperty('--ang', V.ang.toFixed(2) + 'deg');\r\n  }\r\n\r\n  document.getElementById('panel-tarro').addEventListener('toggle', function () {\r\n    cancelAnimationFrame(V.cuadro); V.cuadro = 0;\r\n    if (!this.open) return;\r\n    armarVisor();\r\n    V.antes = performance.now();\r\n    V.cuadro = requestAnimationFrame(girarVisor);\r\n  });\r\n  visor.addEventListener('pointerdown', function (e) {\r\n    V.arrastre = { x: e.clientX, t: performance.now() }; V.auto = false; V.meta = null; V.vel = 0;\r\n    try { visor.setPointerCapture(e.pointerId); } catch (err) { /* sin captura */ }\r\n  });\r\n  visor.addEventListener('pointermove', function (e) {\r\n    if (!V.arrastre) return;\r\n    var ahora = performance.now(), dx = e.clientX - V.arrastre.x;\r\n    var grados = dx * 150 / (V.d || 200);\r\n    V.ang += grados;\r\n    V.vel = grados / Math.max(0.008, (ahora - V.arrastre.t) / 1000);\r\n    V.arrastre = { x: e.clientX, t: ahora };\r\n  });\r\n  ['pointerup', 'pointercancel'].forEach(function (tipo) {\r\n    visor.addEventListener(tipo, function () { V.arrastre = null; V.vel = Math.max(-500, Math.min(500, V.vel)); });\r\n  });\r\n  $$('[data-visor-ir]').forEach(function (b) {\r\n    b.addEventListener('click', function () { V.auto = false; V.vel = 0; V.meta = -parseFloat(b.getAttribute('data-visor-ir')) * 360; });\r\n  });\r\n\r\n  /* ---------- Kallpa Club: entrar y crear cuenta ----------\r\n     La cuenta vive en el club (otro dominio). La web le env\u00EDa el correo y la contrase\u00F1a, y el club responde\r\n     si la persona tiene acceso; si lo tiene, entrega un enlace de entrada de un solo uso. La web no guarda\r\n     contrase\u00F1as ni sesiones. */\r\n\r\n  var parametros = new URLSearchParams(location.search);\r\n  var enPruebas = parametros.get('club') === 'pruebas';\r\n  var clubAbierto = K.clubAbierto === true || parametros.get('club') === 'abierto' || enPruebas;\r\n  // ?club=pruebas apunta al club de pruebas de KALLPA (una direcci\u00F3n fija nuestra, no una que venga en el enlace)\r\n  var clubApi = enPruebas ? K.enlaces.clubPruebas : K.enlaces.club;\r\n  // Solo en el computador de desarrollo se permite apuntar a un club de pruebas. Nunca en la web publicada:\r\n  // un enlace no debe poder desviar a d\u00F3nde se env\u00EDan el correo y la contrase\u00F1a.\r\n  if (location.hostname === 'localhost' && parametros.get('clubapi')) clubApi = parametros.get('clubapi');\r\n\r\n  if (clubAbierto) {\r\n    document.documentElement.classList.add('club-abierto');\r\n    $$('[data-club-texto]').forEach(function (el) { el.textContent = el.getAttribute('data-club-texto'); });\r\n    $('[data-club-pronto]').hidden = true;\r\n    $('[data-club]').hidden = false;\r\n    $('[data-club-olvide]').href = clubApi;\r\n  }\r\n\r\n  (function () {\r\n    var forma = $('[data-club-forma]'), error = $('[data-club-error]'), enviar = $('[data-club-enviar]');\r\n    var resultado = $('[data-club-resultado]'), enlaceEntrar = $('[data-club-entrar]'), robot = $('[data-club-robot]');\r\n    var modo = 'entrar', fichaRobot = '', widget = null, robotListo = false, vence = 0;\r\n    var formaCodigo = $('[data-club-codigo]'), errorCodigo = $('[data-club-codigo-error]'), enviarCodigo = $('[data-club-codigo-enviar]');\r\n    // Mientras se confirma el c\u00F3digo, el correo y la contrase\u00F1a se guardan solo en memoria (nunca en el navegador)\r\n    var pendiente = null;\r\n    // \"Crear cuenta\" solo existe si el club tiene el registro abierto; si no, la cuenta llega con la compra\r\n    var registroAbierto = false;\r\n    function verModos(si) { $('.club__modos').hidden = !(si && registroAbierto) || !!(appClub && !appClub.hidden); }\r\n\r\n    // La app del club primero (Esteban, 22/10/2026: \"que quede como una app de solo el club\"): el bot\u00F3n abre el club en\r\n    // su propia direcci\u00F3n, donde se guarda en el inicio. Entrar aqu\u00ED mismo queda como segunda opci\u00F3n. Quien llega con\r\n    // una invitaci\u00F3n va directo al formulario, que es el que lleva el c\u00F3digo de quien lo invit\u00F3.\r\n    var appClub = $('[data-club-app]');\r\n    function verApp(si) {\r\n      if (!appClub) return;\r\n      appClub.hidden = !si;\r\n      forma.hidden = si;\r\n      $('.club__regla').hidden = si;\r\n      if (si) $('.club__modos').hidden = true;\r\n    }\r\n\r\n    // C\u00F3digo de invitaci\u00F3n: llega en el enlace (?ref=C\u00D3DIGO) y se recuerda durante la visita\r\n    var codigoRef = '';\r\n    try {\r\n      codigoRef = (parametros.get('ref') || '').replace(/[^A-Za-z0-9]/g, '').slice(0, 12).toUpperCase();\r\n      if (codigoRef) sessionStorage.setItem('kallpa.ref', codigoRef);\r\n      else codigoRef = sessionStorage.getItem('kallpa.ref') || '';\r\n    } catch (err) { /* sin almacenamiento: el c\u00F3digo vale solo si viene en el enlace */ }\r\n\r\n    function ponerModo(nuevo) {\r\n      modo = nuevo;\r\n      $$('[data-club-modo]').forEach(function (b) { b.setAttribute('aria-pressed', b.getAttribute('data-club-modo') === modo ? 'true' : 'false'); });\r\n      $$('[data-solo-registro]', forma).forEach(function (el) { el.hidden = modo !== 'registro'; });\r\n      $('[data-club-invitado]').hidden = !codigoRef;\r\n      $('[data-club-sin-invitado]').hidden = !!codigoRef;\r\n      if (modo === 'registro' && codigoRef && !forma.elements.referral_code.value) forma.elements.referral_code.value = codigoRef;\r\n      forma.elements.password.autocomplete = modo === 'registro' ? 'new-password' : 'current-password';\r\n      enviar.textContent = modo === 'registro' ? 'Crear mi cuenta' : 'Iniciar sesi\u00F3n';\r\n      $('[data-club-olvide]').hidden = modo === 'registro';\r\n      $('[data-club-sin-acceso]').hidden = registroAbierto;\r\n      error.textContent = '';\r\n      if (modo === 'registro') prepararRobot();\r\n    }\r\n    $$('[data-club-modo]').forEach(function (b) { b.addEventListener('click', function () { ponerModo(b.getAttribute('data-club-modo')); }); });\r\n\r\n    // \"No soy un robot\" (Cloudflare Turnstile): el club la exige para crear cuentas. La llave p\u00FAblica se le pide al club.\r\n    function prepararRobot() {\r\n      if (robotListo) return;\r\n      robotListo = true;\r\n      fetch(clubApi + '/api/web/config').then(function (r) { return r.json(); }).then(function (c) {\r\n        if (!c.turnstile_site_key) throw new Error('sin llave');\r\n        window.kallpaRobot = function () {\r\n          widget = window.turnstile.render(robot, {\r\n            sitekey: c.turnstile_site_key, theme: 'dark', language: 'es',\r\n            callback: function (t) { fichaRobot = t; },\r\n            'expired-callback': function () { fichaRobot = ''; },\r\n            'error-callback': function () { fichaRobot = ''; robot.textContent = 'No pudimos cargar la verificaci\u00F3n de seguridad. Recarga la p\u00E1gina o crea tu cuenta directamente en el club.'; }\r\n          });\r\n        };\r\n        var s = document.createElement('script');\r\n        s.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=kallpaRobot';\r\n        s.async = true;\r\n        s.onerror = function () { robot.textContent = 'No pudimos cargar la verificaci\u00F3n de seguridad. Revisa tu conexi\u00F3n.'; robotListo = false; };\r\n        document.head.appendChild(s);\r\n      }).catch(function () { robotListo = false; robot.textContent = 'No pudimos conectar con el club. Int\u00E9ntalo de nuevo en un momento.'; });\r\n    }\r\n\r\n    function validar(d) {\r\n      if (modo === 'registro' && d.name.length < 3) return ['name', 'Escribe tu nombre completo.'];\r\n      if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(d.email)) return ['email', 'Escribe un correo v\u00E1lido.'];\r\n      if (!d.password) return ['password', 'Escribe tu contrase\u00F1a.'];\r\n      if (modo === 'registro' && d.password.length < 8) return ['password', 'La contrase\u00F1a debe tener al menos 8 caracteres.'];\r\n      if (modo === 'registro' && !d.purchase_email) return ['purchase_email', 'Escribe el correo o tel\u00E9fono con el que compraste COFFEE WORKOUT.'];\r\n      if (modo === 'registro' && !fichaRobot) return [null, 'Espera a que cargue la verificaci\u00F3n de seguridad e int\u00E9ntalo de nuevo.'];\r\n      return null;\r\n    }\r\n\r\n    function mostrar(d) {\r\n      var nombre = (d.user && d.user.name ? d.user.name : '').split(' ')[0];\r\n      var estado = d.user && d.user.eligibility_status;\r\n      $('[data-club-saludo]').textContent = d.acceso ? 'Hola, ' + nombre + '.' : estado === 'rejected' ? 'No pudimos confirmar tu compra' : 'Estamos confirmando tu compra';\r\n      $('[data-club-mensaje]').textContent = d.acceso\r\n        ? 'Tu acceso a Kallpa Club est\u00E1 activo.'\r\n        : estado === 'rejected'\r\n          ? 'Kallpa Club es para quienes compraron COFFEE WORKOUT. Si crees que es un error, escr\u00EDbenos y lo revisamos.'\r\n          : d.revision_manual\r\n            ? nombre + ', tu cuenta ya est\u00E1 creada. Como nos diste un tel\u00E9fono, confirmamos tu compra a mano: en cuanto la revisemos podr\u00E1s entrar.'\r\n          : nombre + ', tu cuenta ya est\u00E1 creada. Con el dato que nos diste todav\u00EDa no encontramos tu compra, as\u00ED que la revisamos a mano: en cuanto la confirmemos podr\u00E1s entrar. Si compraste con otro correo o tel\u00E9fono, escr\u00EDbenos.';\r\n      enlaceEntrar.hidden = !d.acceso;\r\n      $('[data-club-wa]').hidden = !!d.acceso;\r\n      if (d.acceso) { enlaceEntrar.href = d.entrar; enlaceEntrar.textContent = 'Entrar a Kallpa Club'; vence = Date.now() + 110000; }\r\n      forma.hidden = true; formaCodigo.hidden = true; verModos(false); $('.club__regla').hidden = true;\r\n      resultado.hidden = false;\r\n      // Con el acceso activo, el club se abre de una (Esteban, 22/10/2026: \"si meto usuario y contrase\u00F1a no debe\r\n      // volverme a preguntar\"), y en su propia direcci\u00F3n, no dentro de la tienda (23/10/2026: \"que quede independiente\r\n      // a la web\"): all\u00E1 queda su sesi\u00F3n y sale la gu\u00EDa para guardarlo como app. Si la persona vuelve a la tienda, el\r\n      // bot\u00F3n la lleva al club, que ya la reconoce.\r\n      if (d.acceso) {\r\n        vence = 0;\r\n        registrar('club_entrar', {});\r\n        enlaceEntrar.href = clubApi;\r\n        enlaceEntrar.removeAttribute('target');\r\n        enlaceEntrar.textContent = 'Abrir mi club';\r\n        location.assign(d.entrar);\r\n        return;\r\n      }\r\n      resultado.focus();\r\n    }\r\n\r\n    // El enlace de entrada dura dos minutos y sirve una sola vez: usado o vencido, hay que volver a entrar\r\n    function reiniciar() {\r\n      pendiente = null; formaCodigo.hidden = true; formaCodigo.elements.codigo.value = ''; errorCodigo.textContent = '';\r\n      resultado.hidden = true; forma.hidden = false; verModos(true); $('.club__regla').hidden = false;\r\n      forma.elements.password.value = '';\r\n      ponerModo('entrar');\r\n    }\r\n    // El club se abre aqu\u00ED mismo, a pantalla completa: no hay otra pesta\u00F1a ni otra direcci\u00F3n. La primera vez\r\n    // carga con el enlace de entrada (dura dos minutos y sirve una vez); despu\u00E9s la vista queda viva en la\r\n    // p\u00E1gina y volver a abrirla es inmediato, sin entrar de nuevo.\r\n    var vista = $('[data-clubvista]'), marco = $('[data-clubvista-marco]'), vistaViva = false, panelClub = document.getElementById('panel-club');\r\n    function abrirVista(enlace) {\r\n      if (!vistaViva) { marco.src = enlace; vistaViva = true; }\r\n      if (panelClub.open) panelClub.close();\r\n      vista.hidden = false;\r\n      $('[data-clubvista-cerrar]').focus();\r\n    }\r\n    function cerrarVista(terminoSesion) {\r\n      vista.hidden = true;\r\n      if (terminoSesion) { vistaViva = false; marco.removeAttribute('src'); reiniciar(); }\r\n    }\r\n    $('[data-clubvista-cerrar]').addEventListener('click', function () { cerrarVista(false); });\r\n    document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && !vista.hidden) cerrarVista(false); });\r\n    // El club avisa cuando la sesi\u00F3n termina (salir o inactividad): se cierra la vista y vuelve el ingreso\r\n    window.addEventListener('message', function (e) {\r\n      var origenClub = '';\r\n      try { origenClub = new URL(clubApi).origin; } catch (err) { return; }\r\n      if (e.origin !== origenClub || !e.data || e.data.origen !== 'kallpa-club') return;\r\n      if (e.data.evento === 'salir' && vistaViva) cerrarVista(true);\r\n    });\r\n    // El club va en su propia direcci\u00F3n (23/10/2026): el bot\u00F3n lleva all\u00E1 en esta misma pesta\u00F1a\r\n    enlaceEntrar.addEventListener('click', function (e) {\r\n      e.preventDefault();\r\n      registrar('club_entrar', {});\r\n      location.assign(enlaceEntrar.href);\r\n    });\r\n    // Con la vista ya abierta en esta visita, el bot\u00F3n del club de la cabecera lleva directo a ella\r\n    document.addEventListener('click', function (e) {\r\n      var b = e.target.closest && e.target.closest('[data-panel=\"club\"]');\r\n      if (b && vistaViva) { e.preventDefault(); e.stopPropagation(); abrirVista(''); }\r\n    }, true);\r\n    $('[data-club-otra]').addEventListener('click', reiniciar);\r\n    $('[data-club-codigo-otra]').addEventListener('click', reiniciar);\r\n\r\n    // Una petici\u00F3n al club con el mismo corte de 20 segundos del formulario principal\r\n    function pedirAlClub(ruta, cuerpo) {\r\n      var corte = typeof AbortController === 'function' ? new AbortController() : null;\r\n      var reloj = setTimeout(function () { if (corte) corte.abort(); }, 20000);\r\n      return fetch(clubApi + ruta, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(cuerpo), signal: corte ? corte.signal : undefined })\r\n        .then(function (r) { return r.json().catch(function () { return {}; }).then(function (datos) { clearTimeout(reloj); if (!r.ok) throw new Error(datos.error || 'No pudimos completar la solicitud. Int\u00E9ntalo de nuevo.'); return datos; }); })\r\n        .catch(function (ex) { clearTimeout(reloj); throw ex instanceof TypeError || ex.name === 'AbortError' ? new Error('No pudimos conectar con el club. Revisa tu conexi\u00F3n e int\u00E9ntalo de nuevo.') : ex; });\r\n    }\r\n\r\n    // El club pide confirmar el correo de compra: llega un c\u00F3digo de 6 d\u00EDgitos a ese correo\r\n    function mostrarCodigo(confirmar, credenciales) {\r\n      pendiente = credenciales;\r\n      $('[data-club-codigo-texto]').textContent = 'Te enviamos un c\u00F3digo de 6 d\u00EDgitos a ' + confirmar.destino + ', el correo de tu compra. Escr\u00EDbelo aqu\u00ED para confirmar que es tuyo.';\r\n      errorCodigo.textContent = '';\r\n      forma.hidden = true; resultado.hidden = true; verModos(false); $('.club__regla').hidden = true;\r\n      formaCodigo.hidden = false;\r\n      formaCodigo.elements.codigo.value = '';\r\n      formaCodigo.elements.codigo.focus();\r\n    }\r\n    formaCodigo.addEventListener('submit', function (e) {\r\n      e.preventDefault();\r\n      errorCodigo.textContent = '';\r\n      var codigo = formaCodigo.elements.codigo.value.replace(/\\D/g, '');\r\n      if (codigo.length !== 6) { errorCodigo.textContent = 'Escribe los 6 d\u00EDgitos del c\u00F3digo.'; formaCodigo.elements.codigo.focus(); return; }\r\n      if (!pendiente) { reiniciar(); return; }\r\n      enviarCodigo.disabled = true; enviarCodigo.textContent = 'Confirmando\u2026';\r\n      pedirAlClub('/api/web/confirm', { email: pendiente.email, password: pendiente.password, codigo: codigo })\r\n        .then(function (datos) { pendiente = null; registrar('club_codigo', { acceso: !!datos.acceso }); mostrar(datos); })\r\n        .catch(function (ex) { errorCodigo.textContent = ex.message; })\r\n        .then(function () { enviarCodigo.disabled = false; enviarCodigo.textContent = 'Confirmar'; });\r\n    });\r\n    $('[data-club-reenviar]').addEventListener('click', function () {\r\n      if (!pendiente) { reiniciar(); return; }\r\n      var boton = this;\r\n      boton.disabled = true; errorCodigo.textContent = '';\r\n      pedirAlClub('/api/web/resend', pendiente)\r\n        .then(function (datos) { errorCodigo.textContent = 'Te enviamos un c\u00F3digo nuevo a ' + datos.confirmar.destino + '. El anterior ya no sirve.'; formaCodigo.elements.codigo.value = ''; formaCodigo.elements.codigo.focus(); })\r\n        .catch(function (ex) { errorCodigo.textContent = ex.message; })\r\n        .then(function () { boton.disabled = false; });\r\n    });\r\n\r\n    forma.addEventListener('submit', function (e) {\r\n      e.preventDefault();\r\n      error.textContent = '';\r\n      var el = forma.elements;\r\n      var d = { email: el.email.value.trim(), password: el.password.value };\r\n      if (modo === 'registro') { d.name = el.name.value.trim().replace(/\\s+/g, ' '); d.purchase_email = el.purchase_email.value.trim(); d.phone = el.phone.value.trim(); d.turnstile_token = fichaRobot; var escrito = el.referral_code.value.replace(/[^A-Za-z0-9]/g, '').toUpperCase(); if (escrito) d.referral_code = escrito; }\r\n      // Al entrar con el enlace de invitaci\u00F3n, el club anota qui\u00E9n lo invit\u00F3 (solo en su primer mes)\r\n      else if (codigoRef) d.referral_code = codigoRef;\r\n      var falla = validar(d);\r\n      if (falla) { error.textContent = falla[1]; if (falla[0]) el[falla[0]].focus(); return; }\r\n      enviar.disabled = true; enviar.textContent = modo === 'registro' ? 'Creando tu cuenta\u2026' : 'Entrando\u2026';\r\n      // Si el club no responde en 20 segundos se corta la espera: el bot\u00F3n no debe quedarse cargando para siempre\r\n      var corte = typeof AbortController === 'function' ? new AbortController() : null;\r\n      var reloj = setTimeout(function () { if (corte) corte.abort(); }, 20000);\r\n      fetch(clubApi + (modo === 'registro' ? '/api/web/signup' : '/api/web/login'), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(d), signal: corte ? corte.signal : undefined })\r\n        .then(function (r) { return r.json().catch(function () { return {}; }).then(function (datos) { return { ok: r.ok, datos: datos }; }); })\r\n        .then(function (r) {\r\n          if (!r.ok) throw new Error(r.datos.error || 'No pudimos completar la solicitud. Int\u00E9ntalo de nuevo.');\r\n          el.password.value = '';\r\n          registrar(modo === 'registro' ? 'club_registro' : 'club_login', { acceso: !!r.datos.acceso });\r\n          if (modo === 'registro') { codigoRef = ''; try { sessionStorage.removeItem('kallpa.ref'); } catch (err) { /* nada que borrar */ } }\r\n          if (r.datos.confirmar) mostrarCodigo(r.datos.confirmar, { email: d.email, password: d.password });\r\n          else mostrar(r.datos);\r\n        })\r\n        .catch(function (ex) {\r\n          error.textContent = ex instanceof TypeError || ex.name === 'AbortError' ? 'No pudimos conectar con el club. Revisa tu conexi\u00F3n e int\u00E9ntalo de nuevo.' : ex.message;\r\n          // La verificaci\u00F3n de seguridad sirve una sola vez: tras un intento fallido se pide otra\r\n          if (widget !== null && window.turnstile) { fichaRobot = ''; window.turnstile.reset(widget); }\r\n        })\r\n        .then(function () { clearTimeout(reloj); enviar.disabled = false; enviar.textContent = modo === 'registro' ? 'Crear mi cuenta' : 'Iniciar sesi\u00F3n'; });\r\n    });\r\n    if (appClub) {\r\n      $('[data-club-app-abrir]').href = clubApi;\r\n      $('[data-club-app-abrir]').addEventListener('click', function () { registrar('club_app', {}); });\r\n      $('[data-club-app-aqui]').addEventListener('click', function () { verApp(false); verModos(true); forma.elements.email.focus(); });\r\n      verApp(!codigoRef);\r\n    }\r\n    // Si el club tiene el registro abierto, vuelve \"Crear cuenta\" (y quien llega con una invitaci\u00F3n va directo ah\u00ED)\r\n    if (clubAbierto) {\r\n    document.documentElement.classList.add('club-abierto');\r\n      fetch(clubApi + '/api/web/config').then(function (r) { return r.json(); }).then(function (c) {\r\n        if (c.registro_abierto !== true) return;\r\n        registroAbierto = true;\r\n        var regla = $('.club__regla');\r\n        regla.textContent = regla.getAttribute('data-regla-registro');\r\n        $('[data-club-sin-acceso]').hidden = true;\r\n        if (!forma.hidden) verModos(true);\r\n        if (codigoRef) ponerModo('registro');\r\n      }).catch(function () { /* sin respuesta: queda solo el ingreso */ });\r\n    }\r\n  })();\r\n\r\n  /* ---------- La cabecera siempre cabe (26/10/2026, Esteban: \"eso no puede pasar\") ----------\r\n     Seg\u00FAn el ancho del celular, el bot\u00F3n dorado de turno (Club o Comprar) y los d\u00EDgitos del carrito, \"KALLPA\r\n     NUTRITION\" puede no caber junto a los botones. Si no cabe queda solo el logo KN (hud--apretada); si aun as\u00ED no\r\n     cabe, los botones se achican (hud--mini). Una vez apretada no vuelve a cambiar mientras no cambie el ancho de la\r\n     pantalla, para que la cabecera no salte al pasar de un cap\u00EDtulo a otro. */\r\n  (function () {\r\n    var hud = $('.hud'), marca = $('.hud .marca'), acciones = $('.hud__acciones');\r\n    if (!hud || !marca || !acciones) return;\r\n    var anchoVisto = 0;\r\n    function noCabe() {\r\n      var visibles = Array.prototype.filter.call(acciones.children, function (e) { return e.offsetWidth > 0; });\r\n      if (!visibles.length) return false;\r\n      var izq = visibles[0].getBoundingClientRect().left;\r\n      var der = visibles[visibles.length - 1].getBoundingClientRect().right;\r\n      return marca.getBoundingClientRect().right > izq - 8 || der > document.documentElement.clientWidth - 4;\r\n    }\r\n    function ajustar() {\r\n      var w = document.documentElement.clientWidth;\r\n      if (w !== anchoVisto) { anchoVisto = w; hud.classList.remove('hud--apretada', 'hud--mini'); }\r\n      if (!hud.classList.contains('hud--apretada') && noCabe()) hud.classList.add('hud--apretada');\r\n      if (hud.classList.contains('hud--apretada') && !hud.classList.contains('hud--mini') && noCabe()) hud.classList.add('hud--mini');\r\n    }\r\n    var pendiente = 0;\r\n    function pronto() { cancelAnimationFrame(pendiente); pendiente = requestAnimationFrame(ajustar); }\r\n    window.addEventListener('resize', pronto);\r\n    if (window.ResizeObserver) new ResizeObserver(pronto).observe(acciones);\r\n    // Al cambiar de cap\u00EDtulo cambia el bot\u00F3n dorado; al sumar al carrito, los d\u00EDgitos\r\n    new MutationObserver(pronto).observe(raiz, { attributes: true, attributeFilter: ['data-cap'] });\r\n    var cuentaHud = $('[data-cuenta]');\r\n    if (cuentaHud) new MutationObserver(pronto).observe(cuentaHud, { childList: true, characterData: true, subtree: true, attributes: true, attributeFilter: ['hidden'] });\r\n    if (document.fonts && document.fonts.ready) document.fonts.ready.then(pronto);\r\n    ajustar();\r\n  })();\r\n\r\n  /* ---------- Giroscopio: el tarro sigue el movimiento del celular ---------- */\r\n\r\n  var tarroCuerpo = $('.tarro__cuerpo');\r\n  function inclinar(x, y, gradosX, gradosY) {\r\n    tarroCuerpo.style.setProperty('--gx', (x * gradosX).toFixed(2) + 'deg');\r\n    tarroCuerpo.style.setProperty('--gy', (-y * gradosY).toFixed(2) + 'deg');\r\n    tarroCuerpo.style.setProperty('--bx', (50 - x * 46).toFixed(1) + '%');\r\n  }\r\n\r\n  var giro = { activo: false, base: null, x: 0, y: 0, sx: 0, sy: 0, cuadro: 0, ultimo: 0 };\r\n  var limitar = function (v) { return Math.max(-1, Math.min(1, v)); };\r\n\r\n  function alGirar(e) {\r\n    if (e.gamma === null || e.beta === null) return;\r\n    // La posici\u00F3n en que la persona sostiene el celular es el punto neutro,\r\n    // y se va recentrando despacio para que el tarro no quede torcido.\r\n    if (!giro.base) giro.base = { g: e.gamma, b: e.beta };\r\n    giro.base.g += (e.gamma - giro.base.g) * 0.01;\r\n    giro.base.b += (e.beta - giro.base.b) * 0.01;\r\n    giro.x = limitar((e.gamma - giro.base.g) / 22);\r\n    giro.y = limitar((e.beta - giro.base.b) / 22);\r\n    giro.ultimo = Date.now();\r\n    if (!giro.cuadro) giro.cuadro = requestAnimationFrame(aplicarGiro);\r\n  }\r\n\r\n  function aplicarGiro() {\r\n    giro.sx += (giro.x - giro.sx) * 0.14; giro.sy += (giro.y - giro.sy) * 0.14;\r\n    if (!hayDialogo() && modoPulso) {\r\n      inclinar(giro.sx, giro.sy, 17, 12);\r\n      mira.tx = giro.sx; mira.ty = giro.sy;\r\n      raiz.style.setProperty('--mx', giro.sx.toFixed(3));\r\n      raiz.style.setProperty('--my', giro.sy.toFixed(3));\r\n    }\r\n    // Sigue mientras lleguen lecturas o falte suavizar\r\n    var quieto = Math.abs(giro.x - giro.sx) + Math.abs(giro.y - giro.sy) < 0.004;\r\n    giro.cuadro = (quieto && Date.now() - giro.ultimo > 400) ? 0 : requestAnimationFrame(aplicarGiro);\r\n  }\r\n\r\n  function encenderGiro() {\r\n    if (giro.activo) return;\r\n    giro.activo = true;\r\n    setTimeout(ajustarTarro, 0);\r\n    window.addEventListener('deviceorientation', alGirar, { passive: true });\r\n    botonGiro.hidden = true;\r\n  }\r\n\r\n  if ('DeviceOrientationEvent' in window && !punteroFino && !sinMovimiento.matches) {\r\n    if (typeof DeviceOrientationEvent.requestPermission === 'function') {\r\n      // Donde existe permiso (iPhone), el sistema solo deja pedirlo tras un toque.\r\n      // Primero se intenta sin molestar: si ya estaba concedido, se enciende solo;\r\n      // si no, aparece el bot\u00F3n.\r\n      // Si la persona ya lo permiti\u00F3 una vez, la web lo recuerda y no vuelve a mostrarle el bot\u00F3n: en su\r\n      // siguiente visita el 3D se enciende con su primer toque en cualquier parte de la p\u00E1gina.\r\n      var LLAVE_GIRO = 'kallpa.giro';\r\n      var yaPermitio = false;\r\n      try { yaPermitio = localStorage.getItem(LLAVE_GIRO) === '1'; } catch (err) { /* sin almacenamiento */ }\r\n      var recordarGiro = function (si) { try { if (si) localStorage.setItem(LLAVE_GIRO, '1'); else localStorage.removeItem(LLAVE_GIRO); } catch (err) { /* sin almacenamiento */ } };\r\n      var pedirGiro = function (alFallar) {\r\n        var pedido;\r\n        try { pedido = DeviceOrientationEvent.requestPermission(); } catch (err) { pedido = Promise.reject(err); }\r\n        pedido.then(function (r) {\r\n          if (r === 'granted') { recordarGiro(true); encenderGiro(); }\r\n          else { recordarGiro(false); botonGiro.hidden = false; } // lo neg\u00F3 en el aviso del sistema: queda el bot\u00F3n por si cambia de idea\r\n        }).catch(alFallar);\r\n      };\r\n      var conPrimerToque = function () {\r\n        var unaVez = function () {\r\n          document.removeEventListener('touchend', unaVez, true);\r\n          document.removeEventListener('click', unaVez, true);\r\n          if (!giro.activo) pedirGiro(function () { botonGiro.hidden = false; });\r\n        };\r\n        document.addEventListener('touchend', unaVez, true);\r\n        document.addEventListener('click', unaVez, true);\r\n      };\r\n      botonGiro.addEventListener('click', function () { pedirGiro(function () { botonGiro.hidden = true; }); });\r\n      // Primero, sin molestar: si el sistema todav\u00EDa lo tiene concedido, se enciende solo\r\n      pedirGiro(function () {\r\n        if (yaPermitio) { botonGiro.hidden = true; conPrimerToque(); }\r\n        else botonGiro.hidden = false;\r\n      });\r\n    } else {\r\n      encenderGiro(); // Android: no pide permiso\r\n    }\r\n  }\r\n\r\n  /* ---------- App instalable ---------- */\r\n\r\n  // Chrome en Android avisa con beforeinstallprompt y ah\u00ED se muestra el bot\u00F3n.\r\n  // En los dem\u00E1s casos no hay aviso, as\u00ED que se explica el paso manual que\r\n  // corresponde a cada navegador en vez de no mostrar nada.\r\n  var cajaInstalar = $('[data-instalar]');\r\n  var botonInstalar = $('[data-instalar-boton]');\r\n  var textoInstalar = $('[data-instalar-texto]');\r\n  var ofertaInstalar = null;\r\n  var agente = navigator.userAgent;\r\n  var yaInstalada = window.matchMedia('(display-mode: standalone)').matches || navigator.standalone === true;\r\n  var esIos = /iphone|ipad|ipod/i.test(agente);\r\n  var esAndroid = /android/i.test(agente);\r\n  // Navegadores internos de otras apps: desde ah\u00ED no se puede instalar\r\n  var dentroDeOtraApp = /Instagram|FBAN|FBAV|FB_IAB|Line\\/|TikTok|musical_ly|; wv\\)/i.test(agente);\r\n\r\n  function pintarInstalar() {\r\n    if (yaInstalada || location.protocol === 'file:') { cajaInstalar.hidden = true; return; }\r\n    botonInstalar.hidden = !ofertaInstalar;\r\n    if (ofertaInstalar) {\r\n      textoInstalar.textContent = 'Inst\u00E1lala como app: queda con su \u00EDcono y abre a pantalla completa. No necesita tienda de aplicaciones.';\r\n    } else if (dentroDeOtraApp) {\r\n      textoInstalar.textContent = 'Est\u00E1s viendo KALLPA dentro de otra app. Toca el men\u00FA (\u22EF o \u22EE) y elige \"Abrir en el navegador\"; desde Chrome o Safari podr\u00E1s instalarla.';\r\n    } else if (esIos && !/crios|fxios|edgios/i.test(agente)) {\r\n      textoInstalar.textContent = 'Toca el bot\u00F3n Compartir de Safari (el cuadro con la flecha hacia arriba) y luego \"Agregar a pantalla de inicio\".';\r\n    } else if (esIos) {\r\n      textoInstalar.textContent = 'Toca Compartir y luego \"Agregar a pantalla de inicio\". Si no ves esa opci\u00F3n, abre este enlace en Safari.';\r\n    } else if (esAndroid) {\r\n      textoInstalar.textContent = 'Toca el men\u00FA \u22EE del navegador y elige \"Instalar app\" o \"Agregar a pantalla principal\".';\r\n    } else {\r\n      cajaInstalar.hidden = true; // computador sin aviso del navegador\r\n      return;\r\n    }\r\n    cajaInstalar.hidden = false;\r\n  }\r\n\r\n  // Dentro de Shopify no hay /sw.js en la ra\u00EDz: ah\u00ED la app se instala sin modo sin conexi\u00F3n.\r\n  if ('serviceWorker' in navigator && location.protocol !== 'file:' && !K.shopify) {\r\n    window.addEventListener('load', function () { navigator.serviceWorker.register('/sw.js').catch(function () { /* sin app instalable */ }); });\r\n  }\r\n  window.addEventListener('beforeinstallprompt', function (e) { e.preventDefault(); ofertaInstalar = e; pintarInstalar(); });\r\n  window.addEventListener('appinstalled', function () { ofertaInstalar = null; yaInstalada = true; pintarInstalar(); });\r\n  botonInstalar.addEventListener('click', function () {\r\n    if (!ofertaInstalar) return;\r\n    var oferta = ofertaInstalar;\r\n    ofertaInstalar = null;\r\n    oferta.prompt();\r\n    oferta.userChoice.then(function (r) { if (r.outcome === 'accepted') yaInstalada = true; pintarInstalar(); }).catch(pintarInstalar);\r\n  });\r\n  pintarInstalar();\r\n\r\n  /* ---------- Arranque ---------- */\r\n\r\n  var inicial = caps.findIndex(function (c) { return '#' + c.id === location.hash; });\r\n  // Dentro de Shopify, cada p\u00E1gina de la tienda dice d\u00F3nde debe abrir (KALLPA_INICIO)\r\n  var inicio = window.KALLPA_INICIO || {};\r\n  // Orden: un enlace con #cap\u00EDtulo manda; si se recarg\u00F3 la p\u00E1gina, se vuelve a donde se estaba; si no, lo que diga la tienda\r\n  var recargada = false, guardado = -1;\r\n  try {\r\n    var entrada = performance.getEntriesByType('navigation')[0];\r\n    recargada = !!entrada && entrada.type === 'reload';\r\n    guardado = parseInt(sessionStorage.getItem(LLAVE_CAP), 10);\r\n  } catch (err) { /* sin almacenamiento */ }\r\n  if (inicial > 0) actual = inicial;\r\n  else if (recargada && guardado > 0 && guardado < caps.length) actual = guardado;\r\n  else if (inicio.capitulo > 0 && inicio.capitulo < caps.length) actual = inicio.capitulo;\r\n  var abrirClub = location.hash === '#club';\r\n\r\n  medir(); sembrar();\r\n  activarModo();\r\n  if (sinMovimiento.matches) cuadroFijo(); else gobernarFondo();\r\n  if (abrirClub) abrir(document.getElementById('panel-club'));\r\n  else if (inicio.panel === 'carrito') abrir(carrito);\r\n  else if (inicio.panel) abrir(document.getElementById('panel-' + inicio.panel));\r\n  // En modo scroll el navegador ya no encuentra el #cap\u00EDtulo (se limpia enseguida): se lleva a mano\r\n  if (!modoPulso && inicial > 0) caps[inicial].scrollIntoView();\r\n  recordarCapitulo();\r\n  // Un enlace con #cap\u00EDtulo o #club abierto estando ya en la p\u00E1gina: se atiende y la direcci\u00F3n vuelve a quedar limpia\r\n  window.addEventListener('hashchange', function () {\r\n    var pedido = location.hash;\r\n    var destino = caps.findIndex(function (c) { return '#' + c.id === pedido; });\r\n    limpiarDireccion();\r\n    if (pedido === '#club') abrir(document.getElementById('panel-club'));\r\n    else if (destino >= 0) ir(destino);\r\n  });\r\n  requestAnimationFrame(function () { requestAnimationFrame(function () { raiz.classList.add('es-listo'); }); });\r\n  // Las fuentes cambian el alto del texto: se vuelve a medir cuando terminan de cargar\r\n  if (document.fonts && document.fonts.ready) document.fonts.ready.then(ajustarTarro);\r\n  window.addEventListener('load', ajustarTarro);\r\n\r\n  var espera = 0;\r\n  window.addEventListener('resize', function () {\r\n    clearTimeout(espera);\r\n    espera = setTimeout(function () {\r\n      var antes = ancho < 900;\r\n      medir(); activarModo(); ajustarTarro();\r\n      if ((ancho < 900) !== antes) sembrar();\r\n      if (sinMovimiento.matches) cuadroFijo();\r\n    }, 120);\r\n  });\r\n})();\r\n"],
  "mappings": "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",
  "names": ["base", "inicio", "LLAVE", "cuadro", "sigue", "alto"]
}
