{
  "version": 3,
  "sources": ["/cdn/shop/t/58/assets/dco-order.js?dco_v=20261009-thresholds-158"],
  "sourcesContent": ["(function () {\n  const root = document.querySelector(\"[data-dco-order]\");\n  if (!root) return;\n\n  document.body.classList.add(\"dco-order-active\");\n  document.documentElement.classList.add(\"dco-order-html-active\");\n\n  // On iOS (every browser there is WebKit), position:fixed anchors to the large\n  // layout viewport while the visible area shrinks to the dynamic viewport as the\n  // Safari toolbar collapses \u2014 which can push the drawer's Checkout button off the\n  // bottom of the screen. Tag the document so the drawer can correct for that gap\n  // only on the platform that has it, leaving bottom:0 untouched everywhere else.\n  // iPadOS 13+ reports navigator.platform as \"MacIntel\", so include a touch check.\n  const isIOS =\n    /iP(hone|od|ad)/.test(navigator.platform) ||\n    /iPhone|iPad|iPod/.test(navigator.userAgent) ||\n    (navigator.platform === \"MacIntel\" && navigator.maxTouchPoints > 1);\n  if (isIOS) document.documentElement.classList.add(\"dco-ios\");\n\n  const locale = root.dataset.locale && root.dataset.locale.indexOf(\"en\") === 0 ? \"en\" : \"vi\";\n  const minimum = Number(root.dataset.minimumCents || 11500);\n  const shipping = Number(root.dataset.shippingCents || 14800);\n  const gift = Number(root.dataset.giftCents || 20000);\n  const shippingFee = Number(root.dataset.shippingFeeCents || 1500);\n  const basePromoGoal = Math.max(minimum, shipping, gift);\n  const checkoutUrl = \"/checkout?locale=en\";\n  const legacyCheckoutTitleProperties = new Set([\"M\u00F3n / Item\", \"Mon / Item\", \"M\u00F3n\", \"Mon\", \"Item\", \"_dco_checkout_title\"]);\n  const retiredPromoAttributes = [\n    \"DCO Promo\",\n    \"Labor Day Tofu Gift\",\n    \"World Cup Tofu Gift\",\n    \"July 4th Tofu Gift\",\n    \"Father's Day Tofu Gift\"\n  ];\n  const retiredPromoNoteLines = new Set([\"LABOR DAY\", \"WORLD CUP\", \"JULY4TH\", \"FATHERSDAY\"]);\n  const preferredLanguageAttribute = \"DCO Preferred Language\";\n  const preferredLocaleAttribute = \"DCO Preferred Locale\";\n  const preferredLanguageLabel = locale === \"en\" ? \"English\" : \"Vietnamese\";\n  const preferredLocale = locale === \"en\" ? \"en\" : \"vi\";\n  const productScript = document.getElementById(root.dataset.productsId);\n  const products = productScript ? JSON.parse(productScript.textContent) : [];\n  const productByVariant = new Map(products.map((product) => [String(product.variantId), product]));\n  // Seasonal gift copy comes from theme settings via data attributes.\n  const giftQuantity = Math.max(1, Number(root.dataset.giftQuantity || 8));\n  const giftName = root.dataset.giftName || (locale === \"en\" ? \"B\u00F2 L\u00E1 L\u1ED1t rolls\" : \"cu\u1ED1n B\u00F2 L\u00E1 L\u1ED1t\");\n  const giftLabel = `${giftQuantity} ${giftName}`;\n  const strings = {\n    vi: {\n      empty: \"Gi\u1ECF h\u00E0ng \u0111ang tr\u1ED1ng.\",\n      items: \"m\u00F3n\",\n      subtotal: \"T\u1EA1m t\u00EDnh\",\n      ship: \"Ph\u00ED ship\",\n      free: \"Mi\u1EC5n ph\u00ED\",\n      gift: giftLabel,\n      remainingMinimum: \"Th\u00EAm {amount} \u0111\u1EC3 \u0111\u01B0\u1EE3c {reward}.\",\n      emptyFreeShip: \"{reward} t\u1EEB {threshold}\",\n      minimumNote: \"\u0110\u01A1n t\u1ED1i thi\u1EC3u {minimum}\",\n      shipHint: \"Th\u00EAm {amount} \u0111\u1EC3 {reward}\",\n      shipNudgeFee: \"B\u1EA1n \u0111ang tr\u1EA3 {fee} ph\u00ED ship.\",\n      shipNudgeQuestion: \"Th\u00EAm {amount} \u0111\u1EC3 \u0111\u01B0\u1EE3c {reward}?\",\n      shipNudgeAdd: \"Th\u00EAm m\u00F3n\",\n      shipNudgeContinue: \"V\u1EABn checkout\",\n      remainingShipping: \"\u0110\u1EE7 checkout. Th\u00EAm {amount} \u0111\u1EC3 \u0111\u01B0\u1EE3c {reward}.\",\n      remainingGift: \"Th\u00EAm {amount} nh\u1EADn {reward}.\",\n      freeShipDone: \"\u0110\u00E3 free ship\",\n      stretchGiftNudge: \"\u0110\u00E3 nh\u1EADn qu\u00E0 m\u1ED1c {threshold}. Th\u00EAm {amount} nh\u1EADn th\u00EAm {reward}.\",\n      stretchGiftComplete: \"\u0110\u00E3 nh\u1EADn {reward}.\",\n      giftAtMilestone: \"qu\u00E0 m\u1ED1c {threshold}\",\n      bottomMinimum: \"Th\u00EAm {amount} \u0111\u1EC3 \u0111\u01B0\u1EE3c {reward}\",\n      bottomShipping: \"Th\u00EAm {amount} \u0111\u1EC3 \u0111\u01B0\u1EE3c {reward}\",\n      bottomGift: \"Th\u00EAm {amount} nh\u1EADn {reward}\",\n      bottomStretchGift: \"Th\u00EAm {amount} nh\u1EADn {reward}\",\n      bottomStretchGiftComplete: \"\u0110\u00E3 nh\u1EADn {reward}\",\n      freeShipReward: \"FREE\\u00a0SHIP\",\n      giftReward: giftLabel,\n      giftAtThreshold: \"qu\u00E0 {threshold}\",\n      giftNudge: `Th\u00EAm {amount} nh\u1EADn ${giftLabel}`,\n      locked: \"Th\u00EAm {amount} \u0111\u1EC3 checkout\",\n      checkout: \"Checkout\",\n      checkoutLoading: \"\u0110ang m\u1EDF checkout...\",\n      minWarning: \"Th\u00EAm {amount} n\u1EEFa \u0111\u1EC3 checkout. \u0110\u01A1n ship t\u1ED1i thi\u1EC3u {minimum}.\",\n      cartError: \"Kh\u00F4ng c\u1EADp nh\u1EADt \u0111\u01B0\u1EE3c gi\u1ECF h\u00E0ng. Vui l\u00F2ng th\u1EED l\u1EA1i ho\u1EB7c text/call 469-644-4086.\",\n      cartErrorBottom: \"Kh\u00F4ng c\u1EADp nh\u1EADt \u0111\u01B0\u1EE3c gi\u1ECF h\u00E0ng. Th\u1EED l\u1EA1i.\",\n      remove: \"X\u00F3a\",\n      decrease: \"Gi\u1EA3m s\u1ED1 l\u01B0\u1EE3ng\",\n      increase: \"T\u0103ng s\u1ED1 l\u01B0\u1EE3ng\",\n      chooseQuantity: \"Ch\u1ECDn s\u1ED1 l\u01B0\u1EE3ng\",\n      orderMore: \"Ti\u1EBFp t\u1EE5c \u0111\u1EB7t m\u00F3n\",\n      storage: \"B\u1EA3o qu\u1EA3n\",\n      reheating: \"C\u00E1ch d\u00F9ng\",\n      allergens: \"L\u01B0u \u00FD d\u1ECB \u1EE9ng\",\n      nutrition: \"Dinh d\u01B0\u1EE1ng\",\n      nutritionOpen: \"Xem b\u1EA3ng dinh d\u01B0\u1EE1ng\",\n      nutritionZoom: \"B\u1EA5m \u0111\u1EC3 ph\u00F3ng to nh\u00E3n\"\n    },\n    en: {\n      empty: \"Your cart is empty.\",\n      items: \"items\",\n      subtotal: \"Subtotal\",\n      ship: \"Shipping\",\n      free: \"Free\",\n      gift: giftLabel,\n      remainingMinimum: \"Add {amount} for {reward}.\",\n      emptyFreeShip: \"{reward} on orders {threshold}+\",\n      minimumNote: \"Minimum order {minimum}\",\n      shipHint: \"Add {amount} for {reward}\",\n      shipNudgeFee: \"You're paying {fee} shipping.\",\n      shipNudgeQuestion: \"Add {amount} for {reward}?\",\n      shipNudgeAdd: \"Add items\",\n      shipNudgeContinue: \"Checkout anyway\",\n      remainingShipping: \"Minimum reached. Add {amount} for {reward}.\",\n      remainingGift: \"Add {amount} for {reward}.\",\n      freeShipDone: \"Free shipping\",\n      stretchGiftNudge: \"{threshold} gift unlocked. Add {amount} for the {reward}.\",\n      stretchGiftComplete: \"{reward} unlocked.\",\n      giftAtMilestone: \"{threshold} gift\",\n      bottomMinimum: \"Add {amount} for {reward}\",\n      bottomShipping: \"Add {amount} for {reward}\",\n      bottomGift: \"Add {amount} for {reward}\",\n      bottomStretchGift: \"Add {amount} for the {reward}\",\n      bottomStretchGiftComplete: \"{reward} unlocked\",\n      freeShipReward: \"FREE\\u00a0SHIPPING\",\n      giftReward: giftLabel,\n      giftAtThreshold: \"{threshold} gift\",\n      giftNudge: `Add {amount} for ${giftLabel}`,\n      locked: \"Add {amount} to checkout\",\n      checkout: \"Checkout\",\n      checkoutLoading: \"Opening checkout...\",\n      minWarning: \"Add {amount} more to checkout. Shipping orders need at least {minimum}.\",\n      cartError: \"Could not update your cart. Please try again or call/text 469-644-4086.\",\n      cartErrorBottom: \"Cart did not update. Try again.\",\n      remove: \"Remove\",\n      decrease: \"Decrease quantity\",\n      increase: \"Increase quantity\",\n      chooseQuantity: \"Choose quantity\",\n      orderMore: \"Order more items\",\n      storage: \"Storage\",\n      reheating: \"Preparation\",\n      allergens: \"Allergy notes\",\n      nutrition: \"Nutrition\",\n      nutritionOpen: \"View Nutrition Facts\",\n      nutritionZoom: \"Tap to enlarge the label\"\n    }\n  }[locale];\n\n  let cart = { items: [], item_count: 0, total_price: 0, currency: \"USD\", note: \"\", attributes: {} };\n  const cartOrderStorageKey = \"dcoCartLineOrder\";\n  const quantityTimers = new Map();\n  const desiredQuantities = new Map();\n  let syncedQuantities = new Map();\n  let cartLineOrder = readCartLineOrder();\n  let renderedLineStructure = \"\";\n  let renderScheduled = false;\n  let pendingScrollRestore = null;\n  let pendingScrollRestoreUntil = 0;\n  let drawerScrollY = 0;\n  let drawerScrollLocked = false;\n  let drawerBodyScrollSnapshot = null;\n  let drawerHtmlScrollSnapshot = null;\n  let drawerTouchStartY = 0;\n  let drawerTouchStartX = 0;\n  let drawerTouchLastY = 0;\n  let drawerSwipeActive = false;\n  let drawerSwipeDistance = 0;\n  let lastDetailsTrigger = null;\n  let detailsScrollX = 0;\n  let detailsScrollY = 0;\n  let detailsScrollLocked = false;\n  let detailsUsesFixedScrollLock = false;\n  let bodyScrollSnapshot = null;\n  let htmlScrollSnapshot = null;\n  let detailsTouchStartY = 0;\n  let detailsTouchStartX = 0;\n  let detailsTouchLastY = 0;\n  let detailsSwipeActive = false;\n  let detailsSwipeDistance = 0;\n  let syncedNote = \"\";\n  let noteDirty = false;\n  let noteSyncTimer = null;\n  let noteSyncPromise = null;\n  let retiredPromoCleanupPromise = null;\n  let languagePreferenceSyncPromise = null;\n  let checkoutRequestActive = false;\n  let checkoutHandoffActive = false;\n  let checkoutHandoffTimer = null;\n  let cartSyncTimer = null;\n  let cartSyncPromise = null;\n  let cartSyncDirty = false;\n  let cartSyncFailureCount = 0;\n  let cartDebugSessionReady = false;\n  const trackedMilestones = new Set();\n\n  const frame = window.requestAnimationFrame\n    ? window.requestAnimationFrame.bind(window)\n    : (callback) => window.setTimeout(callback, 16);\n\n  function delay(ms) {\n    return new Promise((resolve) => window.setTimeout(resolve, ms));\n  }\n\n  function analyticsProductPayload(variantId) {\n    const id = String(variantId);\n    const product = productByVariant.get(id);\n    return {\n      variant_id: id,\n      product_title: product?.title || \"\",\n      product_price_cents: Number(product?.price || 0)\n    };\n  }\n\n  function trackEvent(name, detail = {}) {\n    const payload = {\n      event: name,\n      dco: true,\n      source: \"dco_order_page\",\n      language: locale,\n      currency: cart.currency || \"USD\",\n      cart_total_cents: Number(cart.total_price || 0),\n      cart_item_count: Number(cart.item_count || 0),\n      ...detail\n    };\n\n    window.dataLayer = window.dataLayer || [];\n    if (typeof window.dataLayer.push === \"function\") window.dataLayer.push(payload);\n    document.dispatchEvent(new CustomEvent(name, { detail: payload }));\n    document.dispatchEvent(new CustomEvent(\"dco:analytics\", { detail: payload }));\n  }\n\n  function trackMilestone(key, detail) {\n    if (trackedMilestones.has(key)) return;\n    trackedMilestones.add(key);\n    trackEvent(\"dco_promo_milestone_reached\", detail);\n  }\n\n  function cartDebugRequested() {\n    const params = new URLSearchParams(window.location.search);\n    const param = params.get(\"dco_debug_cart\");\n    if (param === \"0\" || param === \"false\") {\n      try { window.sessionStorage?.removeItem(\"dco_debug_cart\"); } catch {}\n      return false;\n    }\n    if (param === \"1\" || param === \"true\" || window.location.href.indexOf(\"dco_debug_cart=1\") !== -1) {\n      try { window.sessionStorage?.setItem(\"dco_debug_cart\", \"1\"); } catch {}\n      return true;\n    }\n    try { return window.sessionStorage?.getItem(\"dco_debug_cart\") === \"1\"; } catch {}\n    return false;\n  }\n\n  function ensureCartDebugSession() {\n    if (!cartDebugRequested()) return false;\n    window.__DCO_CART_DEBUG__ = window.__DCO_CART_DEBUG__ || [];\n    window.__DCO_CART_DEBUG_ENABLED__ = true;\n    if (!cartDebugSessionReady) {\n      cartDebugSessionReady = true;\n      console.info(\"[DCO cart debug] enabled\");\n    }\n    return true;\n  }\n\n  function cartDebug(event, detail = {}) {\n    if (!ensureCartDebugSession()) return;\n\n    const entry = {\n      at: new Date().toISOString(),\n      ms: Math.round(performance.now()),\n      event,\n      cart_total_cents: Number(cart.total_price || 0),\n      cart_item_count: Number(cart.item_count || 0),\n      pending_quantity_count: desiredQuantities.size,\n      cart_sync_dirty: cartSyncDirty,\n      cart_sync_active: Boolean(cartSyncPromise),\n      ...detail\n    };\n\n    window.__DCO_CART_DEBUG__ = window.__DCO_CART_DEBUG__ || [];\n    window.__DCO_CART_DEBUG__.push(entry);\n    if (window.__DCO_CART_DEBUG__.length > 200) window.__DCO_CART_DEBUG__.shift();\n    console.info(\"[DCO cart debug]\", entry);\n  }\n\n  const nodes = {\n    cartLines: [...root.querySelectorAll(\"[data-dco-cart-lines]\")],\n    counts: [...root.querySelectorAll(\"[data-dco-count]\")],\n    subtotals: [...root.querySelectorAll(\"[data-dco-subtotal]\")],\n    shipping: [...root.querySelectorAll(\"[data-dco-shipping]\")],\n    messages: [...root.querySelectorAll(\"[data-dco-message]\")],\n    bottomMessages: [...root.querySelectorAll(\"[data-dco-bottom-message]\")],\n    checkoutButtons: [...root.querySelectorAll(\"[data-dco-checkout]\")],\n    checkouts: [...root.querySelectorAll(\"[data-dco-checkout-label]\")],\n    checkoutCounts: [...root.querySelectorAll(\"[data-dco-checkout-count]\")],\n    giftRows: [...root.querySelectorAll(\"[data-dco-gift-row]\")],\n    giftValues: [...root.querySelectorAll(\"[data-dco-gift-value]\")],\n    minimumTierLabels: [...root.querySelectorAll(\"[data-dco-minimum-tier-label]\")],\n    repeatingGiftTiers: [...root.querySelectorAll(\"[data-dco-repeating-gift-tier]\")],\n    repeatingGiftLabels: [...root.querySelectorAll(\"[data-dco-repeating-gift-label]\")],\n    repeatingGiftValues: [...root.querySelectorAll(\"[data-dco-repeating-gift-value]\")],\n    promoFills: [...root.querySelectorAll(\"[data-dco-promo-fill]\")],\n    promoMarkers: [...root.querySelectorAll(\"[data-dco-promo-marker]\")],\n    repeatingGiftMarkers: [...root.querySelectorAll(\"[data-dco-repeating-gift-marker]\")],\n    promo: root.querySelector(\".dco-promo\"),\n    orderInner: root.querySelector(\".dco-order-inner\"),\n    hero: root.querySelector(\".dco-order-hero\"),\n    topMilestone: root.querySelector(\"[data-dco-top-milestone]\"),\n    headerCarts: [...document.querySelectorAll(\"[data-dco-header-cart]\")],\n    headerCountBadges: [...document.querySelectorAll(\"[data-dco-header-count-badge]\")],\n    headerSubtotals: [...document.querySelectorAll(\"[data-dco-header-subtotal]\")],\n    tiers: [...root.querySelectorAll(\"[data-dco-tier]\")],\n    warnings: [...root.querySelectorAll(\"[data-dco-warning]\")],\n    notes: [...root.querySelectorAll(\"[data-dco-note]\")],\n    drawer: root.querySelector(\"[data-dco-drawer]\"),\n    drawerBody: root.querySelector(\"[data-dco-drawer-body]\"),\n    drawerBackdrop: root.querySelector(\"[data-dco-drawer-backdrop]\"),\n    detailsModal: root.querySelector(\"[data-dco-details-modal]\"),\n    detailsBackdrop: root.querySelector(\"[data-dco-details-backdrop]\"),\n    detailsTitle: root.querySelector(\"[data-dco-details-title]\"),\n    detailsBody: root.querySelector(\"[data-dco-details-body]\"),\n    detailsFooter: root.querySelector(\"[data-dco-details-footer]\")\n  };\n\n  syncedNote = nodes.notes[0]?.value || \"\";\n\n  const productNodes = new Map();\n  products.forEach((product) => {\n    const id = String(product.variantId);\n    const cards = [...root.querySelectorAll(`[data-dco-product-card][data-variant-id=\"${id}\"]`)];\n    const inputs = cards.flatMap((card) => [...card.querySelectorAll(\"[data-dco-qty-input]\")]);\n    productNodes.set(id, { cards, inputs });\n  });\n\n  function escapeHtml(value) {\n    return String(value ?? \"\").replace(/[&<>\"']/g, (char) => ({\n      \"&\": \"&amp;\",\n      \"<\": \"&lt;\",\n      \">\": \"&gt;\",\n      '\"': \"&quot;\",\n      \"'\": \"&#039;\"\n    }[char]));\n  }\n\n  function formatText(value) {\n    return escapeHtml(value).replace(/\\n/g, \"<br>\");\n  }\n\n  function setText(targets, value) {\n    targets.forEach((node) => {\n      if (node.textContent !== value) node.textContent = value;\n    });\n  }\n\n  function scheduleRender() {\n    if (renderScheduled) return;\n    renderScheduled = true;\n    frame(() => {\n      renderScheduled = false;\n      restoreScrollAfterQuantityChange();\n      render();\n      updateTopMilestoneVisibility();\n      restoreScrollAfterQuantityChange();\n      frame(restoreScrollAfterQuantityChange);\n    });\n  }\n\n  function siteHeaderHeight() {\n    const header = document.querySelector(\".dco-site-header\");\n    return Math.ceil(header?.getBoundingClientRect().height || 0);\n  }\n\n  function updateSiteHeaderHeight() {\n    const height = siteHeaderHeight();\n    if (height > 0) root.style.setProperty(\"--dco-site-header-height\", `${height}px`);\n    return height;\n  }\n\n  function updateVisualViewportHeight() {\n    const visualViewport = window.visualViewport;\n    const height = Math.round(visualViewport?.height || window.innerHeight || document.documentElement.clientHeight || 0);\n    const layoutHeight = Math.round(window.innerHeight || document.documentElement.clientHeight || height);\n    const offsetTop = Math.max(0, Math.round(visualViewport?.offsetTop || 0));\n    const noteFocused = root.classList.contains(\"is-drawer-note-focused\") || Boolean(activeDrawerNote());\n    const offsetBottom = Math.max(0, Math.round(layoutHeight - offsetTop - height));\n    const hasSafariBottomChrome = offsetBottom > 24;\n    if (height > 0) root.style.setProperty(\"--dco-visual-viewport-height\", `${height}px`);\n    root.style.setProperty(\"--dco-visual-viewport-offset-bottom\", `${offsetBottom}px`);\n    root.style.setProperty(\"--dco-drawer-checkout-bottom\", hasSafariBottomChrome ? \"8px\" : \"max(18px, env(safe-area-inset-bottom))\");\n    root.style.setProperty(\"--dco-drawer-body-bottom\", hasSafariBottomChrome ? \"18px\" : \"calc(38px + env(safe-area-inset-bottom))\");\n    root.classList.toggle(\"is-drawer-note-focused\", noteFocused);\n  }\n\n  function activeDrawerNote() {\n    const active = document.activeElement;\n    if (!active?.matches?.(\"[data-dco-note]\")) return null;\n    if (!nodes.drawer?.contains(active)) return null;\n    return active;\n  }\n\n  function keepDrawerNoteVisible(note = activeDrawerNote()) {\n    if (!note || !nodes.drawerBody) return;\n    const bodyRect = nodes.drawerBody.getBoundingClientRect();\n    const noteRect = note.getBoundingClientRect();\n    const topGap = 12;\n    const bottomGap = 14;\n\n    if (noteRect.bottom > bodyRect.bottom - bottomGap) {\n      nodes.drawerBody.scrollTop += noteRect.bottom - bodyRect.bottom + bottomGap;\n    } else if (noteRect.top < bodyRect.top + topGap) {\n      nodes.drawerBody.scrollTop -= bodyRect.top + topGap - noteRect.top;\n    }\n  }\n\n  function updateVisualViewportForDrawer() {\n    updateVisualViewportHeight();\n  }\n\n  function handleDrawerNoteFocus(event) {\n    const note = event.target;\n    if (!note?.matches?.(\"[data-dco-note]\") || !nodes.drawer?.contains(note)) return;\n    root.classList.add(\"is-drawer-note-focused\");\n    updateVisualViewportForDrawer();\n  }\n\n  function handleDrawerNoteBlur(event) {\n    const note = event.target;\n    if (!note?.matches?.(\"[data-dco-note]\") || !nodes.drawer?.contains(note)) return;\n    window.setTimeout(() => {\n      if (!activeDrawerNote()) root.classList.remove(\"is-drawer-note-focused\");\n      updateVisualViewportForDrawer();\n    }, 80);\n  }\n\n  let topMilestoneShown = null;\n\n  function updateTopMilestoneVisibility() {\n    if (!nodes.topMilestone || !nodes.promo) return;\n    const headerHeight = updateSiteHeaderHeight();\n    const isSmallViewport = window.matchMedia(\"(max-width: 989px)\").matches;\n    const promoRect = nodes.promo.getBoundingClientRect();\n    const shouldShow = isSmallViewport && promoRect.bottom <= headerHeight + 2;\n    // This runs on every scroll event; skip the DOM writes (which invalidate\n    // style/layout mid-scroll and show up as INP cost) unless the state flips.\n    if (topMilestoneShown === shouldShow) return;\n    topMilestoneShown = shouldShow;\n    root.classList.toggle(\"is-top-milestone-visible\", shouldShow);\n    nodes.topMilestone.classList.toggle(\"is-visible\", shouldShow);\n    nodes.topMilestone.hidden = !shouldShow;\n    nodes.topMilestone.setAttribute(\"aria-hidden\", shouldShow ? \"false\" : \"true\");\n  }\n\n  function handleHeaderCartClick(event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    if (window.matchMedia(\"(max-width: 989px)\").matches) {\n      openDrawer(\"header_cart\");\n      return;\n    }\n\n    const desktopCart = root.querySelector(\".dco-cart--desktop\");\n    if (desktopCart) desktopCart.scrollIntoView({ block: \"start\", behavior: \"smooth\" });\n    trackEvent(\"dco_cart_opened\", { trigger: \"desktop_header_cart\" });\n  }\n\n  function scrollToPromoMilestones(event) {\n    event.preventDefault();\n    event.stopPropagation();\n    if (!nodes.promo) return;\n\n    updateSiteHeaderHeight();\n    const targetTop = window.scrollY + nodes.promo.getBoundingClientRect().top - siteHeaderHeight() - 8;\n    const prefersReducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n    window.scrollTo({\n      top: Math.max(0, Math.round(targetTop)),\n      behavior: prefersReducedMotion ? \"auto\" : \"smooth\"\n    });\n    window.setTimeout(updateTopMilestoneVisibility, prefersReducedMotion ? 0 : 360);\n    trackEvent(\"dco_milestones_shortcut_clicked\", {\n      trigger: \"sticky_milestone\"\n    });\n  }\n\n  function money(cents) {\n    return new Intl.NumberFormat(\"en-US\", {\n      style: \"currency\",\n      currency: cart.currency || \"USD\",\n      minimumFractionDigits: cents % 100 === 0 ? 0 : 2\n    }).format(cents / 100);\n  }\n\n  function template(text, amountOrValues) {\n    const values = typeof amountOrValues === \"object\"\n      ? amountOrValues\n      : { amount: money(amountOrValues) };\n\n    return Object.entries(values).reduce((output, [key, value]) => {\n      return output.split(`{${key}}`).join(value);\n    }, text);\n  }\n\n  function quantityFor(variantId) {\n    const line = cart.items.find((item) => String(item.id) === String(variantId));\n    return line ? line.quantity : 0;\n  }\n\n  function displayedQuantityFor(variantId) {\n    const id = String(variantId);\n    return desiredQuantities.has(id) ? desiredQuantities.get(id) : quantityFor(id);\n  }\n\n  function giftTier(total) {\n    if (gift > 0 && total >= gift) return \"base\";\n    return \"\";\n  }\n\n  function giftMultiplier(total) {\n    if (gift <= 0 || total < gift) return 0;\n    return Math.max(1, Math.floor(total / gift));\n  }\n\n  function currentGiftThreshold(total) {\n    const multiplier = giftMultiplier(total);\n    return multiplier > 0 ? multiplier * gift : gift;\n  }\n\n  function nextGiftThreshold(total) {\n    if (gift <= 0) return 0;\n    if (total < gift) return gift;\n    return (Math.floor(total / gift) + 1) * gift;\n  }\n\n  function promoGoalFor(total) {\n    if (gift > 0 && total >= gift) {\n      return Math.max(basePromoGoal, nextGiftThreshold(total));\n    }\n\n    return basePromoGoal;\n  }\n\n  function giftDescription(total = gift) {\n    const multiplier = Math.max(1, giftMultiplier(total));\n    return `${giftQuantity * multiplier} ${giftName}`;\n  }\n\n  function nextStretchGiftAmount(total) {\n    if (gift <= 0 || total < gift) return 0;\n    return nextGiftThreshold(total) - total;\n  }\n\n  function stretchGiftTemplateValues(total) {\n    return {\n      amount: money(nextStretchGiftAmount(total)),\n      threshold: money(currentGiftThreshold(total)),\n      next: money(nextGiftThreshold(total))\n    };\n  }\n\n  // Below the minimum the messages lead with the free-shipping goal; the\n  // minimum itself lives on the checkout button, the milestone card's\n  // \"\u0110\u01A1n ship t\u1ED1i thi\u1EC3u\" line, and the cart box's small note.\n  function freeShipFirstMessage(total, text) {\n    const note = template(strings.minimumNote, { minimum: money(minimum) });\n    if (total <= 0) {\n      return { text: template(strings.emptyFreeShip, { threshold: money(shipping) }), reward: strings.freeShipReward, pill: true, note };\n    }\n    return { text, amount: money(shipping - total), reward: strings.freeShipReward, pill: true, note };\n  }\n\n  function milestoneMessage(total) {\n    if (total < minimum) {\n      return freeShipFirstMessage(total, strings.remainingMinimum);\n    }\n    if (total < shipping) {\n      return { text: strings.remainingShipping, amount: money(shipping - total), reward: strings.freeShipReward, pill: true };\n    }\n    if (total < gift) {\n      return { text: strings.remainingGift, amount: money(gift - total), reward: strings.gift, done: strings.freeShipDone };\n    }\n    const stretch = stretchGiftTemplateValues(total);\n    if (nextStretchGiftAmount(total) > 0) {\n      return {\n        text: template(strings.stretchGiftNudge, { threshold: stretch.threshold }),\n        amount: stretch.amount,\n        reward: template(strings.giftAtMilestone, { threshold: stretch.next })\n      };\n    }\n    return { text: strings.stretchGiftComplete, reward: template(strings.giftAtMilestone, { threshold: stretch.threshold }) };\n  }\n\n  function messageParts(message) {\n    const [before, after = \"\"] = template(message.text, { amount: message.amount || \"\" }).split(\"{reward}\");\n    return { before, after };\n  }\n\n  function nextMilestoneText(total) {\n    const message = milestoneMessage(total);\n    const { before, after } = messageParts(message);\n    const main = `${message.done ? `${message.done}. ` : \"\"}${before}${message.reward}${after}`;\n    if (!message.note) return main;\n    return `${/[.!?]$/.test(main) ? main : `${main}.`} ${message.note}.`;\n  }\n\n  function bottomMessage(total) {\n    if (total < minimum) {\n      const message = freeShipFirstMessage(total, strings.bottomMinimum);\n      return { ...message, note: \"\" };\n    }\n    if (total < shipping) {\n      return { text: strings.bottomShipping, amount: money(shipping - total), reward: strings.freeShipReward, pill: true };\n    }\n    if (total < gift) {\n      return { text: strings.bottomGift, amount: money(gift - total), reward: strings.giftReward };\n    }\n    const stretch = stretchGiftTemplateValues(total);\n    if (nextStretchGiftAmount(total) > 0) {\n      return { text: strings.bottomStretchGift, amount: stretch.amount, reward: template(strings.giftAtThreshold, { threshold: stretch.next }) };\n    }\n    return { text: strings.bottomStretchGiftComplete, reward: template(strings.giftAtThreshold, { threshold: stretch.threshold }) };\n  }\n\n  // emphasize: (node) => boolean \u2014 the pill (and the small minimum note) are\n  // shown once per screen, so callers decide which surfaces carry them.\n  function renderRewardMessage(targets, message, emphasize = () => true) {\n    const { before, after } = messageParts(message);\n    targets.forEach((node) => {\n      const strong = emphasize(node);\n      const pill = Boolean(message.pill && strong);\n      const note = strong && message.note ? message.note : \"\";\n      const key = [message.done || \"\", before, message.reward, after, pill ? \"pill\" : \"\", note].join(\"\\u0000\");\n      if (node.dataset.dcoMessageKey === key) return;\n      node.dataset.dcoMessageKey = key;\n      const reward = document.createElement(\"b\");\n      reward.className = pill ? \"dco-reward dco-reward--pill\" : \"dco-reward\";\n      reward.textContent = message.reward;\n      const parts = [document.createTextNode(before), reward, document.createTextNode(after)];\n      if (message.done) {\n        // An earned milestone reads as done (green check), not as a goal.\n        const done = document.createElement(\"span\");\n        done.className = \"dco-done\";\n        const check = document.createElement(\"span\");\n        check.setAttribute(\"aria-hidden\", \"true\");\n        check.textContent = \"\u2713 \";\n        done.append(check, message.done);\n        parts.unshift(done, document.createTextNode(\" \u00B7 \"));\n      }\n      if (note) {\n        const small = document.createElement(\"small\");\n        small.className = \"dco-cart-message__note\";\n        small.textContent = note;\n        parts.push(small);\n      }\n      node.replaceChildren(...parts);\n    });\n  }\n\n  // \"Ph\u00ED ship $15\" gets a hint underneath while the customer is paying the\n  // fee: between the minimum and the free-shipping threshold.\n  function renderShipHint(row, total) {\n    const show = total >= minimum && total < shipping;\n    let hint = row.querySelector(\".dco-ship-hint\");\n    if (!show) {\n      if (hint) hint.remove();\n      row.classList.remove(\"has-ship-hint\");\n      return;\n    }\n    const message = { text: strings.shipHint, amount: money(shipping - total), reward: strings.freeShipReward };\n    if (!hint) {\n      hint = document.createElement(\"small\");\n      hint.className = \"dco-ship-hint\";\n      row.appendChild(hint);\n    }\n    row.classList.add(\"has-ship-hint\");\n    renderRewardMessage([hint], message, () => false);\n  }\n\n  // One gentle check per visit: when the free-shipping gap is no more than the\n  // shipping fee, adding food costs less than paying for shipping. Never blocks\n  // checkout.\n  const SHIP_NUDGE_KEY = \"dco_ship_nudge_shown\";\n  let shipNudgeDialog = null;\n  let shipNudgeEscapeAt = 0;\n\n  function shipNudgeAlreadyShown() {\n    try { return window.sessionStorage.getItem(SHIP_NUDGE_KEY) === \"1\"; } catch (error) { return shipNudgeShownFallback; }\n  }\n\n  let shipNudgeShownFallback = false;\n  function markShipNudgeShown() {\n    shipNudgeShownFallback = true;\n    try { window.sessionStorage.setItem(SHIP_NUDGE_KEY, \"1\"); } catch (error) { /* private mode */ }\n  }\n\n  function shouldShowShipNudge(total) {\n    const gap = shipping - total;\n    return total >= minimum && gap > 0 && gap <= shippingFee && !shipNudgeAlreadyShown() &&\n      typeof HTMLDialogElement === \"function\";\n  }\n\n  function buildShipNudgeDialog() {\n    const dialog = document.createElement(\"dialog\");\n    dialog.className = \"dco-ship-nudge\";\n    dialog.setAttribute(\"aria-labelledby\", \"dco-ship-nudge-title\");\n    dialog.innerHTML = `\n      <p class=\"dco-ship-nudge__fee\" data-ship-nudge-fee></p>\n      <p class=\"dco-ship-nudge__question\" id=\"dco-ship-nudge-title\" data-ship-nudge-question></p>\n      <div class=\"dco-ship-nudge__actions\">\n        <button type=\"button\" class=\"dco-ship-nudge__add\" data-ship-nudge-add></button>\n        <button type=\"button\" class=\"dco-ship-nudge__continue\" data-ship-nudge-continue></button>\n      </div>`;\n    // Escape closes only this sheet; the drawer's Escape handler runs on\n    // keyup, so remember when the sheet was dismissed that way.\n    dialog.addEventListener(\"cancel\", () => { shipNudgeEscapeAt = Date.now(); });\n    // Inside the shell so it inherits the --dco-* tokens; showModal() puts it\n    // in the top layer above the drawer.\n    root.appendChild(dialog);\n    return dialog;\n  }\n\n  function scrollToProductGrid() {\n    const grid = root.querySelector(\".dco-product-grid\");\n    if (!grid) return;\n    const reduce = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n    grid.scrollIntoView({ behavior: reduce ? \"auto\" : \"smooth\", block: \"start\" });\n  }\n\n  function showShipNudge(trigger, total) {\n    if (!shipNudgeDialog) shipNudgeDialog = buildShipNudgeDialog();\n    const dialog = shipNudgeDialog;\n    const amount = money(shipping - total);\n    dialog.querySelector(\"[data-ship-nudge-fee]\").textContent = template(strings.shipNudgeFee, { fee: money(shippingFee) });\n    renderRewardMessage(\n      [dialog.querySelector(\"[data-ship-nudge-question]\")],\n      { text: strings.shipNudgeQuestion, amount, reward: strings.freeShipReward, pill: true },\n      () => true\n    );\n    const addButton = dialog.querySelector(\"[data-ship-nudge-add]\");\n    const continueButton = dialog.querySelector(\"[data-ship-nudge-continue]\");\n    addButton.textContent = strings.shipNudgeAdd;\n    continueButton.textContent = strings.shipNudgeContinue;\n    addButton.onclick = () => {\n      trackEvent(\"dco_ship_nudge_add_items\", { gap_cents: shipping - total });\n      dialog.close();\n      if (nodes.drawer?.classList.contains(\"is-open\")) closeDrawer();\n      window.setTimeout(scrollToProductGrid, 60);\n    };\n    continueButton.onclick = () => {\n      trackEvent(\"dco_ship_nudge_checkout_anyway\", { gap_cents: shipping - total });\n      dialog.close();\n      checkout(trigger, { skipShipNudge: true });\n    };\n    dialog.onclick = (event) => {\n      if (event.target === dialog) dialog.close();\n    };\n    markShipNudgeShown();\n    trackEvent(\"dco_ship_nudge_shown\", { gap_cents: shipping - total });\n    dialog.showModal();\n    try { addButton.focus({ preventScroll: true }); } catch (error) { addButton.focus(); }\n  }\n\n  function milestoneState(total) {\n    if (total >= gift) return \"gift\";\n    if (total >= shipping) return \"shipping\";\n    if (total >= minimum) return \"minimum\";\n    return \"locked\";\n  }\n\n  function progress(total) {\n    if (total <= 0) return 0;\n    const goal = promoGoalFor(total);\n    return Math.min(100, Math.round((total / goal) * 100));\n  }\n\n  function maybeTrackMilestones(total) {\n    if (minimum > 0 && total >= minimum) {\n      trackMilestone(\"minimum\", {\n        milestone: \"minimum_order\",\n        threshold_cents: minimum\n      });\n    }\n\n    if (shipping > 0 && total >= shipping) {\n      trackMilestone(\"free_shipping\", {\n        milestone: \"free_shipping\",\n        threshold_cents: shipping\n      });\n    }\n\n    const earnedGiftCount = giftMultiplier(total);\n    for (let multiplier = 1; multiplier <= earnedGiftCount; multiplier += 1) {\n      const threshold = multiplier * gift;\n      trackMilestone(`gift_${threshold}`, {\n        milestone: \"repeating_gift\",\n        threshold_cents: threshold,\n        gift_multiplier: multiplier\n      });\n    }\n  }\n\n  function normalizeQuantity(value, step) {\n    const parsed = Math.max(0, parseInt(value, 10) || 0);\n    if (parsed === 0) return 0;\n    if (Number(step) === 2 && parsed % 2 !== 0) return parsed + 1;\n    return parsed;\n  }\n\n  function shouldPreservePageScroll() {\n    if (!window.matchMedia || !window.matchMedia(\"(max-width: 749px)\").matches) return false;\n    if (nodes.drawer?.classList.contains(\"is-open\")) return false;\n    if (nodes.detailsModal?.classList.contains(\"is-open\")) return false;\n    return true;\n  }\n\n  function isMobileSheetViewport() {\n    return !window.matchMedia || window.matchMedia(\"(max-width: 749px)\").matches;\n  }\n\n  function captureScrollBeforeQuantityChange() {\n    clearPendingScrollRestore();\n  }\n\n  function clearPendingScrollRestore() {\n    pendingScrollRestore = null;\n    pendingScrollRestoreUntil = 0;\n  }\n\n  function cancelScrollRestoreAfterUserMove() {\n    if (!pendingScrollRestore) return;\n    clearPendingScrollRestore();\n  }\n\n  function captureScrollBeforeQuantityPointer(event) {\n    if (!event.target.closest(\"[data-dco-plus], [data-dco-minus], [data-dco-remove]\")) return;\n    captureScrollBeforeQuantityChange();\n  }\n\n  function releaseQuantityButtonFocus(button, fromPointer) {\n    if (!button || typeof button.blur !== \"function\" || !fromPointer) return;\n    frame(() => {\n      if (document.activeElement === button) button.blur();\n    });\n  }\n\n  function restoreScrollAfterQuantityChange() {\n    clearPendingScrollRestore();\n  }\n\n  function linePrice(item) {\n    return Number(item.final_price || item.price || item.original_price || 0);\n  }\n\n  function cartItemId(item) {\n    return String(item.id);\n  }\n\n  function cartItemTitle(item) {\n    const product = productByVariant.get(cartItemId(item));\n    return product?.title || item.product_title || item.title || \"\";\n  }\n\n  function normalizePropertyText(value) {\n    return String(value || \"\")\n      .normalize(\"NFKC\")\n      .trim()\n      .replace(/\\s+/g, \" \")\n      .toLowerCase();\n  }\n\n  function titleCandidatesForItem(item) {\n    const product = productByVariant.get(cartItemId(item));\n    return [product?.title, item.product_title, item.title]\n      .filter(Boolean)\n      .flatMap((title) => String(title).split(\"/\"))\n      .map(normalizePropertyText)\n      .filter(Boolean);\n  }\n\n  function isLegacyCheckoutProperty(key, value, item) {\n    const cleanKey = String(key || \"\").trim().replace(/:$/, \"\");\n    if (legacyCheckoutTitleProperties.has(cleanKey)) return true;\n\n    const normalizedKey = normalizePropertyText(cleanKey);\n    const normalizedValue = normalizePropertyText(value);\n    if (cleanKey[0] === \"_\" && normalizedKey.indexOf(\"dco\") !== -1) return true;\n    if (!normalizedValue && cleanKey[0] !== \"_\") return true;\n\n    const titleCandidates = titleCandidatesForItem(item);\n    if (titleCandidates.includes(normalizedKey)) return true;\n    return titleCandidates.includes(normalizedValue) && /mon|m\u00F3n|item|title/.test(normalizedKey);\n  }\n\n  function cleanLegacyLineProperties(item) {\n    const properties = item?.properties;\n    if (!properties || typeof properties !== \"object\" || Array.isArray(properties)) return null;\n\n    const cleaned = {};\n    let changed = false;\n    Object.entries(properties).forEach(([key, value]) => {\n      if (isLegacyCheckoutProperty(key, value, item)) {\n        changed = true;\n        return;\n      }\n      cleaned[key] = value;\n    });\n\n    return changed ? cleaned : null;\n  }\n\n  function readCartLineOrder() {\n    try {\n      const parsed = JSON.parse(window.sessionStorage?.getItem(cartOrderStorageKey) || \"[]\");\n      return Array.isArray(parsed) ? parsed.map(String) : [];\n    } catch (error) {\n      return [];\n    }\n  }\n\n  function writeCartLineOrder() {\n    try {\n      if (cartLineOrder.length) {\n        window.sessionStorage?.setItem(cartOrderStorageKey, JSON.stringify(cartLineOrder));\n      } else {\n        window.sessionStorage?.removeItem(cartOrderStorageKey);\n      }\n    } catch (error) {\n      // Session storage is only a convenience for reloads; the in-memory order still works.\n    }\n  }\n\n  function orderCartItems() {\n    if (!Array.isArray(cart.items)) cart.items = [];\n\n    const ids = cart.items.map(cartItemId);\n    const activeIds = new Set(ids);\n    const orderedIds = new Set();\n\n    if (!cartLineOrder.length) {\n      cartLineOrder = ids;\n    } else {\n      cartLineOrder = cartLineOrder.filter((id) => {\n        if (!activeIds.has(id) || orderedIds.has(id)) return false;\n        orderedIds.add(id);\n        return true;\n      });\n\n      ids.forEach((id) => {\n        if (orderedIds.has(id)) return;\n        orderedIds.add(id);\n        cartLineOrder.push(id);\n      });\n    }\n\n    const orderIndex = new Map(cartLineOrder.map((id, index) => [id, index]));\n    cart.items.sort((a, b) => orderIndex.get(cartItemId(a)) - orderIndex.get(cartItemId(b)));\n\n    if (!cart.items.length) cartLineOrder = [];\n    writeCartLineOrder();\n  }\n\n  function recalculateCart() {\n    cart.items = cart.items.filter((item) => Number(item.quantity || 0) > 0);\n    orderCartItems();\n    cart.item_count = cart.items.reduce((sum, item) => sum + Number(item.quantity || 0), 0);\n    cart.total_price = cart.items.reduce((sum, item) => {\n      return sum + (Number(item.quantity || 0) * linePrice(item));\n    }, 0);\n  }\n\n  function updateSyncedQuantities() {\n    syncedQuantities = new Map(cart.items.map((item) => [String(item.id), Number(item.quantity || 0)]));\n  }\n\n  function isCartPayload(payload) {\n    return Boolean(payload && typeof payload === \"object\" && Array.isArray(payload.items));\n  }\n\n  function withoutRetiredPromoNote(note) {\n    return String(note || \"\")\n      .split(/\\r?\\n/)\n      .filter((line) => !retiredPromoNoteLines.has(line.trim().toUpperCase()))\n      .join(\"\\n\")\n      .trim();\n  }\n\n  function cartHasRetiredPromo(payload = cart) {\n    const attributes = payload?.attributes || {};\n    const note = String(payload?.note || \"\").trim();\n    return retiredPromoAttributes.some((attribute) => Boolean(String(attributes[attribute] || \"\").trim()))\n      || withoutRetiredPromoNote(note) !== note;\n  }\n\n  function cartHasPreferredLanguage(payload = cart) {\n    const attributes = payload?.attributes || {};\n    return attributes[preferredLanguageAttribute] === preferredLanguageLabel\n      && attributes[preferredLocaleAttribute] === preferredLocale;\n  }\n\n  function applyCartPayload(payload, options = {}) {\n    if (!isCartPayload(payload)) return false;\n    cart = payload;\n    if (!noteDirty && !noteSyncPromise) syncedNote = cart.note || \"\";\n    orderCartItems();\n    updateSyncedQuantities();\n    if (options.preservePending) applyPendingQuantities();\n    cleanupDesiredQuantities();\n    scheduleRender();\n    return true;\n  }\n\n  function setCartQuantity(variantId, quantity) {\n    const id = String(variantId);\n    const safeQuantity = Math.max(0, Number(quantity || 0));\n    const line = cart.items.find((item) => String(item.id) === id);\n\n    if (safeQuantity === 0) {\n      cart.items = cart.items.filter((item) => String(item.id) !== id);\n      recalculateCart();\n      return;\n    }\n\n    if (line) {\n      line.quantity = safeQuantity;\n      recalculateCart();\n      return;\n    }\n\n    const product = productByVariant.get(id);\n    if (!product) return;\n    cart.items.push({\n      id: Number.isFinite(Number(id)) ? Number(id) : id,\n      product_title: product.title,\n      quantity: safeQuantity,\n      final_price: Number(product.price || 0)\n    });\n    recalculateCart();\n  }\n\n  function displayCartItems() {\n    const items = Array.isArray(cart.items) ? cart.items.map((item) => ({ ...item })) : [];\n    const byId = new Map(items.map((item) => [cartItemId(item), item]));\n\n    desiredQuantities.forEach((quantity, id) => {\n      const safeQuantity = Math.max(0, Number(quantity || 0));\n      const existing = byId.get(String(id));\n\n      if (safeQuantity === 0) {\n        if (existing) existing.quantity = 0;\n        return;\n      }\n\n      if (existing) {\n        existing.quantity = safeQuantity;\n        return;\n      }\n\n      const product = productByVariant.get(String(id));\n      if (!product) return;\n      const item = {\n        id: Number.isFinite(Number(id)) ? Number(id) : id,\n        product_title: product.title,\n        quantity: safeQuantity,\n        final_price: Number(product.price || 0)\n      };\n      items.push(item);\n      byId.set(String(id), item);\n    });\n\n    const orderIndex = new Map(cartLineOrder.map((id, index) => [String(id), index]));\n    return items\n      .filter((item) => Number(item.quantity || 0) > 0)\n      .sort((a, b) => {\n        const aIndex = orderIndex.has(cartItemId(a)) ? orderIndex.get(cartItemId(a)) : Number.MAX_SAFE_INTEGER;\n        const bIndex = orderIndex.has(cartItemId(b)) ? orderIndex.get(cartItemId(b)) : Number.MAX_SAFE_INTEGER;\n        return aIndex - bIndex;\n      });\n  }\n\n  function displayCartSummary() {\n    const items = displayCartItems();\n    return {\n      count: items.reduce((sum, item) => sum + Number(item.quantity || 0), 0),\n      total: items.reduce((sum, item) => sum + (Number(item.quantity || 0) * linePrice(item)), 0)\n    };\n  }\n\n  function cleanupDesiredQuantities() {\n    desiredQuantities.forEach((quantity, id) => {\n      if (quantity === (syncedQuantities.get(id) || 0)) desiredQuantities.delete(id);\n    });\n  }\n\n  function applyPendingQuantities() {\n    desiredQuantities.forEach((quantity, id) => {\n      if (quantity !== (syncedQuantities.get(id) || 0)) setCartQuantity(id, quantity);\n    });\n  }\n\n  function applyOptimisticQuantity(variantId, quantity) {\n    const id = String(variantId);\n    if (quantity === displayedQuantityFor(id) && quantity === (syncedQuantities.get(id) || 0)) return;\n    if (quantity === displayedQuantityFor(id) && desiredQuantities.get(id) === quantity) return;\n    desiredQuantities.set(id, quantity);\n    setCartQuantity(id, quantity);\n    scheduleRender();\n  }\n\n  function clearWarnings() {\n    nodes.warnings.forEach((node) => {\n      if (node.textContent) node.textContent = \"\";\n      if (node.classList.contains(\"is-visible\")) node.classList.remove(\"is-visible\");\n    });\n  }\n\n  function showCartError(message) {\n    const text = message || strings.cartError;\n    nodes.warnings.forEach((node) => {\n      if (node.textContent !== text) node.textContent = text;\n      if (!node.classList.contains(\"is-visible\")) node.classList.add(\"is-visible\");\n    });\n  }\n\n  async function fetchCart(options = {}) {\n    const attempts = Math.max(1, Number(options.attempts || 2));\n    let lastError = null;\n\n    for (let attempt = 1; attempt <= attempts; attempt += 1) {\n      const started = performance.now();\n      cartDebug(\"cart_fetch_start\", {\n        endpoint: \"/cart.js\",\n        preserve_pending: Boolean(options.preservePending),\n        attempt\n      });\n\n      try {\n        const response = await fetch(\"/cart.js\", {\n          credentials: \"same-origin\",\n          headers: { Accept: \"application/json\" }\n        });\n        cartDebug(\"cart_fetch_response\", {\n          endpoint: \"/cart.js\",\n          ok: response.ok,\n          status: response.status,\n          duration_ms: Math.round(performance.now() - started),\n          preserve_pending: Boolean(options.preservePending),\n          attempt\n        });\n        if (!response.ok) throw new Error(`Cart fetch failed: ${response.status}`);\n        const payload = await response.json();\n        applyCartPayload(payload, { preservePending: options.preservePending });\n        cartDebug(\"cart_fetch_applied\", {\n          endpoint: \"/cart.js\",\n          preserve_pending: Boolean(options.preservePending),\n          synced_quantity_count: syncedQuantities.size,\n          attempt\n        });\n        return;\n      } catch (error) {\n        lastError = error;\n        cartDebug(\"cart_fetch_error\", {\n          endpoint: \"/cart.js\",\n          duration_ms: Math.round(performance.now() - started),\n          error: error?.message || String(error),\n          attempt\n        });\n        if (attempt < attempts) await delay(180 * attempt);\n      }\n    }\n\n    throw lastError || new Error(\"Cart fetch failed.\");\n  }\n\n  function clearCartSyncTimer() {\n    if (cartSyncTimer) window.clearTimeout(cartSyncTimer);\n    cartSyncTimer = null;\n  }\n\n  function handleCartSyncError(error) {\n    console.error(\"[DCO] Cart update failed\", error);\n    cartDebug(\"cart_sync_error_handler\", {\n      error: error?.message || String(error)\n    });\n    fetchCart({ preservePending: true })\n      .then(() => {\n        if (desiredQuantities.size === 0) {\n          cartSyncFailureCount = 0;\n          clearWarnings();\n          cartDebug(\"cart_sync_recovered\", {\n            retry_count: cartSyncFailureCount\n          });\n          return;\n        }\n        if (desiredQuantities.size > 0 && cartSyncFailureCount < 2) {\n          cartSyncFailureCount += 1;\n          cartDebug(\"cart_sync_retry_scheduled\", {\n            retry_count: cartSyncFailureCount\n          });\n          scheduleCartSync(null, 300 * cartSyncFailureCount + Math.floor(Math.random() * 200));\n          return;\n        }\n        // Retries exhausted: drop the unconfirmable change and reconcile to the server\n        // cart so the customer is not wedged out of checkout by a transient failure.\n        desiredQuantities.clear();\n        cartSyncFailureCount = 0;\n        showCartError(strings.cartError);\n        fetchCart().catch(() => render());\n      })\n      .catch(() => {\n        if (desiredQuantities.size > 0 && cartSyncFailureCount < 2) {\n          cartSyncFailureCount += 1;\n          scheduleCartSync(null, 400 * cartSyncFailureCount + Math.floor(Math.random() * 200));\n          return;\n        }\n        // Retries exhausted: drop the unconfirmable change and reconcile to the server\n        // cart so the customer is not wedged out of checkout by a transient failure.\n        desiredQuantities.clear();\n        cartSyncFailureCount = 0;\n        showCartError(strings.cartError);\n        fetchCart().catch(() => render());\n      });\n  }\n\n  function scheduleCartSync(variantId, delay = 180) {\n    if (!variantId && desiredQuantities.size === 0) return;\n\n    if (cartSyncPromise) {\n      cartSyncDirty = true;\n      cartDebug(\"cart_sync_mark_dirty\", {\n        variant_id: variantId ? String(variantId) : \"\",\n        delay_ms: delay\n      });\n      return;\n    }\n\n    clearCartSyncTimer();\n    cartDebug(\"cart_sync_scheduled\", {\n      variant_id: variantId ? String(variantId) : \"\",\n      delay_ms: delay\n    });\n    cartSyncTimer = window.setTimeout(() => {\n      cartSyncTimer = null;\n      syncPendingQuantities().catch(handleCartSyncError);\n    }, delay);\n  }\n\n  function syncBackoff(attempt) {\n    return 220 * attempt + Math.floor(Math.random() * 160);\n  }\n\n  function buildPendingUpdates() {\n    cleanupDesiredQuantities();\n    const updates = {};\n    const entries = [];\n    desiredQuantities.forEach((desired, id) => {\n      if (desired === (syncedQuantities.get(id) || 0)) return;\n      const line = cart.items.find((item) => cartItemId(item) === id);\n      const updateKey = line?.key || id;\n      updates[updateKey] = desired;\n      entries.push({\n        variant_id: id,\n        desired_quantity: desired,\n        synced_quantity: syncedQuantities.get(id) || 0,\n        update_key_type: line?.key ? \"line_key\" : \"variant_id\"\n      });\n    });\n    return { updates, entries };\n  }\n\n  // One /cart/update.js request for every pending line, instead of one request per\n  // line. Batching keeps a multi-item cart edit to a single round-trip so a retry can\n  // no longer fan out into the request storm that triggers Shopify cart throttling.\n  async function syncCartUpdates() {\n    let lastError = null;\n    for (let attempt = 1; attempt <= 2; attempt += 1) {\n      const { updates, entries } = buildPendingUpdates();\n      const keys = Object.keys(updates);\n      if (!keys.length) return;\n\n      const started = performance.now();\n      cartDebug(\"quantity_sync_start\", {\n        endpoint: \"/cart/update.js\",\n        batch_size: keys.length,\n        items: entries,\n        attempt\n      });\n\n      try {\n        const response = await fetch(\"/cart/update.js\", {\n          credentials: \"same-origin\",\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n          body: JSON.stringify({ updates })\n        });\n        cartDebug(\"quantity_sync_response\", {\n          endpoint: \"/cart/update.js\",\n          batch_size: keys.length,\n          ok: response.ok,\n          status: response.status,\n          duration_ms: Math.round(performance.now() - started),\n          attempt\n        });\n        if (!response.ok) throw new Error(`Cart update failed: ${response.status}`);\n\n        const payload = await response.json().catch(() => null);\n        if (isCartPayload(payload)) {\n          applyCartPayload(payload, { preservePending: true });\n        } else {\n          await fetchCart({ preservePending: true, attempts: 2 });\n        }\n        document.dispatchEvent(new CustomEvent(\"cart:build\"));\n        document.dispatchEvent(new CustomEvent(\"cart:updated\", { detail: { cart } }));\n        cartDebug(\"quantity_sync_complete\", {\n          batch_size: keys.length,\n          still_pending: desiredQuantities.size,\n          attempt\n        });\n        return;\n      } catch (error) {\n        lastError = error;\n        cartDebug(\"quantity_sync_error\", {\n          endpoint: \"/cart/update.js\",\n          batch_size: keys.length,\n          duration_ms: Math.round(performance.now() - started),\n          error: error?.message || String(error),\n          attempt\n        });\n        if (attempt < 2) await delay(syncBackoff(attempt));\n      }\n    }\n\n    throw lastError || new Error(\"Cart update failed.\");\n  }\n\n  async function syncPendingQuantities() {\n    clearCartSyncTimer();\n\n    if (cartSyncPromise) {\n      cartSyncDirty = true;\n      return cartSyncPromise;\n    }\n\n    const promise = (async () => {\n      let guard = 0;\n\n      cartDebug(\"cart_sync_loop_start\", {\n        guard_limit: 6\n      });\n\n      while ((desiredQuantities.size > 0 || cartSyncDirty) && guard < 6) {\n        cartSyncDirty = false;\n        cleanupDesiredQuantities();\n        if (desiredQuantities.size === 0) break;\n\n        await syncCartUpdates();\n\n        cleanupDesiredQuantities();\n        guard += 1;\n      }\n\n      if (desiredQuantities.size > 0) {\n        throw new Error(\"Cart quantities did not finish syncing.\");\n      }\n\n      cartDebug(\"cart_sync_loop_complete\", {\n        guard_count: guard\n      });\n      cartSyncFailureCount = 0;\n    })();\n\n    cartSyncPromise = promise;\n    try {\n      await promise;\n    } finally {\n      if (cartSyncPromise === promise) cartSyncPromise = null;\n      if (cartSyncDirty && desiredQuantities.size > 0) scheduleCartSync(null, 0);\n    }\n\n    return promise;\n  }\n\n  function changeQuantity(variantId, quantity, trigger = \"quantity_control\") {\n    // Sold-out items render disabled controls; this guards the JS-rendered\n    // paths (details modal, cart lines) against adding unavailable variants.\n    const changedProduct = productByVariant.get(String(variantId));\n    if (changedProduct && changedProduct.available === false && quantity > 0) return;\n    const previousQuantity = displayedQuantityFor(variantId);\n    captureScrollBeforeQuantityChange();\n    clearWarnings();\n    applyOptimisticQuantity(variantId, quantity);\n    if (quantity !== previousQuantity) {\n      trackEvent(\"dco_quantity_changed\", {\n        trigger,\n        ...analyticsProductPayload(variantId),\n        previous_quantity: previousQuantity,\n        quantity,\n        quantity_delta: quantity - previousQuantity\n      });\n    }\n    scheduleCartSync(variantId);\n  }\n\n  async function flushPendingQuantities() {\n    clearCartSyncTimer();\n\n    let guard = 0;\n    while ((desiredQuantities.size > 0 || cartSyncPromise) && guard < 8) {\n      if (cartSyncPromise) {\n        await cartSyncPromise;\n      } else {\n        await syncPendingQuantities();\n      }\n      cleanupDesiredQuantities();\n      guard += 1;\n    }\n\n    if (desiredQuantities.size > 0 || cartSyncPromise) {\n      throw new Error(\"Cart quantities are still syncing.\");\n    }\n  }\n\n  async function cleanLegacyCheckoutProperties() {\n    const lines = Array.isArray(cart.items)\n      ? cart.items\n        .map((item) => ({ item, properties: cleanLegacyLineProperties(item) }))\n        .filter((entry) => entry.properties)\n      : [];\n    if (!lines.length) return;\n\n    for (const { item, properties } of lines) {\n      const response = await fetch(\"/cart/change.js\", {\n        credentials: \"same-origin\",\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n        body: JSON.stringify({\n          id: item.key || item.id,\n          quantity: item.quantity,\n          properties\n        })\n      });\n      if (!response.ok) throw new Error(`Legacy checkout property cleanup failed: ${response.status}`);\n    }\n\n    await fetchCart({ preservePending: true });\n  }\n\n  function currentNote() {\n    if (!nodes.notes.length) return syncedNote || cart.note || \"\";\n    return nodes.notes[0]?.value || \"\";\n  }\n\n  async function clearRetiredPromo() {\n    if (retiredPromoCleanupPromise) return retiredPromoCleanupPromise;\n    if (!cartHasRetiredPromo(cart)) return;\n\n    const sourceNote = noteDirty ? currentNote() : (cart.note || syncedNote || \"\");\n    const note = withoutRetiredPromoNote(sourceNote);\n    const attributes = { ...(cart.attributes || {}) };\n    retiredPromoAttributes.forEach((attribute) => {\n      attributes[attribute] = \"\";\n    });\n\n    const promise = (async () => {\n      let response = null;\n      let lastError = null;\n      for (let attempt = 1; attempt <= 2; attempt += 1) {\n        try {\n          response = await fetch(\"/cart/update.js\", {\n            credentials: \"same-origin\",\n            method: \"POST\",\n            headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n            body: JSON.stringify({ attributes, note })\n          });\n          if (response.ok) break;\n          lastError = new Error(`Retired promotion cleanup failed: ${response.status}`);\n        } catch (error) {\n          lastError = error;\n        }\n        if (attempt < 2) await delay(220);\n      }\n\n      if (!response?.ok) throw lastError || new Error(\"Retired promotion cleanup failed.\");\n      const payload = await response.json();\n      applyCartPayload(payload, { preservePending: true });\n      const currentNoteAfterCleanup = currentNote();\n      const customerEditedDuringCleanup = currentNoteAfterCleanup !== sourceNote;\n      const visibleNote = customerEditedDuringCleanup\n        ? withoutRetiredPromoNote(currentNoteAfterCleanup)\n        : (payload.note || note);\n\n      syncedNote = payload.note || note;\n      cart.note = syncedNote;\n      nodes.notes.forEach((node) => {\n        if (node.value !== visibleNote) node.value = visibleNote;\n      });\n      noteDirty = visibleNote !== syncedNote;\n    })();\n\n    retiredPromoCleanupPromise = promise;\n    try {\n      await promise;\n    } finally {\n      if (retiredPromoCleanupPromise === promise) retiredPromoCleanupPromise = null;\n    }\n\n    if (noteDirty) await syncNote();\n  }\n\n  function clearNoteSyncTimer() {\n    if (noteSyncTimer) window.clearTimeout(noteSyncTimer);\n    noteSyncTimer = null;\n  }\n\n  function scheduleNoteSync(delay = 700) {\n    clearNoteSyncTimer();\n    noteDirty = currentNote() !== syncedNote;\n    if (!noteDirty) return;\n\n    noteSyncTimer = window.setTimeout(() => {\n      noteSyncTimer = null;\n      syncNote().catch((error) => {\n        console.error(\"[DCO] Cart note update failed\", error);\n      });\n    }, delay);\n  }\n\n  async function syncNote() {\n    clearNoteSyncTimer();\n\n    if (noteSyncPromise) {\n      await noteSyncPromise;\n      if (currentNote() === syncedNote) {\n        noteDirty = false;\n        return;\n      }\n    }\n\n    const note = currentNote();\n    if (note === syncedNote) {\n      noteDirty = false;\n      return;\n    }\n\n    const promise = (async () => {\n      let response = null;\n      let lastError = null;\n      for (let attempt = 1; attempt <= 2; attempt += 1) {\n        try {\n          response = await fetch(\"/cart/update.js\", {\n            credentials: \"same-origin\",\n            method: \"POST\",\n            headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n            body: JSON.stringify({ note })\n          });\n          if (response.ok) break;\n          lastError = new Error(`Cart note update failed: ${response.status}`);\n        } catch (error) {\n          lastError = error;\n        }\n        if (attempt < 2) await delay(220);\n      }\n      if (!response?.ok) throw lastError || new Error(\"Cart note update failed.\");\n      syncedNote = note;\n      cart.note = note;\n      noteDirty = currentNote() !== syncedNote;\n    })();\n\n    noteSyncPromise = promise;\n    try {\n      await promise;\n    } finally {\n      if (noteSyncPromise === promise) noteSyncPromise = null;\n    }\n\n    if (currentNote() !== syncedNote) await syncNote();\n  }\n\n  async function updateNote() {\n    if (!nodes.notes.length) return;\n    await syncNote();\n  }\n\n  async function syncLanguagePreference() {\n    if (languagePreferenceSyncPromise) return languagePreferenceSyncPromise;\n    if (cartHasPreferredLanguage(cart)) return;\n\n    const attributes = {\n      ...(cart.attributes || {}),\n      [preferredLanguageAttribute]: preferredLanguageLabel,\n      [preferredLocaleAttribute]: preferredLocale\n    };\n\n    const promise = (async () => {\n      let response = null;\n      let lastError = null;\n      for (let attempt = 1; attempt <= 2; attempt += 1) {\n        try {\n          response = await fetch(\"/cart/update.js\", {\n            credentials: \"same-origin\",\n            method: \"POST\",\n            headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n            body: JSON.stringify({ attributes })\n          });\n          if (response.ok) break;\n          lastError = new Error(`Language preference update failed: ${response.status}`);\n        } catch (error) {\n          lastError = error;\n        }\n        if (attempt < 2) await delay(220);\n      }\n\n      if (!response?.ok) throw lastError || new Error(\"Language preference update failed.\");\n      const payload = await response.json();\n      applyCartPayload(payload, { preservePending: true });\n    })();\n\n    languagePreferenceSyncPromise = promise;\n    try {\n      await promise;\n    } finally {\n      if (languagePreferenceSyncPromise === promise) languagePreferenceSyncPromise = null;\n    }\n  }\n\n  async function updateLanguagePreference() {\n    await syncLanguagePreference();\n  }\n\n  function clearQuantityTimer(input) {\n    const variantId = input.dataset.dcoQtyInput;\n    const timer = quantityTimers.get(variantId);\n    if (timer) window.clearTimeout(timer);\n    quantityTimers.delete(variantId);\n  }\n\n  function commitQuantityInput(input) {\n    clearQuantityTimer(input);\n    const variantId = input.dataset.dcoQtyInput;\n    const qty = normalizeQuantity(input.value, input.dataset.step);\n    input.value = qty;\n    if (qty !== displayedQuantityFor(variantId)) changeQuantity(variantId, qty, \"quantity_input\");\n  }\n\n  function scheduleQuantityInput(input) {\n    clearQuantityTimer(input);\n    if (input.value.trim() === \"\") return;\n    const variantId = input.dataset.dcoQtyInput;\n    quantityTimers.set(variantId, window.setTimeout(() => {\n      commitQuantityInput(input);\n    }, 450));\n  }\n\n  function renderProductInputs() {\n    productNodes.forEach((group, id) => {\n      const qty = displayedQuantityFor(id);\n      const value = String(qty);\n      const liveInputs = [...new Set([\n        ...group.inputs,\n        ...root.querySelectorAll(`[data-dco-qty-input=\"${id}\"]`)\n      ])];\n      liveInputs.forEach((input) => {\n        if (document.activeElement !== input && input.value !== value) input.value = value;\n      });\n      group.cards.forEach((card) => {\n        const isSelected = qty > 0;\n        if (card.classList.contains(\"is-selected\") !== isSelected) {\n          card.classList.toggle(\"is-selected\", isSelected);\n        }\n      });\n    });\n  }\n\n  function renderLines() {\n    const items = displayCartItems();\n    const structure = items.length ? items.map((item) => String(item.id)).join(\"|\") : \"empty\";\n\n    if (structure !== renderedLineStructure) {\n      const html = items.length\n        ? items.map((item) => {\n            const id = String(item.id);\n            const product = productByVariant.get(id);\n            const step = product ? Number(product.step || 1) : 1;\n            const titleText = cartItemTitle(item);\n            const title = escapeHtml(titleText);\n            const meta = escapeHtml(`${item.quantity} \u00D7 ${money(item.final_price)}`);\n            return `\n              <div class=\"dco-cart-line\" data-dco-cart-line=\"${escapeHtml(id)}\">\n                <div>\n                  <div class=\"dco-cart-line__title\" data-dco-line-title>${title}</div>\n                  <div class=\"dco-cart-line__meta\" data-dco-line-meta>${meta}</div>\n                </div>\n                <div class=\"dco-cart-line__controls\">\n                  <div class=\"dco-cart-qty\">\n                    <button type=\"button\" data-dco-minus=\"${escapeHtml(id)}\" aria-label=\"${escapeHtml(`${strings.decrease} ${titleText}`)}\">\u2212</button>\n                    <input type=\"tel\" inputmode=\"numeric\" pattern=\"[0-9]*\" value=\"${escapeHtml(item.quantity)}\" data-dco-qty-input=\"${escapeHtml(id)}\" data-step=\"${escapeHtml(step)}\" aria-label=\"${escapeHtml(`${strings.chooseQuantity} ${titleText}`)}\">\n                    <button type=\"button\" data-dco-plus=\"${escapeHtml(id)}\" aria-label=\"${escapeHtml(`${strings.increase} ${titleText}`)}\">+</button>\n                  </div>\n                  <button class=\"dco-cart-line__remove\" type=\"button\" data-dco-remove=\"${escapeHtml(id)}\" aria-label=\"${escapeHtml(`${strings.remove} ${titleText}`)}\">\u00D7</button>\n                </div>\n              </div>\n            `;\n          }).join(\"\")\n        : `<div class=\"dco-empty\">${strings.empty}</div>`;\n\n      nodes.cartLines.forEach((node) => {\n        node.innerHTML = html;\n      });\n      renderedLineStructure = structure;\n      return;\n    }\n\n    if (!items.length) return;\n\n    nodes.cartLines.forEach((container) => {\n      items.forEach((item) => {\n        const id = String(item.id);\n        const line = container.querySelector(`[data-dco-cart-line=\"${id}\"]`);\n        if (!line) return;\n        const title = cartItemTitle(item);\n        const titleNode = line.querySelector(\"[data-dco-line-title]\");\n        if (titleNode && titleNode.textContent !== title) titleNode.textContent = title;\n        const meta = `${item.quantity} \u00D7 ${money(item.final_price)}`;\n        const metaNode = line.querySelector(\"[data-dco-line-meta]\");\n        if (metaNode && metaNode.textContent !== meta) metaNode.textContent = meta;\n        const input = line.querySelector(\"[data-dco-qty-input]\");\n        const value = String(item.quantity);\n        if (input && document.activeElement !== input && input.value !== value) input.value = value;\n      });\n    });\n  }\n\n  function renderSummary() {\n    const summary = displayCartSummary();\n    const total = summary.total;\n    const count = summary.count;\n    announceCartSummary(total, count);\n    const shippingValue = total >= shipping ? strings.free : money(shippingFee);\n    const earnedGiftTier = giftTier(total);\n    const reachedGift = Boolean(earnedGiftTier);\n    const showGiftRow = gift > 0 && total >= minimum;\n    const checkoutText = checkoutHandoffActive\n      ? strings.checkoutLoading\n      : total >= minimum ? strings.checkout : template(strings.locked, minimum - total);\n    const state = milestoneState(total);\n    const earnedGiftThreshold = reachedGift ? currentGiftThreshold(total) : gift;\n    const repeatingGiftText = giftDescription(reachedGift ? total : gift);\n    const giftValue = reachedGift\n      ? giftDescription(total)\n      : template(strings.giftNudge, gift - total);\n\n    setText(nodes.counts, `${count} ${strings.items}`);\n    setText(nodes.headerCountBadges, String(count));\n    setText(nodes.headerSubtotals, money(total));\n    setText(nodes.subtotals, money(total));\n    setText(nodes.shipping, shippingValue);\n    nodes.shipping.forEach((node) => {\n      const row = node.closest(\".dco-summary-row\");\n      if (row && row.classList.contains(\"is-free\") !== (total >= shipping)) {\n        row.classList.toggle(\"is-free\", total >= shipping);\n      }\n      if (row) renderShipHint(row, total);\n    });\n    renderRewardMessage(nodes.messages, milestoneMessage(total), (node) => node.classList.contains(\"dco-cart-message\"));\n    renderRewardMessage(nodes.bottomMessages, bottomMessage(total));\n    setText(nodes.checkouts, checkoutText);\n    nodes.checkoutButtons.forEach((node) => {\n      node.disabled = false;\n      node.removeAttribute(\"disabled\");\n      node.classList.toggle(\"is-loading\", checkoutHandoffActive);\n      if (checkoutHandoffActive) {\n        node.setAttribute(\"aria-busy\", \"true\");\n        node.setAttribute(\"aria-disabled\", \"true\");\n      } else {\n        node.removeAttribute(\"aria-busy\");\n        node.removeAttribute(\"aria-disabled\");\n      }\n    });\n    nodes.checkoutCounts.forEach((node) => {\n      const showCount = !checkoutHandoffActive && total >= minimum && count > 0;\n      const countText = `\u00B7 ${count} ${strings.items}`;\n      if (node.textContent !== countText) node.textContent = countText;\n      if (node.hidden !== !showCount) node.hidden = !showCount;\n    });\n    nodes.headerCarts.forEach((node) => {\n      const label = locale === \"en\"\n        ? `Open cart, ${count} ${strings.items}, ${money(total)}`\n        : `M\u1EDF gi\u1ECF h\u00E0ng, ${count} ${strings.items}, ${money(total)}`;\n      if (node.getAttribute(\"aria-label\") !== label) node.setAttribute(\"aria-label\", label);\n      node.classList.toggle(\"has-items\", count > 0);\n    });\n    if (root.dataset.dcoMilestone !== state) root.dataset.dcoMilestone = state;\n\n    nodes.giftRows.forEach((node) => {\n      if (node.classList.contains(\"is-hidden\") === showGiftRow) node.classList.toggle(\"is-hidden\", !showGiftRow);\n      node.classList.toggle(\"is-earned\", reachedGift);\n      node.classList.toggle(\"is-pending\", showGiftRow && !reachedGift);\n    });\n    setText(nodes.giftValues, giftValue);\n\n    const fillTransform = `scaleX(${progress(total) / 100})`;\n    nodes.promoFills.forEach((node) => {\n      if (node.style.transform !== fillTransform) node.style.transform = fillTransform;\n    });\n\n    nodes.repeatingGiftMarkers.forEach((node) => {\n      const markerValue = String(earnedGiftThreshold);\n      if (node.dataset.dcoPromoMarker !== markerValue) node.dataset.dcoPromoMarker = markerValue;\n    });\n    setText(nodes.repeatingGiftLabels, locale === \"en\" ? `Get ${repeatingGiftText}` : `T\u1EB7ng ${repeatingGiftText}`);\n    setText(nodes.repeatingGiftValues, money(earnedGiftThreshold));\n    nodes.repeatingGiftTiers.forEach((node) => {\n      const tierValue = String(earnedGiftThreshold);\n      if (node.dataset.dcoTier !== tierValue) node.dataset.dcoTier = tierValue;\n    });\n\n    nodes.promoMarkers.forEach((node) => {\n      const tier = Number(node.dataset.dcoPromoMarker || 0);\n      const goal = promoGoalFor(total);\n      const left = goal > 0 ? Math.max(0, Math.min(100, (tier / goal) * 100)) : 100;\n      const leftValue = `${left}%`;\n      if (node.style.getPropertyValue(\"--dco-marker-left\") !== leftValue) {\n        node.style.setProperty(\"--dco-marker-left\", leftValue);\n      }\n      if (node.classList.contains(\"is-active\") !== (total >= tier)) {\n        node.classList.toggle(\"is-active\", total >= tier);\n      }\n    });\n\n    nodes.tiers.forEach((node) => {\n      const isActive = total >= Number(node.dataset.dcoTier);\n      if (node.classList.contains(\"is-active\") !== isActive) node.classList.toggle(\"is-active\", isActive);\n    });\n\n    maybeTrackMilestones(total);\n  }\n\n  function render() {\n    renderProductInputs();\n    renderLines();\n    renderSummary();\n    updateTopMilestoneVisibility();\n  }\n\n  function sheetDragDistance(distance) {\n    if (distance <= 0) return 0;\n    if (distance <= 150) return distance;\n    return 150 + (distance - 150) * 0.32;\n  }\n\n  function setSheetDrag(node, distance) {\n    if (!node) return;\n    const drag = sheetDragDistance(distance);\n    node.style.setProperty(\"--dco-sheet-translate-y\", `${drag}px`);\n    node.classList.toggle(\"is-dragging\", drag > 0);\n  }\n\n  function resetSheetDrag(node) {\n    if (!node) return;\n    node.classList.remove(\"is-dragging\", \"is-dismissing\");\n    node.style.removeProperty(\"--dco-sheet-translate-y\");\n  }\n\n  function dismissSheet(node, closeCallback) {\n    if (!node) {\n      closeCallback();\n      return;\n    }\n    const dismissDistance = Math.ceil(node.getBoundingClientRect().height + 32);\n    node.classList.remove(\"is-dragging\");\n    node.classList.add(\"is-dismissing\");\n    node.getBoundingClientRect();\n    window.requestAnimationFrame(() => {\n      node.style.setProperty(\"--dco-sheet-translate-y\", `${dismissDistance}px`);\n    });\n    window.setTimeout(() => {\n      closeCallback();\n      resetSheetDrag(node);\n    }, 320);\n  }\n\n  function shouldIgnoreSheetSwipe(target) {\n    return Boolean(target?.closest?.(\"input, textarea, select, option\"));\n  }\n\n  function isDismissSwipe(totalY, totalX) {\n    return totalY > 10 && Math.abs(totalY) > Math.abs(totalX) * 1.25;\n  }\n\n  let lastDrawerTrigger = null;\n  let liveRegion = null;\n  let lastAnnouncement = \"\";\n  let announceTimer = null;\n  const focusableSelector = 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n  function focusableWithin(container) {\n    if (!container) return [];\n    return [...container.querySelectorAll(focusableSelector)].filter(\n      (el) => el.offsetWidth > 0 || el.offsetHeight > 0 || el === document.activeElement\n    );\n  }\n\n  function trapFocusKeydown(event, container) {\n    if (event.key !== \"Tab\" || !container || !container.classList.contains(\"is-open\")) return;\n    const focusables = focusableWithin(container);\n    if (!focusables.length) return;\n    const first = focusables[0];\n    const last = focusables[focusables.length - 1];\n    if (event.shiftKey && (document.activeElement === first || !container.contains(document.activeElement))) {\n      event.preventDefault();\n      last.focus();\n    } else if (!event.shiftKey && (document.activeElement === last || !container.contains(document.activeElement))) {\n      event.preventDefault();\n      first.focus();\n    }\n  }\n\n  function setOverlayBackgroundInert(isInert) {\n    [nodes.hero, nodes.topMilestone, nodes.orderInner].forEach((el) => {\n      if (!el) return;\n      if (isInert) {\n        el.setAttribute(\"inert\", \"\");\n        el.setAttribute(\"aria-hidden\", \"true\");\n      } else {\n        el.removeAttribute(\"inert\");\n        el.removeAttribute(\"aria-hidden\");\n      }\n    });\n  }\n\n  function refreshOverlayState() {\n    const drawerOpen = nodes.drawer?.classList.contains(\"is-open\");\n    const detailsOpen = nodes.detailsModal?.classList.contains(\"is-open\");\n    setOverlayBackgroundInert(Boolean(drawerOpen || detailsOpen));\n  }\n\n  function focusFirstIn(container, preferredSelector) {\n    if (!container) return;\n    const focusTarget = () => {\n      if (!container.classList.contains(\"is-open\")) return;\n      const target = (preferredSelector && container.querySelector(preferredSelector)) || focusableWithin(container)[0] || container;\n      if (!target || container.contains(document.activeElement)) return;\n      try { target.focus({ preventScroll: true }); } catch (error) { target.focus?.(); }\n    };\n    window.requestAnimationFrame(focusTarget);\n    window.setTimeout(focusTarget, 90);\n  }\n\n  function restoreFocusTo(element) {\n    if (element && document.contains(element)) {\n      try { element.focus({ preventScroll: true }); } catch (error) { element.focus(); }\n    }\n  }\n\n  function ensureLiveRegion() {\n    if (liveRegion) return liveRegion;\n    liveRegion = document.createElement(\"div\");\n    liveRegion.className = \"dco-sr-only\";\n    liveRegion.setAttribute(\"aria-live\", \"polite\");\n    liveRegion.setAttribute(\"aria-atomic\", \"true\");\n    root.appendChild(liveRegion);\n    return liveRegion;\n  }\n\n  function announceCartSummary(total, count) {\n    const region = ensureLiveRegion();\n    const message = locale === \"en\"\n      ? `Cart ${money(total)}, ${count} ${strings.items}. ${nextMilestoneText(total)}`\n      : `Gi\u1ECF h\u00E0ng ${money(total)}, ${count} ${strings.items}. ${nextMilestoneText(total)}`;\n    if (message === lastAnnouncement) return;\n    lastAnnouncement = message;\n    window.clearTimeout(announceTimer);\n    announceTimer = window.setTimeout(() => { region.textContent = message; }, 500);\n  }\n\n  function openDrawer(trigger = \"cart_button\") {\n    const alreadyOpen = nodes.drawer?.classList.contains(\"is-open\");\n    if (!alreadyOpen) lastDrawerTrigger = document.activeElement;\n    updateVisualViewportHeight();\n    window.setTimeout(updateVisualViewportHeight, 120);\n    window.setTimeout(updateVisualViewportHeight, 360);\n    resetSheetDrag(nodes.drawer);\n    if (nodes.drawerBody) nodes.drawerBody.scrollTop = 0;\n    lockDrawerPageScroll();\n    nodes.drawer?.classList.add(\"is-open\");\n    nodes.drawer?.removeAttribute(\"inert\");\n    nodes.drawer?.setAttribute(\"aria-hidden\", \"false\");\n    nodes.drawerBackdrop?.classList.add(\"is-open\");\n    refreshOverlayState();\n    focusFirstIn(nodes.drawer, \"[data-dco-close-cart]\");\n    if (!alreadyOpen) trackEvent(\"dco_cart_opened\", { trigger });\n  }\n\n  function closeDrawer() {\n    const wasOpen = nodes.drawer?.classList.contains(\"is-open\");\n    root.classList.remove(\"is-drawer-note-focused\");\n    resetSheetDrag(nodes.drawer);\n    nodes.drawer?.classList.remove(\"is-open\");\n    nodes.drawer?.setAttribute(\"inert\", \"\");\n    nodes.drawer?.setAttribute(\"aria-hidden\", \"true\");\n    nodes.drawerBackdrop?.classList.remove(\"is-open\");\n    unlockDrawerPageScroll();\n    refreshOverlayState();\n    if (wasOpen) {\n      restoreFocusTo(lastDrawerTrigger);\n      lastDrawerTrigger = null;\n    }\n  }\n\n  function closeDrawerAnimated() {\n    if (nodes.drawer?.classList.contains(\"is-dismissing\")) return;\n    if (!nodes.drawer?.classList.contains(\"is-open\")) {\n      closeDrawer();\n      return;\n    }\n    dismissSheet(nodes.drawer, closeDrawer);\n  }\n\n  function lockDrawerPageScroll() {\n    if (drawerScrollLocked) return;\n    drawerScrollY = window.scrollY || document.documentElement.scrollTop || 0;\n    drawerHtmlScrollSnapshot = {\n      overflow: document.documentElement.style.overflow,\n      height: document.documentElement.style.height\n    };\n    drawerBodyScrollSnapshot = {\n      position: document.body.style.position,\n      top: document.body.style.top,\n      left: document.body.style.left,\n      right: document.body.style.right,\n      width: document.body.style.width,\n      overflow: document.body.style.overflow,\n      height: document.body.style.height\n    };\n    document.documentElement.classList.add(\"dco-drawer-scroll-locked\");\n    document.body.classList.add(\"dco-drawer-scroll-locked\");\n    document.body.style.setProperty(\"--dco-drawer-page-offset\", `-${drawerScrollY}px`);\n    document.body.style.setProperty(\"--dco-drawer-page-height\", `${Math.max(document.documentElement.scrollHeight, document.body.scrollHeight)}px`);\n    window.requestAnimationFrame(() => window.scrollTo(0, drawerScrollY));\n    window.setTimeout(() => window.scrollTo(0, drawerScrollY), 0);\n    document.addEventListener(\"pointerdown\", handleDrawerPointerStart, { passive: true });\n    document.addEventListener(\"pointermove\", handleDrawerPointerMove, { passive: false });\n    document.addEventListener(\"pointerup\", handleDrawerPointerEnd, { passive: true });\n    document.addEventListener(\"pointercancel\", handleDrawerPointerEnd, { passive: true });\n    document.addEventListener(\"touchstart\", handleDrawerTouchStart, { passive: true });\n    document.addEventListener(\"touchmove\", handleDrawerTouchMove, { passive: false });\n    document.addEventListener(\"touchend\", handleDrawerTouchEnd, { passive: true });\n    document.addEventListener(\"touchcancel\", handleDrawerTouchEnd, { passive: true });\n    document.addEventListener(\"wheel\", handleDrawerWheel, { passive: false });\n    drawerScrollLocked = true;\n  }\n\n  function unlockDrawerPageScroll() {\n    if (!drawerScrollLocked) return;\n    document.removeEventListener(\"touchstart\", handleDrawerTouchStart);\n    document.removeEventListener(\"touchmove\", handleDrawerTouchMove);\n    document.removeEventListener(\"touchend\", handleDrawerTouchEnd);\n    document.removeEventListener(\"touchcancel\", handleDrawerTouchEnd);\n    document.removeEventListener(\"pointerdown\", handleDrawerPointerStart);\n    document.removeEventListener(\"pointermove\", handleDrawerPointerMove);\n    document.removeEventListener(\"pointerup\", handleDrawerPointerEnd);\n    document.removeEventListener(\"pointercancel\", handleDrawerPointerEnd);\n    document.removeEventListener(\"wheel\", handleDrawerWheel);\n    document.documentElement.classList.remove(\"dco-drawer-scroll-locked\");\n    document.body.classList.remove(\"dco-drawer-scroll-locked\");\n    if (drawerHtmlScrollSnapshot) {\n      Object.entries(drawerHtmlScrollSnapshot).forEach(([property, value]) => {\n        document.documentElement.style[property] = value;\n      });\n    }\n    if (drawerBodyScrollSnapshot) {\n      Object.entries(drawerBodyScrollSnapshot).forEach(([property, value]) => {\n        document.body.style[property] = value;\n      });\n    }\n    drawerScrollLocked = false;\n    drawerSwipeActive = false;\n    drawerSwipeDistance = 0;\n    drawerHtmlScrollSnapshot = null;\n    drawerBodyScrollSnapshot = null;\n    document.body.style.removeProperty(\"--dco-drawer-page-offset\");\n    document.body.style.removeProperty(\"--dco-drawer-page-height\");\n    window.scrollTo(0, drawerScrollY);\n  }\n\n  function scrollableDrawerNode(target, intendedDeltaY = 0) {\n    if (!nodes.drawerBody || !target || !nodes.drawerBody.contains(target)) return null;\n\n    let node = target;\n    while (node && node !== nodes.drawerBody && node !== document.body) {\n      if (node instanceof HTMLElement) {\n        const style = window.getComputedStyle(node);\n        const canScroll = /(auto|scroll)/.test(style.overflowY) && node.scrollHeight > node.clientHeight;\n        const atTop = node.scrollTop <= 0;\n        const atBottom = Math.ceil(node.scrollTop + node.clientHeight) >= node.scrollHeight;\n        if (canScroll && (intendedDeltaY === 0 || (intendedDeltaY < 0 && !atTop) || (intendedDeltaY > 0 && !atBottom))) return node;\n      }\n      node = node.parentElement;\n    }\n\n    if (nodes.drawerBody.scrollHeight <= nodes.drawerBody.clientHeight) return null;\n    const atTop = nodes.drawerBody.scrollTop <= 0;\n    const atBottom = Math.ceil(nodes.drawerBody.scrollTop + nodes.drawerBody.clientHeight) >= nodes.drawerBody.scrollHeight;\n    if (intendedDeltaY < 0 && atTop) return null;\n    if (intendedDeltaY > 0 && atBottom) return null;\n    return nodes.drawerBody;\n  }\n\n  function handleDrawerTouchStart(event) {\n    if (!drawerScrollLocked) return;\n    const touch = event.touches?.[0];\n    drawerTouchStartY = touch?.clientY || 0;\n    drawerTouchLastY = drawerTouchStartY;\n    drawerTouchStartX = touch?.clientX || 0;\n    drawerSwipeActive = false;\n    drawerSwipeDistance = 0;\n    resetSheetDrag(nodes.drawer);\n  }\n\n  function handleDrawerTouchMove(event) {\n    if (!drawerScrollLocked) return;\n    const touch = event.touches?.[0];\n    const currentY = touch?.clientY || drawerTouchLastY;\n    const currentX = touch?.clientX || drawerTouchStartX;\n    const totalY = currentY - drawerTouchStartY;\n    const totalX = currentX - drawerTouchStartX;\n    const intendedDeltaY = drawerTouchLastY - currentY;\n\n    if (drawerSwipeActive) {\n      drawerSwipeDistance = Math.max(0, totalY);\n      setSheetDrag(nodes.drawer, drawerSwipeDistance);\n      event.preventDefault();\n      return;\n    }\n\n    const scrollNode = scrollableDrawerNode(event.target, intendedDeltaY);\n    if (!scrollNode && !shouldIgnoreSheetSwipe(event.target) && isDismissSwipe(totalY, totalX)) {\n      drawerSwipeActive = true;\n      drawerSwipeDistance = totalY;\n      setSheetDrag(nodes.drawer, drawerSwipeDistance);\n      event.preventDefault();\n      return;\n    }\n\n    if (!scrollNode) {\n      event.preventDefault();\n      return;\n    }\n\n    drawerTouchLastY = currentY;\n  }\n\n  function handleDrawerTouchEnd() {\n    if (!drawerSwipeActive) return;\n    const shouldClose = drawerSwipeDistance > 88;\n    drawerSwipeActive = false;\n    drawerSwipeDistance = 0;\n    if (shouldClose) {\n      dismissSheet(nodes.drawer, closeDrawer);\n    } else {\n      resetSheetDrag(nodes.drawer);\n    }\n  }\n\n  function handleDrawerPointerStart(event) {\n    if (!drawerScrollLocked || event.pointerType !== \"mouse\" || !nodes.drawer?.contains(event.target)) return;\n    drawerTouchStartY = event.clientY || 0;\n    drawerTouchLastY = drawerTouchStartY;\n    drawerTouchStartX = event.clientX || 0;\n    drawerSwipeActive = false;\n    drawerSwipeDistance = 0;\n    resetSheetDrag(nodes.drawer);\n  }\n\n  function handleDrawerPointerMove(event) {\n    if (!drawerScrollLocked || event.pointerType !== \"mouse\" || (!drawerSwipeActive && !nodes.drawer?.contains(event.target))) return;\n    const currentY = event.clientY || drawerTouchLastY;\n    const currentX = event.clientX || drawerTouchStartX;\n    const totalY = currentY - drawerTouchStartY;\n    const totalX = currentX - drawerTouchStartX;\n    const intendedDeltaY = drawerTouchLastY - currentY;\n\n    if (drawerSwipeActive) {\n      drawerSwipeDistance = Math.max(0, totalY);\n      setSheetDrag(nodes.drawer, drawerSwipeDistance);\n      event.preventDefault();\n      return;\n    }\n\n    const scrollNode = scrollableDrawerNode(event.target, intendedDeltaY);\n    if (!scrollNode && !shouldIgnoreSheetSwipe(event.target) && isDismissSwipe(totalY, totalX)) {\n      drawerSwipeActive = true;\n      drawerSwipeDistance = totalY;\n      setSheetDrag(nodes.drawer, drawerSwipeDistance);\n      event.preventDefault();\n      return;\n    }\n\n    drawerTouchLastY = currentY;\n  }\n\n  function handleDrawerPointerEnd(event) {\n    if (event.pointerType !== \"mouse\") return;\n    handleDrawerTouchEnd();\n  }\n\n  function handleDrawerWheel(event) {\n    if (!drawerScrollLocked) return;\n    const scrollNode = scrollableDrawerNode(event.target, event.deltaY);\n    if (!scrollNode) {\n      event.preventDefault();\n      return;\n    }\n  }\n\n  function lockDetailsPageScroll() {\n    if (detailsScrollLocked) return;\n    detailsScrollX = window.scrollX || document.documentElement.scrollLeft || 0;\n    detailsScrollY = window.scrollY || document.documentElement.scrollTop || 0;\n    detailsUsesFixedScrollLock = isMobileSheetViewport();\n    htmlScrollSnapshot = {\n      overflow: document.documentElement.style.overflow,\n      height: document.documentElement.style.height\n    };\n    bodyScrollSnapshot = {\n      position: document.body.style.position,\n      top: document.body.style.top,\n      left: document.body.style.left,\n      right: document.body.style.right,\n      width: document.body.style.width,\n      overflow: document.body.style.overflow,\n      height: document.body.style.height\n    };\n    document.documentElement.classList.add(\"dco-details-scroll-locked\");\n    document.body.classList.add(\"dco-details-scroll-locked\");\n    document.documentElement.style.overflow = \"hidden\";\n    document.body.style.overflow = \"hidden\";\n    if (detailsUsesFixedScrollLock) {\n      document.documentElement.style.height = \"100%\";\n      document.body.style.position = \"fixed\";\n      document.body.style.top = `-${detailsScrollY}px`;\n      document.body.style.left = \"0\";\n      document.body.style.right = \"0\";\n      document.body.style.width = \"100%\";\n      document.body.style.height = \"100%\";\n    } else {\n      window.requestAnimationFrame(() => window.scrollTo(detailsScrollX, detailsScrollY));\n      window.setTimeout(() => window.scrollTo(detailsScrollX, detailsScrollY), 0);\n    }\n    document.addEventListener(\"touchstart\", handleDetailsTouchStart, { passive: true });\n    document.addEventListener(\"touchmove\", handleDetailsTouchMove, { passive: false });\n    document.addEventListener(\"touchend\", handleDetailsTouchEnd, { passive: true });\n    document.addEventListener(\"touchcancel\", handleDetailsTouchEnd, { passive: true });\n    document.addEventListener(\"wheel\", handleDetailsWheel, { passive: false });\n    detailsScrollLocked = true;\n  }\n\n  function unlockDetailsPageScroll() {\n    if (!detailsScrollLocked) return;\n    const shouldRestoreScrollPosition = detailsUsesFixedScrollLock;\n    document.removeEventListener(\"touchstart\", handleDetailsTouchStart);\n    document.removeEventListener(\"touchmove\", handleDetailsTouchMove);\n    document.removeEventListener(\"touchend\", handleDetailsTouchEnd);\n    document.removeEventListener(\"touchcancel\", handleDetailsTouchEnd);\n    document.removeEventListener(\"wheel\", handleDetailsWheel);\n    document.documentElement.classList.remove(\"dco-details-scroll-locked\");\n    document.body.classList.remove(\"dco-details-scroll-locked\");\n    if (htmlScrollSnapshot) {\n      Object.entries(htmlScrollSnapshot).forEach(([property, value]) => {\n        document.documentElement.style[property] = value;\n      });\n    }\n    if (bodyScrollSnapshot) {\n      Object.entries(bodyScrollSnapshot).forEach(([property, value]) => {\n        document.body.style[property] = value;\n      });\n    }\n    detailsScrollLocked = false;\n    detailsUsesFixedScrollLock = false;\n    detailsSwipeActive = false;\n    detailsSwipeDistance = 0;\n    htmlScrollSnapshot = null;\n    bodyScrollSnapshot = null;\n    if (shouldRestoreScrollPosition) window.scrollTo(detailsScrollX, detailsScrollY);\n  }\n\n  function detailsScrollContainer(target) {\n    return target?.closest?.(\"[data-dco-details-body]\");\n  }\n\n  function handleDetailsTouchStart(event) {\n    if (!detailsScrollLocked) return;\n    const touch = event.touches?.[0];\n    detailsTouchStartY = touch?.clientY || 0;\n    detailsTouchLastY = detailsTouchStartY;\n    detailsTouchStartX = touch?.clientX || 0;\n    detailsSwipeActive = false;\n    detailsSwipeDistance = 0;\n    resetSheetDrag(nodes.detailsModal);\n  }\n\n  function handleDetailsTouchMove(event) {\n    if (!detailsScrollLocked) return;\n    const touch = event.touches?.[0];\n    const currentY = touch?.clientY || detailsTouchLastY;\n    const currentX = touch?.clientX || detailsTouchStartX;\n    const totalY = currentY - detailsTouchStartY;\n    const totalX = currentX - detailsTouchStartX;\n    const intendedDeltaY = detailsTouchLastY - currentY;\n\n    if (detailsSwipeActive) {\n      detailsSwipeDistance = Math.max(0, totalY);\n      setSheetDrag(nodes.detailsModal, detailsSwipeDistance);\n      event.preventDefault();\n      return;\n    }\n\n    const scrollNode = detailsScrollContainer(event.target);\n    const canScroll = scrollNode && scrollNode.scrollHeight > scrollNode.clientHeight;\n    const atTop = !scrollNode || scrollNode.scrollTop <= 0;\n    const atBottom = scrollNode && Math.ceil(scrollNode.scrollTop + scrollNode.clientHeight) >= scrollNode.scrollHeight;\n    if (\n      nodes.detailsModal?.contains(event.target)\n      && !shouldIgnoreSheetSwipe(event.target)\n      && isDismissSwipe(totalY, totalX)\n      && (!scrollNode || !canScroll || (atTop && intendedDeltaY < 0))\n    ) {\n      detailsSwipeActive = true;\n      detailsSwipeDistance = totalY;\n      setSheetDrag(nodes.detailsModal, detailsSwipeDistance);\n      event.preventDefault();\n      return;\n    }\n\n    if (!scrollNode) {\n      event.preventDefault();\n      return;\n    }\n\n    const deltaY = currentY - detailsTouchLastY;\n    detailsTouchLastY = currentY;\n    if (!canScroll || (atTop && deltaY > 0) || (atBottom && deltaY < 0)) event.preventDefault();\n  }\n\n  function handleDetailsTouchEnd() {\n    if (!detailsSwipeActive) return;\n    const shouldClose = detailsSwipeDistance > 88;\n    detailsSwipeActive = false;\n    detailsSwipeDistance = 0;\n    if (shouldClose) {\n      dismissSheet(nodes.detailsModal, closeDetails);\n    } else {\n      resetSheetDrag(nodes.detailsModal);\n    }\n  }\n\n  function handleDetailsPointerStart(event) {\n    if (!detailsScrollLocked || event.pointerType !== \"mouse\" || !nodes.detailsModal?.contains(event.target)) return;\n    detailsTouchStartY = event.clientY || 0;\n    detailsTouchLastY = detailsTouchStartY;\n    detailsTouchStartX = event.clientX || 0;\n    detailsSwipeActive = false;\n    detailsSwipeDistance = 0;\n    resetSheetDrag(nodes.detailsModal);\n  }\n\n  function handleDetailsPointerMove(event) {\n    if (!detailsScrollLocked || event.pointerType !== \"mouse\" || (!detailsSwipeActive && !nodes.detailsModal?.contains(event.target))) return;\n    const currentY = event.clientY || detailsTouchLastY;\n    const currentX = event.clientX || detailsTouchStartX;\n    const totalY = currentY - detailsTouchStartY;\n    const totalX = currentX - detailsTouchStartX;\n    const intendedDeltaY = detailsTouchLastY - currentY;\n\n    if (detailsSwipeActive) {\n      detailsSwipeDistance = Math.max(0, totalY);\n      setSheetDrag(nodes.detailsModal, detailsSwipeDistance);\n      event.preventDefault();\n      return;\n    }\n\n    const scrollNode = detailsScrollContainer(event.target);\n    const canScroll = scrollNode && scrollNode.scrollHeight > scrollNode.clientHeight;\n    const atTop = !scrollNode || scrollNode.scrollTop <= 0;\n    if (\n      !shouldIgnoreSheetSwipe(event.target)\n      && isDismissSwipe(totalY, totalX)\n      && (!scrollNode || !canScroll || (atTop && intendedDeltaY < 0))\n    ) {\n      detailsSwipeActive = true;\n      detailsSwipeDistance = totalY;\n      setSheetDrag(nodes.detailsModal, detailsSwipeDistance);\n      event.preventDefault();\n      return;\n    }\n\n    detailsTouchLastY = currentY;\n  }\n\n  function handleDetailsPointerEnd(event) {\n    if (event.pointerType !== \"mouse\") return;\n    handleDetailsTouchEnd();\n  }\n\n  function handleDetailsWheel(event) {\n    if (!detailsScrollLocked) return;\n    const scrollNode = detailsScrollContainer(event.target);\n    if (!scrollNode) {\n      event.preventDefault();\n      return;\n    }\n\n    const canScroll = scrollNode.scrollHeight > scrollNode.clientHeight;\n    const atTop = scrollNode.scrollTop <= 0;\n    const atBottom = Math.ceil(scrollNode.scrollTop + scrollNode.clientHeight) >= scrollNode.scrollHeight;\n    if (!canScroll || (atTop && event.deltaY < 0) || (atBottom && event.deltaY > 0)) event.preventDefault();\n  }\n\n  function detailFact(label, value) {\n    if (!value) return \"\";\n    return `\n      <div class=\"dco-details-modal__fact\">\n        <b>${escapeHtml(label)}</b>\n        <p>${formatText(value)}</p>\n      </div>\n    `;\n  }\n\n  // The real package label (tap to enlarge) plus a link to the product page's\n  // full text panel. Data comes from snippets/dco-care via the product JSON.\n  // Text-only panels (no label photo, e.g. T\u00F4m Kh\u00F4) get just the link.\n  function detailNutrition(product) {\n    if (!product.nutritionImage && !product.hasNutrition) return \"\";\n    const fullPanelLink = `<a class=\"dco-details-modal__nutrition-link\" href=\"${escapeHtml(`${product.url}#dinh-duong`)}\">${escapeHtml(strings.nutritionOpen)}</a>`;\n    if (!product.nutritionImage) {\n      return `\n      <div class=\"dco-details-modal__fact dco-details-modal__nutrition\">\n        <b>${escapeHtml(strings.nutrition)}</b>\n        ${fullPanelLink}\n      </div>\n    `;\n    }\n    const full = String(product.nutritionImage);\n    const thumb = `${full}${full.includes(\"?\") ? \"&\" : \"?\"}width=900`;\n    const alt = `${strings.nutrition}: ${product.title}`;\n    return `\n      <div class=\"dco-details-modal__fact dco-details-modal__nutrition\">\n        <b>${escapeHtml(strings.nutrition)}</b>\n        <a class=\"dco-details-modal__label\" href=\"${escapeHtml(full)}\" target=\"_blank\" rel=\"noopener\">\n          <img src=\"${escapeHtml(thumb)}\" alt=\"${escapeHtml(alt)}\" loading=\"lazy\" width=\"900\" height=\"450\">\n          <span>${escapeHtml(strings.nutritionZoom)}</span>\n        </a>\n        ${fullPanelLink}\n      </div>\n    `;\n  }\n\n  function renderDetailsGallery(product) {\n    const images = Array.isArray(product.images) ? product.images.filter((image) => image && image.src) : [];\n    if (!images.length) return \"\";\n    const first = images[0];\n    const thumbs = images.length > 1\n      ? `<div class=\"dco-details-modal__thumbs\">\n          ${images.map((image, index) => `\n            <button type=\"button\" data-dco-detail-thumb data-src=\"${escapeHtml(image.src)}\" data-alt=\"${escapeHtml(image.alt || product.title)}\" aria-label=\"${escapeHtml(`${product.title} photo ${index + 1}`)}\">\n              <img src=\"${escapeHtml(image.src)}\" alt=\"${escapeHtml(image.alt || product.title)}\" loading=\"lazy\">\n            </button>\n          `).join(\"\")}\n        </div>`\n      : \"\";\n\n    return `\n      <div class=\"dco-details-modal__media\">\n        <img data-dco-details-image src=\"${escapeHtml(first.src)}\" alt=\"${escapeHtml(first.alt || product.title)}\">\n        ${thumbs}\n      </div>\n    `;\n  }\n\n  function renderDetailsActions(product, variantId, qty, step) {\n    if (product.available === false) {\n      return `\n        <div class=\"dco-details-modal__quantity\">\n          <span class=\"dco-details-soldout\">${locale === \"en\" ? \"Sold out \u2014 back soon. Call/text 469-644-4086 to ask when.\" : \"T\u1EA1m h\u1EBFt h\u00E0ng. G\u1ECDi/text 469-644-4086 \u0111\u1EC3 h\u1ECFi ng\u00E0y c\u00F3 l\u1EA1i.\"}</span>\n        </div>\n        <button class=\"dco-details-modal__return\" type=\"button\" data-dco-close-details>${strings.orderMore}</button>\n      `;\n    }\n    return `\n      <div class=\"dco-details-modal__quantity\">\n        <span>${strings.chooseQuantity}</span>\n        <div class=\"dco-qty\" aria-label=\"${escapeHtml(`${strings.chooseQuantity} ${product.title}`)}\">\n          <button type=\"button\" data-dco-minus=\"${escapeHtml(variantId)}\" aria-label=\"${escapeHtml(`${strings.decrease} ${product.title}`)}\">\u2212</button>\n          <input type=\"tel\" inputmode=\"numeric\" pattern=\"[0-9]*\" autocomplete=\"off\" enterkeyhint=\"done\" value=\"${escapeHtml(qty)}\" data-dco-qty-input=\"${escapeHtml(variantId)}\" data-step=\"${escapeHtml(step)}\" aria-label=\"${escapeHtml(`${strings.chooseQuantity} ${product.title}`)}\">\n          <button type=\"button\" data-dco-plus=\"${escapeHtml(variantId)}\" aria-label=\"${escapeHtml(`${strings.increase} ${product.title}`)}\">+</button>\n        </div>\n      </div>\n      <button class=\"dco-details-modal__return\" type=\"button\" data-dco-close-details>${strings.orderMore}</button>\n    `;\n  }\n\n  function openDetails(variantId, trigger) {\n    const product = productByVariant.get(String(variantId));\n    if (!product || !nodes.detailsModal || !nodes.detailsBody) return;\n\n    trackEvent(\"dco_details_opened\", {\n      ...analyticsProductPayload(variantId),\n      quantity: displayedQuantityFor(variantId)\n    });\n    resetSheetDrag(nodes.detailsModal);\n    lastDetailsTrigger = trigger || document.activeElement;\n    const step = Number(product.step || 1);\n    const qty = displayedQuantityFor(variantId);\n    const actions = renderDetailsActions(product, variantId, qty, step);\n    if (nodes.detailsTitle) nodes.detailsTitle.textContent = product.title;\n    nodes.detailsBody.innerHTML = `\n      ${renderDetailsGallery(product)}\n      <div class=\"dco-details-modal__copy\">\n        <div class=\"dco-details-modal__price\">${money(Number(product.price || 0))}</div>\n        ${product.summary ? `<p class=\"dco-details-modal__summary\">${formatText(product.summary)}</p>` : \"\"}\n        <div class=\"dco-details-modal__actions dco-details-modal__actions--inline\">\n          ${actions}\n        </div>\n        <div class=\"dco-details-modal__facts\">\n          ${detailFact(strings.reheating, product.reheating)}\n          ${detailFact(strings.storage, product.storage)}\n          ${detailFact(strings.allergens, product.allergens)}\n          ${detailNutrition(product)}\n        </div>\n      </div>\n    `;\n    if (nodes.detailsFooter) {\n      nodes.detailsFooter.innerHTML = `\n        <div class=\"dco-details-modal__actions dco-details-modal__actions--footer\">\n          ${actions}\n        </div>\n      `;\n    }\n    nodes.detailsBody.scrollTop = 0;\n\n    lockDetailsPageScroll();\n    window.requestAnimationFrame(() => {\n      nodes.detailsModal.classList.add(\"is-open\");\n      nodes.detailsModal.removeAttribute(\"inert\");\n      nodes.detailsModal.setAttribute(\"aria-hidden\", \"false\");\n      nodes.detailsBackdrop?.classList.add(\"is-open\");\n      refreshOverlayState();\n      const closeButton = nodes.detailsModal.querySelector(\"[data-dco-close-details]\");\n      if (closeButton) {\n        try {\n          closeButton.focus({ preventScroll: true });\n        } catch (error) {\n          closeButton.focus();\n        }\n      }\n    });\n    renderProductInputs();\n  }\n\n  function closeDetails() {\n    resetSheetDrag(nodes.detailsModal);\n    nodes.detailsModal?.classList.remove(\"is-open\");\n    nodes.detailsModal?.setAttribute(\"inert\", \"\");\n    nodes.detailsModal?.setAttribute(\"aria-hidden\", \"true\");\n    nodes.detailsBackdrop?.classList.remove(\"is-open\");\n    if (nodes.detailsFooter) nodes.detailsFooter.innerHTML = \"\";\n    unlockDetailsPageScroll();\n    refreshOverlayState();\n    if (lastDetailsTrigger && document.contains(lastDetailsTrigger)) {\n      try {\n        lastDetailsTrigger.focus({ preventScroll: true });\n      } catch (error) {\n        lastDetailsTrigger.focus();\n      }\n    }\n    lastDetailsTrigger = null;\n  }\n\n  function updateDetailsImage(button) {\n    const image = nodes.detailsModal?.querySelector(\"[data-dco-details-image]\");\n    if (!image) return;\n    image.src = button.dataset.src || image.src;\n    image.alt = button.dataset.alt || image.alt;\n  }\n\n  function warningTarget(trigger) {\n    return trigger?.closest(\".dco-cart, .dco-drawer\")?.querySelector(\"[data-dco-warning]\") || nodes.warnings[0];\n  }\n\n  function bringWarningIntoView(node) {\n    if (!node) return;\n    const rect = node.getBoundingClientRect();\n    const isVisible = rect.top >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight);\n    if (!isVisible) node.scrollIntoView({ block: \"nearest\" });\n  }\n\n  function showWarning(trigger) {\n    const target = warningTarget(trigger);\n    const warningText = template(strings.minWarning, { amount: money(minimum - (cart.total_price || 0)), minimum: money(minimum) });\n    nodes.warnings.forEach((node) => {\n      if (node.textContent !== warningText) node.textContent = warningText;\n      if (!node.classList.contains(\"is-visible\")) node.classList.add(\"is-visible\");\n    });\n    bringWarningIntoView(target);\n  }\n\n  function setCheckoutHandoffActive(value) {\n    if (checkoutHandoffActive === value) return;\n    checkoutHandoffActive = value;\n    renderSummary();\n  }\n\n  function startCheckoutHandoffAnimation() {\n    window.clearTimeout(checkoutHandoffTimer);\n    setCheckoutHandoffActive(true);\n    checkoutHandoffTimer = window.setTimeout(() => {\n      checkoutHandoffTimer = null;\n      setCheckoutHandoffActive(false);\n    }, 550);\n  }\n\n  function clearCheckoutHandoffAnimation() {\n    window.clearTimeout(checkoutHandoffTimer);\n    checkoutHandoffTimer = null;\n    checkoutHandoffActive = false;\n    renderSummary();\n  }\n\n  function restoreCheckoutControls() {\n    checkoutRequestActive = false;\n    checkoutHandoffActive = false;\n    window.clearTimeout(checkoutHandoffTimer);\n    checkoutHandoffTimer = null;\n    nodes.checkoutButtons.forEach((node) => {\n      node.disabled = false;\n      node.removeAttribute(\"disabled\");\n      node.classList.remove(\"is-loading\");\n      node.removeAttribute(\"aria-busy\");\n      node.removeAttribute(\"aria-disabled\");\n    });\n    renderSummary();\n  }\n\n  function scheduleCheckoutRestore() {\n    restoreCheckoutControls();\n    window.requestAnimationFrame(restoreCheckoutControls);\n    window.setTimeout(restoreCheckoutControls, 120);\n    window.setTimeout(restoreCheckoutControls, 750);\n  }\n\n  async function checkout(trigger, { skipShipNudge = false } = {}) {\n    const total = cart.total_price || 0;\n    trackEvent(\"dco_checkout_clicked\", {\n      meets_minimum: total >= minimum,\n      missing_minimum_cents: Math.max(0, minimum - total),\n      pending_quantity_count: desiredQuantities.size,\n      note_dirty: noteDirty\n    });\n\n    if (checkoutRequestActive) {\n      startCheckoutHandoffAnimation();\n      return;\n    }\n\n    if (!skipShipNudge && desiredQuantities.size === 0 && !cartSyncPromise && shouldShowShipNudge(total)) {\n      showShipNudge(trigger, total);\n      return;\n    }\n\n    if (total < minimum && desiredQuantities.size === 0 && !cartSyncPromise) {\n      trackEvent(\"dco_checkout_blocked_minimum\", {\n        missing_minimum_cents: minimum - total\n      });\n      showWarning(trigger);\n      return;\n    }\n\n    checkoutRequestActive = true;\n    startCheckoutHandoffAnimation();\n    try {\n      await flushPendingQuantities();\n      if ((cart.total_price || 0) < minimum) {\n        checkoutRequestActive = false;\n        clearCheckoutHandoffAnimation();\n        trackEvent(\"dco_checkout_blocked_minimum\", {\n          missing_minimum_cents: minimum - (cart.total_price || 0),\n          blocked_after_sync: true\n        });\n        showWarning(trigger);\n        return;\n      }\n      await clearRetiredPromo();\n      const languagePreferenceUpdate = updateLanguagePreference().catch((error) => {\n        console.error(\"[DCO] Language preference update failed\", error);\n      });\n      await Promise.all([cleanLegacyCheckoutProperties(), updateNote(), languagePreferenceUpdate]);\n      trackEvent(\"dco_checkout_handoff\", {\n        pending_quantity_count: desiredQuantities.size,\n        note_dirty: noteDirty\n      });\n      window.location.href = checkoutUrl;\n    } catch (error) {\n      console.error(\"[DCO] Checkout handoff failed\", error);\n      // A transient or throttled cart write must not strand the customer. Reconcile to\n      // the authoritative server cart and proceed if it still meets the minimum, since\n      // Shopify checkout uses the server cart, not our optimistic copy.\n      desiredQuantities.clear();\n      try {\n        await fetchCart();\n      } catch (fetchError) {\n        console.error(\"[DCO] Checkout recovery fetch failed\", fetchError);\n      }\n      if ((cart.total_price || 0) >= minimum) {\n        trackEvent(\"dco_checkout_handoff_recovered\", {\n          error_message: error?.message || String(error)\n        });\n        window.location.href = checkoutUrl;\n        return;\n      }\n      checkoutRequestActive = false;\n      clearCheckoutHandoffAnimation();\n      showCartError(strings.cartError);\n    }\n  }\n\n  root.addEventListener(\"pointerdown\", captureScrollBeforeQuantityPointer, { passive: true });\n  root.addEventListener(\"touchstart\", captureScrollBeforeQuantityPointer, { passive: true });\n  window.addEventListener(\"touchmove\", cancelScrollRestoreAfterUserMove, { passive: true });\n  window.addEventListener(\"wheel\", cancelScrollRestoreAfterUserMove, { passive: true });\n  window.addEventListener(\"scroll\", updateTopMilestoneVisibility, { passive: true });\n  document.addEventListener(\"scroll\", updateTopMilestoneVisibility, { passive: true, capture: true });\n  window.addEventListener(\"resize\", updateTopMilestoneVisibility, { passive: true });\n  window.addEventListener(\"resize\", updateVisualViewportForDrawer, { passive: true });\n  window.visualViewport?.addEventListener(\"resize\", updateVisualViewportForDrawer, { passive: true });\n  window.visualViewport?.addEventListener(\"scroll\", updateVisualViewportForDrawer, { passive: true });\n\n  nodes.headerCarts.forEach((node) => {\n    node.addEventListener(\"click\", handleHeaderCartClick);\n  });\n\n  if (nodes.topMilestone) nodes.topMilestone.addEventListener(\"click\", scrollToPromoMilestones);\n\n  root.addEventListener(\"click\", (event) => {\n    const plus = event.target.closest(\"[data-dco-plus]\");\n    const minus = event.target.closest(\"[data-dco-minus]\");\n    const remove = event.target.closest(\"[data-dco-remove]\");\n    const open = event.target.closest(\"[data-dco-open-cart]\");\n    const close = event.target.closest(\"[data-dco-close-cart]\");\n    const openDetailsButton = event.target.closest(\"[data-dco-open-details]\");\n    const closeDetailsButton = event.target.closest(\"[data-dco-close-details]\");\n    const detailThumb = event.target.closest(\"[data-dco-detail-thumb]\");\n    const checkoutButton = event.target.closest(\"[data-dco-checkout]\");\n    const scrollPromo = event.target.closest(\"[data-dco-scroll-promo]\");\n\n    if (scrollPromo) {\n      scrollToPromoMilestones(event);\n      return;\n    }\n\n    if (plus) {\n      event.preventDefault();\n      event.stopPropagation();\n      const variantId = plus.dataset.dcoPlus;\n      const product = productByVariant.get(String(variantId));\n      const step = Number(product?.step || plus.parentElement.querySelector(\"input\")?.dataset.step || 1);\n      changeQuantity(variantId, displayedQuantityFor(variantId) + step, \"plus_button\");\n      releaseQuantityButtonFocus(plus, event.detail > 0);\n      return;\n    }\n\n    if (minus) {\n      event.preventDefault();\n      event.stopPropagation();\n      const variantId = minus.dataset.dcoMinus;\n      const product = productByVariant.get(String(variantId));\n      const step = Number(product?.step || minus.parentElement.querySelector(\"input\")?.dataset.step || 1);\n      changeQuantity(variantId, Math.max(0, displayedQuantityFor(variantId) - step), \"minus_button\");\n      releaseQuantityButtonFocus(minus, event.detail > 0);\n      return;\n    }\n\n    if (remove) {\n      event.preventDefault();\n      event.stopPropagation();\n      const removedViaKeyboard = event.detail === 0;\n      const panel = remove.closest(\".dco-drawer, .dco-cart\");\n      changeQuantity(remove.dataset.dcoRemove, 0, \"remove_button\");\n      releaseQuantityButtonFocus(remove, event.detail > 0);\n      if (removedViaKeyboard && panel) {\n        restoreFocusTo(panel.querySelector(\"[data-dco-close-cart]\") || panel.querySelector(\"[data-dco-checkout]\"));\n      }\n      return;\n    }\n\n    if (open) {\n      event.preventDefault();\n      event.stopPropagation();\n      openDrawer(\"bottom_cart\");\n      return;\n    }\n\n    if (close) {\n      event.preventDefault();\n      event.stopPropagation();\n      closeDrawerAnimated();\n      return;\n    }\n\n    if (openDetailsButton) {\n      // Card titles are real product links for crawlers; let modified clicks\n      // (new tab / new window) behave like normal links instead of the modal.\n      if (\n        openDetailsButton.tagName === \"A\" &&\n        (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)\n      ) {\n        return;\n      }\n      event.preventDefault();\n      event.stopPropagation();\n      openDetails(openDetailsButton.dataset.dcoOpenDetails, openDetailsButton);\n      return;\n    }\n\n    if (closeDetailsButton) {\n      event.preventDefault();\n      event.stopPropagation();\n      closeDetails();\n      return;\n    }\n\n    if (detailThumb) {\n      event.preventDefault();\n      event.stopPropagation();\n      updateDetailsImage(detailThumb);\n      return;\n    }\n\n    if (checkoutButton) {\n      event.preventDefault();\n      event.stopPropagation();\n      checkout(checkoutButton);\n    }\n  });\n\n  root.addEventListener(\"submit\", (event) => {\n    event.preventDefault();\n    event.stopPropagation();\n    cartDebug(\"unexpected_form_submit_blocked\", {\n      target: event.target?.tagName || \"\"\n    });\n  }, true);\n\n  root.addEventListener(\"focusin\", (event) => {\n    if (event.target.matches(\"[data-dco-qty-input]\")) event.target.select();\n    handleDrawerNoteFocus(event);\n  });\n\n  root.addEventListener(\"input\", (event) => {\n    const input = event.target.closest(\"[data-dco-qty-input]\");\n    if (!input) return;\n    scheduleQuantityInput(input);\n  });\n\n  root.addEventListener(\"change\", (event) => {\n    const input = event.target.closest(\"[data-dco-qty-input]\");\n    if (!input) return;\n    commitQuantityInput(input);\n  });\n\n  root.addEventListener(\"focusout\", (event) => {\n    const input = event.target.closest(\"[data-dco-qty-input]\");\n    if (input) commitQuantityInput(input);\n    handleDrawerNoteBlur(event);\n  });\n\n  nodes.drawer?.addEventListener(\"focusin\", handleDrawerNoteFocus);\n  nodes.drawer?.addEventListener(\"focusout\", handleDrawerNoteBlur);\n\n  root.addEventListener(\"keydown\", (event) => {\n    if (event.key !== \"Enter\") return;\n    const note = event.target.closest(\"[data-dco-note]\");\n    if (note && nodes.drawer?.contains(note)) {\n      event.preventDefault();\n      note.blur();\n      return;\n    }\n\n    const input = event.target.closest(\"[data-dco-qty-input]\");\n    if (!input) return;\n    event.preventDefault();\n    commitQuantityInput(input);\n    input.blur();\n  });\n\n  nodes.notes.forEach((node) => {\n    node.addEventListener(\"focus\", handleDrawerNoteFocus);\n    node.addEventListener(\"blur\", handleDrawerNoteBlur);\n    node.addEventListener(\"input\", () => {\n      nodes.notes.forEach((other) => {\n        if (other !== node) other.value = node.value;\n      });\n      noteDirty = node.value !== syncedNote;\n      if (noteDirty) {\n        scheduleNoteSync();\n      } else {\n        clearNoteSyncTimer();\n      }\n    });\n  });\n\n  document.addEventListener(\"keyup\", (event) => {\n    if (event.key === \"Escape\") {\n      if (shipNudgeDialog?.open || Date.now() - shipNudgeEscapeAt < 600) return;\n      closeDrawer();\n      closeDetails();\n    }\n  });\n\n  window.addEventListener(\"pageshow\", scheduleCheckoutRestore);\n  document.addEventListener(\"visibilitychange\", () => {\n    if (document.visibilityState === \"visible\") scheduleCheckoutRestore();\n  });\n\n  nodes.drawer?.setAttribute(\"inert\", \"\");\n  nodes.drawer?.setAttribute(\"aria-hidden\", \"true\");\n  nodes.detailsModal?.setAttribute(\"inert\", \"\");\n  nodes.drawer?.addEventListener(\"keydown\", (event) => trapFocusKeydown(event, nodes.drawer));\n  nodes.detailsModal?.addEventListener(\"keydown\", (event) => trapFocusKeydown(event, nodes.detailsModal));\n\n  updateSiteHeaderHeight();\n  updateVisualViewportHeight();\n  cartDebug(\"debug_boot\", {\n    href: window.location.href,\n    script_version: \"20260605-cart-diagnostics-viewport\"\n  });\n  trackEvent(\"dco_order_loaded\", { product_count: products.length });\n  render();\n  // Upgrade the static ship-schedule line with the exact next ship/arrival\n  // day, computed in the store's timezone (America/Chicago). The Liquid line\n  // stays truthful on its own, so this failing silently is safe.\n  function initShipEta() {\n    const notes = root.querySelectorAll(\"[data-dco-ship-note][data-ship-days]\");\n    if (!notes.length) return;\n    let weekday;\n    let hour;\n    try {\n      const parts = new Intl.DateTimeFormat(\"en-US\", {\n        timeZone: \"America/Chicago\",\n        weekday: \"short\",\n        hour: \"numeric\",\n        hour12: false\n      }).formatToParts(new Date());\n      const dayMap = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 };\n      weekday = dayMap[parts.find((part) => part.type === \"weekday\")?.value];\n      hour = Number(parts.find((part) => part.type === \"hour\")?.value);\n    } catch (error) {\n      return;\n    }\n    if (weekday === undefined || Number.isNaN(hour)) return;\n    const viDays = [\"Ch\u1EE7 Nh\u1EADt\", \"Th\u1EE9 Hai\", \"Th\u1EE9 Ba\", \"Th\u1EE9 T\u01B0\", \"Th\u1EE9 N\u0103m\", \"Th\u1EE9 S\u00E1u\", \"Th\u1EE9 B\u1EA3y\"];\n    const enDays = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n    notes.forEach((note) => {\n      const days = (note.dataset.shipDays || \"\")\n        .split(\",\")\n        .map(Number)\n        .filter((day) => !Number.isNaN(day));\n      if (!days.length) return;\n      const cutoff = Number(note.dataset.shipCutoff || 16);\n      let shipOffset = null;\n      for (let offset = 0; offset < 8; offset += 1) {\n        const candidate = (weekday + offset) % 7;\n        if (!days.includes(candidate)) continue;\n        if (offset === 0 && hour >= cutoff) continue;\n        shipOffset = offset;\n        break;\n      }\n      if (shipOffset === null) return;\n      const shipDay = (weekday + shipOffset) % 7;\n      const arriveDay = (shipDay + 1) % 7;\n      const names = locale === \"en\" ? enDays : viDays;\n      let text;\n      if (locale === \"en\") {\n        text = shipOffset === 0\n          ? `Order now \u2192 ships today, arrives ${names[arriveDay]}.`\n          : `Order now \u2192 ships ${names[shipDay]}, arrives ${names[arriveDay]}.`;\n      } else {\n        text = shipOffset === 0\n          ? `\u0110\u1EB7t b\u00E2y gi\u1EDD \u2192 ship h\u00F4m nay, d\u1EF1 ki\u1EBFn nh\u1EADn ${names[arriveDay]}.`\n          : `\u0110\u1EB7t b\u00E2y gi\u1EDD \u2192 ship ${names[shipDay]}, d\u1EF1 ki\u1EBFn nh\u1EADn ${names[arriveDay]}.`;\n      }\n      const eta = note.querySelector(\"[data-dco-ship-eta]\");\n      if (eta) {\n        eta.textContent = text;\n        eta.hidden = false;\n      }\n    });\n  }\n\n  initShipEta();\n\n  fetchCart({ preservePending: true })\n    .then(async () => {\n      await clearRetiredPromo();\n      updateLanguagePreference().catch((error) => {\n        console.error(\"[DCO] Language preference update failed\", error);\n      });\n    })\n    .catch((error) => {\n      console.error(\"[DCO] Initial cart fetch failed\", error);\n      showCartError(strings.cartError);\n    });\n})();\n"],
  "mappings": "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",
  "names": ["delay", "atTop", "atBottom"]
}
