{
  "version": 3,
  "sources": ["/cdn/shop/t/236/assets/newsletter-popup-claim.js?cb=1784754898187"],
  "sourcesContent": ["/* Newsletter popup \u2014 claim flow.\n   Shows the loader -> success step IN the popup first, then submits the form\n   natively (full page, exactly like the footer JOIN) so the signup goes\n   through Shopify's captcha chain and is guaranteed to register. After the\n   reload, Liquid renders posted_successfully and popup.js auto-reopens the\n   popup on the success view (the .newsletter-message hook), so the user lands\n   back on step 2.\n\n   Why not fetch(): Shopify requires an hCaptcha token on /contact posts \u2014 a\n   background fetch has none and gets 400 \"Missing CAPTCHA token\" (verified\n   live). Only the native submit chain (Shopify's bootstrap + hCaptcha\n   provider) attaches the token. ensureCaptcha() makes sure the form is bound\n   before we fire that chain.\n\n   Hardening:\n   - Claim CTA click AND form submit are intercepted at document level in the\n     CAPTURE phase and routed through claim(); our own deferred native submit\n     is let through via the tlSubmitting flag so the captcha chain can run.\n   - The email is persisted to sessionStorage as it is typed \u2014 after the\n     reload the success view echoes the address from there.\n   Cards are matched by #tl-pp-card-<sectionId>. */\n(function () {\n  var EMAIL_RE = /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/;\n  var STORE_KEY = 'tl-pp-email';\n  var SUCCESS_DWELL_MS = 4000; // how long step 2 stays visible before the real submit (design: 4s countdown)\n\n  function savedEmail() {\n    try { return sessionStorage.getItem(STORE_KEY) || ''; } catch (x) { return ''; }\n  }\n  function saveEmail(v) {\n    try { sessionStorage.setItem(STORE_KEY, v); } catch (x) {}\n  }\n\n  function els(card) {\n    return {\n      form: card.querySelector('form[id^=\"newsletter-\"]'),\n      formView: card.querySelector('.tl-pp-form-view'),\n      pending: card.querySelector('.tl-pp-pending'),\n      pendingMail: card.querySelector('[id^=\"tl-pp-pendingmail-\"]'),\n      success: card.querySelector('.tl-pp-ok'),\n      email: card.querySelector('input[type=\"email\"]'),\n      emailOut: card.querySelector('[id^=\"tl-pp-emailout-\"]'),\n      cta: card.querySelector('button.tl-pp-cta'),\n      error: card.querySelector('.tl-pp-error'),\n      content: card.querySelector('.tl-pp-content')\n    };\n  }\n\n  /* Resolve once the form is captcha-bound (data-hcaptcha-bound /\n     data-recaptcha-bound, set by Shopify's provider script). Normally the\n     focusin on the email field has already bound it; otherwise ask\n     Shopify.captcha.protect. Times out rather than hanging. */\n  function ensureCaptcha(form) {\n    return new Promise(function (resolve) {\n      function bound() {\n        return form.dataset.hcaptchaBound || form.dataset.recaptchaBound;\n      }\n      if (bound()) return resolve();\n      var S = window.Shopify;\n      if (!form.dataset.cptcha && S && S.captcha && typeof S.captcha.protect === 'function') {\n        try { S.captcha.protect(form, function () {}); } catch (x) {}\n      }\n      var tries = 0;\n      (function poll() {\n        if (bound() || tries++ > 50) return resolve();\n        setTimeout(poll, 100);\n      })();\n    });\n  }\n\n  /* \"Saving your subscription \u00B7 refreshing in Ns\" \u2014 the reload is not a glitch,\n     so the reason is spelled out and the seconds tick down for real until the\n     deferred submit fires, then hold at 0 while the captcha/POST completes. */\n  function startCountdown(card, durationMs) {\n    var row = card.querySelector('.tl-pp-ok-count');\n    if (!row) return;\n    var num = row.querySelector('.tl-pp-count-num');\n    row.classList.remove('hidden');\n    var deadline = Date.now() + durationMs;\n    // setInterval, not rAF \u2014 rAF can freeze in in-app browsers/background tabs\n    var timer = setInterval(function () {\n      var left = Math.max(0, deadline - Date.now());\n      if (num) num.textContent = Math.ceil(left / 1000);\n      if (left <= 0) clearInterval(timer);\n    }, 200);\n  }\n\n  function reveal(card, withLoader, onSuccessShown) {\n    var e = els(card);\n    var val = ((e.email && e.email.value) || '').trim() || savedEmail();\n    if (e.emailOut && val) e.emailOut.textContent = val;\n    if (e.pendingMail && val) e.pendingMail.textContent = val;\n    function finish() {\n      card.classList.remove('tl-pp-loading');\n      card.classList.add('tl-pp-claimed');\n      if (e.formView) e.formView.classList.add('hidden');\n      if (e.pending) e.pending.classList.add('hidden');\n      if (e.success) {\n        e.success.classList.remove('hidden');\n        try { e.success.focus(); } catch (x) {}\n      }\n      if (onSuccessShown) onSuccessShown();\n    }\n    if (withLoader) {\n      // Freeze the column at its current height first: form -> pending ->\n      // success swap three different blocks in, and the card must not jump.\n      if (e.content && !e.content.style.minHeight) {\n        e.content.style.minHeight = e.content.offsetHeight + 'px';\n      }\n      // The right panel never goes blank while the loader runs on the image.\n      if (e.pending) e.pending.classList.remove('hidden');\n      card.classList.add('tl-pp-loading');\n      setTimeout(finish, 1500);\n    } else {\n      finish();\n    }\n  }\n\n  function claim(card) {\n    if (card.classList.contains('tl-pp-loading') || card.classList.contains('tl-pp-claimed')) return;\n    var e = els(card);\n    var val = ((e.email && e.email.value) || '').trim();\n    if (!EMAIL_RE.test(val)) {\n      if (e.email) e.email.focus();\n      if (e.error) {\n        e.error.textContent = 'Please enter a valid email address.';\n        e.error.classList.remove('hidden');\n      }\n      return;\n    }\n    if (e.error) e.error.classList.add('hidden');\n    saveEmail(val);\n    if (e.cta) {\n      e.cta.disabled = true;\n      e.cta.style.opacity = '.75';\n      e.cta.style.cursor = 'default';\n    }\n\n    // Start binding the captcha in parallel with the loader animation.\n    var captchaReady = e.form ? ensureCaptcha(e.form) : Promise.resolve();\n\n    // Loader -> success step; once step 2 has been on screen for the dwell\n    // time, fire the REAL native submit (footer-identical, page reloads).\n    reveal(card, true, function () {\n      // v2: the reward has now been shown in the popup itself, so the offer is\n      // closed for good \u2014 after the reload the corner stays clean.\n      if (window.TLNewsletterV2) window.TLNewsletterV2.markClaimed();\n      if (!e.form) return;\n      startCountdown(card, SUCCESS_DWELL_MS);\n      setTimeout(function () {\n        card.dataset.tlSubmitting = '1';\n        captchaReady.then(function () {\n          try {\n            if (e.form.requestSubmit) e.form.requestSubmit();\n            else e.form.submit();\n          } catch (x) {\n            try { e.form.submit(); } catch (y) {}\n          }\n        });\n      }, SUCCESS_DWELL_MS);\n    });\n  }\n\n  // Claim CTA click \u2014 capture phase beats everything. Our own deferred\n  // native submit (tlSubmitting) passes through untouched.\n  document.addEventListener('click', function (ev) {\n    var btn = ev.target.closest && ev.target.closest('button.tl-pp-cta');\n    if (!btn) return;\n    var card = btn.closest('[id^=\"tl-pp-card-\"]');\n    if (!card || card.dataset.tlSubmitting) return;\n    ev.preventDefault();\n    claim(card);\n  }, true);\n\n  // Enter key in the email field fires submit \u2014 route through claim() unless\n  // it's our own deferred submit heading for the captcha chain.\n  document.addEventListener('submit', function (ev) {\n    var form = ev.target;\n    if (!(form instanceof HTMLFormElement)) return;\n    var card = form.closest('[id^=\"tl-pp-card-\"]');\n    if (!card || card.dataset.tlSubmitting) return;\n    ev.preventDefault();\n    claim(card);\n  }, true);\n\n  // Persist the address while it is typed \u2014 survives the reload.\n  document.addEventListener('input', function (ev) {\n    var inp = ev.target;\n    if (!inp || inp.type !== 'email') return;\n    if (!inp.closest || !inp.closest('[id^=\"tl-pp-card-\"]')) return;\n    saveEmail((inp.value || '').trim());\n  }, true);\n\n  // After the posted reload the success view renders visible from Liquid \u2014\n  // jump straight to the claimed end-state (no loader, no re-submit) and\n  // restore the typed address from sessionStorage.\n  function scanPosted() {\n    document.querySelectorAll('[id^=\"tl-pp-card-\"]').forEach(function (card) {\n      if (card.dataset.tlPpPosted) return;\n      var success = card.querySelector('.tl-pp-ok');\n      if (success && !success.classList.contains('hidden') && !card.classList.contains('tl-pp-claimed')) {\n        card.dataset.tlPpPosted = '1';\n        card.dataset.tlSubmitting = '1'; // already posted \u2014 never submit again\n        reveal(card, false);\n      }\n    });\n  }\n  if (document.readyState !== 'loading') scanPosted();\n  else document.addEventListener('DOMContentLoaded', scanPosted);\n  document.addEventListener('alpine:initialized', function () { setTimeout(scanPosted, 50); });\n  setTimeout(scanPosted, 600);\n  setTimeout(scanPosted, 1500);\n})();\n"],
  "mappings": "CAqBC,UAAY,CACX,IAAI,SAAW,6BACX,UAAY,cACZ,iBAAmB,IAEvB,SAAS,YAAa,CACpB,GAAI,CAAE,OAAO,eAAe,QAAQ,SAAS,GAAK,EAAI,OAAS,EAAG,CAAE,MAAO,EAAI,CACjF,CACA,SAAS,UAAU,EAAG,CACpB,GAAI,CAAE,eAAe,QAAQ,UAAW,CAAC,CAAG,OAAS,EAAG,CAAC,CAC3D,CAEA,SAAS,IAAI,KAAM,CACjB,MAAO,CACL,KAAM,KAAK,cAAc,yBAAyB,EAClD,SAAU,KAAK,cAAc,kBAAkB,EAC/C,QAAS,KAAK,cAAc,gBAAgB,EAC5C,YAAa,KAAK,cAAc,4BAA4B,EAC5D,QAAS,KAAK,cAAc,WAAW,EACvC,MAAO,KAAK,cAAc,qBAAqB,EAC/C,SAAU,KAAK,cAAc,yBAAyB,EACtD,IAAK,KAAK,cAAc,kBAAkB,EAC1C,MAAO,KAAK,cAAc,cAAc,EACxC,QAAS,KAAK,cAAc,gBAAgB,CAC9C,CACF,CAMA,SAAS,cAAc,KAAM,CAC3B,OAAO,IAAI,QAAQ,SAAU,QAAS,CACpC,SAAS,OAAQ,CACf,OAAO,KAAK,QAAQ,eAAiB,KAAK,QAAQ,cACpD,CACA,GAAI,MAAM,EAAG,OAAO,QAAQ,EAC5B,IAAI,EAAI,OAAO,QACf,GAAI,CAAC,KAAK,QAAQ,QAAU,GAAK,EAAE,SAAW,OAAO,EAAE,QAAQ,SAAY,WACzE,GAAI,CAAE,EAAE,QAAQ,QAAQ,KAAM,UAAY,CAAC,CAAC,CAAG,OAAS,EAAG,CAAC,CAE9D,IAAI,MAAQ,GACX,SAAS,MAAO,CACf,GAAI,MAAM,GAAK,QAAU,GAAI,OAAO,QAAQ,EAC5C,WAAW,KAAM,GAAG,CACtB,GAAG,CACL,CAAC,CACH,CAKA,SAAS,eAAe,KAAM,WAAY,CACxC,IAAI,IAAM,KAAK,cAAc,iBAAiB,EAC9C,GAAK,IACL,KAAI,IAAM,IAAI,cAAc,kBAAkB,EAC9C,IAAI,UAAU,OAAO,QAAQ,EAC7B,IAAI,SAAW,KAAK,IAAI,EAAI,WAExB,MAAQ,YAAY,UAAY,CAClC,IAAI,KAAO,KAAK,IAAI,EAAG,SAAW,KAAK,IAAI,CAAC,EACxC,MAAK,IAAI,YAAc,KAAK,KAAK,KAAO,GAAI,GAC5C,MAAQ,GAAG,cAAc,KAAK,CACpC,EAAG,GAAG,EACR,CAEA,SAAS,OAAO,KAAM,WAAY,eAAgB,CAChD,IAAI,EAAI,IAAI,IAAI,EACZ,KAAQ,EAAE,OAAS,EAAE,MAAM,OAAU,IAAI,KAAK,GAAK,WAAW,EAC9D,EAAE,UAAY,MAAK,EAAE,SAAS,YAAc,KAC5C,EAAE,aAAe,MAAK,EAAE,YAAY,YAAc,KACtD,SAAS,QAAS,CAKhB,GAJA,KAAK,UAAU,OAAO,eAAe,EACrC,KAAK,UAAU,IAAI,eAAe,EAC9B,EAAE,UAAU,EAAE,SAAS,UAAU,IAAI,QAAQ,EAC7C,EAAE,SAAS,EAAE,QAAQ,UAAU,IAAI,QAAQ,EAC3C,EAAE,QAAS,CACb,EAAE,QAAQ,UAAU,OAAO,QAAQ,EACnC,GAAI,CAAE,EAAE,QAAQ,MAAM,CAAG,OAAS,EAAG,CAAC,CACxC,CACI,gBAAgB,eAAe,CACrC,CACI,YAGE,EAAE,SAAW,CAAC,EAAE,QAAQ,MAAM,YAChC,EAAE,QAAQ,MAAM,UAAY,EAAE,QAAQ,aAAe,MAGnD,EAAE,SAAS,EAAE,QAAQ,UAAU,OAAO,QAAQ,EAClD,KAAK,UAAU,IAAI,eAAe,EAClC,WAAW,OAAQ,IAAI,GAEvB,OAAO,CAEX,CAEA,SAAS,MAAM,KAAM,CACnB,GAAI,OAAK,UAAU,SAAS,eAAe,GAAK,KAAK,UAAU,SAAS,eAAe,GACvF,KAAI,EAAI,IAAI,IAAI,EACZ,KAAQ,EAAE,OAAS,EAAE,MAAM,OAAU,IAAI,KAAK,EAClD,GAAI,CAAC,SAAS,KAAK,GAAG,EAAG,CACnB,EAAE,OAAO,EAAE,MAAM,MAAM,EACvB,EAAE,QACJ,EAAE,MAAM,YAAc,sCACtB,EAAE,MAAM,UAAU,OAAO,QAAQ,GAEnC,MACF,CACI,EAAE,OAAO,EAAE,MAAM,UAAU,IAAI,QAAQ,EAC3C,UAAU,GAAG,EACT,EAAE,MACJ,EAAE,IAAI,SAAW,GACjB,EAAE,IAAI,MAAM,QAAU,MACtB,EAAE,IAAI,MAAM,OAAS,WAIvB,IAAI,aAAe,EAAE,KAAO,cAAc,EAAE,IAAI,EAAI,QAAQ,QAAQ,EAIpE,OAAO,KAAM,GAAM,UAAY,CAGzB,OAAO,gBAAgB,OAAO,eAAe,YAAY,EACxD,EAAE,OACP,eAAe,KAAM,gBAAgB,EACrC,WAAW,UAAY,CACrB,KAAK,QAAQ,aAAe,IAC5B,aAAa,KAAK,UAAY,CAC5B,GAAI,CACE,EAAE,KAAK,cAAe,EAAE,KAAK,cAAc,EAC1C,EAAE,KAAK,OAAO,CACrB,OAAS,EAAG,CACV,GAAI,CAAE,EAAE,KAAK,OAAO,CAAG,OAAS,EAAG,CAAC,CACtC,CACF,CAAC,CACH,EAAG,gBAAgB,EACrB,CAAC,EACH,CAIA,SAAS,iBAAiB,QAAS,SAAU,GAAI,CAC/C,IAAI,IAAM,GAAG,OAAO,SAAW,GAAG,OAAO,QAAQ,kBAAkB,EACnE,GAAK,IACL,KAAI,KAAO,IAAI,QAAQ,qBAAqB,EACxC,CAAC,MAAQ,KAAK,QAAQ,eAC1B,GAAG,eAAe,EAClB,MAAM,IAAI,GACZ,EAAG,EAAI,EAIP,SAAS,iBAAiB,SAAU,SAAU,GAAI,CAChD,IAAI,KAAO,GAAG,OACd,GAAM,gBAAgB,gBACtB,KAAI,KAAO,KAAK,QAAQ,qBAAqB,EACzC,CAAC,MAAQ,KAAK,QAAQ,eAC1B,GAAG,eAAe,EAClB,MAAM,IAAI,GACZ,EAAG,EAAI,EAGP,SAAS,iBAAiB,QAAS,SAAU,GAAI,CAC/C,IAAI,IAAM,GAAG,OACT,CAAC,KAAO,IAAI,OAAS,SACrB,CAAC,IAAI,SAAW,CAAC,IAAI,QAAQ,qBAAqB,GACtD,WAAW,IAAI,OAAS,IAAI,KAAK,CAAC,CACpC,EAAG,EAAI,EAKP,SAAS,YAAa,CACpB,SAAS,iBAAiB,qBAAqB,EAAE,QAAQ,SAAU,KAAM,CACvE,GAAI,MAAK,QAAQ,WACjB,KAAI,QAAU,KAAK,cAAc,WAAW,EACxC,SAAW,CAAC,QAAQ,UAAU,SAAS,QAAQ,GAAK,CAAC,KAAK,UAAU,SAAS,eAAe,IAC9F,KAAK,QAAQ,WAAa,IAC1B,KAAK,QAAQ,aAAe,IAC5B,OAAO,KAAM,EAAK,GAEtB,CAAC,CACH,CACI,SAAS,aAAe,UAAW,WAAW,EAC7C,SAAS,iBAAiB,mBAAoB,UAAU,EAC7D,SAAS,iBAAiB,qBAAsB,UAAY,CAAE,WAAW,WAAY,EAAE,CAAG,CAAC,EAC3F,WAAW,WAAY,GAAG,EAC1B,WAAW,WAAY,IAAI,CAC7B,GAAG",
  "names": []
}
