{
  "version": 3,
  "sources": ["/cdn/shop/t/51/assets/tp-roleta.js?t=1789155066493"],
  "sourcesContent": ["/* =============================================\n   TP \u2014 Roleta de oferta (pop-up EXCLUSIVO de uma cole\u00E7\u00E3o: hoje /collections/gire-e-ganhe, handle em snippets/tp-roleta-pagina)\n\n   O Liquid da se\u00E7\u00E3o j\u00E1 n\u00E3o renderiza nada fora dessa cole\u00E7\u00E3o. Aqui conferimos\n   a URL uma segunda vez (data-pagina) e s\u00F3 ent\u00E3o abrimos. Se a URL n\u00E3o bater,\n   o markup \u00E9 removido do DOM.\n\n   Fluxo: desenha as fatias do SVG (Liquid n\u00E3o tem seno/cosseno) \u2192 espera o\n   delay \u2192 abre (foco no bot\u00E3o) \u2192 \"Girar\" sorteia uma fatia pelo peso \u2192 gira\n   por CSS transform com desacelera\u00E7\u00E3o longa, o ponteiro \"tica\" a cada fatia\n   que passa (e vibra no celular) \u2192 ao parar: fatia vencedora em destaque,\n   ponteiro pula, confete na paleta, resultado revelado em cascata \u2192 grava no\n   localStorage para n\u00E3o aparecer de novo pelo prazo configurado.\n\n   Quem fecha SEM girar s\u00F3 \u00E9 lembrado na sess\u00E3o (volta na pr\u00F3xima visita).\n   ============================================= */\n(function () {\n  var PALETTE = ['#C4D3AA', '#F3E4E0', '#FFAA99', '#F1F0EB', '#866F5E'];\n\n  function normalizePath(p) {\n    // sem barra final, sem locale (/pt-br/collections/...), sem query/hash\n    p = (p || '').split('?')[0].split('#')[0].replace(/\\/+$/, '');\n    var m = p.match(/^\\/[a-z]{2}(?:-[a-z]{2})?(\\/collections\\/.*)$/i);\n    return (m ? m[1] : p).toLowerCase();\n  }\n\n  // Texto do degrau do presente: com minimo, diz a partir de quanto ele entra.\n  function brlRoleta(c) { return 'R$ ' + (c / 100).toFixed(2).replace('.', ',').replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.'); }\n  function notaPresente(minimo) {\n    var cents = Math.round((+minimo || 0) * 100);\n    return cents > 0 ? 'Vai junto em compras a partir de ' + brlRoleta(cents).replace(/,00$/, '') : 'Vai junto no seu pedido';\n  }\n  function reducedMotion() {\n    try { return window.matchMedia('(prefers-reduced-motion: reduce)').matches; } catch (e) { return false; }\n  }\n\n  // \u00C2ngulo atual (graus) de um elemento com transform rotate, lido da matriz.\n  function currentAngle(el) {\n    var tr = getComputedStyle(el).transform;\n    if (!tr || tr === 'none') return 0;\n    var m = tr.match(/matrix\\(([^)]+)\\)/);\n    if (!m) return 0;\n    var v = m[1].split(',').map(parseFloat);\n    var ang = Math.atan2(v[1], v[0]) * 180 / Math.PI;\n    return ang < 0 ? ang + 360 : ang;\n  }\n\n  function init(root) {\n    if (!root || root.dataset.tpRoletaReady) return;\n    root.dataset.tpRoletaReady = '1';\n\n    var EDIT = root.dataset.edit === '1';\n    var DESIGN = root.dataset.design === '1';\n\n    /* ---- LISTA DE BLOQUEIO POR CAMINHO (segunda camada; a primeira e o Liquid)\n\n       Ate 12/09/2026 aqui morava o oposto: a roleta so podia existir em UM\n       caminho, e o JS removia o markup em qualquer outro. O Luiz inverteu --\n       agora ela vale no site todo e esta lista diz onde NAO aparecer.\n\n       As paginas de CAMPANHA nao estao aqui: elas saem no Liquid, por colecao e\n       metacampo. Um produto de campanha aparece em varias URLs (com e sem\n       colecao no caminho), e cada uma exigiria mais uma linha.\n\n       O `*` so vale no FIM do padrao, que e o formato que o Luiz ja usa na lista\n       do app da raspadinha -- `/account*` pega /account e tudo abaixo dele.\n       Comparacao sem barra final e sem diferenca de maiuscula, senao `/Cart/`\n       passaria. */\n    var here = normalizePath(location.pathname);\n    var bloqueios = String(root.dataset.bloqueio || '')\n      .split('\\n')\n      .map(function (l) { return normalizePath(l.trim()); })\n      .filter(Boolean);\n    /* CURINGA EM QUALQUER POSICAO (08/10/2026): a lista herdada da raspadinha usa padroes\n       com asterisco no comeco e no meio (asterisco + /collections/x + asterisco, asterisco +\n       /products/ + asterisco + -x), e o teste antigo so entendia o asterisco no FIM -- a\n       roleta aparecia nas paginas das campanhas de link (Comprou Dobrou, Flash Promo, Data\n       Dupla...). Cuidado ao escrever esses padroes em comentario: asterisco seguido de barra\n       fecha o comentario de bloco e derruba o script inteiro (aconteceu em 08/10). */\n    /* Curinga sem RegExp: cada trecho entre asteriscos precisa aparecer na ordem; sem `*` no\n       inicio o primeiro trecho tem de abrir o caminho, sem `*` no fim o ultimo tem de fecha-lo. */\n    function casaGlob(p, s) {\n      var partes = p.split('*'), pos = 0;\n      for (var i = 0; i < partes.length; i++) {\n        var t = partes[i];\n        if (!t) continue;\n        var j = s.indexOf(t, pos);\n        if (j === -1) return false;\n        if (i === 0 && j !== 0) return false;\n        pos = j + t.length;\n      }\n      if (partes[partes.length - 1] !== '' && pos !== s.length) return false;\n      return true;\n    }\n    var barrado = bloqueios.some(function (p) {\n      if (p.indexOf('*') === -1) return here === p;\n      return casaGlob(p, here);\n    });\n    if (barrado && !DESIGN) {\n      root.parentNode && root.parentNode.removeChild(root);\n      return;\n    }\n\n    /* BLOQUEIO POR UTM (05/10/2026): herdado da raspadinha, que a roleta substitui. Linhas\n       \"chave=valor\" (source=klaviyo => utm_source=klaviyo). Quem chega por e-mail, WhatsApp\n       ou SMS nao ve a roleta; a marca fica na sessao, porque o UTM so existe na primeira URL. */\n    var utmBloq = false;\n    try { utmBloq = sessionStorage.getItem('tp-roleta-utm-bloqueio') === '1'; } catch (e) {}\n    if (!utmBloq) {\n      var qs = {};\n      try {\n        location.search.replace(/^\\?/, '').split('&').forEach(function (par) {\n          if (!par) return;\n          var kv = par.split('=');\n          qs[decodeURIComponent(kv[0]).toLowerCase()] = decodeURIComponent((kv[1] || '').replace(/\\+/g, ' ')).toLowerCase();\n        });\n      } catch (e) {}\n      String(root.dataset.bloqueioUtm || '').split('\\n').forEach(function (l) {\n        var kv = l.trim().toLowerCase().split('=');\n        if (kv.length < 2 || !kv[0]) return;\n        var chave = kv[0].indexOf('utm_') === 0 ? kv[0] : 'utm_' + kv[0];\n        if (qs[chave] !== undefined && qs[chave] === kv.slice(1).join('=')) utmBloq = true;\n      });\n      if (utmBloq) { try { sessionStorage.setItem('tp-roleta-utm-bloqueio', '1'); } catch (e) {} }\n    }\n    if (utmBloq && !DESIGN) {\n      root.parentNode && root.parentNode.removeChild(root);\n      return;\n    }\n\n    /* ---- PAGINA UNICA (23/09/2026): a roleta so existe em /collections/<data-pagina>.\n       O Liquid ja nao renderiza fora dela; esta e a segunda camada, como era antes\n       de 12/09. Fora do editor de temas, URL diferente = markup removido do DOM. */\n    var pagina = String(root.dataset.pagina || '').trim().toLowerCase();\n    if (pagina && pagina !== '*' && here !== '/collections/' + pagina && !DESIGN) {\n      root.parentNode && root.parentNode.removeChild(root);\n      return;\n    }\n\n    var KEY = root.dataset.key || 'tp-roleta-v1';\n\n    /* SO NA PRIMEIRA COMPRA (14/10/2026, Guilherme: \"ja comprou -> roleta nao aparece\").\n       \"Ja comprou\" = cookie tp_comprou / localStorage tp-comprou (pixel do checkout,\n       checkout_completed) ou cliente logada com pedido (data-ja-comprou, do Liquid).\n       ISSO SO DECIDE SE A ROLETA APARECE. Quem ja girou (resultado guardado em KEY, presente\n       ganho ou e-mail pendente) fica com a roleta, a aba e o premio, mesmo que depois compre ou\n       entre numa conta que ja comprou -- \"se a roleta apareceu, ela ganha e ponto\". */\n    var comprou = root.dataset.jaComprou === '1';\n    var jaGirou = false;\n    try {\n      if (!comprou) comprou = /(?:^|;\\s*)tp_comprou=1/.test(document.cookie) || localStorage.getItem('tp-comprou') === '1';\n      jaGirou = !!(localStorage.getItem(KEY) || localStorage.getItem('tp-roleta-presente') || localStorage.getItem('tp-roleta-pendente'));\n    } catch (e) {}\n    if (comprou && !jaGirou && !DESIGN) {\n      root.parentNode && root.parentNode.removeChild(root);\n      return;\n    }\n    /* PRESENTE PRESO A CAMPANHA (24/09/2026). As chaves do presente\n       (tp-roleta-presente, -minimo, -variante, -tamanho) sao fixas, para o\n       tp-presente le-las no site inteiro. Mas um presente ganho na campanha\n       anterior nao pode valer na nova: ao trocar o identificador da campanha\n       (storage_key), tudo o que foi gravado com outro identificador e apagado,\n       e a cliente comeca do zero -- e como o Guilherme reseta os testes. */\n    try {\n      var campanhaGravada = localStorage.getItem('tp-roleta-presente-campanha');\n      if (localStorage.getItem('tp-roleta-presente') && campanhaGravada !== KEY) {\n        ['tp-roleta-presente', 'tp-roleta-presente-minimo', 'tp-roleta-presente-variante', 'tp-roleta-presente-tamanho', 'tp-roleta-presente-campanha', 'tp-roleta-presente-valor'].forEach(function (k) { localStorage.removeItem(k); });\n      }\n    } catch (e) {}\n    var DELAY = (parseInt(root.dataset.delay, 10) || 0) * 1000;\n    var SEG = parseFloat(root.dataset.seg) || 90;\n    var COUNT = parseInt(root.dataset.count, 10) || 0; // fatias na roda (pr\u00EAmios \u00D7 repeti\u00E7\u00F5es)\n    var POINTER = 90; // o ponteiro fica \u00E0 direita (3h); 0 = topo, sentido hor\u00E1rio\n    var TURNS = parseInt(root.dataset.turns, 10) || 5;\n    var SECONDS = parseFloat(root.dataset.seconds) || 6;\n    var APPLY = root.dataset.apply === '1';\n\n    var card = root.querySelector('[data-roleta-card]');\n    var wheel = root.querySelector('[data-roleta-wheel]');\n    var pointer = root.querySelector('[data-roleta-pointer]');\n    var spinBtns = root.querySelectorAll('[data-roleta-spin]'); // p\u00EDlula abaixo + bot\u00E3o do centro\n    var spinBtn = spinBtns[0];\n    function eachSpin(fn) { for (var b = 0; b < spinBtns.length; b++) fn(spinBtns[b]); }\n    var result = root.querySelector('[data-roleta-result]');\n    var wonLabel = root.querySelector('[data-roleta-won-label]');\n    var descEl = root.querySelector('[data-roleta-desc]');\n    var codeWrap = root.querySelector('[data-roleta-code-wrap]');\n    var codeEl = root.querySelector('[data-roleta-code]');\n    var copyBtn = root.querySelector('[data-roleta-copy]');\n    var codeStep = root.querySelector('[data-roleta-code-step]');\n    var presenteStep = root.querySelector('[data-roleta-presente-step]');\n    var presenteFoto = root.querySelector('[data-roleta-presente-foto]');\n    var presenteNome = root.querySelector('[data-roleta-presente-nome]');\n    var presenteNota = root.querySelector('[data-roleta-presente-nota]');\n    /* Botao \"Escolher o tamanho\" do presente (24/09/2026). O pop-up de tamanho e\n       do tp-presente (site inteiro); aqui so o gatilho e o texto do que ja foi\n       escolhido. Sem tamanho escolhido, o presente nao entra no carrinho. */\n    var presenteTamBtn = root.querySelector('[data-roleta-presente-tamanho]');\n    function tamanhoEscolhido() { try { return localStorage.getItem('tp-roleta-presente-tamanho'); } catch (e) { return null; } }\n    /* PRESENTE SEM TAMANHO (05/10/2026): a Necessaire tem uma variante so. O giro grava\n       'unico' como tamanho e a variante direto, entao nenhum botao de tamanho aparece. */\n    var premioSemTamanho = false; // marcado pelo proprio premio (giro ou restauracao), sem depender do localStorage\n    function presenteSemTamanho() { return premioSemTamanho || tamanhoEscolhido() === 'unico'; }\n    function atualizaTamanho() {\n      if (!presenteTamBtn) return;\n      if (presenteSemTamanho()) { presenteTamBtn.hidden = true; return; }\n      var t = tamanhoEscolhido();\n      presenteTamBtn.hidden = false;\n      presenteTamBtn.textContent = t ? 'Tamanho escolhido: ' + String(t).split(' (')[0] : 'Escolher o tamanho do presente';\n      presenteTamBtn.classList.toggle('is-ok', !!t);\n    }\n    if (presenteTamBtn) presenteTamBtn.addEventListener('click', function () { if (window.tpPresenteTamanho) window.tpPresenteTamanho.abrir(); });\n    document.addEventListener('tp:presente-tamanho', atualizaTamanho);\n    /* FAIXA NA COLECAO (24/09/2026): com presente gravado, a faixa que nasceu\n       escondida ao lado da roleta vai para antes da grade de produtos (logo\n       abaixo do countdown, quando ele existe) e aparece. O botao \"Escolher o\n       tamanho\" so fica visivel enquanto o tamanho nao foi escolhido. */\n    /* CONTADOR DA COLECAO NO LUGAR DA FAIXA (25/09/2026): se a faixa escura do\n       countdown esta no modo \"oferta so depois da roleta\" (`[data-cc-roleta]`,\n       metacampo `custom.countdown_oferta_apos_roleta`), e ela que vira o aviso\n       do presente -- antes do giro so \"A oferta acaba em\" + relogio, depois a\n       oferta -- e a faixa separada nao aparece. */\n    var ccRoleta = document.querySelector('[data-cc-roleta]');\n    var ccBtn = ccRoleta && ccRoleta.querySelector('[data-cc-roleta-tamanho]');\n    if (ccBtn) ccBtn.addEventListener('click', function () { if (window.tpPresenteTamanho) window.tpPresenteTamanho.abrir(); });\n    function mostrarFaixa() {\n      var faixa = document.querySelector('[data-roleta-faixa]');\n      var ganhou = null;\n      try { ganhou = localStorage.getItem('tp-roleta-presente'); } catch (e) {}\n      if (ccRoleta) {\n        ccRoleta.classList.toggle('is-antes', !ganhou);\n        if (ccBtn) ccBtn.hidden = !ganhou || !!tamanhoEscolhido();\n        if (faixa) faixa.hidden = true;\n        return;\n      }\n      if (!faixa) return;\n      if (!ganhou) { faixa.hidden = true; return; }\n      var grade = document.querySelector('.shopify-section[id$=\"__product-grid\"]');\n      if (grade && faixa.nextElementSibling !== grade) grade.parentNode.insertBefore(faixa, grade);\n      faixa.hidden = false;\n      var btn = faixa.querySelector('[data-roleta-faixa-tamanho]');\n      if (btn) btn.hidden = !!tamanhoEscolhido();\n    }\n    var faixaBtn = document.querySelector('[data-roleta-faixa-tamanho]');\n    if (faixaBtn) faixaBtn.addEventListener('click', function () { if (window.tpPresenteTamanho) window.tpPresenteTamanho.abrir(); });\n    document.addEventListener('tp:presente-tamanho', mostrarFaixa);\n    mostrarFaixa();\n    var noteStep = root.querySelector('[data-roleta-note-step]');\n    var ctaBtn = root.querySelector('[data-roleta-cta]');\n    var confetti = root.querySelector('[data-roleta-confetti]');\n    var closeEls = root.querySelectorAll('[data-roleta-close]');\n\n    var prizes = [];\n    try {\n      prizes = JSON.parse(root.querySelector('[data-roleta-prizes]').textContent) || [];\n    } catch (e) { prizes = []; }\n    if (prizes.length < 2) return;\n    if (!COUNT || COUNT % prizes.length) COUNT = prizes.length;\n    var REPEAT = COUNT / prizes.length;\n\n    // ---- J\u00E1 viu? (fora do modo edi\u00E7\u00E3o) ----\n    //\n    // GIROU UMA VEZ, ACABOU. Antes o registro do giro valia por um prazo\n    // (`remember_days`) e o pop-up voltava depois dele. Foi pedido que n\u00E3o\n    // volte \"de forma alguma\", ent\u00E3o basta o registro existir -- nem lemos mais\n    // a idade dele. Para reexibir a quem j\u00E1 girou, o caminho continua sendo\n    // trocar o identificador da campanha, que muda a chave inteira.\n    //\n    // FECHOU SEM GIRAR \u00E9 outra coisa, e n\u00E3o silencia mais a p\u00E1gina: o pop-up\n    // n\u00E3o volta sozinho nesta sess\u00E3o, mas a aba lateral fica oferecendo.\n    /* QUEM JA GIROU NAO SOME MAIS -- fica com o premio guardado e a aba na tela.\n\n       Ate 12/09/2026 este trecho dava `return` e a roleta simplesmente nao\n       existia para quem ja tinha girado. Pedido do Luiz: a aba continua, com\n       outro texto, e clicando nela a cliente REVE o que ganhou.\n\n       Por isso o premio guardado passou a ser o objeto inteiro (rotulo, cupom,\n       descricao e o presente com foto) e nao so duas strings: e dele que a tela\n       do resultado e remontada numa visita seguinte, sem sorteio nenhum. */\n    var fechouAntes = false;\n    var premioAtual = null; /* premio girado NESTA visita (premioGuardado so existe a partir do reload) */\n    var premioGuardado = null;\n    if (!EDIT) {\n      var saved = null;\n      try { saved = JSON.parse(localStorage.getItem(KEY) || 'null'); } catch (e) { saved = null; }\n      if (saved && saved.t) premioGuardado = saved;\n\n      /* COMPROU DEPOIS DE GIRAR? ENTAO GIRA DE NOVO (pedido do Luiz).\n\n         O token do carrinho e o unico sinal de compra que chega ate aqui: o\n         checkout e pagina da Shopify e o JS do tema nao roda la. Medido: o\n         token sobrevive a esvaziar e a readicionar item, e so troca quando um\n         pedido e fechado.\n\n         So reseta quando os DOIS tokens existem e diferem. Premio guardado\n         antes desta mudanca nao tem token -- tratar ausencia como \"mudou\" daria\n         um giro extra de brinde a quem ja tinha girado. */\n      /* Com a regra da primeira compra (14/10/2026), quem ja comprou nao ganha giro novo: o\n         premio que ela ganhou fica como esta. */\n      if (premioGuardado && premioGuardado.cartToken && !comprou) {\n        /* Assincrono de proposito: se o token mudou, a pagina ja esta montada\n           com a aba do premio -- recarregamos para a roleta nascer no estado de\n           \"pode girar\". Sem o reload ela ficaria oferecendo o premio velho ate\n           a proxima navegacao. */\n        tokenDoCarrinho().then(function (agora) {\n          if (!agora || agora === premioGuardado.cartToken) return;\n          try { localStorage.removeItem(KEY); } catch (e) {}\n          try { localStorage.removeItem(KEY + ':closed'); } catch (e) {}\n          window.location.reload();\n        });\n      }\n\n      var dismissed = null;\n      try { dismissed = localStorage.getItem(KEY + ':closed'); } catch (e) { dismissed = null; }\n      if (dismissed) fechouAntes = true;\n    }\n\n    function tokenDoCarrinho() {\n      return fetch('/cart.js', { cache: 'no-store', credentials: 'same-origin' })\n        .then(function (r) { return r.json(); })\n        .then(function (c) { return c.token || ''; })\n        .catch(function () { return ''; });\n    }\n\n    function rememberSpin(extra) {\n      if (EDIT) return;\n      try { localStorage.setItem(KEY, JSON.stringify(Object.assign({ t: Date.now() }, extra || {}))); } catch (e) {}\n    }\n    /* FECHOU SEM GIRAR = NAO VOLTA SOZINHA (05/10/2026, pedido do Guilherme: \"deve aparecer uma\n       vez\"). Era sessionStorage -- por aba, entao cada aba/visita nova reabria o pop-up. Agora e\n       localStorage, preso a chave da campanha: so a aba \"Gire e ganhe!\" fica no canto, e trocar a\n       campanha (tp-roleta-campanha) reabre para todo mundo. */\n    function rememberClose() {\n      if (EDIT) return;\n      try { localStorage.setItem(KEY + ':closed', '1'); } catch (e) {}\n    }\n\n    // ---- Geometria das fatias ----\n    // \u00C2ngulo 0 = topo (ponteiro), sentido hor\u00E1rio. viewBox -100..100.\n    function pt(r, deg) {\n      var rad = (deg - 90) * Math.PI / 180;\n      return [r * Math.cos(rad), r * Math.sin(rad)];\n    }\n    function drawSlices() {\n      var R = 90; // as fatias v\u00E3o at\u00E9 o friso interno do aro\n      var slices = wheel.querySelectorAll('.tp-roleta__slice');\n      for (var i = 0; i < slices.length; i++) {\n        var el = slices[i];\n        var a0 = parseFloat(el.dataset.a0), a1 = parseFloat(el.dataset.a1);\n        var p0 = pt(R, a0), p1 = pt(R, a1);\n        var large = (a1 - a0) > 180 ? 1 : 0;\n        el.setAttribute('d',\n          'M0 0 L' + p0[0].toFixed(3) + ' ' + p0[1].toFixed(3) +\n          ' A' + R + ' ' + R + ' 0 ' + large + ' 1 ' + p1[0].toFixed(3) + ' ' + p1[1].toFixed(3) + ' Z');\n      }\n      layoutLabels();\n    }\n\n    // Pr\u00EAmio reto ao longo do raio, entre o bot\u00E3o central (r\u224834) e a borda\n    // (r\u224892). Metade direita (0\u2013180\u00B0) l\u00EA do centro para fora; metade esquerda\n    // \u00E9 virada 180\u00B0 e l\u00EA da borda para o centro \u2014 assim nenhum texto fica de\n    // cabe\u00E7a para baixo na posi\u00E7\u00E3o inicial e todos correm da esquerda para a\n    // direita. Quebra em duas linhas quando n\u00E3o cabe; nunca comprime as letras.\n    var R_IN = 22, R_OUT = 86, MAX_LEN = R_OUT - R_IN; // R_IN fica fora do bot\u00E3o central (raio 16 + folga)\n    var lastAngle = 0; // \u00FAltimo \u00E2ngulo conhecido da roda; define a orienta\u00E7\u00E3o de leitura dos r\u00F3tulos\n    // R\u00F3tulos FIXOS: todos l\u00EAem do centro para a borda, como numa roleta de\n    // verdade (metade fica de cabe\u00E7a para baixo em repouso; decis\u00E3o do Luiz:\n    // texto que muda durante o giro incomoda mais). O vencedor, \u00E0 direita do\n    // ponteiro, l\u00EA na horizontal.\n    function flipFor(mid) { return false; }\n    function layoutLabels() {\n      var labels = wheel.querySelectorAll('.tp-roleta__label');\n      for (var j = 0; j < labels.length; j++) {\n        var mid = parseFloat(labels[j].dataset.mid);\n        place(labels[j], mid, flipFor(mid), R_IN);\n      }\n    }\n    // S\u00F3 funciona com o SVG vis\u00EDvel (getComputedTextLength d\u00E1 0 escondido),\n    // por isso roda ao abrir e quando a fonte termina de carregar.\n    //\n    // E \"vis\u00EDvel\" aqui \u00E9 mais estrito do que parece: o pop-up sai de\n    // `display: none` e a medida acontece no quadro seguinte, quando a roda\n    // pode ainda n\u00E3o ter altura resolvida -- ela tira a altura do pr\u00F3prio\n    // viewBox (`height: auto`), e n\u00E3o de um `aspect-ratio` declarado. Enquanto\n    // isso n\u00E3o assenta, `getComputedTextLength()` devolve 0.\n    //\n    // Zero \u00E9 justamente o valor que passa por \"cabe numa linha s\u00F3\", ent\u00E3o a\n    // corrida terminava com TODOS os pr\u00EAmios numa linha -- \u00E0s vezes, em\n    // algumas aberturas, o que \u00E9 pior que sempre.\n    //\n    // E h\u00E1 um caso em que a roda fica sem medida por MUITO mais que um quadro:\n    // a raspadinha (ou o carrinho) abre por cima, e as regras de `display:\n    // none` deste arquivo escondem o pop-up da roleta inteiro. Elemento\n    // escondido tem caixa 0x0, e qualquer medida dentro dele \u00E9 0 -- foi assim\n    // que os pr\u00EAmios chegaram numa linha s\u00F3 na campanha: a roleta mediu a si\n    // mesma enquanto estava atr\u00E1s da raspadinha, e ningu\u00E9m mediu de novo\n    // depois que ela apareceu.\n    //\n    // Por isso s\u00E3o duas defesas: o adiamento por quadro, para o atraso curto\n    // de layout, e o ResizeObserver l\u00E1 embaixo, para o atraso longo -- ele\n    // refaz a passada no instante em que a roda ganha tamanho, venha isso de\n    // um pop-up que fechou, de uma fonte que trocou ou de um giro de tela.\n    var fitTentativas = 0;\n    function fitLabels() {\n      var labels = wheel.querySelectorAll('.tp-roleta__label:not([data-line2])');\n      var NS = 'http://www.w3.org/2000/svg';\n      if (!medivel(labels)) {\n        if (fitTentativas++ < 30) requestAnimationFrame(fitLabels);\n        return;\n      }\n      fitTentativas = 0;\n      for (var j = 0; j < labels.length; j++) {\n        var t = labels[j];\n        // remove a 2\u00AA linha de uma passada anterior (fonte recarregada, redimensionamento)\n        var old2 = wheel.querySelector('.tp-roleta__label[data-line2=\"' + t.dataset.i + '\"]');\n        if (old2) old2.parentNode.removeChild(old2);\n        var full = t.dataset.label || t.textContent;\n        var mid = parseFloat(t.dataset.mid);\n        var flip = flipFor(mid);\n        var baseFont = parseFloat(t.dataset.font || getComputedStyle(t).fontSize) || 10;\n        t.dataset.font = baseFont;\n        var fontPx = baseFont;\n        var fits = false;\n        // Tenta: 1 linha \u2192 2 linhas (come\u00E7ando num raio em que a fatia tem largura\n        // para duas linhas) \u2192 reduz a fonte aos poucos (m\u00EDnimo 7). Nunca comprime.\n        for (var attempt = 0; attempt < 8 && !fits; attempt++) {\n          t.setAttribute('font-size', fontPx);\n          t.textContent = full;\n          t.setAttribute('dy', '0.36em'); // centro vertical manual: dominant-baseline falha no iOS\n          var rIn = R_IN;\n          place(t, mid, flip, rIn);\n          var len = measure(t);\n          if (len <= R_OUT - rIn) { fits = true; break; }\n          var words = full.split(' ');\n          if (words.length >= 2) {\n            // raio m\u00EDnimo para caber 2 linhas (~2.4em de altura) dentro da fatia\n            var need = (fontPx * 1.2) / Math.sin((SEG / 2) * Math.PI / 180);\n            var rIn2 = Math.max(R_IN, Math.ceil(need));\n            if (R_OUT - rIn2 > fontPx * 2) {\n              var best = 1, bestDiff = Infinity;\n              for (var k = 1; k < words.length; k++) {\n                var diff = Math.abs(words.slice(0, k).join(' ').length - words.slice(k).join(' ').length);\n                if (diff < bestDiff) { bestDiff = diff; best = k; }\n              }\n              place(t, mid, flip, rIn2);\n              // 1\u00AA linha no pr\u00F3prio <text>, 2\u00AA linha num <text> irm\u00E3o: o iOS\n              // ignora/desloca `dy` em <tspan>, mas respeita `dy` no <text>.\n              t.textContent = words.slice(0, best).join(' ');\n              t.setAttribute('dy', '-0.22em');\n              var t2 = t.cloneNode(false);\n              t2.textContent = words.slice(best).join(' ');\n              t2.setAttribute('dy', '0.94em');\n              t2.setAttribute('data-line2', t.dataset.i);\n              t2.removeAttribute('data-label');\n              t.parentNode.insertBefore(t2, t.nextSibling);\n              var l1 = measure(t), l2 = measure(t2);\n              if (Math.max(l1, l2) <= R_OUT - rIn2) { fits = true; break; }\n              t2.parentNode.removeChild(t2);\n            }\n          }\n          if (fontPx <= 7) break;\n          fontPx = Math.max(7, fontPx - 0.5);\n        }\n        /* NADA COUBE: antes o laco saia com o <text> segurando so a PRIMEIRA linha\n           da ultima tentativa (\"CUPOM DE\", sem o \"20% OFF\" -- visto em 24/09/2026\n           com a Ingram Mono, mais larga que a Host Grotesk). Rotulo cortado e pior\n           que rotulo apertado: forca as duas linhas no menor tamanho e segue. */\n        if (!fits) {\n          var wordsF = full.split(' ');\n          if (wordsF.length >= 2) {\n            var bestF = 1, bestDiffF = Infinity;\n            for (var kf = 1; kf < wordsF.length; kf++) {\n              var diffF = Math.abs(wordsF.slice(0, kf).join(' ').length - wordsF.slice(kf).join(' ').length);\n              if (diffF < bestDiffF) { bestDiffF = diffF; bestF = kf; }\n            }\n            t.setAttribute('font-size', fontPx);\n            place(t, mid, flip, Math.max(R_IN, Math.ceil((fontPx * 1.2) / Math.sin((SEG / 2) * Math.PI / 180))));\n            t.textContent = wordsF.slice(0, bestF).join(' ');\n            t.setAttribute('dy', '-0.22em');\n            var t2F = t.cloneNode(false);\n            t2F.textContent = wordsF.slice(bestF).join(' ');\n            t2F.setAttribute('dy', '0.94em');\n            t2F.setAttribute('data-line2', t.dataset.i);\n            t2F.removeAttribute('data-label');\n            t.parentNode.insertBefore(t2F, t.nextSibling);\n          } else {\n            t.textContent = full;\n          }\n        }\n      }\n    }\n    function measure(t) {\n      try { return t.getComputedTextLength(); } catch (e) { return 0; }\n    }\n    // A roda j\u00E1 pode ser medida? Duas perguntas, porque uma s\u00F3 engana: a caixa\n    // pode existir e o texto ainda medir 0 (fonte trocando), e o texto pode\n    // medir antes de a caixa assentar. S\u00F3 com as duas a quebra em duas linhas\n    // sai igual em toda abertura.\n    function medivel(labels) {\n      var cx = wheel.getBoundingClientRect();\n      if (cx.width < 1 || cx.height < 1) return false;\n      for (var j = 0; j < labels.length; j++) {\n        if ((labels[j].dataset.label || labels[j].textContent || '').length && !measure(labels[j])) return false;\n      }\n      return true;\n    }\n    // Refaz a quebra quando a roda ganha (ou muda de) tamanho. `fitLabels` n\u00E3o\n    // mexe no tamanho do SVG -- a largura vem do CSS --, ent\u00E3o isto n\u00E3o se\n    // realimenta.\n    if (window.ResizeObserver) {\n      new ResizeObserver(function () {\n        var cx = wheel.getBoundingClientRect();\n        if (cx.width < 1 || cx.height < 1) return;\n        fitTentativas = 0;\n        fitLabels();\n      }).observe(wheel);\n    }\n\n    // Posiciona o texto no raio `rIn` (lendo para fora) ou, virado, na borda\n    // (lendo para dentro).\n    function place(t, mid, flip, rIn) {\n      // centro do texto no meio do trecho radial dispon\u00EDvel (entre o cubo e o aro)\n      var rc = (rIn + R_OUT) / 2;\n      var p = pt(rc, mid);\n      var rot = flip ? mid + 90 : mid - 90;\n      var x = p[0].toFixed(3), y = p[1].toFixed(3);\n      t.setAttribute('text-anchor', 'middle');\n      t.setAttribute('x', x);\n      t.setAttribute('y', y);\n      t.setAttribute('transform', 'rotate(' + rot.toFixed(3) + ' ' + x + ' ' + y + ')');\n      var spans = t.querySelectorAll('tspan');\n      for (var q = 0; q < spans.length; q++) spans[q].setAttribute('x', x);\n      t.dataset.rin = rIn;\n      t.dataset.flip = flip ? '1' : '';\n    }\n    // Reorienta cada r\u00F3tulo pelo \u00E2ngulo ATUAL da roda: quem est\u00E1 na metade\n    // esquerda l\u00EA da borda para o centro, quem est\u00E1 na direita l\u00EA do centro\n    // para a borda \u2014 assim nada fica de cabe\u00E7a para baixo, nem durante o giro\n    // nem na posi\u00E7\u00E3o final (o vencedor, \u00E0 direita, l\u00EA na horizontal).\n    // Vers\u00E3o suave, usada durante o giro: quem cruza o topo/base da roda some\n    // por ~80ms, vira e volta \u2014 em vez de saltar. Assim nada fica de cabe\u00E7a\n    // para baixo em nenhum momento e nada \"pula\" na frente da cliente.\n    var prevAngle = null, prevTime = 0;\n    function orientLabelsSoft(angle) {\n      var now = performance.now();\n      var fast = false;\n      if (prevAngle !== null && now > prevTime) {\n        var d = Math.abs(angle - prevAngle); if (d > 180) d = 360 - d;\n        fast = (d / (now - prevTime)) * 1000 > 240; // > 240\u00B0/s: a leitura j\u00E1 \u00E9 imposs\u00EDvel\n      }\n      prevAngle = angle; prevTime = now;\n      lastAngle = angle;\n      var labels = wheel.querySelectorAll('.tp-roleta__label');\n      for (var j = 0; j < labels.length; j++) {\n        var t = labels[j];\n        if (t.dataset.flipping) continue;\n        var mid = parseFloat(t.dataset.mid);\n        var flip = flipFor(mid);\n        if ((t.dataset.flip === '1') !== flip) {\n          if (fast) { place(t, mid, flip, parseFloat(t.dataset.rin) || R_IN); continue; }\n          t.dataset.flipping = '1';\n          t.classList.add('is-flipping');\n          (function (el, m, f) {\n            setTimeout(function () {\n              place(el, m, f, parseFloat(el.dataset.rin) || R_IN);\n              el.classList.remove('is-flipping');\n              delete el.dataset.flipping;\n            }, 80);\n          })(t, mid, flip);\n        }\n      }\n    }\n    function orientLabels(angle) {\n      lastAngle = angle;\n      var labels = wheel.querySelectorAll('.tp-roleta__label');\n      for (var j = 0; j < labels.length; j++) {\n        var t = labels[j];\n        t.classList.remove('is-flipping');\n        delete t.dataset.flipping;\n        var mid = parseFloat(t.dataset.mid);\n        var flip = flipFor(mid);\n        if ((t.dataset.flip === '1') !== flip) {\n          place(t, mid, flip, parseFloat(t.dataset.rin) || R_IN);\n        }\n      }\n    }\n    drawSlices();\n\n    // ---- Sorteio por peso (por pr\u00EAmio); depois escolhe qual das repeti\u00E7\u00F5es ----\n    function pickPrize() {\n      var total = 0, i;\n      for (i = 0; i < prizes.length; i++) total += Math.max(0, +prizes[i].weight || 0);\n      if (total <= 0) return Math.floor(Math.random() * prizes.length);\n      var r = Math.random() * total;\n      for (i = 0; i < prizes.length; i++) {\n        r -= Math.max(0, +prizes[i].weight || 0);\n        if (r < 0) return i;\n      }\n      return prizes.length - 1;\n    }\n    function pick() {\n      return pickPrize() + prizes.length * Math.floor(Math.random() * REPEAT);\n    }\n\n    // ---- Ponteiro \"tica\" a cada fatia que passa ----\n    var tickRaf = 0, lastIdx = -1;\n    function sliceUnderPointer(angle) {\n      return Math.floor(((((POINTER - angle) % 360) + 360) % 360) / SEG) % COUNT;\n    }\n    function tickLoop() {\n      var now = currentAngle(wheel);\n      var idx = sliceUnderPointer(now);\n      if (idx !== lastIdx) {\n        if (lastIdx !== -1) tick();\n        lastIdx = idx;\n      }\n      tickRaf = requestAnimationFrame(tickLoop);\n    }\n    function tick() {\n      pointer.classList.add('is-tick');\n      setTimeout(function () { pointer.classList.remove('is-tick'); }, 60);\n      try { if (navigator.vibrate) navigator.vibrate(6); } catch (e) {}\n    }\n\n    // ---- Confete discreto na paleta ----\n    function burst() {\n      if (!confetti || reducedMotion()) return;\n      var ctx = confetti.getContext('2d');\n      if (!ctx) return;\n      var dpr = window.devicePixelRatio || 1;\n      var W = card.clientWidth, H = card.clientHeight;\n      confetti.width = W * dpr;\n      confetti.height = H * dpr;\n      ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n      var sr = wheel.getBoundingClientRect(), cr = card.getBoundingClientRect();\n      var ox = sr.left - cr.left + sr.width / 2, oy = sr.top - cr.top;\n      var parts = [];\n      for (var i = 0; i < 56; i++) {\n        var a = (-90 + (Math.random() - 0.5) * 150) * Math.PI / 180;\n        var sp = 5 + Math.random() * 7;\n        parts.push({\n          x: ox, y: oy, vx: Math.cos(a) * sp, vy: Math.sin(a) * sp,\n          w: 4 + Math.random() * 4, h: 6 + Math.random() * 6,\n          rot: Math.random() * Math.PI, vr: (Math.random() - 0.5) * 0.3,\n          c: PALETTE[i % PALETTE.length]\n        });\n      }\n      var start = performance.now(), DUR = 1700;\n      function frame(now) {\n        var t = (now - start) / DUR;\n        ctx.clearRect(0, 0, W, H);\n        if (t >= 1) return;\n        for (var k = 0; k < parts.length; k++) {\n          var p = parts[k];\n          p.vy += 0.22; p.vx *= 0.985; p.vy *= 0.985;\n          p.x += p.vx; p.y += p.vy; p.rot += p.vr;\n          ctx.save();\n          ctx.globalAlpha = Math.max(0, 1 - Math.max(0, t - 0.55) / 0.45);\n          ctx.translate(p.x, p.y); ctx.rotate(p.rot);\n          ctx.fillStyle = p.c;\n          ctx.beginPath();\n          // \"p\u00E9tala\": ret\u00E2ngulo arredondado, ecoa a tag oval\n          var r = Math.min(p.w, p.h) / 2;\n          ctx.moveTo(-p.w / 2 + r, -p.h / 2);\n          ctx.arcTo(p.w / 2, -p.h / 2, p.w / 2, p.h / 2, r);\n          ctx.arcTo(p.w / 2, p.h / 2, -p.w / 2, p.h / 2, r);\n          ctx.arcTo(-p.w / 2, p.h / 2, -p.w / 2, -p.h / 2, r);\n          ctx.arcTo(-p.w / 2, -p.h / 2, p.w / 2, -p.h / 2, r);\n          ctx.fill();\n          ctx.restore();\n        }\n        requestAnimationFrame(frame);\n      }\n      requestAnimationFrame(frame);\n    }\n\n    // ---- Giro ----\n    var spinning = false, done = false, rotation = 0, spinAnim = null;\n    var resetTimer = 0; // rearme do modo edi\u00E7\u00E3o: s\u00F3 um agendado por vez\n    function scheduleReset(ms) { clearTimeout(resetTimer); resetTimer = setTimeout(resetForEdit, ms); }\n\n    function spin() {\n      if (spinning || done) return;\n      if (!root.classList.contains('is-visible')) return; // fechado: ignora\n      clearTimeout(resetTimer); // um rearme pendente N\u00C3O pode disparar no meio do giro\n      spinning = true;\n      eachSpin(function (b) { b.disabled = true; b.classList.remove('is-idle'); });\n      root.classList.add('is-spinning');\n\n      // Congela o \u00E2ngulo atual do balan\u00E7o para o giro partir dele sem pulo.\n      var from = currentAngle(wheel);\n      wheel.classList.remove('is-idle');\n      wheel.classList.add('is-spinning');\n      wheel.style.transform = 'rotate(' + from + 'deg)';\n\n      var idx = pick();\n      var center = idx * SEG + SEG / 2;\n      // pequena varia\u00E7\u00E3o para n\u00E3o parar sempre no meio exato da fatia\n      var jitter = (Math.random() - 0.5) * SEG * 0.5;\n      // girar R graus (hor\u00E1rio) leva o centro para (center + R) mod 360; queremos POINTER\n      var toTop = (((POINTER - center - jitter) % 360) + 360) % 360;\n      rotation = from + TURNS * 360 + ((toTop - from) % 360 + 360) % 360;\n\n      var ms = (reducedMotion() ? 1.2 : SECONDS) * 1000;\n      var finished = false;\n\n      // Web Animations API: n\u00E3o depende de transitionend (que borbulha dos\n      // filhos do SVG) nem de reflow, e d\u00E1 um `finished` confi\u00E1vel.\n      if (wheel.animate) {\n        spinAnim = wheel.animate(\n          [{ transform: 'rotate(' + from + 'deg)' }, { transform: 'rotate(' + rotation + 'deg)' }],\n          { duration: ms, easing: 'cubic-bezier(0.12, 0.72, 0.06, 1)', fill: 'forwards' }\n        );\n        spinAnim.onfinish = finish;\n      } else {\n        // fallback (navegador sem WAAPI): transi\u00E7\u00E3o CSS inline\n        wheel.style.transition = 'transform ' + ms + 'ms cubic-bezier(0.12, 0.72, 0.06, 1)';\n        wheel.getBoundingClientRect();\n        wheel.style.transform = 'rotate(' + rotation + 'deg)';\n      }\n      // rede de seguran\u00E7a caso o evento n\u00E3o venha (aba oculta)\n      setTimeout(finish, ms + 400);\n\n      lastIdx = sliceUnderPointer(from);\n      prevAngle = null;\n      cancelAnimationFrame(tickRaf);\n      tickRaf = requestAnimationFrame(tickLoop);\n\n      function finish() {\n        if (finished) return;\n        finished = true;\n        cancelAnimationFrame(tickRaf);\n        spinning = false;\n        done = true;\n        // fixa o \u00E2ngulo final no estilo e libera a anima\u00E7\u00E3o. A roda N\u00C3O pode ter\n        // nenhuma outra anima\u00E7\u00E3o de transform (o balan\u00E7o do is-idle puxaria ela\n        // de volta para o in\u00EDcio) \u2014 por isso o is-idle \u00E9 removido aqui de novo.\n        wheel.classList.remove('is-idle');\n        wheel.classList.add('is-spinning');\n        wheel.style.transition = '';\n        wheel.style.transform = 'rotate(' + rotation + 'deg)';\n        if (spinAnim) { try { spinAnim.cancel(); } catch (e) {} spinAnim = null; }\n        // vigia: se algo mover a roda depois de parar, recoloca no \u00E2ngulo final\n        [120, 600, 1500].forEach(function (d) {\n          setTimeout(function () {\n            if (!done) return;\n            wheel.classList.remove('is-idle');\n            var diff = Math.abs((((currentAngle(wheel) - rotation) % 360) + 360) % 360);\n            if (diff > 180) diff = 360 - diff;\n            if (diff > 0.5) wheel.style.transform = 'rotate(' + rotation + 'deg)';\n          }, d);\n        });\n\n\n        var prize = prizes[idx % prizes.length] || {};\n        // destaque da fatia vencedora\n        var slices = wheel.querySelectorAll('.tp-roleta__slice, .tp-roleta__label');\n        for (var k = 0; k < slices.length; k++) {\n          slices[k].classList.toggle('is-winner', parseInt(slices[k].dataset.i, 10) === idx);\n        }\n        wheel.classList.add('is-settled');\n        pointer.classList.add('is-bounce');\n        setTimeout(function () { pointer.classList.remove('is-bounce'); }, 650);\n        try { if (navigator.vibrate) navigator.vibrate([20, 40, 30]); } catch (e) {}\n        burst();\n\n        wonLabel.textContent = prize.label || '';\n        descEl.textContent = prize.desc || '';\n        // Pr\u00EAmio sem cupom (frete, presente): some a p\u00EDlula e a observa\u00E7\u00E3o.\n        var hasCode = !!prize.code;\n        codeEl.textContent = hasCode ? prize.code : '';\n        if (codeStep) codeStep.hidden = !hasCode;\n        if (noteStep) noteStep.hidden = !hasCode;\n        \n        /* O AVISO CONTA O QUE ACONTECEU, e a falha tem saida.\n        \n           Pedido do Luiz: a tela precisa dizer que o cupom entra sozinho, e precisa\n           dar a ela como copiar o codigo se nao entrar. Sem isso, quem clica em\n           \"Aproveitar agora\" sai sem saber se ganhou alguma coisa.\n        \n           O texto de sucesso e o configurado na secao (redacao e do Luiz); os de\n           andamento e de falha sao fixos porque descrevem estado, nao oferta. */\n        if (hasCode) {\n          var notaEl = noteStep ? noteStep.querySelector('.tp-roleta__note') : null;\n          var notaOk = notaEl ? (notaEl.getAttribute('data-ok') || notaEl.textContent) : '';\n          if (notaEl && !notaEl.getAttribute('data-ok')) notaEl.setAttribute('data-ok', notaOk);\n          if (APPLY) {\n            if (notaEl) notaEl.textContent = 'Aplicando o cupom no seu carrinho...';\n            if (codeWrap) codeWrap.classList.remove('is-alerta');\n            applyDiscount(prize.code).then(function (ok) {\n              if (notaEl) {\n                notaEl.textContent = ok\n                  ? (notaOk || 'O cupom j\u00E1 fica aplicado ao seu carrinho.')\n                  : 'N\u00E3o deu para aplicar sozinho \u2014 copie o c\u00F3digo acima e use no carrinho.';\n              }\n              if (!ok && codeWrap) codeWrap.classList.add('is-alerta');\n            });\n          } else if (notaEl) {\n            notaEl.textContent = 'Copie o c\u00F3digo acima e use no seu carrinho.';\n          }\n        }\n\n        /* PREMIO QUE E PRODUTO, e nao cupom.\n\n           A Necessaire custa R$ 0,00 no catalogo, entao nao precisa de desconto\n           nenhum: basta entrar no carrinho. Por isso o campo e o handle do\n           produto e nao um codigo -- cupom aqui exigiria um desconto de brinde,\n           um slot de automatico e a peca ja no carrinho para ser zerada.\n\n           A foto vem pronta do Liquid (ele tem o produto a mao); o JS so revela\n           o degrau. Sem foto, o degrau fica escondido em vez de mostrar um\n           quadrado vazio. */\n        var temPresente = !!prize.presente;\n        if (presenteStep) presenteStep.hidden = !temPresente;\n        if (temPresente) {\n          var nomePresente = prize.presenteTitulo || prize.label || 'Seu presente';\n          /* Sem foto o <img> quebrado seria pior que ausencia: some a imagem e o\n             cartao segue valendo pelo nome. */\n          if (presenteFoto) {\n            if (prize.presenteFoto) {\n              presenteFoto.src = prize.presenteFoto;\n              presenteFoto.alt = nomePresente;\n              presenteFoto.hidden = false;\n            } else {\n              presenteFoto.hidden = true;\n            }\n          }\n          if (presenteNome) presenteNome.textContent = nomePresente;\n          /* A CONFIRMACAO SO APARECE DEPOIS QUE O CARRINHO RESPONDE.\n        \n             \"Ja esta no seu carrinho\" escrito antes da resposta seria mentira toda\n             vez que a adicao falhasse -- e ela falha calada, de proposito. Durante a\n             requisicao o texto diz o que esta acontecendo; no fim, o que aconteceu. */\n          /* \"Vai junto no seu pedido\" e nao \"ja esta no carrinho\": o presente so\n             entra quando houver peca paga, entao afirmar que ja esta la seria\n             falso para quem ainda nao comprou nada -- que e a maioria de quem\n             acaba de girar. */\n          if (presenteNota) presenteNota.textContent = notaPresente(prize.presenteMinimo);\n          premioSemTamanho = !!prize.presenteSemTamanho;\n          premioAtual = prize; /* para a aba poder pedir o e-mail ainda nesta visita */\n          /* Roleta parou, resultado na tela, 2 segundos para ler -- e ai o pop-up\n             do presente (parabens + tamanhos + botao da tabela). Pedido do\n             Guilherme em 24/09/2026, depois de duas versoes: a primeira abria\n             cedo demais e cheia de coisa; a segunda so abria ao fechar a roleta.\n\n             E-MAIL ANTES (06/10/2026): quem ainda nao deixou o e-mail ve primeiro o\n             pop-up do e-mail; o presente so e registrado e o pop-up \"presente ganho\"\n             so abre depois que o e-mail foi aceito (ver pedirEmail). */\n          if (precisaEmail()) {\n            guardaPendente(prize);\n            /* SEM ESPERA (06/10/2026, Guilherme): com 2 s a cliente ja estava lendo o resultado e\n               fechava o pedido de e-mail no reflexo. O pop-up sobe assim que a roda para -- e ele\n               mesmo diz o que ela ganhou (valor e foto), entao nada se perde. */\n            setTimeout(function () { pedirEmail(prize); }, 350);\n          } else {\n            liberaPresente(prize);\n            setTimeout(function () { abrePremio(prize); }, 2000);\n          }\n        }\n        root.classList.remove('is-spinning');\n        root.classList.add('is-done');\n        // For\u00E7a o layout com o resultado j\u00E1 em display:block (opacidade 0) e s\u00F3\n        // ent\u00E3o liga a cascata \u2014 assim a transi\u00E7\u00E3o parte do estado inicial.\n        // setTimeout em vez de rAF: rAF n\u00E3o dispara em aba em segundo plano.\n        void result.offsetHeight;\n        setTimeout(function () {\n          root.classList.add('is-revealed');\n          try { result.scrollIntoView({ behavior: reducedMotion() ? 'auto' : 'smooth', block: 'nearest' }); } catch (e) {}\n          if (ctaBtn) setTimeout(function () { try { ctaBtn.focus({ preventScroll: true }); } catch (e) {} }, 600);\n        }, 40);\n        rememberSpin({\n          prize: prize.label || '',\n          code: prize.code || '',\n          desc: prize.desc || '',\n          presente: prize.presente || '',\n          presenteFoto: prize.presenteFoto || '',\n          presenteTitulo: prize.presenteTitulo || '',\n          presenteMinimo: prize.presenteMinimo || 0,\n          presenteVariante: prize.presenteVariante || 0,\n          presenteSemTamanho: !!prize.presenteSemTamanho,\n          presenteValor: prize.presenteValor || 0,\n          /* Preenchido logo abaixo, quando o /cart.js responder. */\n          cartToken: ''\n        });\n        /* O TOKEN VEM DO /cart.js, E NAO DO LIQUID.\n\n           `cart.token` no Liquid volta VAZIO com carrinho vazio -- que e\n           exatamente o estado de quem acabou de girar sem ter comprado nada.\n           Guardado vazio, a comparacao da visita seguinte nunca dispararia.\n           O `/cart.js` devolve o token mesmo com zero itens (medido). */\n        tokenDoCarrinho().then(function (tk) {\n          if (!tk) return;\n          try {\n            var g = JSON.parse(localStorage.getItem(KEY) || 'null');\n            if (!g) return;\n            g.cartToken = tk;\n            localStorage.setItem(KEY, JSON.stringify(g));\n          } catch (e) {}\n        });\n\n        // no modo edi\u00E7\u00E3o, deixa girar de novo depois de um tempo\n        if (EDIT) scheduleReset(7000);\n      }\n    }\n\n    function resetForEdit() {\n      clearTimeout(resetTimer);\n      if (spinning) return; // nunca rearmar com a roda em movimento\n      done = false;\n      eachSpin(function (b) { b.disabled = false; b.classList.add('is-idle'); });\n      root.classList.remove('is-done', 'is-revealed', 'is-spinning');\n      wheel.classList.remove('is-settled', 'is-spinning');\n      wheel.style.transition = '';\n      wheel.style.transform = '';\n      wheel.classList.add('is-idle');\n    }\n\n    /* Prende o cupom ao carrinho e DEVOLVE SE DEU CERTO.\n\n       Antes era disparar e esquecer, e a tela afirmava \"o cupom ja fica aplicado\n       ao seu carrinho\" sem nunca ter conferido. Quando falhasse, a cliente sairia\n       do pop-up achando que tinha desconto e descobriria no checkout.\n\n       A prova e o `/cart.js`: quem sabe responder \"este codigo esta no carrinho?\"\n       e o campo `discount_codes`. Conferimos a PRESENCA e nao o `applicable` --\n       com o carrinho ainda vazio o codigo fica gravado como nao aplicavel e passa\n       a valer sozinho quando ela poe a primeira peca. Exigir `applicable` aqui\n       diria \"falhou\" no caso mais comum de todos. */\n    /* O CUPOM GANHO ACUMULA com o que a cliente ja tiver no carrinho.\n    \n       Houve uma versao que LIMPAVA a lista antes de aplicar (`cart/update.js`\n       com `discount: ''`), a pedido. O pedido foi revisto: o premio soma, nao\n       substitui. Sem a limpeza, o `/discount/` apenas acrescenta -- medido: com\n       CLIENTE50 no carrinho, aplicar CLIENTEFRETE deixa os dois, os dois\n       aplicaveis.\n    \n       Quem decide se dois cupons de PEDIDO valem juntos nao e este arquivo, e o\n       `combinesWith.orderDiscounts` de cada um na Shopify. Aqui so paramos de\n       atrapalhar.\n    \n       A prova de que entrou continua sendo o `/cart.js`: quem sabe responder\n       \"este codigo esta no carrinho?\" e o campo `discount_codes`. Conferimos a\n       PRESENCA e nao o `applicable` -- com o carrinho ainda vazio o codigo fica\n       gravado como nao aplicavel e passa a valer sozinho na primeira peca. */\n    function applyDiscount(code) {\n      return fetch('/discount/' + encodeURIComponent(code), { credentials: 'same-origin', redirect: 'follow' })\n        .then(function () {\n          return fetch('/cart.js', { cache: 'no-store', credentials: 'same-origin' });\n        })\n        .then(function (r) { return r.json(); })\n        .then(function (c) {\n          var alvo = String(code).toUpperCase();\n          return (c.discount_codes || []).some(function (d) {\n            return String(d.code).toUpperCase() === alvo;\n          });\n        })\n        .catch(function () { return false; });\n    }\n\n\n    /* A ROLETA REGISTRA O PREMIO; QUEM POE E TIRA DO CARRINHO E O tp-presente.\n    \n       A primeira versao adicionava na hora e deu um furo de verdade: a Necessaire\n       custa R$ 0,00, entrava sozinha num carrinho vazio e dava para fechar pedido\n       de R$ 0,00 -- o Luiz pegou 3 delas de graca no checkout. Eu tinha mandado o\n       tp-presente ignorar essas linhas, e com isso tirei o unico guarda que havia.\n    \n       Agora so gravamos o handle. O tp-presente e quem decide, e ele roda no SITE\n       INTEIRO (vive na gaveta do carrinho): com peca paga no carrinho ele coloca\n       uma -- exatamente uma --, e sem peca paga ele tira. Presente acompanha\n       compra; sozinho ele nao existe.\n    \n       Chave fixa e nao a `storage_key` da campanha: o tp-presente nao conhece as\n       configuracoes da roleta, e este contrato precisa ser legivel dos dois lados. */\n    /* ---- E-mail antes do presente (06/10/2026) ----\n       `tp-roleta-email` e gravado pelo tp-presente.js quando o Klaviyo aceita o e-mail;\n       dado uma vez, nunca mais e pedido. Quem ja tinha o presente registrado antes desta\n       mudanca (tp-roleta-presente existe) tambem nao e incomodada. */\n    function semEmail() {\n      try { return !localStorage.getItem('tp-roleta-presente') && !localStorage.getItem('tp-roleta-email'); } catch (e) { return false; }\n    }\n    function precisaEmail() {\n      return !!window.tpPresenteEmail && semEmail();\n    }\n    /* PREMIO PENDENTE DE E-MAIL (06/10/2026): gravado para o tp-presente.js, que roda em todas\n       as paginas e nao conhece a chave da campanha, subir o cartao \"deixe seu e-mail e ganhe o\n       presente\" quando o carrinho bater o minimo. Apagado quando o presente e liberado. */\n    function guardaPendente(prize) {\n      if (EDIT || !prize || !prize.presente) return;\n      try { localStorage.setItem('tp-roleta-pendente', JSON.stringify(Object.assign({}, prize, { campanha: KEY }))); } catch (e) {}\n    }\n    function liberaPresente(prize) {\n      try { localStorage.removeItem('tp-roleta-pendente'); } catch (e) {}\n      guardaPresente(prize.presente, prize.presenteMinimo, prize);\n      atualizaTamanho();\n      mostrarFaixa();\n    }\n    function abrePremio(prize) {\n      /* SEM TAMANHO (05/10/2026): nada a escolher; abre o pop-up \"presente ganho\"\n         (parabens + frete gratis como extra), em vez do de tamanho. */\n      if (prize.presenteSemTamanho) { if (window.tpPresenteGanho) window.tpPresenteGanho.abrir(prize); return; }\n      if (window.tpPresenteTamanho && !window.tpPresenteTamanho.escolhido()) window.tpPresenteTamanho.abrir();\n    }\n    function pedirEmail(prize) {\n      if (!prize || !prize.presente) return;\n      if (window.tpPresenteEmail.aberto()) return;\n      /* Cada abertura cria uma promessa nova; so a ultima resolve quando o e-mail e aceito,\n         entao fechar e reabrir pela aba nao libera o presente duas vezes. */\n      window.tpPresenteEmail.abrir(prize).then(function () {\n        liberaPresente(prize);\n        abrePremio(prize);\n      }).catch(function () {});\n    }\n\n    function guardaPresente(handle, minimo, prize) {\n      try { localStorage.setItem('tp-roleta-presente', handle); } catch (e) {}\n      try { localStorage.setItem('tp-roleta-presente-campanha', KEY); } catch (e) {}\n      /* SEM TAMANHO (05/10/2026): variante unica gravada ja no giro -- o tp-presente nao\n         pede tamanho e poe esta variante quando o carrinho bate o minimo. O valor \"de\" (em\n         centavos) vai junto para o cartao \"adicione mais R$ X e ganhe o presente de R$ Y\". */\n      if (prize && prize.presenteSemTamanho && prize.presenteVariante) {\n        try {\n          localStorage.setItem('tp-roleta-presente-variante', String(prize.presenteVariante));\n          localStorage.setItem('tp-roleta-presente-tamanho', 'unico');\n        } catch (e) {}\n      }\n      try { localStorage.setItem('tp-roleta-presente-valor', String((prize && prize.presenteValor) || 0)); } catch (e) {}\n      /* MINIMO EM CENTAVOS, ao lado do handle (23/09/2026): o presente da roleta\n         passou a poder exigir um valor de pedido (\"presente misterioso a partir de\n         R$ 299\"). O tp-presente le esta chave e so coloca -- e so mantem -- o\n         presente com esse total em pecas pagas. Zero = regra antiga, qualquer peca. */\n      try { localStorage.setItem('tp-roleta-presente-minimo', String(Math.round((+minimo || 0) * 100))); } catch (e) {}\n      /* Cutuca o tp-presente para o caso de ela JA ter pecas no carrinho: sem isto\n         o presente so entraria na proxima mexida. */\n      try { document.dispatchEvent(new CustomEvent('tp:roleta-presente')); } catch (e) {}\n      if (typeof publish === 'function' && typeof PUB_SUB_EVENTS !== 'undefined') {\n        try { publish(PUB_SUB_EVENTS.cartUpdate, { source: 'tp-roleta' }); } catch (e) {}\n      }\n    }\n\n    // ---- Abrir / fechar ----\n    //\n    // A ABA MORA FORA DO `root`, que \u00E9 `display: none` quando fechado -- dentro\n    // dele ela sumiria junto. Como a se\u00E7\u00E3o tem `tag: section`, os dois j\u00E1 nascem\n    // irm\u00E3os dentro da <section> que a Shopify embrulha, e o `parentNode`\n    // alcan\u00E7a a aba sem wrapper novo e sem depender da ordem dos elementos.\n    var aba = root.parentNode ? root.parentNode.querySelector('[data-roleta-aba]') : null;\n\n    /* A ABA ATENDE OS DOIS ESTADOS, e o texto dela diz qual.\n\n       Antes ela era so para quem fechou ANTES de girar (`!done`). Agora quem ja\n       ganhou tambem a ve, com o texto trocado -- clicando, ela reve o premio em\n       vez de girar de novo. O `<span data-roleta-aba-texto>` existe justamente\n       para essa troca nao apagar o emoji junto.\n\n       A redacao dos dois estados vem do Liquid (`aba_texto` e\n       `data-aba-premio`), nao daqui: texto que a cliente le e do editor. */\n    var abaTexto = aba ? aba.querySelector('[data-roleta-aba-texto]') : null;\n    function rotuloAba(premio) {\n      if (!aba) return;\n      /* Sem e-mail ainda: a aba convida a desbloquear, nao a rever (06/10/2026). */\n      var alvo = premio ? (precisaEmail() ? (aba.dataset.abaEmail || 'Desbloquear seu pr\u00EAmio') : (aba.dataset.abaPremio || 'Veja seu pr\u00EAmio')) : null;\n      if (!alvo) return;\n      if (abaTexto) abaTexto.textContent = alvo;\n      aba.setAttribute('aria-label', alvo);\n    }\n    function mostraAba() { if (aba) aba.classList.add('is-on'); }\n    function escondeAba() { if (aba) aba.classList.remove('is-on'); }\n    aba && aba.addEventListener('click', function () {\n      escondeAba();\n      /* Ja ganhou: remonta o resultado antes de abrir, senao a roda apareceria\n         pronta para um giro que nao vai acontecer. */\n      if (premioGuardado && !done) restauraPremio(premioGuardado);\n      /* Girou e saiu sem deixar o e-mail: a aba (\"Desbloquear seu premio\") volta DIRETO no\n         pop-up do e-mail, sem reabrir a roleta. So depois do e-mail o presente e registrado\n         e o pop-up \"presente ganho\" abre. */\n      var pend = premioGuardado || premioAtual;\n      if (done && pend && precisaEmail()) { pedirEmail(pend); return; }\n      show();\n    });\n    /* Saiu do pedido de e-mail sem preencher (\"Sair mesmo assim\"): a roleta fecha junto e a\n       aba fica com \"Desbloquear seu premio\". Se a roleta ja estava fechada (veio pela aba),\n       so a aba volta. */\n    /* O cartao \"deixe seu e-mail\" do rodape (tp-presente.js) pede para reabrir o pop-up do\n       e-mail: a liberacao do presente mora aqui, entao o pedido passa por pedirEmail. */\n    document.addEventListener('tp-roleta-pedir-email', function () {\n      var p = premioGuardado || premioAtual;\n      if (!p || !precisaEmail()) return;\n      if (premioGuardado && !done) restauraPremio(premioGuardado);\n      escondeAba();\n      pedirEmail(p);\n    });\n    document.addEventListener('tp-pe-saiu', function () {\n      if (root.classList.contains('is-visible')) hide();\n      else if (done) { rotuloAba(true); mostraAba(); }\n    });\n\n    /* REMONTA O RESULTADO a partir do que foi guardado, sem sortear nada.\n\n       Nao reaplica o cupom nem registra o presente de novo: as duas coisas ja\n       aconteceram no giro, e repetir criaria cupom trocado e presente duplicado.\n       Aqui e so tela. */\n    function restauraPremio(g) {\n      done = true;\n      spinning = false;\n      wonLabel.textContent = g.prize || '';\n      descEl.textContent = g.desc || '';\n\n      var temCodigo = !!g.code;\n      codeEl.textContent = temCodigo ? g.code : '';\n      if (codeStep) codeStep.hidden = !temCodigo;\n      if (noteStep) noteStep.hidden = !temCodigo;\n\n      var temPresente = !!g.presente;\n      if (presenteStep) presenteStep.hidden = !temPresente;\n      if (temPresente) {\n        var nome = g.presenteTitulo || g.prize || '';\n        if (presenteFoto) {\n          if (g.presenteFoto) {\n            presenteFoto.src = g.presenteFoto;\n            presenteFoto.alt = nome;\n            presenteFoto.hidden = false;\n          } else {\n            presenteFoto.hidden = true;\n          }\n        }\n        if (presenteNome) presenteNome.textContent = nome;\n        if (presenteNota) presenteNota.textContent = notaPresente(g.presenteMinimo);\n        premioSemTamanho = !!g.presenteSemTamanho;\n        atualizaTamanho();\n      }\n\n      root.classList.remove('is-spinning');\n      root.classList.add('is-done', 'is-revealed');\n      wheel.classList.remove('is-idle');\n      wheel.classList.add('is-settled');\n    }\n\n    var lastFocus = null;\n    function show() {\n      escondeAba();\n      lastFocus = document.activeElement;\n      root.classList.remove('is-closing');\n      root.classList.add('is-visible');\n      document.documentElement.classList.add('tp-roleta-open');\n      fitTentativas = 0; // cada abertura tem or\u00E7amento pr\u00F3prio de tentativas\n      requestAnimationFrame(fitLabels);\n      if (document.fonts && document.fonts.ready) document.fonts.ready.then(fitLabels).catch(function () {});\n      // O balan\u00E7o s\u00F3 come\u00E7a depois que o card terminou de entrar (0.5s): assim a\n      // roda \u00E9 rasterizada n\u00EDtida, parada e em escala 1, antes de virar camada animada.\n      setTimeout(function () { if (!spinning && !done) wheel.classList.add('is-idle'); }, 600);\n      setTimeout(function () { try { spinBtn.focus({ preventScroll: true }); } catch (e) {} }, 350);\n    }\n    function hide() {\n      if (!root.classList.contains('is-visible') || root.classList.contains('is-closing')) return;\n      if (!done) rememberClose();\n      root.classList.add('is-closing');\n      /* Sem girar, o cartao ENCOLHE rumo a aba no canto direito (CSS is-encolhendo), para a\n         cliente ver para onde a roleta foi. Com premio, fecha como antes. */\n      var encolhe = !done && !reducedMotion();\n      if (encolhe) root.classList.add('is-encolhendo');\n      document.documentElement.classList.remove('tp-roleta-open');\n      setTimeout(function () {\n        root.classList.remove('is-visible', 'is-closing', 'is-encolhendo');\n        /* A aba volta nos DOIS casos, com textos diferentes: quem fechou sem\n           girar e convidado a girar; quem ja ganhou e convidado a rever. */\n        rotuloAba(done);\n        mostraAba();\n        try { lastFocus && lastFocus.focus && lastFocus.focus({ preventScroll: true }); } catch (e) {}\n        if (EDIT) {\n          clearTimeout(resetTimer);\n          setTimeout(function () {\n            if (spinning || root.classList.contains('is-visible')) return; // j\u00E1 reaberto/girando: n\u00E3o mexe\n            if (done) resetForEdit();\n            show();\n          }, 3000);\n        }\n      }, encolhe ? 520 : 230);\n    }\n\n    for (var c = 0; c < closeEls.length; c++) closeEls[c].addEventListener('click', hide);\n    /* Fechou o pop-up \"presente ganho\" (X, overlay, botao ou ESC): a roleta, que\n       ficou aberta por tras mostrando o resultado, fecha junto e vira a aba\n       \"rever\". Pedido do Guilherme em 06/10/2026. */\n    document.addEventListener('tp-pg-fechou', function () {\n      if (root.classList.contains('is-visible')) hide();\n      /* Veio pela aba (roleta fechada), deu o e-mail, viu o presente: a aba volta como \"Veja seu premio\". */\n      else if (done) { rotuloAba(true); mostraAba(); }\n    });\n\n    // iOS: mesmo com overflow-x hidden, um dedo arrastando na horizontal move o\n    // conte\u00FAdo e solta de volta (rubber band). Cancela s\u00F3 o gesto horizontal;\n    // o vertical continua rolando o card normalmente.\n    (function () {\n      var sx = 0, sy = 0, horiz = null;\n      card.addEventListener('touchstart', function (e) {\n        if (e.touches.length !== 1) return;\n        sx = e.touches[0].clientX; sy = e.touches[0].clientY; horiz = null;\n      }, { passive: true });\n      card.addEventListener('touchmove', function (e) {\n        if (e.touches.length !== 1) return;\n        if (horiz === null) {\n          var dx = Math.abs(e.touches[0].clientX - sx), dy = Math.abs(e.touches[0].clientY - sy);\n          if (dx < 4 && dy < 4) return;\n          horiz = dx > dy;\n        }\n        if (horiz && e.cancelable) e.preventDefault();\n      }, { passive: false });\n    })();\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape' && root.classList.contains('is-visible')) hide();\n    });\n\n    eachSpin(function (b) { b.addEventListener('click', spin); });\n    // a roda inteira tamb\u00E9m gira (alvo grande no celular)\n    wheel && wheel.addEventListener('click', spin);\n\n    // ---- Copiar cupom (clique em qualquer parte da p\u00EDlula) ----\n    function copyCode() {\n      var code = codeEl ? codeEl.textContent.trim() : '';\n      if (!code) return;\n      var original = copyBtn.textContent;\n      function ok() {\n        copyBtn.textContent = 'Copiado';\n        codeWrap.classList.add('is-copied');\n        setTimeout(function () { copyBtn.textContent = original; codeWrap.classList.remove('is-copied'); }, 2200);\n      }\n      if (navigator.clipboard && navigator.clipboard.writeText) {\n        navigator.clipboard.writeText(code).then(ok).catch(function () {});\n      } else {\n        var ta = document.createElement('textarea');\n        ta.value = code; ta.setAttribute('readonly', ''); ta.style.position = 'fixed'; ta.style.opacity = '0';\n        document.body.appendChild(ta); ta.select();\n        try { document.execCommand('copy'); ok(); } catch (e) {}\n        document.body.removeChild(ta);\n      }\n    }\n    codeWrap && codeWrap.addEventListener('click', copyCode);\n    codeWrap && codeWrap.addEventListener('keydown', function (e) {\n      if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); copyCode(); }\n    });\n\n    ctaBtn && ctaBtn.addEventListener('click', function () {\n      var url = (ctaBtn.dataset.url || '').trim();\n      /* Sem URL configurada (21/10/2026, pedido do Guilherme): aberta na HOME, o botao leva\n         para a vitrine (produtos-site-base); em colecao, PDP ou qualquer outra pagina so fecha\n         e a cliente continua onde estava (nunca /collections/all). `here` ja vem sem barra\n         final, entao a home e '' (ou so o prefixo de idioma, /pt-br). */\n      var naHome = here === '' || /^\\/[a-z]{2}(?:-[a-z]{2})?$/i.test(here);\n      if (!url && naHome) url = '/collections/produtos-site-base';\n      if (url) { location.href = url; } else { hide(); }\n    });\n\n    /* QUEM JA GANHOU NAO VE O POP-UP ABRIR SOZINHO -- so a aba.\n\n       Abrir de novo seria mostrar um premio que ela ja conhece, toda vez que\n       trocasse de pagina. A aba fica a mao para quando ela quiser reve-lo. */\n    if (premioGuardado) {\n      rotuloAba(true);\n      mostraAba();\n      /* Girou numa visita anterior e ainda nao deixou o e-mail: mantem o pendente em dia\n         para o cartao do rodape (e cobre quem girou antes de o cartao existir). */\n      if (premioGuardado.presente && semEmail()) guardaPendente(premioGuardado);\n    }\n    // Fechou sem girar nesta sess\u00E3o: n\u00E3o reabre sozinho -- seria insistir com\n    // quem j\u00E1 disse n\u00E3o -- mas a aba fica \u00E0 m\u00E3o.\n    else if (fechouAntes) mostraAba();\n    else if (DELAY > 0) setTimeout(show, DELAY);\n    else show();\n    /* Pendente de outra campanha, ou ja resolvido (e-mail dado / presente liberado): apaga. */\n    try {\n      var pend = JSON.parse(localStorage.getItem('tp-roleta-pendente') || 'null');\n      if (pend && (pend.campanha !== KEY || !semEmail() || !premioGuardado)) localStorage.removeItem('tp-roleta-pendente');\n    } catch (e) {}\n  }\n\n  function boot() {\n    var roots = document.querySelectorAll('[data-tp-roleta]');\n    for (var i = 0; i < roots.length; i++) init(roots[i]);\n  }\n\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);\n  else boot();\n  document.addEventListener('shopify:section:load', boot);\n})();\n"],
  "mappings": "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",
  "names": ["c", "pend"]
}
