{
  "version": 3,
  "sources": ["/cdn/shop/t/125/assets/ch-cart-rewards.js?chv=23"],
  "sourcesContent": ["import { StandardEvents } from '@shopify/events';\nimport { beginCartDiscountUpdate, beginCartLinesUpdate } from './standard-cart-events.js';\n\nconst CONFIG_ID = 'ch-cart-rewards-config';\nconst ROOT = window.Shopify?.routes?.root || '/';\nconst REWARD_PROPERTY = '_ch_reward';\nconst TIER_PROPERTY = '_ch_reward_tier';\nconst SOURCE = 'ch-cart-rewards';\nconst REWARD_STATUS_EVENT = 'ch:cart-reward-status';\n\nfunction qualifyingCartSpend(cart, rewardProperty = '_ch_reward') {\n  const cartDiscountTitles = new Set(\n    (cart?.cart_level_discount_applications || [])\n      .map((discount) => String(discount.title || discount.discount_application?.title || ''))\n      .filter(Boolean)\n  );\n\n  return (cart?.items || []).reduce((total, item) => {\n    if (item.properties?.[rewardProperty] === 'true') return total;\n    if (item.gift_card || item.selling_plan_allocation) return total;\n\n    const linePrice = Number(item.final_line_price ?? item.original_line_price) || 0;\n    const cartDiscountAmount = (item.discounts || []).reduce((discountTotal, discount) => {\n      if (!cartDiscountTitles.has(String(discount.title || ''))) return discountTotal;\n      return discountTotal + (Number(discount.amount) || 0);\n    }, 0);\n\n    return total + Math.max(0, linePrice - cartDiscountAmount);\n  }, 0);\n}\n\nfunction escapeHtml(value = '') {\n  return String(value)\n    .replaceAll('&', '&amp;')\n    .replaceAll('<', '&lt;')\n    .replaceAll('>', '&gt;')\n    .replaceAll('\"', '&quot;')\n    .replaceAll(\"'\", '&#039;');\n}\n\nfunction readConfig() {\n  const element = document.getElementById(CONFIG_ID);\n  if (!(element instanceof HTMLScriptElement)) return null;\n\n  try {\n    return JSON.parse(element.textContent || '{}');\n  } catch (error) {\n    console.error('Failed to read cart reward configuration:', error);\n    return null;\n  }\n}\n\nfunction tickMarkup() {\n  const template = document.getElementById('ch-cart-reward-tick-icon');\n  return template instanceof HTMLTemplateElement\n    ? template.innerHTML.trim()\n    : '<span class=\"ch-cart-reward-tick\" aria-hidden=\"true\">\u2713</span>';\n}\n\nfunction issueMarkup() {\n  const template = document.getElementById('ch-cart-reward-issue-icon');\n  return template instanceof HTMLTemplateElement ? template.innerHTML.trim() : '';\n}\n\nfunction getSectionIds() {\n  return Array.from(document.querySelectorAll('cart-items-component'))\n    .map((component) => component.dataset.sectionId)\n    .filter(Boolean);\n}\n\nasync function fetchJson(url, body) {\n  const response = await fetch(url, {\n    method: body ? 'POST' : 'GET',\n    credentials: 'same-origin',\n    headers: {\n      Accept: 'application/json',\n      ...(body ? { 'Content-Type': 'application/json' } : {}),\n    },\n    ...(body ? { body: JSON.stringify(body) } : {}),\n  });\n  const data = await response.json().catch(() => ({}));\n\n  if (!response.ok || data.status) {\n    throw new Error(data.description || data.message || `Cart request failed: ${response.status}`);\n  }\n\n  return data;\n}\n\nclass CHCartRewardsController extends HTMLElement {\n  #config;\n  #changingTier;\n  #cart;\n  #queue = Promise.resolve();\n  #isReconciling = false;\n  #announced = new Set();\n  #declined = new Set();\n  #failedAutomatic = new Map();\n  #previousUnlocked = new Set();\n  #pendingSections = {};\n  #pendingExternalUpdates = 0;\n  #hasQuantityPreview = false;\n  #pendingAdditionTiers = new Set();\n  #pendingRemovalTiers = new Set();\n  #pendingIndicatorTimer;\n  #previewRollbackTimer;\n  #pendingRemovalSettlementTimer;\n  #abortController = new AbortController();\n  #productCardObserver = new MutationObserver((mutations) => {\n    if (this.#hasQuantityPreview || this.#pendingExternalUpdates > 0) this.#setCheckoutPending(true);\n    if (this.#pendingAdditionTiers.size) this.#applyPendingRewardAdditions();\n\n    if (this.#pendingRemovalTiers.size) {\n      this.#applyPendingRewardRemoval();\n      this.#schedulePendingRewardRemovalSettlement();\n    }\n\n    const addedRewardCard = mutations.some((mutation) =>\n      Array.from(mutation.addedNodes).some(\n        (node) =>\n          node instanceof Element &&\n          (node.matches('ch-cart-reward-product-card, ch-cart-reward-placeholders') || node.querySelector('ch-cart-reward-product-card, ch-cart-reward-placeholders'))\n      )\n    );\n\n    if (addedRewardCard) this.#render();\n  });\n\n  connectedCallback() {\n    this.#config = readConfig();\n    if (!this.#config) return;\n\n    this.#config.eligible = this.#config.eligible !== 'false' && this.#config.eligible !== false;\n    this.#config.tiers = (this.#config.tiers || [])\n      .filter((tier) => tier.handle && Number(tier.threshold) > 0)\n      .map((tier) => ({ ...tier, autoAdd: Boolean(tier.autoAdd) && (tier.products || []).length === 1 }))\n      .sort((a, b) => Number(a.threshold) - Number(b.threshold));\n    this.#cart = this.#config.cart || { items: [], item_count: 0, currency: this.#config.currency };\n\n    if (!this.#config.eligible) {\n      const { signal } = this.#abortController;\n      document.addEventListener(StandardEvents.cartLinesUpdate, this.#handleStandardCartUpdate, { signal });\n      document.addEventListener(StandardEvents.cartDiscountUpdate, this.#handleStandardCartUpdate, { signal });\n      window.addEventListener('pageshow', this.#handlePageShow, { signal });\n      this.#enqueue(() => this.#reconcile({ announce: false }));\n      return;\n    }\n\n    this.#readDeclined();\n    this.#readAnnounced();\n    this.#previousUnlocked = new Set(this.#unlockedTiers().map((tier) => tier.handle));\n\n    const { signal } = this.#abortController;\n    document.addEventListener(StandardEvents.cartLinesUpdate, this.#handleStandardCartUpdate, { signal });\n    document.addEventListener(StandardEvents.cartDiscountUpdate, this.#handleStandardCartUpdate, { signal });\n    document.addEventListener('quantity-selector:update', this.#handleQuantityPreview, { signal });\n    document.addEventListener('product:variant-rendered', this.#handleVariantUpdate, { signal });\n    document.addEventListener('click', this.#handleClick, { signal });\n    document.addEventListener('submit', this.#handleCheckout, { signal, capture: true });\n    document.addEventListener('click', this.#handleCheckout, { signal, capture: true });\n    window.addEventListener('pageshow', this.#handlePageShow, { signal });\n    this.#productCardObserver.observe(document.body, { childList: true, subtree: true });\n\n    this.#render();\n    this.#enqueue(() => this.#reconcile({ announce: false }));\n  }\n\n  disconnectedCallback() {\n    this.#abortController.abort();\n    this.#productCardObserver.disconnect();\n    if (this.#previewRollbackTimer) window.clearTimeout(this.#previewRollbackTimer);\n    if (this.#pendingRemovalSettlementTimer) window.clearTimeout(this.#pendingRemovalSettlementTimer);\n    if (this.#pendingIndicatorTimer) window.clearTimeout(this.#pendingIndicatorTimer);\n  }\n\n  #handlePageShow = (event) => {\n    if (!event.persisted) return;\n    this.#enqueue(() => this.#reconcile({ announce: false }));\n  };\n\n  /** @param {import('@shopify/events').CartLinesUpdateEvent | import('@shopify/events').CartDiscountUpdateEvent} event */\n  #handleStandardCartUpdate = (event) => {\n    if (event.detail?.source === SOURCE) return;\n\n    this.#pendingExternalUpdates += 1;\n    this.#hasQuantityPreview = false;\n    this.#setProgressPending(true);\n\n    event.promise\n      ?.then(() => {\n        const announce = event.detail?.source === 'product-form-component';\n        const operationId = announce ? String(event.detail?.operationId || '') : '';\n        const updateSource = String(event.detail?.source || '');\n        this.#enqueue(async () => {\n          try {\n            await this.#reconcile({ announce, operationId, updateSource });\n          } finally {\n            this.#finishExternalUpdate();\n          }\n        });\n      })\n      .catch(() => {\n        this.#enqueue(async () => {\n          try {\n            this.#cart = await this.#fetchCart();\n            this.#restorePendingRewardRows();\n            this.#render();\n          } finally {\n            this.#finishExternalUpdate();\n          }\n        });\n      });\n  };\n\n  #handleVariantUpdate = (event) => {\n    const variant = event.detail?.resource;\n    const productId = event.detail?.data?.productId;\n    if (!variant) return;\n\n    document\n      .querySelectorAll('ch-cart-reward-product-card[data-first-threshold-product-prompt=\"true\"]')\n      .forEach((element) => {\n        if (!(element instanceof HTMLElement)) return;\n        if (productId && element.dataset.productId !== String(productId)) return;\n\n        element.dataset.productPrice = String(Number(variant.price) || 0);\n        element.dataset.productAvailable = variant.available ? 'true' : 'false';\n      });\n\n    this.#render();\n  };\n\n  #handleQuantityPreview = (event) => {\n    const lineNumber = Number(event.detail?.cartLine);\n    const quantity = Number(event.detail?.quantity);\n    const currentItem = this.#cart.items?.[lineNumber - 1];\n    if (!currentItem || currentItem.properties?.[REWARD_PROPERTY] === 'true' || quantity < 0) return;\n\n    const currentQuantity = Math.max(Number(currentItem.quantity) || 0, 1);\n    const finalUnitPrice = (Number(currentItem.final_line_price) || 0) / currentQuantity;\n    const originalUnitPrice = (Number(currentItem.original_line_price) || 0) / currentQuantity;\n    const predictedItems = (this.#cart.items || []).map((item, index) => {\n      if (index !== lineNumber - 1) return item;\n\n      return {\n        ...item,\n        quantity,\n        final_line_price: Math.round(finalUnitPrice * quantity),\n        original_line_price: Math.round(originalUnitPrice * quantity),\n      };\n    });\n\n    this.#cart = { ...this.#cart, items: predictedItems };\n    this.#hasQuantityPreview = true;\n    this.#setProgressPending(true);\n    this.#render({ progressOnly: true });\n    this.#previewAutomaticRewardAdditions();\n    this.#previewLockedRewardRemoval();\n\n    if (this.#previewRollbackTimer) window.clearTimeout(this.#previewRollbackTimer);\n    this.#previewRollbackTimer = window.setTimeout(() => {\n      this.#previewRollbackTimer = undefined;\n      if (this.#pendingExternalUpdates > 0) return;\n\n      this.#enqueue(async () => {\n        this.#cart = await this.#fetchCart();\n        this.#hasQuantityPreview = false;\n        this.#restorePendingRewardRows();\n        this.#setProgressPending(this.#pendingExternalUpdates > 0);\n        this.#render();\n      });\n    }, 6000);\n  };\n\n  #missingChoices() {\n    return this.#unlockedTiers().filter((tier) => !tier.autoAdd && !this.#rewardLineFor(tier.handle) && !this.#failedAutomatic.has(tier.handle) && tier.products.some((product) => product.available && product.variantId));\n  }\n\n  #handleCheckout = (event) => {\n    const target = event.target;\n    if (!(target instanceof Element)) return;\n    if (target.closest('[data-ch-reward-continue]')) return;\n    const checkout = event.type === 'submit' ? event.submitter : target.closest('[name=\"checkout\"], a[href$=\"/checkout\"]');\n    if (!checkout || !this.#missingChoices().length) return;\n    event.preventDefault();\n    event.stopImmediatePropagation();\n    this.#openNotification({ title: this.#config.messages.unclaimed, checkout: true });\n  };\n\n  #handleClick = (event) => {\n    const target = event.target;\n    if (!(target instanceof Element)) return;\n\n    if (target.closest('[data-ch-reward-close]')) {\n      this.#closeNotification();\n      return;\n    }\n\n    const changeButton = target.closest('[data-ch-reward-change]');\n    if (changeButton instanceof HTMLButtonElement) {\n      const tier = this.#unlockedTiers().find((candidate) => candidate.handle === changeButton.dataset.chRewardChange && !candidate.autoAdd);\n      if (tier) this.#openGiftPicker(tier.handle);\n      return;\n    }\n\n    const openButton = target.closest('[data-ch-reward-open]');\n    if (openButton) {\n      this.#openGiftPicker();\n      return;\n    }\n\n    const chooseButton = target.closest('[data-ch-reward-choose]');\n    if (chooseButton instanceof HTMLButtonElement) {\n      const tierHandle = chooseButton.dataset.tierHandle;\n      const variantId = chooseButton.dataset.variantId;\n      if (tierHandle && variantId) this.#enqueue(() => this.#chooseReward(tierHandle, variantId, chooseButton));\n      return;\n    }\n\n    const removeButton = target.closest('[data-ch-cart-reward-remove]');\n    if (removeButton instanceof HTMLButtonElement) {\n      const lineKey = removeButton.dataset.lineKey;\n      const tierHandle = removeButton.dataset.tierHandle;\n      if (lineKey && tierHandle) this.#enqueue(() => this.#removeReward(lineKey, tierHandle, removeButton));\n    }\n  };\n\n  #enqueue(task) {\n    this.#queue = this.#queue.then(task).catch((error) => {\n      console.error('Cart reward update failed:', error);\n      this.#hasQuantityPreview = false;\n      this.#pendingExternalUpdates = 0;\n      this.#restorePendingRewardAdditions();\n      this.#restorePendingRewardRows();\n      this.#setProgressPending(false);\n      this.#announce('We could not update your gift. Please try again.');\n      this.#render();\n    });\n    return this.#queue;\n  }\n\n  async #fetchCart() {\n    return fetchJson(this.#config.routes?.cart || `${ROOT}cart.js`);\n  }\n\n  #eligibleSubtotal() {\n    return qualifyingCartSpend(this.#cart, REWARD_PROPERTY);\n  }\n\n  #unlockedTiers() {\n    const subtotal = this.#eligibleSubtotal();\n    return this.#config.tiers.filter((tier) => subtotal >= Number(tier.threshold));\n  }\n\n  #rewardLines() {\n    return (this.#cart.items || []).filter((item) => item.properties?.[REWARD_PROPERTY] === 'true');\n  }\n\n  #rewardLineFor(tierHandle) {\n    return this.#rewardLines().find((item) => item.properties?.[TIER_PROPERTY] === tierHandle);\n  }\n\n  #meaningfulCartSignature() {\n    const items = (this.#cart.items || [])\n      .filter((item) => item.properties?.[REWARD_PROPERTY] !== 'true')\n      .map((item) => `${item.key || item.variant_id}:${item.quantity}:${item.final_line_price}`)\n      .sort();\n    const discounts = (this.#cart.cart_level_discount_applications || [])\n      .map((discount) => {\n        const application = discount.discount_application || discount;\n        return `discount:${application.title}`;\n      })\n      .sort();\n\n    return [...items, ...discounts, `qualifying:${this.#eligibleSubtotal()}`].join('|');\n  }\n\n  #clearChangedFailureSuppressions() {\n    const signature = this.#meaningfulCartSignature();\n\n    for (const [tierHandle, failedSignature] of this.#failedAutomatic) {\n      if (failedSignature !== signature) this.#failedAutomatic.delete(tierHandle);\n    }\n  }\n\n  async #reconcile({ announce, operationId = '', updateSource = '' }) {\n    if (this.#isReconciling) return;\n    this.#isReconciling = true;\n\n    try {\n      // Cart mutations can settle out of order when a shopper changes several\n      // lines quickly. Always reconcile against Shopify's current cart rather\n      // than rendering a possibly stale cart snapshot from an earlier event.\n      this.#cart = await this.#fetchCart();\n      if (updateSource === 'cart-discount') this.#clearInlineNotice();\n      if (!this.#config.eligible) {\n        await this.#removeIneligibleRewards();\n        this.#flushSections();\n        return;\n      }\n\n      if (!(this.#cart.items || []).length) {\n        this.#declined.clear();\n        this.#announced.clear();\n        this.#failedAutomatic.clear();\n        this.#writeDeclined();\n        this.#writeAnnounced();\n      }\n      this.#clearChangedFailureSuppressions();\n\n      const unlocked = this.#unlockedTiers();\n      const unlockedHandles = new Set(unlocked.map((tier) => tier.handle));\n      let announcementsChanged = false;\n      for (const tierHandle of this.#announced) {\n        if (!unlockedHandles.has(tierHandle)) {\n          this.#announced.delete(tierHandle);\n          announcementsChanged = true;\n        }\n      }\n      if (announcementsChanged) this.#writeAnnounced();\n      const lockedLines = this.#rewardLines().filter(\n        (line) => !unlockedHandles.has(line.properties?.[TIER_PROPERTY])\n      );\n      const discountRemovedLockedRewards = updateSource === 'cart-discount' && lockedLines.length > 0;\n\n      if (lockedLines.length) {\n        this.#previewLockedRewardRemoval();\n        await this.#removeLockedRewards(lockedLines);\n      }\n\n      await this.#normalizeRewardQuantities();\n\n      const currentUnlocked = this.#unlockedTiers();\n      const missingAutomatic = currentUnlocked.filter(\n        (tier) =>\n          tier.autoAdd &&\n          !this.#declined.has(tier.handle) &&\n          !this.#failedAutomatic.has(tier.handle) &&\n          !this.#rewardLineFor(tier.handle)\n      );\n\n      if (missingAutomatic.length) {\n        this.#markPendingRewardAdditions(missingAutomatic);\n        this.#emitRewardStatus('pending', missingAutomatic, operationId);\n        await this.#addAutomaticRewards(missingAutomatic);\n      }\n\n      await this.#syncRewardCodes();\n\n      let failedTiers = this.#invalidRewardTiers();\n      if (failedTiers.length) {\n        await this.#syncRewardCodes({ force: true });\n        failedTiers = this.#invalidRewardTiers();\n      }\n\n      if (failedTiers.length) {\n        await this.#handleFailedRewards(failedTiers, { operationId });\n      } else if (missingAutomatic.length) {\n        this.#emitRewardStatus('success', missingAutomatic, operationId);\n      }\n\n      this.#flushSections();\n\n      if (discountRemovedLockedRewards && !failedTiers.length) {\n        const message = this.#config.messages?.discountReducedGiftSpend\n          || 'Discount applied \u2014 gifts above your new total were removed.';\n        this.#announce(message);\n        this.#showInlineNotice(message);\n      }\n\n      if (announce && this.#unlockedTiers().some((tier) => !tier.autoAdd && !this.#previousUnlocked.has(tier.handle))) {\n        this.#announce(this.#config.messages.unlocked);\n      }\n\n      this.#previousUnlocked = new Set(this.#unlockedTiers().map((tier) => tier.handle));\n      this.#render();\n    } finally {\n      this.#isReconciling = false;\n    }\n  }\n\n  async #addAutomaticRewards(tiers) {\n    const items = tiers\n      .map((tier) => {\n        const product = tier.products.find((candidate) => candidate.available && candidate.variantId);\n        if (!product) return null;\n        if (this.#config.applyTestCodes && !tier.discountCode) return null;\n\n        return {\n          id: product.variantId,\n          quantity: 1,\n          properties: {\n            [REWARD_PROPERTY]: 'true',\n            [TIER_PROPERTY]: tier.handle,\n          },\n        };\n      })\n      .filter(Boolean);\n\n    if (!items.length) return;\n    const standardUpdate = beginCartLinesUpdate(this, {\n      action: 'add',\n      context: 'cart',\n      lines: items.map((item) => ({ merchandiseId: String(item.id), quantity: item.quantity })),\n      detail: { source: SOURCE, rewardOperation: 'automatic-add' },\n    });\n\n    try {\n      const response = await fetchJson(this.#config.routes?.add || `${ROOT}cart/add.js`, {\n        items,\n        sections: getSectionIds().join(','),\n        sections_url: window.location.pathname,\n      });\n      this.#cart = await this.#fetchCart();\n      this.#rememberSections(response.sections);\n      standardUpdate.resolve(this.#cart, { sections: response.sections || {}, itemCount: this.#cart.item_count });\n    } catch (error) {\n      standardUpdate.reject(error);\n      throw error;\n    }\n  }\n\n  async #chooseReward(tierHandle, variantId, button) {\n    const tier = this.#config.tiers.find((candidate) => candidate.handle === tierHandle);\n    if (!tier || !this.#unlockedTiers().some((candidate) => candidate.handle === tierHandle)) return;\n    if (this.#config.applyTestCodes && !tier.discountCode) {\n      this.#announce('This test gift still needs its discount code.');\n      return;\n    }\n\n    button.disabled = true;\n    const existing = this.#rewardLineFor(tierHandle);\n\n    try {\n      if (existing && String(existing.variant_id) === String(variantId)) return;\n      if (existing) await this.#removeLines([existing], false);\n\n      const standardUpdate = beginCartLinesUpdate(this, {\n        action: 'add',\n        context: 'cart',\n        lines: [{ merchandiseId: String(variantId), quantity: 1 }],\n        detail: { source: SOURCE, rewardOperation: 'choice-add', tierHandle, variantId },\n      });\n      let response;\n      try {\n        response = await fetchJson(this.#config.routes?.add || `${ROOT}cart/add.js`, {\n        items: [{\n          id: variantId,\n          quantity: 1,\n          properties: {\n            [REWARD_PROPERTY]: 'true',\n            [TIER_PROPERTY]: tierHandle,\n          },\n        }],\n        sections: getSectionIds().join(','),\n        sections_url: window.location.pathname,\n        });\n      } catch (error) {\n        standardUpdate.reject(error);\n        throw error;\n      }\n      this.#declined.delete(tierHandle);\n      this.#writeDeclined();\n      this.#cart = await this.#fetchCart();\n      this.#rememberSections(response.sections);\n      standardUpdate.resolve(this.#cart, { sections: response.sections || {}, itemCount: this.#cart.item_count });\n      await this.#syncRewardCodes();\n\n      let failedTiers = this.#invalidRewardTiers().filter((candidate) => candidate.handle === tierHandle);\n      if (failedTiers.length) {\n        await this.#syncRewardCodes({ force: true });\n        failedTiers = this.#invalidRewardTiers().filter((candidate) => candidate.handle === tierHandle);\n      }\n\n      if (failedTiers.length) {\n        await this.#handleFailedRewards(failedTiers);\n      } else {\n        this.#flushSections();\n        this.#announce(`${tier.title} added to your cart.`);\n        this.#closeNotification();\n      }\n      this.#render();\n    } finally {\n      button.disabled = false;\n    }\n  }\n\n  async #removeReward(lineKey, tierHandle, button) {\n    button.disabled = true;\n    try {\n      const tier = this.#config.tiers.find((candidate) => candidate.handle === tierHandle);\n      const line = (this.#cart.items || []).find((item) => item.key === lineKey);\n      if (!line) return;\n\n      if (tier?.autoAdd) this.#declined.add(tierHandle);\n      this.#writeDeclined();\n      await this.#removeLines([line], false);\n      await this.#syncRewardCodes();\n      this.#flushSections();\n      this.#render();\n    } finally {\n      button.disabled = false;\n    }\n  }\n\n  async #removeLines(lines, dispatch = true) {\n    for (const line of lines) {\n      const standardUpdate = beginCartLinesUpdate(this, {\n        action: 'remove',\n        context: 'cart',\n        lines: [{ id: line.key, quantity: 0 }],\n        detail: { source: SOURCE, rewardOperation: 'remove', tierHandle: line.properties?.[TIER_PROPERTY] },\n      });\n      try {\n        const response = await fetchJson(this.#config.routes?.change || `${ROOT}cart/change.js`, {\n          id: line.key,\n          quantity: 0,\n          sections: getSectionIds().join(','),\n          sections_url: window.location.pathname,\n        });\n        this.#cart = response;\n        this.#rememberSections(response.sections);\n        standardUpdate.resolve(this.#cart, { sections: response.sections || {}, itemCount: this.#cart.item_count });\n        if (dispatch) this.#flushSections();\n      } catch (error) {\n        standardUpdate.reject(error);\n        throw error;\n      }\n    }\n  }\n\n  async #removeIneligibleRewards() {\n    const rewardLines = this.#rewardLines();\n    const configuredCodes = new Set(\n      this.#config.tiers.map((tier) => String(tier.discountCode || '').toLowerCase()).filter(Boolean)\n    );\n    const currentCodes = this.#currentDiscountCodes();\n    const hasRewardCode = currentCodes.some(\n      (code) => configuredCodes.has(String(code).toLowerCase())\n    );\n    if (!rewardLines.length && !hasRewardCode) return;\n\n    const body = {\n      updates: Object.fromEntries(rewardLines.map((line) => [line.key, 0])),\n      sections: getSectionIds().join(','),\n      sections_url: window.location.pathname,\n    };\n    if (hasRewardCode) {\n      body.discount = currentCodes\n        .filter((code) => !configuredCodes.has(String(code).toLowerCase()))\n        .join(',');\n    }\n\n    const lineUpdate = rewardLines.length\n      ? beginCartLinesUpdate(this, {\n          action: 'remove',\n          context: 'cart',\n          lines: rewardLines.map((line) => ({ id: line.key, quantity: 0 })),\n          detail: { source: SOURCE, rewardOperation: 'remove-ineligible' },\n        })\n      : null;\n    const discountUpdate = hasRewardCode\n      ? beginCartDiscountUpdate(this, body.discount ? body.discount.split(',').filter(Boolean) : [], {\n          source: SOURCE,\n          rewardOperation: 'remove-ineligible-codes',\n        })\n      : null;\n    try {\n      const response = await fetchJson(this.#config.routes?.update || `${ROOT}cart/update.js`, body);\n      this.#cart = response;\n      this.#rememberSections(response.sections);\n      const detail = { sections: response.sections || {}, itemCount: response.item_count };\n      lineUpdate?.resolve(response, detail);\n      discountUpdate?.resolve(response, detail);\n    } catch (error) {\n      lineUpdate?.reject(error);\n      discountUpdate?.reject(error);\n      throw error;\n    }\n  }\n\n  async #removeLockedRewards(lines) {\n    const lockedHandles = new Set(lines.map((line) => line.properties?.[TIER_PROPERTY]).filter(Boolean));\n    const configuredCodes = new Set(\n      this.#config.tiers.map((tier) => String(tier.discountCode || '').toLowerCase()).filter(Boolean)\n    );\n    const customerCodes = this.#currentDiscountCodes().filter(\n      (code) => !configuredCodes.has(String(code).toLowerCase())\n    );\n    const remainingRewardCodes = this.#unlockedTiers()\n      .filter(\n        (tier) =>\n          !lockedHandles.has(tier.handle) &&\n          tier.discountCode &&\n          this.#rewardLineFor(tier.handle)\n      )\n      .map((tier) => tier.discountCode);\n    const updates = Object.fromEntries(lines.map((line) => [line.key, 0]));\n\n    const body = {\n      updates,\n      sections: getSectionIds().join(','),\n      sections_url: window.location.pathname,\n    };\n    if (this.#config.applyTestCodes) {\n      body.discount = [...new Set([...customerCodes, ...remainingRewardCodes])].join(',');\n    }\n\n    const lineUpdate = beginCartLinesUpdate(this, {\n      action: 'remove',\n      context: 'cart',\n      lines: lines.map((line) => ({ id: line.key, quantity: 0 })),\n      detail: { source: SOURCE, rewardOperation: 'remove-locked' },\n    });\n    const discountUpdate = this.#config.applyTestCodes\n      ? beginCartDiscountUpdate(this, body.discount ? body.discount.split(',').filter(Boolean) : [], {\n          source: SOURCE,\n          rewardOperation: 'remove-locked-codes',\n        })\n      : null;\n    try {\n      const response = await fetchJson(this.#config.routes?.update || `${ROOT}cart/update.js`, body);\n      this.#cart = response;\n      this.#rememberSections(response.sections);\n      const detail = { sections: response.sections || {}, itemCount: response.item_count };\n      lineUpdate.resolve(response, detail);\n      discountUpdate?.resolve(response, detail);\n    } catch (error) {\n      lineUpdate.reject(error);\n      discountUpdate?.reject(error);\n      throw error;\n    }\n  }\n\n  #previewLockedRewardRemoval() {\n    const unlockedHandles = new Set(this.#unlockedTiers().map((tier) => tier.handle));\n\n    document.querySelectorAll('[data-ch-reward-tier-handle]').forEach((row) => {\n      const tierHandle = row.getAttribute('data-ch-reward-tier-handle');\n      if (!tierHandle || unlockedHandles.has(tierHandle)) return;\n      this.#pendingRemovalTiers.add(tierHandle);\n    });\n\n    document.querySelectorAll('[data-ch-reward-tier]').forEach((tier) => {\n      const tierHandle = tier.getAttribute('data-ch-reward-tier');\n      if (!tierHandle || unlockedHandles.has(tierHandle)) return;\n      this.#pendingRemovalTiers.add(tierHandle);\n    });\n\n    this.#applyPendingRewardRemoval();\n    this.#schedulePendingRewardRemovalSettlement();\n  }\n\n  #previewAutomaticRewardAdditions() {\n    const missingAutomatic = this.#unlockedTiers().filter(\n      (tier) =>\n        tier.autoAdd &&\n        !this.#declined.has(tier.handle) &&\n        !this.#failedAutomatic.has(tier.handle) &&\n        !this.#rewardLineFor(tier.handle)\n    );\n    this.#markPendingRewardAdditions(missingAutomatic);\n  }\n\n  #markPendingRewardAdditions(tiers) {\n    tiers.forEach((tier) => this.#pendingAdditionTiers.add(tier.handle));\n    this.#applyPendingRewardAdditions();\n  }\n\n  #applyPendingRewardAdditions() {\n    for (const tierHandle of this.#pendingAdditionTiers) {\n      const tier = this.#config.tiers.find((candidate) => candidate.handle === tierHandle);\n      const product = tier?.products?.find((candidate) => candidate.available && candidate.variantId);\n      if (!tier || !product) continue;\n\n      document.querySelectorAll('cart-drawer-component .cart-items__table tbody').forEach((tbody) => {\n        if (!(tbody instanceof HTMLTableSectionElement)) return;\n        const existingRows = Array.from(tbody.querySelectorAll('[data-ch-reward-tier-handle]'));\n        const matchingRows = existingRows.filter(\n          (row) => row.getAttribute('data-ch-reward-tier-handle') === tierHandle\n        );\n        if (matchingRows.some((row) => !row.hasAttribute('data-ch-reward-pending-addition'))) {\n          this.#releasePendingRewardAdditions([tierHandle]);\n          return;\n        }\n        if (matchingRows.length) return;\n\n        const row = document.createElement('tr');\n        row.className = 'cart-items__table-row cart-items__table-row--reward ch-cart-reward-pending-addition';\n        row.setAttribute('role', 'row');\n        row.setAttribute('aria-busy', 'true');\n        row.setAttribute('data-ch-reward-tier-handle', tierHandle);\n        row.setAttribute('data-ch-reward-pending-addition', 'true');\n        const image = product.image\n          ? `<img class=\"cart-items__media-image\" src=\"${escapeHtml(product.image)}\" alt=\"\" width=\"96\" height=\"96\">`\n          : '';\n        const addingLabel = this.#config.messages?.addingGift || this.#config.messages?.updatingGifts || '';\n        row.innerHTML = `\n          <td class=\"cart-items__media\" role=\"cell\"><div class=\"cart-items__media-container\">${image}</div></td>\n          <td class=\"cart-items__details cart-primary-typography\" role=\"cell\"><p class=\"cart-items__title\">${escapeHtml(product.title || tier.title)}</p></td>\n          <td class=\"cart-items__quantity\" role=\"cell\"><span class=\"cart-items__reward-label\">${escapeHtml(addingLabel)}</span></td>\n          <td class=\"cart-items__error hidden\" role=\"cell\"></td>\n          <td class=\"cart-items__price cart-secondary-typography\" role=\"cell\"></td>`;\n        tbody.prepend(row);\n      });\n    }\n  }\n\n  #releasePendingRewardAdditions(handles) {\n    const releasedHandles = new Set(handles);\n    if (!releasedHandles.size) return;\n    releasedHandles.forEach((handle) => this.#pendingAdditionTiers.delete(handle));\n    document.querySelectorAll('[data-ch-reward-pending-addition]').forEach((row) => {\n      if (releasedHandles.has(row.getAttribute('data-ch-reward-tier-handle'))) row.remove();\n    });\n  }\n\n  #restorePendingRewardAdditions() {\n    this.#releasePendingRewardAdditions(this.#pendingAdditionTiers);\n  }\n\n  #applyPendingRewardRemoval() {\n    if (!this.#pendingRemovalTiers.size) return;\n\n    document.querySelectorAll('[data-ch-reward-tier-handle]').forEach((row) => {\n      const tierHandle = row.getAttribute('data-ch-reward-tier-handle');\n      if (!tierHandle || !this.#pendingRemovalTiers.has(tierHandle) || !(row instanceof HTMLElement)) return;\n\n      row.classList.add('ch-cart-reward-pending-removal');\n      row.setAttribute('aria-busy', 'true');\n      const label = row.querySelector('.cart-items__reward-label');\n      if (label instanceof HTMLElement) {\n        label.dataset.chRewardLabel ||= label.textContent || 'Free gift';\n        const removingLabel = this.#config.messages?.removingGift || this.#config.messages?.updatingGifts || '';\n        if (label.textContent !== removingLabel) label.textContent = removingLabel;\n      }\n    });\n\n    document.querySelectorAll('[data-ch-reward-tier]').forEach((tier) => {\n      const tierHandle = tier.getAttribute('data-ch-reward-tier');\n      if (!tierHandle || !this.#pendingRemovalTiers.has(tierHandle)) return;\n      tier.setAttribute('data-pending-removal', 'true');\n    });\n  }\n\n  #schedulePendingRewardRemovalSettlement() {\n    if (this.#pendingRemovalSettlementTimer) {\n      window.clearTimeout(this.#pendingRemovalSettlementTimer);\n    }\n    if (!this.#pendingRemovalTiers.size) return;\n\n    this.#pendingRemovalSettlementTimer = window.setTimeout(() => {\n      this.#pendingRemovalSettlementTimer = undefined;\n      const hasPendingElements = Array.from(\n        document.querySelectorAll('[data-ch-reward-tier-handle], [data-ch-reward-tier]')\n      ).some((element) => {\n        const tierHandle =\n          element.getAttribute('data-ch-reward-tier-handle') || element.getAttribute('data-ch-reward-tier');\n        return Boolean(tierHandle && this.#pendingRemovalTiers.has(tierHandle));\n      });\n\n      if (hasPendingElements) {\n        this.#applyPendingRewardRemoval();\n        return;\n      }\n\n      this.#pendingRemovalTiers.clear();\n    }, 80);\n  }\n\n  #releasePendingRewardRemoval(handles) {\n    const releasedHandles = new Set(handles);\n    if (!releasedHandles.size) return;\n\n    releasedHandles.forEach((handle) => this.#pendingRemovalTiers.delete(handle));\n    document.querySelectorAll('[data-ch-reward-tier-handle], [data-ch-reward-tier]').forEach((element) => {\n      const tierHandle =\n        element.getAttribute('data-ch-reward-tier-handle') || element.getAttribute('data-ch-reward-tier');\n      if (!tierHandle || !releasedHandles.has(tierHandle)) return;\n\n      element.classList.remove('ch-cart-reward-pending-removal');\n      element.removeAttribute('aria-busy');\n      element.removeAttribute('data-pending-removal');\n      const label = element.querySelector('.cart-items__reward-label');\n      if (label instanceof HTMLElement && label.dataset.chRewardLabel) {\n        label.textContent = label.dataset.chRewardLabel;\n        delete label.dataset.chRewardLabel;\n      }\n    });\n\n    if (!this.#pendingRemovalTiers.size && this.#pendingRemovalSettlementTimer) {\n      window.clearTimeout(this.#pendingRemovalSettlementTimer);\n      this.#pendingRemovalSettlementTimer = undefined;\n    }\n  }\n\n  #restorePendingRewardRows() {\n    this.#releasePendingRewardRemoval(this.#pendingRemovalTiers);\n  }\n\n  async #normalizeRewardQuantities() {\n    const invalidLines = this.#rewardLines().filter((line) => Number(line.quantity) !== 1);\n\n    for (const line of invalidLines) {\n      const standardUpdate = beginCartLinesUpdate(this, {\n        action: 'update',\n        context: 'cart',\n        lines: [{ id: line.key, quantity: 1 }],\n        detail: { source: SOURCE, rewardOperation: 'normalize-quantity' },\n      });\n      try {\n        const response = await fetchJson(this.#config.routes?.change || `${ROOT}cart/change.js`, {\n          id: line.key,\n          quantity: 1,\n          sections: getSectionIds().join(','),\n          sections_url: window.location.pathname,\n        });\n        this.#cart = response;\n        this.#rememberSections(response.sections);\n        standardUpdate.resolve(response, { sections: response.sections || {}, itemCount: response.item_count });\n      } catch (error) {\n        standardUpdate.reject(error);\n        throw error;\n      }\n    }\n  }\n\n  #currentDiscountCodes() {\n    return (this.#cart.discount_codes || []).map((discount) => discount.code).filter(Boolean);\n  }\n\n  async #syncRewardCodes({ force = false } = {}) {\n    if (!this.#config.applyTestCodes) return false;\n\n    const configuredCodes = new Set(\n      this.#config.tiers.map((tier) => String(tier.discountCode || '').toLowerCase()).filter(Boolean)\n    );\n    const customerCodes = this.#currentDiscountCodes().filter(\n      (code) => !configuredCodes.has(String(code).toLowerCase())\n    );\n    const rewardCodes = this.#unlockedTiers()\n      .filter((tier) => tier.discountCode && this.#rewardLineFor(tier.handle))\n      .map((tier) => tier.discountCode);\n    const desiredCodes = [...new Set([...customerCodes, ...rewardCodes])];\n    const currentCodes = this.#currentDiscountCodes();\n\n    if (!force &&\n      desiredCodes.length === currentCodes.length &&\n      desiredCodes.every((code) => currentCodes.some((current) => current.toLowerCase() === code.toLowerCase()))\n    ) return false;\n\n    const standardUpdate = beginCartDiscountUpdate(this, desiredCodes, {\n      source: SOURCE,\n      rewardOperation: 'sync-codes',\n    });\n    try {\n      const response = await fetchJson(this.#config.routes?.update || `${ROOT}cart/update.js`, {\n        discount: desiredCodes.join(','),\n        sections: getSectionIds().join(','),\n        sections_url: window.location.pathname,\n      });\n      this.#cart = response;\n      this.#rememberSections(response.sections);\n      standardUpdate.resolve(response, { sections: response.sections || {}, itemCount: response.item_count });\n    } catch (error) {\n      standardUpdate.reject(error);\n      throw error;\n    }\n    return true;\n  }\n\n  #invalidRewardTiers() {\n    const unlockedHandles = new Set(this.#unlockedTiers().map((tier) => tier.handle));\n\n    return this.#config.tiers.filter((tier) => {\n      const line = this.#rewardLineFor(tier.handle);\n      if (!line || !unlockedHandles.has(tier.handle)) return false;\n\n      return Number(line.quantity) !== 1 || Number(line.final_line_price) !== 0;\n    });\n  }\n\n  async #handleFailedRewards(tiers, { operationId = '' } = {}) {\n    const signature = this.#meaningfulCartSignature();\n    const handles = new Set(tiers.map((tier) => tier.handle));\n    const failedLines = this.#rewardLines().filter((line) => handles.has(line.properties?.[TIER_PROPERTY]));\n    const hasCustomerDiscount = this.#currentDiscountCodes().length > 0;\n    const tiersToSuppress = hasCustomerDiscount ? this.#unlockedTiers() : tiers;\n\n    tiersToSuppress.forEach((tier) => this.#failedAutomatic.set(tier.handle, signature));\n    if (failedLines.length) await this.#removeLines(failedLines, false);\n\n    await this.#syncRewardCodes({ force: true });\n    this.#flushSections();\n\n    const message = hasCustomerDiscount\n      ? 'We couldn\u2019t make your gift free, so it was removed and you were not charged.'\n      : 'We couldn\u2019t make your gift free, so it was removed and you were not charged. Please try again.';\n    const handledByCartNotification = this.#emitRewardStatus('error', tiers, operationId, message);\n    if (!handledByCartNotification) {\n      this.#announce(message);\n      this.#showInlineNotice(message);\n    }\n  }\n\n  #showInlineNotice(message) {\n    document.querySelectorAll('[data-ch-cart-reward-notice]').forEach((notice) => {\n      if (!(notice instanceof HTMLElement)) return;\n      const copyElement = notice.querySelector('[data-ch-cart-reward-notice-copy]');\n      if (copyElement) copyElement.textContent = message;\n      notice.hidden = false;\n    });\n  }\n\n  #clearInlineNotice() {\n    document.querySelectorAll('[data-ch-cart-reward-notice]').forEach((notice) => {\n      if (notice instanceof HTMLElement) notice.hidden = true;\n    });\n  }\n\n  #emitRewardStatus(status, tiers, operationId, message = '') {\n    if (!operationId || !tiers.length) return false;\n\n    const translatedStatus = status === 'pending'\n      ? this.#config.messages?.adding\n      : this.#config.messages?.added;\n    const statusMessage = message || (translatedStatus\n      ? tiers.map((tier) => `${tier.title}: ${translatedStatus}`).join(' ')\n      : '');\n    if (!statusMessage) return false;\n\n    const event = new CustomEvent(REWARD_STATUS_EVENT, {\n      cancelable: true,\n      detail: { operationId, status, message: statusMessage },\n    });\n    document.dispatchEvent(event);\n    return event.defaultPrevented;\n  }\n\n  #setProgressPending(isPending) {\n    document.querySelectorAll('ch-cart-rewards-progress').forEach((element) => {\n      element.toggleAttribute('aria-busy', isPending);\n      element.toggleAttribute('data-pending', isPending);\n    });\n\n    document.querySelectorAll('ch-cart-reward-picker').forEach((element) => {\n      element.toggleAttribute('aria-busy', isPending);\n      element.toggleAttribute('data-pending', isPending);\n    });\n\n    document.querySelectorAll('.ch-cart-rewards-sidecar').forEach((element) => {\n      element.toggleAttribute('data-rewards-pending', isPending);\n    });\n\n    this.#setCheckoutPending(isPending);\n\n    if (!isPending) {\n      if (this.#pendingIndicatorTimer) window.clearTimeout(this.#pendingIndicatorTimer);\n      this.#pendingIndicatorTimer = undefined;\n      document.querySelectorAll('ch-cart-rewards-progress').forEach((element) => {\n        element.removeAttribute('data-pending-visible');\n        element.querySelector('.ch-cart-rewards-progress__status')?.setAttribute('aria-hidden', 'true');\n      });\n      return;\n    }\n\n    if (this.#pendingIndicatorTimer || document.querySelector('ch-cart-rewards-progress[data-pending-visible]')) return;\n    this.#pendingIndicatorTimer = window.setTimeout(() => {\n      this.#pendingIndicatorTimer = undefined;\n      document.querySelectorAll('ch-cart-rewards-progress[data-pending]').forEach((element) => {\n        element.setAttribute('data-pending-visible', '');\n        element.querySelector('.ch-cart-rewards-progress__status')?.setAttribute('aria-hidden', 'false');\n      });\n    }, 500);\n  }\n\n  #setCheckoutPending(isPending) {\n    document.querySelectorAll('cart-drawer-component .cart__checkout-button').forEach((button) => {\n      if (!(button instanceof HTMLButtonElement)) return;\n      if (isPending) {\n        if (!button.disabled) button.dataset.chRewardPendingDisabled = 'true';\n        button.disabled = true;\n        return;\n      }\n      if (button.dataset.chRewardPendingDisabled === 'true') button.disabled = false;\n      delete button.dataset.chRewardPendingDisabled;\n    });\n  }\n\n  #finishExternalUpdate() {\n    this.#pendingExternalUpdates = Math.max(0, this.#pendingExternalUpdates - 1);\n    if (this.#pendingExternalUpdates > 0) return;\n\n    this.#hasQuantityPreview = false;\n    if (this.#previewRollbackTimer) {\n      window.clearTimeout(this.#previewRollbackTimer);\n      this.#previewRollbackTimer = undefined;\n    }\n    this.#applyPendingRewardRemoval();\n    this.#schedulePendingRewardRemovalSettlement();\n    this.#setProgressPending(false);\n  }\n\n  #rememberSections(sections) {\n    if (!sections || typeof sections !== 'object') return;\n    this.#pendingSections = { ...this.#pendingSections, ...sections };\n  }\n\n  #flushSections() {\n    if (!Object.keys(this.#pendingSections).length) return;\n    this.#pendingSections = {};\n  }\n\n  #formatMoney(cents) {\n    const currency = this.#cart.currency || this.#config.currency || 'GBP';\n    return new Intl.NumberFormat(undefined, { style: 'currency', currency }).format((Number(cents) || 0) / 100);\n  }\n\n  #formatCompactMoney(cents) {\n    const currency = this.#cart.currency || this.#config.currency || 'GBP';\n    return new Intl.NumberFormat(undefined, {\n      style: 'currency',\n      currency,\n      minimumFractionDigits: 0,\n      maximumFractionDigits: 2,\n    }).format((Number(cents) || 0) / 100);\n  }\n\n  #progressFill(subtotal) {\n    const tiers = this.#config.tiers;\n    if (!tiers.length || subtotal <= 0) return 0;\n\n    const tierCount = tiers.length;\n    let previousThreshold = 0;\n    let previousPosition = 0;\n\n    for (const [index, tier] of tiers.entries()) {\n      const threshold = Number(tier.threshold);\n      const markerPosition = tierCount === 1 ? 100 : ((index + 0.5) / tierCount) * 100;\n\n      if (subtotal < threshold) {\n        const segmentProgress = (subtotal - previousThreshold) / Math.max(threshold - previousThreshold, 1);\n        return previousPosition + Math.max(0, Math.min(segmentProgress, 1)) * (markerPosition - previousPosition);\n      }\n\n      previousThreshold = threshold;\n      previousPosition = markerPosition;\n    }\n\n    return previousPosition;\n  }\n\n  #syncSidecars() {\n    document.querySelectorAll('.ch-cart-rewards-sidecar').forEach((sidecar) => {\n      if (!(sidecar instanceof HTMLElement)) return;\n\n      const picker = sidecar.querySelector('ch-cart-reward-picker[data-context=\"drawer-desktop\"]');\n      const hasRewardChoices = picker instanceof HTMLElement && !picker.hidden;\n      const hasUpsells = Boolean(\n        sidecar.querySelector('.ch-cart-upsell-card:not([data-quantity-active=\"true\"])')\n      );\n\n      sidecar.dataset.mode = hasRewardChoices ? 'rewards' : 'upsells';\n      sidecar.hidden = !hasRewardChoices && !hasUpsells;\n    });\n  }\n\n  #render({ progressOnly = false } = {}) {\n    if (!this.#config.eligible) return;\n\n    const subtotal = this.#eligibleSubtotal();\n    const unlocked = this.#unlockedTiers();\n    this.#applyPendingRewardAdditions();\n    const unlockedHandles = new Set(unlocked.map((tier) => tier.handle));\n    this.#releasePendingRewardAdditions(\n      [...this.#pendingAdditionTiers].filter((handle) => !unlockedHandles.has(handle))\n    );\n    this.#releasePendingRewardRemoval(unlocked.map((tier) => tier.handle));\n    const maxThreshold = Number(this.#config.tiers.at(-1)?.threshold || 1);\n    const fill = this.#progressFill(subtotal);\n    const nextTier = this.#config.tiers.find((tier) => subtotal < Number(tier.threshold));\n    const progressLabel = nextTier\n      ? `${this.#formatMoney(Number(nextTier.threshold) - subtotal)} to unlock ${nextTier.title}`\n      : 'Every available cart gift is unlocked';\n\n    const tierMarkup = this.#config.tiers\n      .map((tier) => this.#tierMarker(tier, unlocked, nextTier, subtotal))\n      .join('');\n    const updatingMessage = this.#config.messages?.updatingGifts || this.#config.messages?.adding || '';\n\n    document.querySelectorAll('ch-cart-rewards-progress').forEach((element) => {\n      const track = element.querySelector('.ch-cart-rewards-progress__track');\n      const canUpdate = track?.dataset.tierCount === String(this.#config.tiers.length);\n\n      if (!canUpdate) {\n        element.innerHTML = `\n          <div class=\"ch-cart-rewards-progress__track\" data-tier-count=\"${this.#config.tiers.length}\" style=\"--ch-reward-tier-count:${this.#config.tiers.length}\" role=\"progressbar\" aria-label=\"${escapeHtml(progressLabel)}\" aria-valuemin=\"0\" aria-valuemax=\"${maxThreshold}\" aria-valuenow=\"${Math.min(subtotal, maxThreshold)}\">\n            <span class=\"ch-cart-rewards-progress__fill\" style=\"--ch-reward-fill:${fill}%\"></span>\n            <ol class=\"ch-cart-rewards-progress__tiers\">${tierMarkup}</ol>\n          </div>\n          <p class=\"ch-cart-rewards-progress__status\" role=\"status\" aria-live=\"polite\" aria-hidden=\"true\">\n            <span class=\"ch-cart-rewards-progress__spinner\" aria-hidden=\"true\"></span>\n            <span>${escapeHtml(updatingMessage)}</span>\n          </p>`;\n        return;\n      }\n\n      track.setAttribute('aria-label', progressLabel);\n      track.setAttribute('aria-valuemax', String(maxThreshold));\n      track.setAttribute('aria-valuenow', String(Math.min(subtotal, maxThreshold)));\n      track.style.setProperty('--ch-reward-tier-count', String(this.#config.tiers.length));\n      track.querySelector('.ch-cart-rewards-progress__fill')?.style.setProperty('--ch-reward-fill', `${fill}%`);\n      const tiers = track.querySelector('.ch-cart-rewards-progress__tiers');\n      if (tiers) tiers.innerHTML = tierMarkup;\n    });\n\n    document.querySelectorAll('ch-cart-reward-placeholders').forEach((element) => {\n      const markup = this.#missingChoices().map((tier) => `<article class=\"ch-cart-unclaimed-gift\">\n        <div class=\"ch-cart-unclaimed-gift__image\">${tier.icon ? `<img src=\"${escapeHtml(tier.icon)}\" width=\"80\" height=\"80\" alt=\"\">` : '<span aria-hidden=\"true\">!</span>'}</div>\n        <div><p class=\"ch-cart-unclaimed-gift__title\">${escapeHtml(tier.title)}</p><p>${escapeHtml(this.#config.messages.unclaimed)}</p></div>\n        <div class=\"ch-cart-unclaimed-gift__action\"><button type=\"button\" class=\"button\" data-ch-reward-open>${escapeHtml(this.#config.messages.choose)}</button></div>\n      </article>`).join('');\n      if (element.innerHTML !== markup) element.innerHTML = markup;\n    });\n\n    const isPending = this.#hasQuantityPreview || this.#pendingExternalUpdates > 0;\n    this.#setProgressPending(isPending);\n    if (progressOnly) return;\n\n    document.querySelectorAll('ch-cart-reward-picker').forEach((element) => {\n      const context = element.dataset.context;\n      element.innerHTML = this.#pickerMarkup(['notification', 'drawer-desktop'].includes(context) ? this.#changingTier : undefined, context);\n      element.toggleAttribute('hidden', !element.querySelector('[data-ch-reward-tier]'));\n    });\n\n    document.querySelectorAll('ch-cart-reward-product-card').forEach((element) => {\n      const markup =\n        element.dataset.firstThresholdProductPrompt === 'true'\n          ? this.#firstThresholdProductCardMarkup(element, subtotal)\n          : this.#productCardMarkup(nextTier);\n      element.innerHTML = markup;\n      element.toggleAttribute('hidden', !markup);\n\n      const thresholdSlide = element.closest('[data-ch-first-threshold-slide]');\n      if (thresholdSlide instanceof HTMLElement) {\n        const becameVisible = thresholdSlide.hidden && Boolean(markup);\n        thresholdSlide.toggleAttribute('hidden', !markup);\n\n        if (becameVisible) {\n          requestAnimationFrame(() => {\n            const scroller = thresholdSlide.closest('slideshow-slides');\n            if (!(scroller instanceof HTMLElement) || scroller.scrollLeft <= 1) return;\n            scroller.scrollTo({ left: 0, behavior: 'smooth' });\n          });\n        }\n      }\n    });\n\n    this.#syncSidecars();\n    this.#applyPendingRewardRemoval();\n    this.#schedulePendingRewardRemovalSettlement();\n    requestAnimationFrame(() => this.#syncSidecars());\n  }\n\n  #tierMarker(tier, unlocked, nextTier, subtotal) {\n    const isUnlocked = unlocked.some((candidate) => candidate.handle === tier.handle);\n    const isNext = nextTier?.handle === tier.handle;\n    const isClaimed = Boolean(this.#rewardLineFor(tier.handle));\n    const needsChoice = isUnlocked && !isClaimed && !tier.autoAdd;\n    const icon = tier.icon\n      ? `<img src=\"${escapeHtml(tier.icon)}\" alt=\"\" width=\"32\" height=\"32\" style=\"width:32px;height:32px;object-fit:contain\" loading=\"lazy\">`\n      : '<span class=\"ch-cart-rewards-progress__fallback-icon\" aria-hidden=\"true\">\u2605</span>';\n    const detail = isNext\n      ? `${this.#formatMoney(Number(tier.threshold) - subtotal)} away`\n      : this.#formatMoney(tier.threshold);\n\n    return `<li class=\"ch-cart-rewards-progress__tier\" data-unlocked=\"${isUnlocked}\" data-next=\"${isNext}\" data-needs-choice=\"${needsChoice}\">\n      <span class=\"ch-cart-rewards-progress__icon\">${isClaimed ? tickMarkup() : needsChoice ? `<button type=\"button\" class=\"button-unstyled ch-cart-reward-attention\" data-ch-reward-open aria-label=\"${escapeHtml(this.#config.messages.unclaimed)}\">${issueMarkup()}</button>` : icon}</span>\n      <span class=\"ch-cart-rewards-progress__tier-title\">${escapeHtml(needsChoice ? `${this.#config.messages.choose} ${tier.title}` : tier.title)}</span>\n      <span class=\"ch-cart-rewards-progress__threshold\">${escapeHtml(needsChoice ? this.#config.messages.freeGift : detail)}</span>\n    </li>`;\n  }\n\n  #pickerMarkup(changeTier, context) {\n    return this.#unlockedTiers()\n      .filter(\n        (tier) =>\n          !tier.autoAdd &&\n          !this.#failedAutomatic.has(tier.handle) &&\n          (changeTier ? tier.handle === changeTier : !this.#rewardLineFor(tier.handle))\n      )\n      .map((tier) => {\n        const products = tier.products.filter((product) => product.available && product.variantId);\n        if (!products.length) return '';\n\n        return `<section class=\"ch-cart-reward-picker__tier\" data-ch-reward-tier=\"${escapeHtml(tier.handle)}\">\n          ${changeTier ? context === 'notification' ? '' : `<div class=\"ch-cart-reward-picker__header\"><h3 class=\"ch-cart-reward-picker__title\">${escapeHtml(this.#config.messages.changeGift)}</h3><button type=\"button\" class=\"button-unstyled ch-cart-reward-picker__close\" data-ch-reward-close aria-label=\"${escapeHtml(this.#config.messages.close)}\">${document.querySelector('.ch-cart-reward-notification__close')?.innerHTML || '\u00D7'}</button></div>` : `<h3 class=\"ch-cart-reward-picker__title\">Choose your ${escapeHtml(tier.title)}</h3>`}\n          <div class=\"ch-cart-reward-picker__products\">\n            ${products.map((product) => this.#productChoiceMarkup(tier, product)).join('')}\n          </div>\n        </section>`;\n      })\n      .join('');\n  }\n\n  #productChoiceMarkup(tier, product) {\n    const image = product.image\n      ? `<img src=\"${escapeHtml(product.image)}\" alt=\"\" width=\"72\" height=\"72\" style=\"width:100%;height:100%;object-fit:contain\" loading=\"lazy\">`\n      : '';\n    const isCurrent = String(this.#rewardLineFor(tier.handle)?.variant_id) === String(product.variantId);\n    const disabled = isCurrent || this.#config.applyTestCodes && !tier.discountCode;\n\n    return `<article class=\"ch-cart-reward-choice\">\n      <div class=\"ch-cart-reward-choice__media\">${image}</div>\n      <div class=\"ch-cart-reward-choice__body\">\n        <p class=\"ch-cart-reward-choice__title\">${escapeHtml(product.title)}</p>\n        <p class=\"ch-cart-reward-choice__price\">Free</p>\n      </div>\n      <button class=\"button ch-cart-reward-choice__button\" type=\"button\" data-ch-reward-choose data-tier-handle=\"${escapeHtml(tier.handle)}\" data-variant-id=\"${escapeHtml(product.variantId)}\" ${disabled ? 'disabled' : ''}>\n        ${isCurrent ? escapeHtml(this.#config.messages.selectedGift) : disabled ? 'Discount setup needed' : 'Choose'}\n      </button>\n    </article>`;\n  }\n\n  #productCardMarkup(nextTier) {\n    const missingChoice = this.#unlockedTiers().find(\n      (tier) =>\n        !tier.autoAdd &&\n        !this.#failedAutomatic.has(tier.handle) &&\n        !this.#rewardLineFor(tier.handle)\n    );\n    const tier = missingChoice || nextTier || this.#config.tiers.at(-1);\n    if (!tier) return '';\n\n    const image = tier.icon\n      ? `<img src=\"${escapeHtml(tier.icon)}\" alt=\"\" width=\"72\" height=\"72\" style=\"width:72px;height:72px;object-fit:contain\" loading=\"lazy\">`\n      : '<span aria-hidden=\"true\">\u2605</span>';\n    const copy = missingChoice\n      ? `${tier.title} is unlocked`\n      : nextTier\n        ? `${this.#formatMoney(Number(tier.threshold) - this.#eligibleSubtotal())} away`\n        : `${tier.title} unlocked`;\n\n    return `<article class=\"ch-cart-reward-product-card\">\n      <div class=\"ch-cart-reward-product-card__media\">${image}</div>\n      <div class=\"ch-cart-reward-product-card__body\">\n        <p class=\"ch-cart-reward-product-card__label\">Cart gift</p>\n        <p class=\"ch-cart-reward-product-card__title\">${escapeHtml(tier.title)}</p>\n        <p class=\"ch-cart-reward-product-card__copy\">${escapeHtml(copy)}</p>\n      </div>\n      ${missingChoice ? '<button class=\"button ch-cart-reward-product-card__button\" type=\"button\" data-ch-reward-open>Choose</button>' : `<span class=\"ch-cart-reward-product-card__check\" aria-hidden=\"true\">${tickMarkup()}</span>`}\n    </article>`;\n  }\n\n  #firstThresholdProductCardMarkup(element, subtotal) {\n    const firstTier = this.#config.tiers[0];\n    if (!firstTier) return '';\n\n    const threshold = Number(firstTier.threshold) || 0;\n    const productPrice = Number(element.dataset.productPrice) || 0;\n    const productAvailable = element.dataset.productAvailable === 'true';\n    if (!productAvailable || productPrice <= 0 || threshold <= 0) return '';\n\n    const giftProduct = (firstTier.products || []).find((product) => product.available && product.variantId);\n    if (!giftProduct) return '';\n\n    const giftInCart = Boolean(this.#rewardLineFor(firstTier.handle)) || (this.#cart.items || []).some(\n      (item) => String(item.variant_id) === String(giftProduct.variantId)\n    );\n    if (giftInCart) return '';\n\n    const image = giftProduct.image\n      ? `<img src=\"${escapeHtml(giftProduct.image)}\" alt=\"\" width=\"144\" height=\"144\" style=\"width:144px;height:144px;object-fit:contain\" loading=\"lazy\">`\n      : firstTier.icon\n        ? `<img src=\"${escapeHtml(firstTier.icon)}\" alt=\"\" width=\"72\" height=\"72\" style=\"width:72px;height:72px;object-fit:contain\" loading=\"lazy\">`\n        : '<span aria-hidden=\"true\">\u2605</span>';\n    const giftTitle = giftProduct.title || firstTier.title;\n    const giftUrl = giftProduct.url || '#';\n\n    if (element.dataset.addOnRewardCard === 'true') {\n      const projectedSubtotal = subtotal + productPrice;\n      const isUnlocked = projectedSubtotal >= threshold;\n      const amountRemaining = this.#formatCompactMoney(Math.max(threshold - projectedSubtotal, 0));\n      const rewardKicker = element.dataset.freeGiftLabel || 'Free gift';\n      const freePriceLabel = element.dataset.freePriceLabel || 'Free';\n      const awayTemplate = element.dataset.freeGiftAwayTemplate || '__amount__ away';\n      const rewardStatus = isUnlocked\n        ? element.dataset.freeGiftUnlocked || 'Unlocked'\n        : awayTemplate.replace('__amount__', amountRemaining);\n      const rewardTitle = `${rewardKicker} \u00B7 ${giftTitle}`;\n      return `<article class=\"ch-product-upsell-card ch-product-upsell-card--reward\" data-kind=\"reward-preview\" data-first-threshold-preview=\"true\">\n        <div class=\"ch-product-upsell-card__media-wrap\">\n          <a class=\"ch-product-upsell-card__media\" href=\"${escapeHtml(giftUrl)}\" tabindex=\"-1\" aria-hidden=\"true\">${image}</a>\n          <span class=\"ch-product-upsell-card__reward-label\" aria-label=\"${escapeHtml(`${rewardKicker}: ${rewardStatus}`)}\">${escapeHtml(rewardStatus)}</span>\n        </div>\n        <div class=\"ch-product-upsell-card__body\">\n          <a class=\"ch-product-upsell-card__title\" href=\"${escapeHtml(giftUrl)}\">${escapeHtml(rewardTitle)}</a>\n          <div class=\"ch-product-upsell-card__price\">${escapeHtml(freePriceLabel)}</div>\n        </div>\n      </article>`;\n    }\n\n    if (subtotal >= threshold || subtotal + productPrice < threshold) return '';\n\n    return `<article class=\"ch-product-upsell-card\" data-kind=\"reward-preview\" data-selected=\"true\" data-first-threshold-preview=\"true\">\n      <div class=\"ch-product-upsell-card__media-wrap\">\n        <a class=\"ch-product-upsell-card__media\" href=\"${escapeHtml(giftUrl)}\" tabindex=\"-1\" aria-hidden=\"true\">${image}</a>\n        <span class=\"ch-product-upsell-card__toggle ch-product-upsell-card__reward-tick\" aria-hidden=\"true\">${tickMarkup()}</span>\n      </div>\n      <div class=\"ch-product-upsell-card__body\">\n        <a class=\"ch-product-upsell-card__title\" href=\"${escapeHtml(giftUrl)}\">${escapeHtml(giftTitle)}</a>\n        <div class=\"ch-product-upsell-card__price\">Free</div>\n      </div>\n    </article>`;\n  }\n\n  #openGiftPicker(tierHandle) {\n    const picker = document.querySelector('dialog[open] ch-cart-reward-picker[data-context=\"drawer-desktop\"]');\n    if (window.matchMedia('(min-width: 750px)').matches && picker) {\n      this.#changingTier = tierHandle;\n      this.#render();\n      picker.closest('.ch-cart-rewards-sidecar')?.scrollTo({ top: 0 });\n      picker.scrollTo({ top: 0 });\n      picker.querySelector('button:not([disabled])')?.focus({ preventScroll: true });\n      return;\n    }\n    this.#openNotification(tierHandle ? { title: this.#config.messages.changeGift, tierHandle } : {});\n  }\n\n  #openNotification({ title = 'You unlocked a gift', copy = '', checkout = false, tierHandle } = {}) {\n    const notification = document.querySelector('.ch-cart-reward-notification');\n    if (!(notification instanceof HTMLElement)) return;\n    this.#changingTier = tierHandle;\n    this.#render();\n    const titleElement = notification.querySelector('[data-ch-reward-notification-title]');\n    const copyElement = notification.querySelector('[data-ch-reward-notification-copy]');\n    if (titleElement) titleElement.textContent = title;\n    if (copyElement) {\n      copyElement.textContent = copy;\n      copyElement.hidden = !copy;\n    }\n    notification.querySelector('[data-ch-reward-continue]').hidden = !checkout;\n    notification.hidden = false;\n    if (notification instanceof HTMLDialogElement && !notification.open) notification.showModal();\n    requestAnimationFrame(() => notification.setAttribute('open', ''));\n    notification.querySelector('[data-ch-reward-close]')?.focus();\n  }\n\n  #closeNotification() {\n    this.#changingTier = undefined;\n    this.#render();\n    const notification = document.querySelector('.ch-cart-reward-notification');\n    if (!(notification instanceof HTMLElement)) return;\n    if (notification instanceof HTMLDialogElement) notification.close();\n    notification.removeAttribute('open');\n    window.setTimeout(() => {\n      if (!notification.hasAttribute('open')) notification.hidden = true;\n    }, 340);\n  }\n\n  #announce(message) {\n    const liveRegion = document.querySelector('[data-ch-reward-live]');\n    if (liveRegion) liveRegion.textContent = message;\n  }\n\n  #readDeclined() {\n    try {\n      const value = JSON.parse(sessionStorage.getItem('ch-cart-rewards-declined') || '[]');\n      this.#declined = new Set(Array.isArray(value) ? value : []);\n    } catch (_) {\n      this.#declined = new Set();\n    }\n  }\n\n  #writeDeclined() {\n    if (!(this.#cart.items || []).length) this.#declined.clear();\n    sessionStorage.setItem('ch-cart-rewards-declined', JSON.stringify([...this.#declined]));\n  }\n\n  #readAnnounced() {\n    try {\n      const value = JSON.parse(sessionStorage.getItem('ch-cart-rewards-announced') || '[]');\n      this.#announced = new Set(Array.isArray(value) ? value : []);\n    } catch (_) {\n      this.#announced = new Set();\n    }\n  }\n\n  #writeAnnounced() {\n    sessionStorage.setItem('ch-cart-rewards-announced', JSON.stringify([...this.#announced]));\n  }\n}\n\nif (!customElements.get('ch-cart-rewards-controller')) {\n  customElements.define('ch-cart-rewards-controller', CHCartRewardsController);\n}\n"],
  "mappings": "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",
  "names": ["signal", "row", "tier"]
}
