{
  "version": 3,
  "sources": ["/cdn/shop/t/142/assets/aw-cart-sync.js?r=20260717b"],
  "sourcesContent": ["/* aw-cart-sync.js - VARIANT C FORK (2026-07-18, live-test rule 4)\n * Identical to theme B's aw-cart-sync.js except syncOffer(), which now\n * REPLACES the cart's discount-code set via the cart API instead of\n * appending via /discount/{code}. Appending let Shopify keep whichever\n * attached code paid the customer most (home77 -$77 beat family33 -$74.91\n * on 6 jug carts - Brian's 2026-07-18 report + Round 1 finding 6).\n * POST-TEST BACK-PORT CANDIDATE for B: never back-deploy mid-Round-1.\n *\n * Cart-side guardian for the water delivery flow. Three jobs:\n *  1. Keep the refundable bottle deposit quantity locked 1:1 to the water bottle\n *     quantity on ANY cart change. The change listener catches the drawer's\n *     quantity selects; a debounced MutationObserver on [data-products] catches\n *     everything else (remove links, +/- steppers, the theme's own re-renders).\n *     Corrections require a confirmed double-read: the legacy theme's own qty\n *     sequence writes deposits FIRST and water SECOND, so single snapshots lie.\n *  2. Own the drawer's \"Renews at\" line: published-curve math, shown only while\n *     a subscription line is in the cart. Never the legacy theme.js math\n *     ($24/bottle - the $48/$96/$144 quotes).\n *  3. Keep the auto-applied first-order discount code matched to the cart\n *     composition after cart edits (see syncOffer below).\n *\n * Re-renders go through the theme's own cart:build event so theme.js rebinds its\n * listeners; we never replace [data-products] innerHTML ourselves.\n * Deploy note: Rollouts serving contexts refresh asset digests only on a REAL\n * content change while the experiment is running (identical upserts dedupe;\n * events fired while paused are missed) - hence this line, 2026-07-17.\n */\nconst DEPOSIT_VARIANT_ID = 50052669866266; // One-Time Refundable Deposit (see theme-launch-admin-checklist.md)\nconst WATER_HANDLE = 'spring-water-delivery';\nconst DEPOSIT_HANDLES = ['refundable-jug-deposit', 'one-time-refundable-deposit'];\nconst DISPENSER_PRODUCT_ID = 8076964419; // 2.5 Gallon Dispenser\n\nlet timer = null;\nlet busy = false;\nlet dirtyWhileBusy = false; // mutations that land during a pass queue one follow-up\nlet settleChecked = false; // one bounded follow-up pass per trigger burst\n\n/* Circuit breaker: this module should write to the cart a handful of times per\n * interaction at most. If some interplay with the legacy theme ever loops\n * (write -> re-render -> write), stop writing entirely for the rest of the\n * page view instead of fighting. Checkout enforcement still owns correctness. */\nlet writeStamps = [];\nlet tripped = false;\nfunction breakerOk() {\n  if (tripped) return false;\n  const now = Date.now();\n  writeStamps = writeStamps.filter((t) => now - t < 60000);\n  if (writeStamps.length >= 10) {\n    tripped = true;\n    try { console.warn('[aw-cart-sync] write breaker tripped; standing down for this page view'); } catch (_) {}\n    return false;\n  }\n  writeStamps.push(now);\n  return true;\n}\n\n/* One customer-facing money format (\"$104\" / \"$23.50\"): flush dollar sign, two\n * decimals only when there are cents, no USD suffix. Mirrors aw-money.liquid and\n * usd() in aw-order-widget.js; keep the three in sync. (The Subtotal row is\n * deliberately NOT ours: legacy theme.js rewrites it in the shop money format.) */\nfunction usd(cents) {\n  const n = cents / 100;\n  const digits = n % 1 === 0 ? 0 : 2;\n  return '$' + n.toLocaleString('en-US', { minimumFractionDigits: digits, maximumFractionDigits: 2 });\n}\n\nfunction schedule(delay) {\n  clearTimeout(timer);\n  timer = setTimeout(reconcile, delay);\n}\n\ndocument.addEventListener('change', (e) => {\n  if (!e.target.classList || !e.target.classList.contains('water-delivery-cart-select-quantity')) return;\n  settleChecked = false;\n  schedule(1100); // let the theme's own update land first\n});\n\nconst observed = new WeakSet();\nfunction observeProducts() {\n  document.querySelectorAll('[data-products]').forEach((el) => {\n    if (observed.has(el)) return;\n    observed.add(el);\n    new MutationObserver(() => {\n      if (busy) { dirtyWhileBusy = true; return; } // coalesce; drained in reconcile's finally\n      settleChecked = false;\n      schedule(600);\n    }).observe(el, { childList: true, subtree: true });\n  });\n}\n\nasync function reconcile() {\n  if (busy) return;\n  busy = true;\n  try {\n    const cart = await fetch('/cart.js').then((r) => r.json());\n    updateRenewal(cart);\n\n    let waterQty = 0;\n    let hasDispenser = false;\n    const depositLines = [];\n    for (const item of cart.items) {\n      if (item.handle === WATER_HANDLE) waterQty += item.quantity;\n      else if (DEPOSIT_HANDLES.some((h) => item.handle.indexOf(h) === 0)) depositLines.push(item);\n      if (item.product_id === DISPENSER_PRODUCT_ID) hasDispenser = true;\n    }\n    syncOffer(cart, waterQty, hasDispenser);\n    const primary = depositLines.find((l) => l.variant_id === DEPOSIT_VARIANT_ID) || depositLines[0] || null;\n\n    /* Never correct deposits off a single snapshot. The legacy theme's own\n     * quantity sequence edits the DEPOSIT line first and the WATER line second\n     * (~1-3s apart), so a mid-sequence read (old water, new deposits) looks\n     * like a mismatch that is about to resolve itself - and a write here\n     * re-asserts the stale quantity (observed live 2026-07-17: downward edits\n     * ended water 4 / deposits 6). Rule: re-read after 1200ms and write only\n     * if the water quantity is UNCHANGED across both reads; if water moved,\n     * the theme is mid-sequence - stand down and let the settle pass judge\n     * the final state. */\n    let changed = false;\n    const mismatched = depositLines.some((l) => l.quantity !== (l === primary ? waterQty : 0));\n    if (mismatched) {\n      await new Promise((r) => setTimeout(r, 1200));\n      const confirm = await fetch('/cart.js').then((r) => r.json());\n      let cWaterQty = 0;\n      const cDepositLines = [];\n      for (const item of confirm.items) {\n        if (item.handle === WATER_HANDLE) cWaterQty += item.quantity;\n        else if (DEPOSIT_HANDLES.some((h) => item.handle.indexOf(h) === 0)) cDepositLines.push(item);\n      }\n      if (cWaterQty === waterQty) {\n        const cPrimary = cDepositLines.find((l) => l.variant_id === DEPOSIT_VARIANT_ID) || cDepositLines[0] || null;\n        for (const line of cDepositLines) {\n          const want = line === cPrimary ? cWaterQty : 0; // one deposit line, matched to jugs\n          if (line.quantity !== want && breakerOk()) {\n            await change(line.key, want);\n            changed = true;\n          }\n        }\n      } else {\n        settleChecked = false; // water moved between reads: theme mid-sequence\n      }\n    }\n    if (!primary && waterQty > 0) {\n      // \"Water present, deposits absent\" is also the transient middle of the\n      // theme's own remove-water sequence (it zeroes the deposit line first).\n      // Confirm with a second read before adding, so we never re-add deposits\n      // into a cart that is about to lose its water line.\n      await new Promise((r) => setTimeout(r, 1200));\n      const confirmCart = await fetch('/cart.js').then((r) => r.json());\n      let cWater = 0;\n      let cDeposit = 0;\n      for (const item of confirmCart.items) {\n        if (item.handle === WATER_HANDLE) cWater += item.quantity;\n        else if (DEPOSIT_HANDLES.some((h) => item.handle.indexOf(h) === 0)) cDeposit += item.quantity;\n      }\n      if (cWater > 0 && cDeposit === 0 && breakerOk()) {\n        await fetch('/cart/add.js', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ items: [{ id: DEPOSIT_VARIANT_ID, quantity: cWater }] }),\n        });\n        changed = true;\n      }\n    }\n\n    if (changed) {\n      // The theme rebuilds its own markup (and rebinds listeners); the rebuild\n      // mutates [data-products], which re-runs this reconcile as a final check.\n      document.dispatchEvent(new CustomEvent('cart:build'));\n      const fresh = await fetch('/cart.js').then((r) => r.json());\n      updateRenewal(fresh);\n    } else if (!settleChecked) {\n      // The theme's own deposit adjustment can land AFTER the last drawer\n      // re-render (no DOM signal). One delayed verification pass per burst\n      // catches that late write; a second clean pass ends the burst.\n      settleChecked = true;\n      schedule(2500);\n    }\n  } catch (_) {\n    /* non-blocking; checkout enforcement still owns correctness */\n  } finally {\n    busy = false;\n    if (dirtyWhileBusy) {\n      dirtyWhileBusy = false;\n      settleChecked = false;\n      schedule(600); // re-renders that landed mid-pass get their own pass\n    }\n    gateButtons();\n  }\n}\n\n/* Checkout-button gate. The legacy theme ships TWO competing checkDepositAgree\n * implementations: a global one that only reads the DRAWER terms box\n * (#CartTermsDrawer) but fires on every .checkAgreeJS change, and a CartForm one\n * that only reads #DepositAgree but runs only on cart re-renders. Net effect on\n * the /cart page: checking the deposit box DISABLES the button (the global\n * handler consults the hidden drawer's unchecked terms box) until a quantity\n * change forces a re-render (observed live 2026-07-17, arm B day-1 smoke).\n * One rule instead, evaluated per surface and always LAST (microtask after the\n * legacy handlers): a checkout button is enabled iff every agreement checkbox\n * rendered in ITS OWN surface (drawer vs page form) is checked; no checkboxes\n * rendered means nothing to agree to. */\nfunction gateButtons() {\n  document.querySelectorAll('button.cart__checkout').forEach((btn) => {\n    const scope = btn.closest('#CartDrawer') || btn.closest('form') || document;\n    const boxes = Array.from(new Set(scope.querySelectorAll('input.cart__terms-checkbox, input.checkAgreeJS')));\n    const ok = boxes.every((b) => b.checked);\n    btn.disabled = !ok;\n    btn.classList.toggle('cart-checkout-button-disabled', !ok);\n  });\n}\n\ndocument.addEventListener('change', (e) => {\n  const t = e.target;\n  if (!t || !t.matches || !t.matches('input.cart__terms-checkbox, input.checkAgreeJS')) return;\n  setTimeout(gateButtons, 0); // after the legacy handlers, so this state wins\n});\n\nfunction change(key, quantity) {\n  return fetch('/cart/change.js', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({ id: key, quantity }),\n  });\n}\n\n/* Keep the auto-applied first-order discount matched to the cart when\n * quantities change after add to cart. offerCode() mirrors aw-order-widget.js\n * (codes starter22 / home77 / family33; jugs + dispenser count toward the\n * minimums, deposits and shelf never do) - keep the two in sync. Only runs\n * when the widget armed an offer (aw_offer_code in localStorage), so carts\n * built outside the offer flow are never touched. */\nfunction offerCode(waterQty, hasDispenser) {\n  const eligible = waterQty + (hasDispenser ? 1 : 0);\n  if (waterQty < 1) return null;\n  if (waterQty <= 3) return eligible >= 3 ? 'starter22' : null;\n  if (waterQty <= 5) return hasDispenser && eligible >= 5 ? 'home77' : null;\n  return eligible >= 7 ? 'family33' : null;\n}\n\nfunction syncOffer(cart, waterQty, hasDispenser) {\n  // Only touch carts the widget armed, same opt-in as B.\n  let armed = null;\n  try { armed = localStorage.getItem('aw_offer_code'); } catch (_) { return; }\n  if (!armed) return;\n  const want = offerCode(waterQty, hasDispenser) || 'none';\n  // C fork: the CART's attached codes are the truth (localStorage lied once:\n  // a failed write left it claiming the swap already happened, so every later\n  // pass stood down). Compare against cart.discount_codes and re-assert until\n  // the cart actually matches; update localStorage only after a 2xx.\n  const attached = (cart.discount_codes || []).map((d) => String(d.code || '').toLowerCase());\n  const matches = want === 'none' ? attached.length === 0 : (attached.length === 1 && attached[0] === want);\n  if (matches) {\n    try { localStorage.setItem('aw_offer_code', want); } catch (_) {}\n    return;\n  }\n  fetch('/cart/update.js', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({ discount: want === 'none' ? '' : want }),\n  }).then((r) => {\n    if (r.ok) { try { localStorage.setItem('aw_offer_code', want); } catch (_) {} }\n  }).catch(() => {});\n}\n\n/* Renewal line: always the published curve for CA/FL/TX water, on the 4 bottle\n * minimum (trial sizes 1 to 3 continue on the 4 bottle plan). Other regions bill\n * their flat variant price until their curves are published. */\nconst CURVE = { 4: 2600, 6: 2500, 8: 2400, 10: 2350, 12: 2300 };\nfunction curvePer(qty) {\n  if (CURVE[qty]) return CURVE[qty];\n  if (qty > 12) return 2300;\n  return 2600;\n}\n\nfunction updateRenewal(cart) {\n  let total = 0;\n  let planName = '';\n  for (const item of cart.items) {\n    if (!item.selling_plan_allocation) continue;\n    if (item.handle === WATER_HANDLE) {\n      const eff = Math.max(item.quantity, 4);\n      const onCurve = (item.variant_title || '').indexOf('CA/FL/TX') > -1;\n      const per = onCurve ? curvePer(eff) : item.selling_plan_allocation.price;\n      total += per * eff;\n    } else {\n      total += item.selling_plan_allocation.price * item.quantity;\n    }\n    planName = item.selling_plan_allocation.selling_plan.name || planName;\n  }\n  const show = total > 0;\n  if (show) {\n    const text = usd(total) + ' ' + planName.replace(/^Deliver every/i, 'every').toLowerCase();\n    document.querySelectorAll('[data-aw-recurring]').forEach((el) => { el.textContent = text; });\n  }\n  document.querySelectorAll('[data-aw-recurring-wrap], [data-aw-recurring-note]').forEach((el) => { el.hidden = !show; });\n}\n\nfunction boot() {\n  observeProducts();\n  gateButtons();\n  fetch('/cart.js').then((r) => r.json()).then(updateRenewal).catch(() => {});\n  // Heal any pre-existing deposit mismatch on load - a cart left wrong by an\n  // interrupted edit sequence must not survive a page view. Each page view is\n  // a fresh breaker budget; reconcile no-ops on clean carts.\n  settleChecked = false;\n  schedule(1500);\n}\nif (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);\nelse boot();\n"],
  "mappings": "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",
  "names": []
}
