{
  "version": 3,
  "sources": ["/cdn/shop/t/98/assets/klaviyo-reopen-note.js"],
  "sourcesContent": ["/**\n * Klaviyo welcome offer: eligible PDP row + one-shot PDP popup opening.\n * -----------------------------------------------------------------------------------------------\n * Klaviyo remains the sole source of truth for eligibility. This script only treats the exact\n * market form's rendered teaser as an \"eligible\" signal; it never reconstructs audience rules\n * from cookies, localStorage, URL rules, previous purchases or subscription state.\n *\n * The first opening is remembered in localStorage across tabs/visits; session markers migrate.\n * Submission/eligibility state stays in sessionStorage. An exact market teaser may\n * also cache its own form ID for the rest of the current tab session, so a shopper who was already\n * approved does not wait for Klaviyo to repeat the same decision on every PDP. No URL, timer,\n * generic cookie or reconstructed audience rule can create that cache entry. On PDPs only, the\n * 15 seconds after the cookie choice or 25% genuine user scroll may request one permitted opening.\n * Gallery navigation is deliberately never an opening criterion. Manual row/teaser clicks remain\n * available afterwards.\n *\n * See docs/klaviyo-reopen-note.md.\n */\n(() => {\n  // A second asset evaluation must not install an independent timer/observer/controller.\n  if (window.__lelafineWelcomeController) return;\n  window.__lelafineWelcomeController = true;\n  // Create Klaviyo's documented command queue before the consent-gated onsite library starts.\n  // Some market builds consume and remove a queue that is created only after they are ready;\n  // keeping this early reference lets later PDP clicks dispatch through Klaviyo on every market.\n  const klaviyoOnsite = window._klOnsite = window._klOnsite || [];\n\n  const FORM_IDS = Object.freeze({\n    'lelafine.dk': 'Yj3Vt4',\n    'lelafine.nl': 'YrGt3q',\n    'lelafine.de': 'TSv7Mm',\n    'lelafine.no': 'Srvbjm',\n    'lelafine.be': 'S9wVut',\n    'lelafine.se': 'YiLWGf',\n  });\n\n  const SESSION_LEGACY_RETIRED_KEY = 'lelafine:welcome-offer:retired';\n  const SESSION_SUBMITTED_KEY = 'lelafine:welcome-offer:submitted';\n  // Keep the historic storage key for continuity; it now means that any permitted welcome form\n  // opening has been seen, not that the theme may auto-open a form.\n  const SESSION_OPENED_KEY = 'lelafine:welcome-offer:auto-opened';\n  const PERSISTENT_OPENED_KEY = 'lelafine:welcome-offer:opened';\n  const SESSION_WISH_TRAFFIC_KEY = 'lelafine:welcome-offer:wish-traffic';\n  const SESSION_ELIGIBLE_FORM_KEY = 'lelafine:welcome-offer:eligible-form';\n  const SESSION_CONSENT_ANSWERED_AT_KEY = 'lelafine:welcome-offer:consent-answered-at';\n  const SESSION_CONSENT_CONFIRMED_KEY = 'lelafine:welcome-offer:consent-confirmed-v2';\n  const PERSISTENT_CLAIMED_KEY = 'lf_welcome_claimed';\n  // Klaviyo's \"show teaser before form\" signal is intentionally rendered after two seconds.\n  // Leave a little network/render margin before treating the page as ineligible.\n  const ELIGIBILITY_DEADLINE_MS = 4_000;\n  const FORM_OPEN_PERMIT_MS = 5_000;\n  // After an internal Shopify navigation Klaviyo can retain the approved market eligibility in\n  // this tab while its native teaser is no longer present on the new PDP. In that state the first\n  // documented openForm command only wakes some market builds; a second user click used to be\n  // required. Replay the command once, inside the same still-valid user permit, only when no open\n  // event has arrived. A successful first command consumes the permit and cancels this fallback.\n  const MANUAL_OPEN_RETRY_MS = 900;\n  const PERMITTED_OPEN_CLOSE_GRACE_MS = 750;\n  // Klaviyo swaps the opt-in view for the Success view after `submit`. The swap can briefly leave\n  // no visible form in the DOM, so the one-shot guard must keep the already-permitted dialog alive\n  // long enough for the dynamic coupon view to mount. Coupon activation runs independently in\n  // welcome-discount-price.js and is never awaited here.\n  const SUCCESS_TRANSITION_GRACE_MS = 5_000;\n  const AUTO_OPEN_AFTER_CONSENT_MS = 15_000;\n  const AUTO_OPEN_SCROLL_PROGRESS = 0.25;\n  const AUTO_OPEN_IDLE_MS = 300;\n  const USER_INPUT_WINDOW_MS = 1_800;\n\n  const host = window.location.hostname.replace(/^www\\./, '').toLowerCase();\n  const marketFormId = FORM_IDS[host] || '';\n  // All six live markets use the same one-shot opening state machine. The exact form remains\n  // market-specific and is still the only authority that can grant eligibility.\n  const usesOneShotFlow = Boolean(marketFormId);\n\n  /** sessionStorage can throw in private mode. Automatic opening must then fail closed. */\n  const session = {\n    get(key) {\n      try {\n        return window.sessionStorage.getItem(key);\n      } catch {\n        return null;\n      }\n    },\n    set(key, value) {\n      try {\n        window.sessionStorage.setItem(key, String(value));\n        return true;\n      } catch {\n        return false;\n      }\n    },\n    remove(key) {\n      try {\n        window.sessionStorage.removeItem(key);\n        return true;\n      } catch {\n        return false;\n      }\n    },\n  };\n\n  const SESSION_STORAGE_PROBE_KEY = 'lelafine:welcome-offer:storage-probe';\n  const sessionStorageUsable = (() => {\n    const written = session.set(SESSION_STORAGE_PROBE_KEY, '1');\n    const readable = written && session.get(SESSION_STORAGE_PROBE_KEY) === '1';\n    session.remove(SESSION_STORAGE_PROBE_KEY);\n    return readable;\n  })();\n\n  const now = Date.now();\n\n  // Suppression only, never an audience grant. Keep it across tabs and future visits; if the\n  // browser cannot retain the decision, fail closed for automatic openings and keep clicks usable.\n  function persistentOpenSeen() {\n    try {\n      return window.localStorage.getItem(PERSISTENT_OPENED_KEY) === '1';\n    } catch {\n      return true;\n    }\n  }\n\n  function persistOpenSeen() {\n    try {\n      window.localStorage.setItem(PERSISTENT_OPENED_KEY, '1');\n      return window.localStorage.getItem(PERSISTENT_OPENED_KEY) === '1';\n    } catch {\n      return false;\n    }\n  }\n\n  let eligible = false;\n  let eligibilityClosed = false;\n  const persistentWelcomeClaimed = (() => {\n    try {\n      return window.localStorage.getItem(PERSISTENT_CLAIMED_KEY) === '1';\n    } catch {\n      return document.documentElement.classList.contains('lelafine-welcome-claimed');\n    }\n  })();\n  let retired = session.get(SESSION_SUBMITTED_KEY) === '1' || persistentWelcomeClaimed;\n  const sessionEligibleForMarket = session.get(SESSION_ELIGIBLE_FORM_KEY) === marketFormId;\n  // Before the all-market rollout, the five non-DK markets wrote `retired` after their first open.\n  // Treat that legacy flag as a previously seen opening so an in-flight shopper keeps the same\n  // closed/open state when the new script arrives during the session.\n  let welcomeOpenSeen = usesOneShotFlow && (\n    session.get(SESSION_OPENED_KEY) === '1'\n    || session.get(SESSION_LEGACY_RETIRED_KEY) === '1'\n    || persistentOpenSeen()\n  );\n  if (welcomeOpenSeen) {\n    session.set(SESSION_OPENED_KEY, '1');\n    persistOpenSeen();\n  }\n  let teaserObserver = null;\n  let teaserOverlayObserver = null;\n  let teaserOverlayFrame = 0;\n  let nativeOfferRowReady = false;\n  let eligibilityTimer = null;\n  let openPermitKind = '';\n  let openPermitUntil = 0;\n  let openPermitScrollY = 0;\n  let openPermitTimer = null;\n  let manualOpenRetryTimer = null;\n  let permittedPopupActive = false;\n  let permittedPopupWasVisible = false;\n  let permittedPopupOpenedAt = 0;\n  let permittedPopupScrollY = null;\n  let permittedPopupVisibilityTimer = null;\n  let successTransitionUntil = 0;\n  let successTransitionTimer = null;\n  let formGuardObserver = null;\n  let formGuardFrame = 0;\n  let qaAutomaticReopenAttempted = false;\n  let autoOpenRequested = false;\n  let autoQualifiedReason = '';\n  let autoOpenIdleTimer = null;\n  let consentDelayTimer = null;\n  let consentConfirmationTimer = null;\n  let consentDelayQualified = false;\n  let scrollQualified = false;\n  let lastScrollInputAt = 0;\n  let pointerStart = null;\n  let touchStart = null;\n  let autoObserversBound = false;\n  let popupCloseScrollRestore = null;\n\n  const isHomePage = () => window.location.pathname === '/';\n  const isProductPage = () => window.location.pathname.includes('/products/');\n\n  function cookieBannerVisible() {\n    if (document.documentElement.classList.contains('lelafine-consent-pending')) return true;\n    const cmp = document.querySelector('pandectes-cmp');\n    const root = cmp?.shadowRoot;\n    const dialog = root?.querySelector('dialog[open], .dialog.notice[open], .dialog.notice:not([hidden])');\n    if (!dialog) return false;\n    const style = getComputedStyle(dialog);\n    const rect = dialog.getBoundingClientRect();\n    return style.display !== 'none'\n      && style.visibility !== 'hidden'\n      && parseFloat(style.opacity || '1') > 0.05\n      && rect.width > 1\n      && rect.height > 1\n      && rect.bottom > 0\n      && rect.right > 0\n      && rect.top < window.innerHeight\n      && rect.left < window.innerWidth;\n  }\n\n  /**\n   * Defensive veto only: Klaviyo still grants eligibility, but neither the PDP row nor the\n   * theme-triggered popup may ever override Peter's \u00D8nskeskyen/GoWish exclusion. Keep the veto\n   * for the whole browser session because the acquisition parameters disappear on page two.\n   */\n  function isWishTraffic() {\n    const source = new URLSearchParams(window.location.search).get('utm_source')?.trim().toLowerCase() || '';\n    let referrerHost = '';\n\n    try {\n      referrerHost = new URL(document.referrer).hostname.replace(/^www\\./, '').toLowerCase();\n    } catch {\n      /* Empty or non-URL referrer. The UTM remains the dependable signal. */\n    }\n\n    const sourceMatches = ['onskeskyen', '\u00F8nskeskyen', 'gowish'].includes(source);\n    const referrerMatches = referrerHost === 'onskeskyen.dk'\n      || referrerHost.endsWith('.onskeskyen.dk')\n      || referrerHost === 'gowish.com'\n      || referrerHost.endsWith('.gowish.com');\n\n    if (sourceMatches || referrerMatches) session.set(SESSION_WISH_TRAFFIC_KEY, '1');\n\n    const blocked = session.get(SESSION_WISH_TRAFFIC_KEY) === '1';\n    if (blocked) document.documentElement.classList.add('pkm-wish-traffic');\n    return blocked;\n  }\n\n  // Resolve the sticky acquisition veto before the custom element can connect. The early async\n  // loader may run before Shopify has parsed the PDP row, so the element must be able to inherit\n  // the veto when it appears a few milliseconds later.\n  const wishTrafficVetoed = isWishTraffic();\n\n  function track(name, detail = {}) {\n    window.dataLayer = window.dataLayer || [];\n    window.dataLayer.push({\n      event: name,\n      klaviyo_form_id: marketFormId,\n      ...detail,\n    });\n  }\n\n  function automaticOpenGateIsOpen() {\n    return usesOneShotFlow\n      && isProductPage()\n      && eligible\n      && !retired\n      && !welcomeOpenSeen\n      && !persistentOpenSeen()\n      && !wishTrafficVetoed\n      && sessionStorageUsable\n      && !cookieBannerVisible()\n      && !['manual-only', 'storage-fail-dialog'].includes(unpublishedThemeQaMode());\n  }\n\n  function stopConsentDelayClock() {\n    window.clearTimeout(consentDelayTimer);\n    consentDelayTimer = null;\n    window.clearTimeout(consentConfirmationTimer);\n    consentConfirmationTimer = null;\n  }\n\n  function stopAutomaticTriggers() {\n    stopConsentDelayClock();\n    window.clearTimeout(autoOpenIdleTimer);\n    autoOpenIdleTimer = null;\n  }\n\n  async function requestAutomaticOpen(reason) {\n    if (autoOpenRequested || !autoQualifiedReason || !automaticOpenGateIsOpen()) return false;\n    // Serialize the claim across same-origin tabs. Without a reliable claim, manual opening is\n    // safer than showing the same interruption twice. No timer or page navigation clears it.\n    if (!navigator.locks?.request) return false;\n    try {\n      return await navigator.locks.request(PERSISTENT_OPENED_KEY, () => {\n        if (autoOpenRequested || !automaticOpenGateIsOpen()) return false;\n        return claimAutomaticOpen(reason);\n      });\n    } catch {\n      return false;\n    }\n  }\n\n  function claimAutomaticOpen(reason) {\n    // No opening marker is written, so a later visit without BF access still gets the normal offer.\n    if (window.bfInsider?.isActive?.()) return false;\n    autoOpenRequested = true;\n\n    // openForm bypasses Klaviyo targeting. The exact teaser eligibility gate above is mandatory,\n    // and automatic opening is disabled unless both opening markers are durably writable.\n    const sessionMarked = session.set(SESSION_OPENED_KEY, '1')\n      && session.get(SESSION_OPENED_KEY) === '1';\n    if (!sessionMarked || !persistOpenSeen()) {\n      stopAutomaticTriggers();\n      track('klaviyo_welcome_offer_auto_open_blocked', {\n        reason: 'opening-storage-unavailable',\n        criterion: reason,\n      });\n      return false;\n    }\n\n    armNextFormOpen(`automatic-${reason}`);\n    rememberOpenWithoutHidingRow(`automatic-${reason}`);\n    const opened = openForm(marketFormId);\n    track('klaviyo_welcome_offer_open_requested', {\n      reason: `automatic-${reason}`,\n      opened,\n    });\n    return opened;\n  }\n\n  function scheduleQualifiedAutomaticOpen() {\n    if (!autoQualifiedReason || autoOpenRequested) return;\n    window.clearTimeout(autoOpenIdleTimer);\n    if (cookieBannerVisible()) {\n      autoOpenIdleTimer = window.setTimeout(scheduleQualifiedAutomaticOpen, 250);\n      return;\n    }\n    if (!automaticOpenGateIsOpen()) return;\n    autoOpenIdleTimer = window.setTimeout(() => {\n      autoOpenIdleTimer = null;\n      requestAutomaticOpen(autoQualifiedReason);\n    }, AUTO_OPEN_IDLE_MS);\n  }\n\n  function qualifyAutomaticOpen(reason) {\n    if (!autoQualifiedReason) {\n      autoQualifiedReason = reason;\n      if (unpublishedThemeQaMode()) {\n        document.documentElement.dataset.pkmWelcomeQaCriterion = reason;\n        document.documentElement.dataset.pkmWelcomeQaQualifiedAt = String(Date.now());\n      }\n      track('klaviyo_welcome_offer_auto_qualified', { criterion: reason });\n    }\n    scheduleQualifiedAutomaticOpen();\n  }\n\n  function scheduleConsentDelayCriterion() {\n    if (consentDelayQualified || consentDelayTimer || !isProductPage()) return;\n    const answeredAt = Number(session.get(SESSION_CONSENT_ANSWERED_AT_KEY));\n    if (!Number.isFinite(answeredAt) || answeredAt <= 0) return;\n    const remaining = Math.max(0, AUTO_OPEN_AFTER_CONSENT_MS - (Date.now() - answeredAt));\n    consentDelayTimer = window.setTimeout(() => {\n      consentDelayTimer = null;\n      consentDelayQualified = true;\n      qualifyAutomaticOpen('consent-answered-15s');\n    }, remaining);\n  }\n\n  function noteConsentAnswered(source) {\n    let answeredAt = Number(session.get(SESSION_CONSENT_ANSWERED_AT_KEY));\n    const alreadyConfirmed = session.get(SESSION_CONSENT_CONFIRMED_KEY) === '1';\n    if (!alreadyConfirmed || !Number.isFinite(answeredAt) || answeredAt <= 0) {\n      answeredAt = Date.now();\n      session.set(SESSION_CONSENT_ANSWERED_AT_KEY, answeredAt);\n      session.set(SESSION_CONSENT_CONFIRMED_KEY, '1');\n      track('klaviyo_welcome_offer_consent_answered', { source });\n    }\n    scheduleConsentDelayCriterion();\n    [0, 350, 1_000].forEach((delay) => window.setTimeout(scheduleQualifiedAutomaticOpen, delay));\n  }\n\n  function hasConsentDecisionCookie() {\n    return /(^|;\\s*)_pandectes_gdpr=/.test(document.cookie);\n  }\n\n  function marketingConsentState() {\n    const privacy = window.Shopify?.customerPrivacy;\n    if (!privacy || typeof privacy.marketingAllowed !== 'function') return null;\n    try {\n      return privacy.marketingAllowed() === true;\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Pandectes may emit Shopify's visitorConsentCollected event while its initial undecided state\n   * is mounting. Starting the clock from that event made a physical iPhone recording open about\n   * 12 seconds after the actual Accept tap. Conversely, Safari private browsing may not expose\n   * Pandectes' decision cookie to this first-party script even though Shopify has already granted\n   * marketing processing and Klaviyo has rendered the exact eligible teaser. The cookie is\n   * therefore only a wake-up hint; Shopify Customer Privacy plus a closed dialog is the authority.\n   * Keep the low-frequency monitor alive while the customer considers the banner. A fixed two-\n   * second retry window silently lost the timer when the choice came later than that window.\n   */\n  function confirmConsentAnswered(source) {\n    window.clearTimeout(consentConfirmationTimer);\n    consentConfirmationTimer = null;\n    let attempts = 0;\n\n    const confirm = () => {\n      const marketingState = marketingConsentState();\n      if (marketingState === true && !cookieBannerVisible()) {\n        noteConsentAnswered(source);\n        return;\n      }\n      attempts += 1;\n      // An explicit rejection with a durable Pandectes decision needs no further polling. A later\n      // preferences change emits a fresh event and starts a new confirmation transaction.\n      if (marketingState === false && hasConsentDecisionCookie() && !cookieBannerVisible()) return;\n      consentConfirmationTimer = window.setTimeout(confirm, attempts < 40 ? 50 : 500);\n    };\n\n    confirm();\n  }\n\n  function evaluateScrollCriterion() {\n    if (!isProductPage() || scrollQualified) return;\n    if (unpublishedThemeQaMode()) {\n      const qaScrollable = Math.max(0, document.documentElement.scrollHeight - window.innerHeight);\n      document.documentElement.dataset.pkmWelcomeQaScrollProgress = qaScrollable\n        ? (Math.max(0, window.scrollY) / qaScrollable).toFixed(4)\n        : '0';\n      document.documentElement.dataset.pkmWelcomeQaScrollInputAge = String(\n        Date.now() - lastScrollInputAt\n      );\n    }\n    if (Date.now() - lastScrollInputAt > USER_INPUT_WINDOW_MS) return;\n    const scrollable = Math.max(0, document.documentElement.scrollHeight - window.innerHeight);\n    if (!scrollable) return;\n    const progress = Math.max(0, window.scrollY) / scrollable;\n    if (progress < AUTO_OPEN_SCROLL_PROGRESS) return;\n    scrollQualified = true;\n    qualifyAutomaticOpen('user-scroll-25pct');\n  }\n\n  function noteAutomaticInputActivity() {\n    if (autoQualifiedReason) scheduleQualifiedAutomaticOpen();\n  }\n\n  function resetPageAutomaticCriteria() {\n    stopAutomaticTriggers();\n    autoOpenRequested = false;\n    autoQualifiedReason = '';\n    scrollQualified = false;\n    lastScrollInputAt = 0;\n    pointerStart = null;\n    touchStart = null;\n    scheduleConsentDelayCriterion();\n  }\n\n  function initializeAutomaticCriterionObservers() {\n    if (autoObserversBound || !isProductPage()) return;\n    autoObserversBound = true;\n\n    const criterionEventIsTrusted = (event) => Boolean(\n      event?.isTrusted || unpublishedThemeQaMode()\n    );\n    const markPageScrollInput = (event) => {\n      if (event && !criterionEventIsTrusted(event)) return;\n      lastScrollInputAt = Date.now();\n      if (unpublishedThemeQaMode()) {\n        document.documentElement.dataset.pkmWelcomeQaScrollInput = event?.type || 'trusted';\n        document.documentElement.dataset.pkmWelcomeQaScrollInputAt = String(lastScrollInputAt);\n      }\n      noteAutomaticInputActivity();\n    };\n    const relevantScrollKey = (event) => [\n      'ArrowDown', 'ArrowUp', 'PageDown', 'PageUp', 'Home', 'End', ' ',\n    ].includes(event.key);\n\n    window.addEventListener('wheel', markPageScrollInput, { capture: true, passive: true });\n    window.addEventListener('scroll', evaluateScrollCriterion, { passive: true });\n    document.addEventListener('keydown', (event) => {\n      if (!criterionEventIsTrusted(event)) return;\n      noteAutomaticInputActivity();\n      const interactiveTarget = event.target instanceof Element\n        && Boolean(event.target.closest('button, a, input, select, textarea, [contenteditable=\"true\"]'));\n      if (relevantScrollKey(event) && !(event.key === ' ' && interactiveTarget)) {\n        markPageScrollInput(event);\n      }\n    }, true);\n    document.addEventListener('pointerdown', (event) => {\n      if (!criterionEventIsTrusted(event)) return;\n      noteAutomaticInputActivity();\n      pointerStart = {\n        x: event.clientX,\n        y: event.clientY,\n        pointerId: event.pointerId,\n      };\n    }, { capture: true, passive: true });\n    document.addEventListener('pointermove', (event) => {\n      if (!criterionEventIsTrusted(event)) return;\n      if (!pointerStart || pointerStart.pointerId !== event.pointerId) return;\n      noteAutomaticInputActivity();\n      const dx = event.clientX - pointerStart.x;\n      const dy = event.clientY - pointerStart.y;\n      if (Math.abs(dy) >= 4 && Math.abs(dy) >= Math.abs(dx)) markPageScrollInput(event);\n    }, { capture: true, passive: true });\n    document.addEventListener('pointerup', () => { pointerStart = null; }, true);\n    document.addEventListener('pointercancel', () => { pointerStart = null; }, true);\n    document.addEventListener('touchstart', (event) => {\n      if (!criterionEventIsTrusted(event)) return;\n      noteAutomaticInputActivity();\n      const touch = event.touches?.[0];\n      touchStart = touch\n        ? { x: touch.clientX, y: touch.clientY }\n        : null;\n    }, { capture: true, passive: true });\n    document.addEventListener('touchmove', (event) => {\n      if (!criterionEventIsTrusted(event)) return;\n      const touch = event.touches?.[0];\n      if (!touch || !touchStart) return;\n      noteAutomaticInputActivity();\n      const dx = touch.clientX - touchStart.x;\n      const dy = touch.clientY - touchStart.y;\n      if (Math.abs(dy) >= 4 && Math.abs(dy) >= Math.abs(dx)) markPageScrollInput(event);\n    }, { capture: true, passive: true });\n    document.addEventListener('touchend', () => { touchStart = null; }, true);\n    document.addEventListener('click', (event) => {\n      if (criterionEventIsTrusted(event)) noteAutomaticInputActivity();\n    }, true);\n    window.addEventListener('pagehide', stopConsentDelayClock);\n    window.addEventListener('pageshow', (event) => {\n      if (event.persisted) resetPageAutomaticCriteria();\n    });\n  }\n\n  function syncNotes(state) {\n    document.querySelectorAll('klaviyo-reopen-note').forEach((note) => {\n      if (typeof note.setState === 'function') note.setState(state);\n    });\n  }\n\n  function offerRowCanBePresented() {\n    const qaMode = unpublishedThemeQaMode();\n    const qaCanUseFallback = [\n      'eligible',\n      'dialog',\n      'late-dialog',\n      'storage-fail-dialog',\n      'manual-only',\n    ].includes(qaMode);\n    return nativeOfferRowReady || qaCanUseFallback;\n  }\n\n  function presentOfferRowAfterNativeSurface() {\n    if (nativeOfferRowReady) return;\n    nativeOfferRowReady = true;\n    // The unpublished pending fixture deliberately proves zero-height first paint even if the\n    // real onsite script happens to load during the test.\n    if (unpublishedThemeQaMode() === 'pending') return;\n    // A late native render must not reverse an explicit state transition that happened while the\n    // surface was mounting. A genuine late eligibility grant first moves the row back to pending\n    // in resolveEligible(), so it remains eligible for this one-way presentation commit.\n    const presentationWasRevoked = [...document.querySelectorAll('klaviyo-reopen-note')]\n      .some((note) => note.dataset.state === 'ineligible' || note.dataset.state === 'retired');\n    if (presentationWasRevoked) return;\n    syncNotes('eligible');\n  }\n\n  function setReopenLock(locked) {\n    if (!usesOneShotFlow) return;\n    if (locked) document.documentElement.dataset.pkmKlaviyoReopenLocked = 'true';\n    else delete document.documentElement.dataset.pkmKlaviyoReopenLocked;\n  }\n\n  function qaStamp(value) {\n    if (!unpublishedThemeQaMode()) return;\n    document.documentElement.dataset.pkmWelcomeQaTrace = value;\n  }\n\n  function clearBlockedPopupShells() {\n    document.querySelectorAll('[data-pkm-klaviyo-welcome-blocked]').forEach((element) => {\n      delete element.dataset.pkmKlaviyoWelcomeBlocked;\n    });\n  }\n\n  function armNextFormOpen(kind) {\n    if (!usesOneShotFlow) return;\n    cancelPopupCloseScrollRestore('new-deliberate-open');\n    openPermitKind = kind;\n    openPermitUntil = Date.now() + FORM_OPEN_PERMIT_MS;\n    openPermitScrollY = Math.max(0, window.scrollY);\n    window.clearTimeout(openPermitTimer);\n    clearBlockedPopupShells();\n    setReopenLock(false);\n    qaStamp(`permit-armed:${kind}`);\n\n    openPermitTimer = window.setTimeout(() => {\n      openPermitKind = '';\n      openPermitUntil = 0;\n      if (!permittedPopupActive) setReopenLock(true);\n    }, FORM_OPEN_PERMIT_MS + 50);\n  }\n\n  function consumeFormOpenPermit() {\n    if (!openPermitKind || Date.now() > openPermitUntil) {\n      qaStamp('permit-missing');\n      return '';\n    }\n    const kind = openPermitKind;\n    permittedPopupScrollY = openPermitScrollY;\n    if (unpublishedThemeQaMode()) {\n      document.documentElement.dataset.pkmWelcomeQaPermittedScrollY = String(\n        permittedPopupScrollY\n      );\n    }\n    openPermitKind = '';\n    openPermitUntil = 0;\n    openPermitScrollY = 0;\n    window.clearTimeout(openPermitTimer);\n    qaStamp(`permit-consumed:${kind}`);\n    return kind;\n  }\n\n  /**\n   * Klaviyo can attempt its own reopen after a close. The root lock prevents that attempt from\n   * painting; this closes its internal form state so a later real teaser/row click still works.\n   */\n  function closeUnpermittedFormOpen() {\n    setReopenLock(true);\n\n    let closeRequested = false;\n    const requestClose = () => {\n      if (closeRequested) return;\n      const scope = marketPopupNodes()[0] || klaviyoDialogCandidates()[0];\n      if (!scope) return;\n      scope.dataset.pkmKlaviyoWelcomeDialog = marketFormId;\n      scope.dataset.pkmKlaviyoWelcomeBlocked = 'true';\n      const closeButton = scope.querySelector([\n        'button[aria-label*=\"close\" i]',\n        'button[aria-label*=\"luk\" i]',\n        'button[title*=\"close\" i]',\n        'button[title*=\"luk\" i]',\n      ].join(','));\n\n      if (closeButton instanceof HTMLElement) {\n        closeRequested = true;\n        closeButton.click();\n        return;\n      }\n\n      // Klaviyo currently supplies an accessible close button. Escape is a safe fallback if its\n      // private markup changes before the button exists in the first render pass.\n      const escape = new KeyboardEvent('keydown', {\n        key: 'Escape',\n        code: 'Escape',\n        bubbles: true,\n        cancelable: true,\n      });\n      document.dispatchEvent(escape);\n      window.dispatchEvent(new KeyboardEvent('keydown', {\n        key: 'Escape',\n        code: 'Escape',\n        bubbles: true,\n        cancelable: true,\n      }));\n    };\n\n    requestClose();\n    window.requestAnimationFrame(requestClose);\n    window.setTimeout(requestClose, 100);\n    window.setTimeout(releaseStrandedScrollLock, 200);\n  }\n\n  function retire(reason) {\n    if (retired) return;\n    retired = true;\n    stopAutomaticTriggers();\n    session.set(SESSION_SUBMITTED_KEY, '1');\n    session.remove(SESSION_ELIGIBLE_FORM_KEY);\n    window.clearTimeout(permittedPopupVisibilityTimer);\n    permittedPopupOpenedAt = 0;\n    syncNotes('retired');\n    stopMarketTeaserOverlayProbe();\n    track('klaviyo_welcome_offer_retired', { reason });\n  }\n\n  window.addEventListener('welcome-discount:claimed', () => {\n    document.documentElement.classList.add('lelafine-welcome-claimed');\n    document.documentElement.classList.add('lelafine-welcome-prepaint-hidden');\n    retire('dynamic-code-received');\n  });\n  window.addEventListener('storage', (event) => {\n    if (event.key !== PERSISTENT_CLAIMED_KEY || event.newValue !== '1') return;\n    document.documentElement.classList.add('lelafine-welcome-claimed');\n    document.documentElement.classList.add('lelafine-welcome-prepaint-hidden');\n    retire('dynamic-code-received-another-tab');\n  });\n\n  function preservePermittedPopupForSuccess() {\n    if (!usesOneShotFlow || !permittedPopupActive) return false;\n    successTransitionUntil = Date.now() + SUCCESS_TRANSITION_GRACE_MS;\n    window.clearTimeout(successTransitionTimer);\n    successTransitionTimer = window.setTimeout(() => {\n      successTransitionTimer = null;\n      successTransitionUntil = 0;\n      scheduleFormGuard();\n    }, SUCCESS_TRANSITION_GRACE_MS + 50);\n    qaStamp('submit-success-transition');\n    return true;\n  }\n\n  function rememberOpenWithoutHidingRow(reason) {\n    const firstOpen = !welcomeOpenSeen;\n    welcomeOpenSeen = true;\n    session.set(SESSION_OPENED_KEY, '1');\n    persistOpenSeen();\n    stopAutomaticTriggers();\n    startFormGuard();\n    scheduleFormGuard();\n    if (eligible) syncNotes('eligible');\n    if (firstOpen) track('klaviyo_welcome_offer_opened_row_kept', { reason });\n  }\n\n  /**\n   * Klaviyo's documented onsite queue. Eligibility is checked before this function is ever called.\n   */\n  function openQaDialog(formId) {\n    const lockedScrollY = Math.max(0, window.scrollY);\n    let dialog = document.querySelector('[data-pkm-welcome-qa-dialog]');\n    let shouldApplyScrollLock = false;\n    if (!dialog) {\n      dialog = document.createElement('div');\n      dialog.setAttribute('role', 'dialog');\n      dialog.setAttribute('aria-modal', 'true');\n      dialog.setAttribute('data-pkm-welcome-qa-dialog', 'true');\n      dialog.setAttribute('data-pkm-welcome-qa-locked-scroll-y', String(lockedScrollY));\n      dialog.className = 'needsclick kl-private-reset-css-pkm-qa';\n      dialog.style.cssText = 'position:fixed;inset:0;z-index:2147483000;background:#f9f7f0;display:grid;place-items:center';\n      dialog.innerHTML = [\n        '<button type=\"button\" aria-label=\"Close\" data-pkm-welcome-qa-close style=\"position:absolute;right:16px;top:16px\">\u00D7</button>',\n        '<div style=\"display:grid;gap:16px;justify-items:center\">',\n        '<strong>PKM welcome popup QA</strong>',\n        '<button type=\"button\" data-pkm-welcome-qa-submit>QA submit</button>',\n        '<button type=\"button\" data-pkm-welcome-qa-success-close>QA success close</button>',\n        '</div>',\n      ].join('');\n      const closeQaDialog = () => {\n        const closeLockedScrollY = Number(dialog.dataset.pkmWelcomeQaLockedScrollY) || 0;\n        // Real mobile Klaviyo keeps an aria-modal wrapper mounted and translates it off-screen.\n        // Reproduce that teardown instead of removing the QA dialog, otherwise the watchdog test\n        // misses the exact iPhone failure where the stale wrapper still looks \"visible\" by size.\n        dialog.dataset.pkmWelcomeQaOffscreen = 'true';\n        dialog.setAttribute('aria-hidden', 'true');\n        dialog.style.setProperty('transform', 'translateX(-200vw)');\n        dialog.style.setProperty('pointer-events', 'none');\n\n        // Reproduce the second native iOS scroll mutation that can arrive after the first unlock.\n        // This QA-only fault proves the close transaction protects the original viewport until the\n        // Klaviyo wrapper has fully settled, instead of declaring success after its first frame.\n        const lateNativeScrollY = Math.max(\n          0,\n          closeLockedScrollY - Math.min(420, Math.round(window.innerHeight / 2))\n        );\n        window.setTimeout(() => {\n          if (!['dialog', 'late-dialog', 'storage-fail-dialog'].includes(unpublishedThemeQaMode())\n            || !popupCloseScrollRestore\n            || dialog.dataset.pkmWelcomeQaOffscreen !== 'true') return;\n          window.scrollTo(window.scrollX, lateNativeScrollY);\n          document.documentElement.dataset.pkmWelcomeQaLateScroll = 'true';\n          qaStamp(`qa-late-native-scroll:${lateNativeScrollY}`);\n        }, 650);\n\n        if (qaAutomaticReopenAttempted) return;\n        qaAutomaticReopenAttempted = true;\n        window.setTimeout(() => openQaDialog(formId), 500);\n      };\n      dialog.querySelector('[data-pkm-welcome-qa-close]').addEventListener('click', closeQaDialog);\n      dialog.querySelector('[data-pkm-welcome-qa-submit]').addEventListener('click', () => {\n        window.dispatchEvent(new CustomEvent('klaviyoForms', {\n          detail: { type: 'submit', formId },\n        }));\n      });\n      dialog.querySelector('[data-pkm-welcome-qa-success-close]')\n        .addEventListener('click', closeQaDialog);\n      document.body.appendChild(dialog);\n      shouldApplyScrollLock = true;\n    } else if (dialog.dataset.pkmWelcomeQaOffscreen === 'true' && openPermitKind) {\n      delete dialog.dataset.pkmWelcomeQaOffscreen;\n      dialog.removeAttribute('aria-hidden');\n      dialog.style.removeProperty('transform');\n      dialog.style.setProperty('pointer-events', 'auto');\n      dialog.dataset.pkmWelcomeQaLockedScrollY = String(lockedScrollY);\n      shouldApplyScrollLock = true;\n    }\n\n    if (shouldApplyScrollLock) {\n      dialog.setAttribute('data-pkm-welcome-qa-locked-scroll-y', String(lockedScrollY));\n      // Reproduce Klaviyo's iOS lock: the viewport is stored as a negative fixed-body top while\n      // window.scrollY itself resets to zero. Closing leaves that lock for the theme watchdog.\n      document.body.style.setProperty('overflow', 'hidden', 'important');\n      document.body.style.setProperty('position', 'fixed', 'important');\n      document.body.style.setProperty('top', `-${lockedScrollY}px`, 'important');\n      document.body.style.setProperty('width', '100%', 'important');\n      window.scrollTo(window.scrollX, 0);\n    }\n\n    window.dispatchEvent(new CustomEvent('klaviyoForms', {\n      detail: { type: 'open', formId },\n    }));\n    return true;\n  }\n\n  function openForm(formId) {\n    if (!formId || window.bfInsider?.isActive?.()) return false;\n    if (['dialog', 'late-dialog', 'storage-fail-dialog'].includes(unpublishedThemeQaMode())) {\n      return openQaDialog(formId);\n    }\n    try {\n      // Queue the documented custom trigger. Do not use\n      // `window.klaviyo.openForm`: the legacy back-in-stock asset can expose a synthetic Proxy\n      // before the real onsite library and make that method look callable without opening a form.\n      // Keep using the original queue reference. Some Klaviyo market builds remove the public\n      // `window._klOnsite` property after boot while retaining and patching the original array.\n      klaviyoOnsite.push(['openForm', formId]);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  function scheduleManualOpenRetry(reason) {\n    if (!usesOneShotFlow) return;\n    window.clearTimeout(manualOpenRetryTimer);\n    manualOpenRetryTimer = window.setTimeout(() => {\n      manualOpenRetryTimer = null;\n      const permitStillValid = Boolean(openPermitKind) && Date.now() <= openPermitUntil;\n      if (permittedPopupActive || !permitStillValid || retired) return;\n\n      const retried = openForm(marketFormId);\n      track('klaviyo_welcome_offer_open_retried', { reason, opened: retried });\n    }, MANUAL_OPEN_RETRY_MS);\n  }\n\n  function requestOpen(reason) {\n    if (!eligible || retired || isHomePage()) return false;\n    if (reason !== 'pdp-row-click') return false;\n\n    if (usesOneShotFlow) {\n      stopAutomaticTriggers();\n      armNextFormOpen('manual-row-click');\n      rememberOpenWithoutHidingRow(reason);\n    }\n\n    const opened = openForm(marketFormId);\n    track('klaviyo_welcome_offer_open_requested', { reason, opened });\n\n    scheduleManualOpenRetry('pdp-row-first-click-fallback');\n    return opened;\n  }\n\n  function exactMarketTeaserExists() {\n    if (!marketFormId) return false;\n    const exactClass = `kl-teaser-${marketFormId}`;\n\n    return [...document.querySelectorAll('[class*=\"kl-teaser-\"]')].some((element) =>\n      element.classList?.contains(exactClass)\n    );\n  }\n\n  /**\n   * Offer-row clicks must be real Klaviyo teaser clicks, not synthetic `openForm` commands.\n   * Klaviyo accepts its own trusted teaser click consistently even when a market/browser build no\n   * longer listens to the public command queue. Move that already target-approved teaser over the\n   * visual PDP row as a transparent hit surface at every breakpoint, including iPhone Firefox.\n   */\n  function mountMarketTeaserOverlay() {\n    if (!marketFormId || !isProductPage()) return false;\n\n    const note = document.querySelector(\n      `klaviyo-reopen-note[data-klaviyo-form-id=\"${marketFormId}\"]`\n    );\n    const trigger = note?.querySelector('[data-klaviyo-reopen-trigger]');\n    const teaser = [...document.querySelectorAll('[class*=\"kl-teaser-\"]')].find((element) =>\n      element.classList?.contains(`kl-teaser-${marketFormId}`)\n    );\n    const animated = teaser?.querySelector('[data-testid=\"animated-teaser\"]');\n    const clickSurface = teaser?.querySelector('[role=\"button\"]');\n    if (!(note instanceof HTMLElement)\n      || !(trigger instanceof HTMLElement)\n      || !(teaser instanceof HTMLElement)\n      || !(animated instanceof HTMLElement)\n      || !(clickSurface instanceof HTMLElement)) return false;\n    if (teaser.dataset.pkmOfferRowOverlay === 'true') return true;\n\n    note.style.position = 'relative';\n    teaser.dataset.pkmOfferRowOverlay = 'true';\n    teaser.setAttribute('aria-hidden', 'true');\n    teaser.style.setProperty('position', 'absolute', 'important');\n    teaser.style.setProperty('inset', '0', 'important');\n    teaser.style.setProperty('width', '100%', 'important');\n    teaser.style.setProperty('height', '100%', 'important');\n    teaser.style.setProperty('margin', '0', 'important');\n    teaser.style.setProperty('transform', 'none', 'important');\n    teaser.style.setProperty('transform-origin', 'center', 'important');\n    teaser.style.setProperty('opacity', '0', 'important');\n    teaser.style.setProperty('visibility', 'visible', 'important');\n    teaser.style.setProperty('pointer-events', 'auto', 'important');\n    teaser.style.setProperty('z-index', '3', 'important');\n\n    [animated, clickSurface].forEach((element) => {\n      element.style.setProperty('position', 'absolute', 'important');\n      element.style.setProperty('inset', '0', 'important');\n      element.style.setProperty('width', '100%', 'important');\n      element.style.setProperty('height', '100%', 'important');\n      element.style.setProperty('min-height', '0', 'important');\n      element.style.setProperty('padding', '0', 'important');\n      element.style.setProperty('pointer-events', 'auto', 'important');\n    });\n    clickSurface.tabIndex = -1;\n\n    note.appendChild(teaser);\n    track('klaviyo_welcome_offer_native_teaser_overlay_mounted');\n    return true;\n  }\n\n  function stopMarketTeaserOverlayProbe() {\n    teaserOverlayObserver?.disconnect();\n    teaserOverlayObserver = null;\n    if (teaserOverlayFrame) window.cancelAnimationFrame(teaserOverlayFrame);\n    teaserOverlayFrame = 0;\n  }\n\n  /**\n   * Klaviyo stamps the market teaser class before its animated wrapper and role=button exist on\n   * some mobile builds. The class is enough to grant eligibility, but not enough to mount the\n   * trusted native hit surface. Keep a separate, idempotent observer alive until the complete\n   * teaser has actually been moved over the visible offer row.\n   */\n  function scheduleMarketTeaserOverlay() {\n    if (!eligible || retired || !marketFormId || !isProductPage()) return false;\n\n    if (mountMarketTeaserOverlay()) {\n      presentOfferRowAfterNativeSurface();\n      stopMarketTeaserOverlayProbe();\n      return true;\n    }\n\n    if (!teaserOverlayObserver) {\n      teaserOverlayObserver = new MutationObserver(scheduleMarketTeaserOverlay);\n      teaserOverlayObserver.observe(document.documentElement, {\n        childList: true,\n        subtree: true,\n        attributes: true,\n        attributeFilter: ['class', 'role', 'data-testid'],\n      });\n    }\n\n    if (!teaserOverlayFrame) {\n      teaserOverlayFrame = window.requestAnimationFrame(() => {\n        teaserOverlayFrame = 0;\n        if (mountMarketTeaserOverlay()) {\n          presentOfferRowAfterNativeSurface();\n          stopMarketTeaserOverlayProbe();\n        }\n      });\n    }\n\n    return false;\n  }\n\n  /**\n   * Office QA only. The switch is deliberately inert unless Shopify says this is not the MAIN\n   * theme. It makes the unpublished duplicate testable without weakening live eligibility.\n   */\n  function unpublishedThemeQaMode() {\n    const params = new URLSearchParams(window.location.search);\n    const mode = params.get('pkm_welcome_qa') || '';\n    if (![\n      'eligible',\n      'pending',\n      'dialog',\n      'late-dialog',\n      'storage-fail-dialog',\n      'teaser-race',\n      'touch-teaser-race',\n      'pre-pointer-teaser-race',\n      'manual-only',\n    ].includes(mode)) return '';\n    const role = String(window.Shopify?.theme?.role || '').toLowerCase();\n    return role && role !== 'main' ? mode : '';\n  }\n\n  function startQaTeaserRaceProbe() {\n    const mount = () => {\n      if (!document.body || document.querySelector('[data-pkm-welcome-qa-teaser-race]')) return;\n      const teaser = document.createElement('div');\n      teaser.className = `kl-teaser-${marketFormId}`;\n      teaser.dataset.pkmWelcomeQaTeaserRace = 'true';\n      document.body.appendChild(teaser);\n\n      // Reproduce the live race: eligibility sees the exact class first; Klaviyo's nested trusted\n      // click surface arrives in a later render pass.\n      window.setTimeout(() => {\n        const animated = document.createElement('div');\n        animated.dataset.testid = 'animated-teaser';\n        const clickSurface = document.createElement('button');\n        clickSurface.type = 'button';\n        clickSurface.setAttribute('role', 'button');\n        clickSurface.addEventListener('click', () => openQaDialog(marketFormId));\n        animated.appendChild(clickSurface);\n        teaser.appendChild(animated);\n      }, 120);\n    };\n\n    if (document.readyState === 'loading') {\n      document.addEventListener('DOMContentLoaded', mount, { once: true });\n    } else {\n      mount();\n    }\n  }\n\n  function startQaTouchTeaserRaceProbe() {\n    const mount = () => {\n      if (!document.body || document.querySelector('[data-pkm-welcome-qa-touch-teaser-race]')) return;\n      const teaser = document.createElement('div');\n      teaser.className = `kl-teaser-${marketFormId}`;\n      teaser.dataset.pkmWelcomeQaTouchTeaserRace = 'true';\n      teaser.style.cssText = 'position:fixed;top:120px;left:0;z-index:2147482000';\n\n      const clickSurface = document.createElement('button');\n      clickSurface.type = 'button';\n      clickSurface.setAttribute('role', 'button');\n      clickSurface.textContent = 'PKM touch teaser QA';\n      clickSurface.style.cssText = 'min-width:120px;min-height:48px';\n      // Reproduce the mobile Klaviyo ordering: its pointer handler can emit `open` before the\n      // browser's later click event. The theme must have armed the manual permit in capture phase.\n      clickSurface.addEventListener('pointerdown', () => openQaDialog(marketFormId));\n      teaser.appendChild(clickSurface);\n      document.body.appendChild(teaser);\n    };\n\n    if (document.readyState === 'loading') {\n      document.addEventListener('DOMContentLoaded', mount, { once: true });\n    } else {\n      mount();\n    }\n  }\n\n  function startQaPrePointerTeaserRaceProbe() {\n    const mount = () => {\n      if (!document.body || document.querySelector('[data-pkm-welcome-qa-pre-pointer-race]')) return;\n      const teaser = document.createElement('div');\n      teaser.className = `kl-teaser-${marketFormId}`;\n      teaser.dataset.pkmWelcomeQaPrePointerRace = 'true';\n\n      const clickSurface = document.createElement('button');\n      clickSurface.type = 'button';\n      clickSurface.setAttribute('role', 'button');\n      clickSurface.addEventListener('touchstart', () => openQaDialog(marketFormId));\n      teaser.appendChild(clickSurface);\n      document.body.appendChild(teaser);\n\n      // Model a browser/Klaviyo path where touchstart is the first activation signal and no\n      // Pointer Event is available. On the broken runtime, `open` beats the click-only fallback.\n      window.setTimeout(() => {\n        clickSurface.dispatchEvent(new Event('touchstart', { bubbles: true, cancelable: true }));\n      }, 120);\n    };\n\n    if (document.readyState === 'loading') {\n      document.addEventListener('DOMContentLoaded', mount, { once: true });\n    } else {\n      mount();\n    }\n  }\n\n  function startQaManualOnlyProbe() {\n    const mount = () => {\n      if (!document.querySelector('[data-pkm-welcome-qa-manual-only-trigger]')) {\n        const teaser = document.createElement('div');\n        teaser.className = `kl-teaser-${marketFormId}`;\n        teaser.dataset.pkmWelcomeQaManualOnlyTrigger = 'true';\n        teaser.style.cssText = 'position:fixed;top:120px;left:0;z-index:2147482000';\n\n        const clickSurface = document.createElement('button');\n        clickSurface.type = 'button';\n        clickSurface.setAttribute('role', 'button');\n        clickSurface.textContent = 'PKM manual-only teaser QA';\n        clickSurface.style.cssText = 'min-width:120px;min-height:48px';\n        clickSurface.addEventListener('click', () => openQaDialog(marketFormId));\n        teaser.appendChild(clickSurface);\n        document.body.appendChild(teaser);\n      }\n\n      window.setTimeout(() => openQaDialog(marketFormId), 250);\n    };\n\n    if (document.readyState === 'loading') {\n      document.addEventListener('DOMContentLoaded', mount, { once: true });\n    } else {\n      mount();\n    }\n  }\n\n  function startQaLayoutShiftProbe() {\n    if (!('PerformanceObserver' in window)) return;\n    const startedAt = window.performance.now();\n    let total = 0;\n\n    const publish = () => {\n      document.querySelectorAll('klaviyo-reopen-note').forEach((note) => {\n        note.setAttribute('data-qa-layout-shift', total.toFixed(6));\n      });\n    };\n\n    try {\n      const observer = new PerformanceObserver((list) => {\n        list.getEntries().forEach((entry) => {\n          if (!entry.hadRecentInput && entry.startTime >= startedAt) total += entry.value;\n        });\n        publish();\n      });\n      observer.observe({ type: 'layout-shift', buffered: false });\n      publish();\n      window.setTimeout(() => {\n        publish();\n        observer.disconnect();\n      }, 800);\n    } catch {\n      /* LayoutShift is not available in every browser. Coordinate QA remains authoritative. */\n    }\n  }\n\n  function resolveEligible(source) {\n    if (eligible || eligibilityClosed || retired) return;\n    eligible = true;\n    eligibilityClosed = true;\n    if (unpublishedThemeQaMode()) {\n      document.documentElement.dataset.pkmWelcomeQaEligibleAt = String(Date.now());\n    }\n    session.set(SESSION_ELIGIBLE_FORM_KEY, marketFormId);\n    teaserObserver?.disconnect();\n    window.clearTimeout(eligibilityTimer);\n\n    // On live PDPs, keep the custom row at zero height until Klaviyo's complete native click\n    // surface is mounted over it. This prevents a session-cached eligibility grant from exposing\n    // the unreliable openForm fallback for the first click after homepage \u2192 PDP navigation.\n    syncNotes(offerRowCanBePresented() ? 'eligible' : 'pending');\n    scheduleMarketTeaserOverlay();\n    scheduleConsentDelayCriterion();\n    scheduleQualifiedAutomaticOpen();\n    track('klaviyo_welcome_offer_eligible', {\n      source,\n      eligibility_ms: Date.now() - now,\n    });\n  }\n\n  function closeEligibilityWindow() {\n    if (eligible || eligibilityClosed || retired) return;\n    const consentAnsweredAt = Number(session.get(SESSION_CONSENT_ANSWERED_AT_KEY));\n    if (!Number.isFinite(consentAnsweredAt) || consentAnsweredAt <= 0 || cookieBannerVisible()) {\n      eligibilityTimer = window.setTimeout(closeEligibilityWindow, 250);\n      return;\n    }\n    const postConsentRemaining = ELIGIBILITY_DEADLINE_MS - (Date.now() - consentAnsweredAt);\n    if (postConsentRemaining > 0) {\n      eligibilityTimer = window.setTimeout(closeEligibilityWindow, postConsentRemaining);\n      return;\n    }\n    // Collapse the pending row after the short first-render window, but keep the exact-form\n    // observer alive. Consent managers can load Klaviyo much later; a late, exact market teaser\n    // is still authoritative eligibility and must be allowed to expand the row safely.\n    syncNotes(retired ? 'retired' : 'ineligible');\n    track('klaviyo_welcome_offer_ineligible_timeout', {\n      eligibility_ms: Date.now() - now,\n    });\n  }\n\n  function startEligibilityProbe(source = 'klaviyo-teaser') {\n    teaserObserver?.disconnect();\n    window.clearTimeout(eligibilityTimer);\n    eligibilityClosed = false;\n\n    if (exactMarketTeaserExists()) {\n      resolveEligible(source);\n      return;\n    }\n\n    teaserObserver = new MutationObserver(() => {\n      if (exactMarketTeaserExists()) resolveEligible(source);\n    });\n    // Klaviyo can append an empty private wrapper first and stamp the market teaser class in a\n    // later render pass. Watch that class change as well as inserted nodes on every market so\n    // the offer expands on the first authoritative eligibility signal instead of the next mutation.\n    teaserObserver.observe(document.documentElement, {\n      childList: true,\n      subtree: true,\n      attributes: true,\n      attributeFilter: ['class'],\n    });\n    eligibilityTimer = window.setTimeout(closeEligibilityWindow, ELIGIBILITY_DEADLINE_MS);\n  }\n\n  /** Laid out but invisible still counts as gone \u2014 that is how the teaser is hidden. */\n  function synlig(element) {\n    if (!element || !element.isConnected) return false;\n    const style = getComputedStyle(element);\n    if (style.display === 'none' || style.visibility === 'hidden' || parseFloat(style.opacity) < 0.05) return false;\n    const rect = element.getBoundingClientRect();\n    return rect.width > 1 && rect.height > 1;\n  }\n\n  function popupSurfaceFor(form) {\n    return form.closest('[role=\"dialog\"], [aria-modal=\"true\"]') || form;\n  }\n\n  function popupShellFor(form) {\n    const surface = popupSurfaceFor(form);\n    let shell = surface;\n    let parent = surface.parentElement;\n\n    // Klaviyo's click-blocking backdrop is outside role=dialog. Walk only through full-viewport,\n    // fixed/absolute private wrappers and tag the outermost one; never tag body or a shop wrapper.\n    while (parent && parent !== document.body && parent !== document.documentElement) {\n      const style = getComputedStyle(parent);\n      const rect = parent.getBoundingClientRect();\n      const coversViewport = rect.width >= window.innerWidth * 0.8\n        && rect.height >= window.innerHeight * 0.8;\n      if (coversViewport && (style.position === 'fixed' || style.position === 'absolute')) shell = parent;\n      parent = parent.parentElement;\n    }\n\n    return shell;\n  }\n\n  function klaviyoDialogCandidates() {\n    return [...document.querySelectorAll('[role=\"dialog\"], [aria-modal=\"true\"]')].filter((element) => {\n      const className = String(element.className || '');\n      return element.classList.contains('needsclick')\n        || className.includes('kl-private-reset')\n        || Boolean(element.querySelector('[class*=\"kl-private-reset\"], .needsclick'));\n    });\n  }\n\n  function stampPermittedPopupDialog() {\n    if (!permittedPopupActive || !marketFormId) return;\n    klaviyoDialogCandidates().filter(synlig).forEach((dialog) => {\n      dialog.dataset.pkmKlaviyoWelcomeDialog = marketFormId;\n      delete dialog.dataset.pkmKlaviyoWelcomeBlocked;\n    });\n  }\n\n  function marketPopupNodes() {\n    if (!marketFormId) return [];\n    const nodes = new Set(\n      document.querySelectorAll(`[data-pkm-klaviyo-welcome-dialog=\"${marketFormId}\"]`)\n    );\n    document.querySelectorAll(`.klaviyo-form-${marketFormId}`).forEach((form) => {\n      nodes.add(popupShellFor(form));\n    });\n    return [...nodes];\n  }\n\n  function popupVisibleOnScreen(form) {\n    const surface = popupSurfaceFor(form);\n    if (!synlig(surface) && !synlig(form)) return false;\n    const rect = surface.getBoundingClientRect();\n    return rect.right > 0\n      && rect.left < window.innerWidth\n      && rect.bottom > 0\n      && rect.top < window.innerHeight;\n  }\n\n  /**\n   * Klaviyo does not consistently emit a close event on iOS. The DOM is therefore the final\n   * authority for the lifetime of an already-permitted popup. Once that popup has been visible and\n   * then disappears, the reopen lock is armed before the next paint. A later Klaviyo reinsert is\n   * tagged in the same mutation microtask and cannot flash. A real row/teaser click clears the tag.\n   */\n  function enforceOneShotPopupState() {\n    if (!usesOneShotFlow) return;\n\n    stampPermittedPopupDialog();\n    const forms = marketPopupNodes();\n    // Klaviyo keeps a full-size form mounted after close and translates it towards the edge teaser.\n    // Width/height alone therefore lies: an off-screen form is closed and must arm the lock.\n    const visiblePopupExists = forms.some(popupVisibleOnScreen);\n\n    if (permittedPopupActive) {\n      if (visiblePopupExists) {\n        permittedPopupWasVisible = true;\n        window.clearTimeout(permittedPopupVisibilityTimer);\n        return;\n      }\n\n      // A submit is not a close. Klaviyo briefly unmounts the opt-in view before mounting the\n      // Success view with the unique coupon. Keep the deliberate dialog permitted during that\n      // bounded handoff; an actual close event (or disappearance after the grace window) still\n      // locks the form and restores the PDP scroll position as before.\n      if (Date.now() < successTransitionUntil) return;\n\n      if (permittedPopupWasVisible) {\n        const restoreScrollY = permittedPopupScrollY;\n        permittedPopupActive = false;\n        permittedPopupWasVisible = false;\n        permittedPopupOpenedAt = 0;\n        permittedPopupScrollY = null;\n        window.clearTimeout(permittedPopupVisibilityTimer);\n        setReopenLock(true);\n        schedulePopupCloseScrollRestore(restoreScrollY);\n      }\n      return;\n    }\n\n    // A deliberate manual open is allowed to build its DOM until its matching `open` event\n    // consumes the permit. Everything else is a Klaviyo-owned automatic open and remains hidden.\n    if (openPermitKind && Date.now() <= openPermitUntil) return;\n\n    setReopenLock(true);\n    forms.forEach((form) => {\n      popupShellFor(form).dataset.pkmKlaviyoWelcomeBlocked = 'true';\n    });\n\n    // Current Klaviyo builds omit `.klaviyo-form-<ID>` from the full-screen dialog. Once the\n    // welcome opening has been spent, a newly inserted Klaviyo dialog is therefore blocked by its\n    // real private wrapper as well. Back-in-stock owns a separate modal and must stay available.\n    let newlyBlockedDialog = false;\n    klaviyoDialogCandidates().forEach((dialog) => {\n      if (dialog.closest('#klaviyo-bis-modal') || dialog.querySelector('#klaviyo-bis-modal')) return;\n      if (dialog.dataset.pkmKlaviyoWelcomeDialog !== marketFormId) newlyBlockedDialog = true;\n      dialog.dataset.pkmKlaviyoWelcomeDialog = marketFormId;\n      dialog.dataset.pkmKlaviyoWelcomeBlocked = 'true';\n    });\n    if (newlyBlockedDialog) {\n      qaStamp('dom-guard-blocked-dialog');\n      closeUnpermittedFormOpen();\n    }\n  }\n\n  function scheduleFormGuard() {\n    if (formGuardFrame) return;\n    formGuardFrame = window.requestAnimationFrame(() => {\n      formGuardFrame = 0;\n      enforceOneShotPopupState();\n    });\n  }\n\n  function startFormGuard() {\n    if (!usesOneShotFlow || formGuardObserver) return;\n    formGuardObserver = new MutationObserver(scheduleFormGuard);\n    formGuardObserver.observe(document.documentElement, {\n      childList: true,\n      subtree: true,\n      attributes: true,\n      attributeFilter: ['class', 'style', 'aria-hidden', 'aria-modal', 'role'],\n    });\n    scheduleFormGuard();\n  }\n\n  /** A visible Klaviyo popup, excluding a teaser in both directions. */\n  function klaviyoPopupOppe() {\n    return [...document.querySelectorAll('.klaviyo-form, [class*=\"kl-private-reset\"]')].some((element) => {\n      if (element.closest('[class*=\"kl-teaser-\"]') || element.querySelector('[class*=\"kl-teaser-\"]')) return false;\n      return popupVisibleOnScreen(element);\n    });\n  }\n\n  /** A visible shop-owned modal/drawer that legitimately owns the scroll lock. */\n  function andenEjerAfLaasen() {\n    return [...document.querySelectorAll(\n      'dialog[open], [aria-modal=\"true\"], x-drawer[open], cart-drawer[open], .drawer[open]'\n    )].some((element) => {\n      // Klaviyo's closed mobile wrapper can remain mounted with aria-modal=\"true\" while translated\n      // off-screen. It is handled above and must never masquerade as a separate shop-owned modal.\n      const className = String(element.className || '');\n      const isKlaviyoSurface = element.hasAttribute('data-pkm-klaviyo-welcome-dialog')\n        || element.hasAttribute('data-pkm-welcome-qa-dialog')\n        || element.classList.contains('needsclick')\n        || className.includes('kl-private-reset')\n        || Boolean(element.querySelector('[class*=\"kl-private-reset\"], .needsclick'));\n      return !isKlaviyoSurface && popupVisibleOnScreen(element);\n    });\n  }\n\n  function releaseStrandedScrollLock(expectedScrollY = null) {\n    if (klaviyoPopupOppe() || andenEjerAfLaasen()) return false;\n\n    // Klaviyo locks a scrolled page by fixing the document and storing the real viewport position\n    // as a negative `top`. Removing that fixed state without restoring the offset sends the shopper\n    // to the top of the PDP. Capture the lock offset before touching any styles, then put the\n    // viewport back exactly where it was after the stranded lock has been released.\n    const hasExpectedScrollY = Number.isFinite(expectedScrollY) && expectedScrollY >= 0;\n    let preservedScrollY = hasExpectedScrollY\n      ? expectedScrollY\n      : Math.max(0, window.scrollY);\n    let removedFixedScrollLock = false;\n\n    [document.body, document.documentElement].forEach((element) => {\n      const style = getComputedStyle(element);\n      if (style.overflow === 'hidden' || style.overflowY === 'hidden') {\n        element.style.setProperty('overflow', 'visible', 'important');\n        if (style.position === 'fixed') {\n          const fixedTop = Number.parseFloat(style.top);\n          if (Number.isFinite(fixedTop) && fixedTop < 0) {\n            preservedScrollY = Math.max(preservedScrollY, Math.round(-fixedTop));\n          }\n          removedFixedScrollLock = true;\n          element.style.removeProperty('position');\n          element.style.removeProperty('top');\n          element.style.removeProperty('width');\n        }\n      }\n    });\n\n    if ((removedFixedScrollLock || hasExpectedScrollY)\n      && Math.abs(window.scrollY - preservedScrollY) > 1) {\n      window.scrollTo(window.scrollX, preservedScrollY);\n    }\n\n    return true;\n  }\n\n  function finishPopupCloseScrollRestore(transaction, reason) {\n    if (!transaction || popupCloseScrollRestore !== transaction) return;\n    window.cancelAnimationFrame(transaction.frame);\n    window.clearTimeout(transaction.fallbackTimer);\n    transaction.cancelEvents.forEach((eventName) => {\n      window.removeEventListener(eventName, transaction.cancelOnUserInput, true);\n    });\n    popupCloseScrollRestore = null;\n\n    if (['dialog', 'late-dialog', 'storage-fail-dialog'].includes(unpublishedThemeQaMode())) {\n      const delta = Math.round(window.scrollY - transaction.expectedScrollY);\n      document.documentElement.dataset.pkmWelcomeQaScrollDelta = String(delta);\n      document.documentElement.dataset.pkmWelcomeQaScrollFinish = reason;\n      qaStamp(`scroll-close-${reason}:${delta}`);\n    }\n  }\n\n  function cancelPopupCloseScrollRestore(reason = 'cancelled') {\n    if (!popupCloseScrollRestore) return;\n    finishPopupCloseScrollRestore(popupCloseScrollRestore, reason);\n  }\n\n  function schedulePopupCloseScrollRestore(expectedScrollY) {\n    const hasExpectedScrollY = Number.isFinite(expectedScrollY) && expectedScrollY >= 0;\n\n    // The DOM guard and Klaviyo close event can observe the same close. Join the existing restore\n    // transaction so a later signal cannot replace the authoritative pre-open position with null.\n    if (popupCloseScrollRestore) {\n      if (hasExpectedScrollY && !popupCloseScrollRestore.hasAuthoritativeExpected) {\n        popupCloseScrollRestore.expectedScrollY = expectedScrollY;\n        popupCloseScrollRestore.hasAuthoritativeExpected = true;\n      }\n      return;\n    }\n\n    const transaction = {\n      expectedScrollY: hasExpectedScrollY ? expectedScrollY : Math.max(0, window.scrollY),\n      hasAuthoritativeExpected: hasExpectedScrollY,\n      // Klaviyo returns focus to its teaser about 1.9 seconds after an X close in Chromium. Keep\n      // the original viewport authoritative through that delayed focus handoff as well as iOS'\n      // native unlock. Trusted user input still cancels the transaction immediately.\n      deadline: window.performance.now() + 2_800,\n      frame: 0,\n      fallbackTimer: 0,\n      cancelEvents: ['touchstart', 'pointerdown', 'wheel', 'keydown'],\n      cancelOnUserInput: null,\n    };\n    transaction.cancelOnUserInput = () => {\n      finishPopupCloseScrollRestore(transaction, 'user-scroll');\n    };\n    transaction.cancelEvents.forEach((eventName) => {\n      window.addEventListener(eventName, transaction.cancelOnUserInput, {\n        capture: true,\n        passive: true,\n      });\n    });\n    popupCloseScrollRestore = transaction;\n\n    // Klaviyo's off-screen handoff and native iOS unlock finish in separate frames. Preserve the\n    // original viewport during the bounded settlement window, even after the first successful\n    // unlock. Any new trusted scroll input cancels immediately, so this never fights the shopper.\n    const settle = () => {\n      if (popupCloseScrollRestore !== transaction) return;\n      releaseStrandedScrollLock(transaction.expectedScrollY);\n      if (window.performance.now() >= transaction.deadline) {\n        finishPopupCloseScrollRestore(transaction, 'settled');\n        return;\n      }\n      transaction.frame = window.requestAnimationFrame(settle);\n    };\n    transaction.frame = window.requestAnimationFrame(settle);\n    transaction.fallbackTimer = window.setTimeout(() => {\n      if (popupCloseScrollRestore !== transaction) return;\n      releaseStrandedScrollLock(transaction.expectedScrollY);\n      finishPopupCloseScrollRestore(transaction, 'fallback-settled');\n    }, 3_000);\n  }\n\n  /**\n   * Klaviyo's Success buttons use CLOSE_FORM, but that action can tear down the private wrapper\n   * without first emitting the same close event as the X button. Arm the exact same restoration\n   * transaction in capture phase, before Klaviyo's handler can unlock the body or move the\n   * viewport. This is deliberately limited to the already-submitted Success view; the signup\n   * submit button itself must never be treated as a close.\n   */\n  function capturePermittedPopupCloseIntent(event) {\n    if (!usesOneShotFlow || !permittedPopupActive || !(event.target instanceof Element)) return;\n    const dialog = event.target.closest(\n      `[data-pkm-klaviyo-welcome-dialog=\"${marketFormId}\"], [data-pkm-welcome-qa-dialog]`\n    );\n    if (!dialog || !popupVisibleOnScreen(dialog)) return;\n\n    const control = event.target.closest('button, a, [role=\"button\"]');\n    if (!control) return;\n    const accessibleName = [\n      control.getAttribute('aria-label'),\n      control.getAttribute('title'),\n      control.textContent,\n    ].filter(Boolean).join(' ').trim().toLowerCase();\n    const explicitClose = /(^|\\s)(close|luk|schlie(?:\u00DF|ss)en|sluit|st\u00E4ng|st\u00E4nga|lukk)(\\s|$)/i\n      .test(accessibleName);\n    const successClose = retired\n      && !control.matches('button[type=\"submit\"], input[type=\"submit\"]');\n    if (!explicitClose && !successClose) return;\n\n    const expectedScrollY = permittedPopupScrollY;\n    // A focused control inside Klaviyo's translated-offscreen wrapper can make Chromium scroll the\n    // page again after the restore transaction has settled. Closing relinquishes that focus; the\n    // form library remains responsible for returning focus to its opener.\n    if (control instanceof HTMLElement) control.blur();\n    if (unpublishedThemeQaMode()) {\n      document.documentElement.dataset.pkmWelcomeQaCloseIntent = successClose\n        ? 'success-control'\n        : 'explicit-close';\n      document.documentElement.dataset.pkmWelcomeQaCloseIntentScrollY = String(window.scrollY);\n      document.documentElement.dataset.pkmWelcomeQaCloseExpectedScrollY = String(\n        Number.isFinite(expectedScrollY) ? expectedScrollY : window.scrollY\n      );\n    }\n    schedulePopupCloseScrollRestore(expectedScrollY);\n  }\n\n  function startVagt() {\n    window.setInterval(() => {\n      if (popupCloseScrollRestore) return;\n      const laast = [document.body, document.documentElement].some((element) => {\n        const style = getComputedStyle(element);\n        return style.overflow === 'hidden' || style.overflowY === 'hidden';\n      });\n      if (laast) releaseStrandedScrollLock();\n    }, 700);\n  }\n\n  if (!window.__klaviyoReopenBound) {\n    window.__klaviyoReopenBound = true;\n    startVagt();\n\n    // Capture before Klaviyo's own CLOSE_FORM handler. `click` is intentional: on touch devices it\n    // arrives after touchstart/pointerdown, so the same gesture cannot cancel the new transaction.\n    document.addEventListener('click', capturePermittedPopupCloseIntent, true);\n\n    // A touch/pointer press is also the start of a scroll. Let the browser decide whether the\n    // gesture completes as a click. Stop Klaviyo's early handlers without preventDefault, so native\n    // scrolling remains available. Only the completed trusted click may arm a permit or retry.\n    const manualOfferTarget = (event) => {\n      if (!(event.target instanceof Element)) return null;\n      return event.target.closest(\n        `klaviyo-reopen-note[data-klaviyo-form-id=\"${marketFormId}\"] [data-klaviyo-reopen-trigger], .kl-teaser-${marketFormId}`\n      );\n    };\n    const deferManualWelcomePress = (event) => {\n      if (usesOneShotFlow && manualOfferTarget(event)) event.stopImmediatePropagation();\n    };\n    const armManualWelcomeOpen = (event) => {\n      if (!event.isTrusted || event.button > 0) return;\n      if (!usesOneShotFlow || !isProductPage() || !eligible || retired || wishTrafficVetoed) return;\n      const clickedOfferRow = event.target.closest(\n        `klaviyo-reopen-note[data-klaviyo-form-id=\"${marketFormId}\"] [data-klaviyo-reopen-trigger]`\n      );\n      const clickedMarketTeaser = event.target.closest(`.kl-teaser-${marketFormId}`);\n      if (!clickedOfferRow && !clickedMarketTeaser) return;\n      if (permittedPopupActive) return;\n      if (openPermitKind && Date.now() <= openPermitUntil) return;\n      stopAutomaticTriggers();\n      armNextFormOpen('manual-user-click');\n      rememberOpenWithoutHidingRow('manual-user-click');\n      if (clickedMarketTeaser) {\n        scheduleManualOpenRetry('native-teaser-first-click-fallback');\n      }\n    };\n    document.addEventListener('touchstart', deferManualWelcomePress, { capture: true, passive: true });\n    document.addEventListener('pointerdown', deferManualWelcomePress, true);\n    document.addEventListener('mousedown', deferManualWelcomePress, true);\n    document.addEventListener('click', armManualWelcomeOpen, true);\n\n    window.addEventListener('klaviyoForms', (event) => {\n      const detail = event.detail || {};\n      const { type, formId } = detail;\n\n      // Back-in-stock, embedded signup and forms for another market must do absolutely nothing.\n      if (!marketFormId || formId !== marketFormId) return;\n\n      if (type === 'open') {\n        if (usesOneShotFlow) {\n          window.clearTimeout(manualOpenRetryTimer);\n          manualOpenRetryTimer = null;\n          const permit = consumeFormOpenPermit();\n          if (!permit) {\n            qaStamp('event-open-blocked');\n            startFormGuard();\n            scheduleFormGuard();\n            closeUnpermittedFormOpen();\n            track('klaviyo_welcome_offer_open_blocked', { reason: 'no-user-permit' });\n            return;\n          }\n          clearBlockedPopupShells();\n          qaStamp(`event-open-permitted:${permit}`);\n          permittedPopupActive = true;\n          permittedPopupWasVisible = false;\n          permittedPopupOpenedAt = Date.now();\n          window.clearTimeout(permittedPopupVisibilityTimer);\n          permittedPopupVisibilityTimer = window.setTimeout(() => {\n            if (!permittedPopupActive || permittedPopupWasVisible) return;\n            permittedPopupActive = false;\n            permittedPopupOpenedAt = 0;\n            permittedPopupScrollY = null;\n            setReopenLock(true);\n            scheduleFormGuard();\n          }, 3_000);\n          rememberOpenWithoutHidingRow(`matching-form-opened:${permit}`);\n          scheduleFormGuard();\n        }\n      }\n      if (type === 'submit') {\n        preservePermittedPopupForSuccess();\n        retire('matching-form-submitted');\n        scheduleFormGuard();\n        return;\n      }\n\n      if (type === 'close') {\n        const deliberateOpenStillPending = Boolean(openPermitKind)\n          && Date.now() <= openPermitUntil;\n        const permittedOpenStillPainting = permittedPopupActive\n          && Date.now() - permittedPopupOpenedAt < PERMITTED_OPEN_CLOSE_GRACE_MS;\n        const ignoreStaleClose = deliberateOpenStillPending || permittedOpenStillPainting;\n        qaStamp(ignoreStaleClose\n          ? (deliberateOpenStillPending ? 'event-close-ignored-pending' : 'event-close-ignored-grace')\n          : 'event-close-locked');\n\n        if (usesOneShotFlow && !ignoreStaleClose) {\n          const restoreScrollY = permittedPopupScrollY;\n          permittedPopupActive = false;\n          permittedPopupWasVisible = false;\n          permittedPopupOpenedAt = 0;\n          permittedPopupScrollY = null;\n          window.clearTimeout(permittedPopupVisibilityTimer);\n          setReopenLock(true);\n          scheduleFormGuard();\n          schedulePopupCloseScrollRestore(restoreScrollY);\n        }\n        if (usesOneShotFlow && eligible && !retired) syncNotes('eligible');\n        if (!usesOneShotFlow) {\n          window.setTimeout(releaseStrandedScrollLock, 400);\n          window.setTimeout(releaseStrandedScrollLock, 1_500);\n        }\n      }\n    });\n\n    // On a fresh private visit Klaviyo may load only after marketing consent. Re-open one short,\n    // fail-closed probe then; the exact teaser must still prove account-side eligibility.\n    document.addEventListener('consent:scripts-unblocked', () => {\n      confirmConsentAnswered('consent:scripts-unblocked');\n      if (!marketFormId || eligible || retired || wishTrafficVetoed) return;\n      startEligibilityProbe('klaviyo-teaser-after-consent');\n    });\n    document.addEventListener('visitorConsentCollected', () => confirmConsentAnswered('visitorConsentCollected'));\n    window.addEventListener('PandectesConsentUpdateLegacy', () => confirmConsentAnswered('PandectesConsentUpdateLegacy'));\n  }\n\n  if (!customElements.get('klaviyo-reopen-note')) {\n    class KlaviyoReopenNote extends HTMLElement {\n      connectedCallback() {\n        this.trigger = this.querySelector('[data-klaviyo-reopen-trigger]');\n        this._onClick = (event) => {\n          event.preventDefault();\n          if (!event.isTrusted) return;\n          requestOpen('pdp-row-click');\n        };\n        this.trigger?.addEventListener('click', this._onClick);\n\n        const idMatchesMarket = this.dataset.klaviyoFormId === marketFormId;\n        this.setState(\n          retired || !idMatchesMarket\n            ? 'retired'\n            : (wishTrafficVetoed\n              ? 'ineligible'\n              : (eligible && offerRowCanBePresented() ? 'eligible' : 'pending'))\n        );\n      }\n\n      disconnectedCallback() {\n        this.trigger?.removeEventListener('click', this._onClick);\n      }\n\n      setState(state) {\n        if (this.dataset.serverHidden === 'true'\n          || document.documentElement.classList.contains('lelafine-welcome-claimed')) {\n          state = 'retired';\n        }\n        this.dataset.state = state;\n        // Pending is deliberately zero-height: only the exact market teaser is allowed to make\n        // the campaign row visible. Showing the server-rendered row before that proof creates a\n        // first-paint flash and can promise a discount to an ineligible visitor.\n        const presented = state === 'eligible';\n        const interactive = state === 'eligible';\n        this.hidden = state === 'pending' || state === 'retired';\n        this.setAttribute('aria-hidden', presented ? 'false' : 'true');\n        if (this.trigger) this.trigger.tabIndex = interactive ? 0 : -1;\n        if (interactive) window.requestAnimationFrame(scheduleMarketTeaserOverlay);\n      }\n    }\n\n    customElements.define('klaviyo-reopen-note', KlaviyoReopenNote);\n  }\n\n  if (!marketFormId || retired) {\n    eligibilityClosed = true;\n    syncNotes('retired');\n    return;\n  }\n\n  if (usesOneShotFlow) {\n    setReopenLock(true);\n  }\n\n  if (wishTrafficVetoed) {\n    eligibilityClosed = true;\n    syncNotes('ineligible');\n    track('klaviyo_welcome_offer_ineligible', { reason: 'wish-traffic' });\n    return;\n  }\n\n  initializeAutomaticCriterionObservers();\n\n  if (hasConsentDecisionCookie() || marketingConsentState() === true) {\n    confirmConsentAnswered('existing-pandectes-cookie');\n  }\n\n  const qaMode = unpublishedThemeQaMode();\n  if (qaMode) startQaLayoutShiftProbe();\n  if (qaMode === 'teaser-race') {\n    startQaTeaserRaceProbe();\n    resolveEligible('unpublished-theme-qa-teaser-race');\n    return;\n  }\n  if (qaMode === 'touch-teaser-race') {\n    startQaTouchTeaserRaceProbe();\n    resolveEligible('unpublished-theme-qa-touch-teaser-race');\n    return;\n  }\n  if (qaMode === 'pre-pointer-teaser-race') {\n    startQaPrePointerTeaserRaceProbe();\n    resolveEligible('unpublished-theme-qa-pre-pointer-teaser-race');\n    return;\n  }\n  if (qaMode === 'manual-only') {\n    resolveEligible('unpublished-theme-qa-manual-only');\n    startQaManualOnlyProbe();\n    return;\n  }\n  if (['eligible', 'dialog', 'storage-fail-dialog'].includes(qaMode)) {\n    resolveEligible('unpublished-theme-qa');\n    return;\n  }\n  if (qaMode === 'late-dialog') {\n    window.setTimeout(() => resolveEligible('unpublished-theme-qa-late'), 12_000);\n    return;\n  }\n\n  if (qaMode === 'pending') return;\n\n  // A grant can only enter sessionStorage above after the exact form teaser existed on this host.\n  // Reuse that same market-specific grant on later PDPs in the tab, until submit retires it. This\n  // is deliberately PDP-only: the native teaser stays visually disabled on every non-PDP surface.\n  if (sessionEligibleForMarket && isProductPage()) {\n    resolveEligible('session-exact-market-teaser');\n    return;\n  }\n\n  startEligibilityProbe();\n})();\n"],
  "mappings": "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",
  "names": ["qaMode"]
}
