{
  "version": 3,
  "sources": ["/cdn/shop/t/110/assets/wf-cart-line-messages.js"],
  "sourcesContent": ["/**\n * Cart line message editor for APO/MWS message properties.\n * Keeps the existing line-item properties intact and lets customers\n * update \"Card Message\" / \"Personal Message\" directly from cart.\n */\n(function () {\n  'use strict';\n\n  var SAVE_LABEL = 'Save message';\n  var SKIP_LABEL = 'No, thanks';\n  var BLANK_SAVE_PROMPT = 'No problem. If you\\'d rather skip the card, tap \"No, thanks\".';\n  var SKIP_SUCCESS_MESSAGE = 'No message needed for this arrangement.';\n  var CHECKOUT_PROMPT_SINGLE = 'Before checkout, please either save your card message or tap \"No, thanks\" if you\\'d rather leave it blank.';\n  var CHECKOUT_PROMPT_MULTI = 'Before checkout, please either save a card message for each arrangement or tap \"No, thanks\" on the ones you\\'d rather leave blank.';\n  var INLINE_CHECKOUT_PROMPT = 'Please save your card message or tap \"No, thanks\" if you\\'d like to skip it.';\n  var DECLINED_STORAGE_KEY = 'wf-cart-line-message-skip:v1';\n\n  function normalizeText(value) {\n    return String(value == null ? '' : value).trim();\n  }\n\n  function decodeHtmlEntityOnce(value) {\n    return String(value == null ? '' : value).replace(/&(#x?[0-9a-f]+|amp|lt|gt|quot|apos|nbsp);/gi, function (match, entity) {\n      var name = String(entity || '').toLowerCase();\n      if (name === 'amp') return '&';\n      if (name === 'lt') return '<';\n      if (name === 'gt') return '>';\n      if (name === 'quot') return '\"';\n      if (name === 'apos') return \"'\";\n      if (name === 'nbsp') return ' ';\n      if (name.indexOf('#x') === 0) {\n        var hex = parseInt(name.slice(2), 16);\n        if (Number.isFinite(hex)) {\n          try { return String.fromCodePoint(hex); } catch (_err) { return match; }\n        }\n      }\n      if (name.indexOf('#') === 0) {\n        var decimal = parseInt(name.slice(1), 10);\n        if (Number.isFinite(decimal)) {\n          try { return String.fromCodePoint(decimal); } catch (_err) { return match; }\n        }\n      }\n      return match;\n    });\n  }\n\n  function normalizeMessageText(value) {\n    var current = normalizeText(value);\n    for (var i = 0; i < 6; i++) {\n      var next = normalizeText(decodeHtmlEntityOnce(current));\n      if (next === current) break;\n      current = next;\n    }\n    return current;\n  }\n\n  function getSessionStorage() {\n    try {\n      return window.sessionStorage || null;\n    } catch (_err) {\n      return null;\n    }\n  }\n\n  function readDeclinedSelections() {\n    var storage = getSessionStorage();\n    if (!storage || typeof storage.getItem !== 'function') return {};\n    try {\n      var parsed = JSON.parse(storage.getItem(DECLINED_STORAGE_KEY) || '{}');\n      return parsed && typeof parsed === 'object' ? parsed : {};\n    } catch (_err) {\n      return {};\n    }\n  }\n\n  function writeDeclinedSelections(next) {\n    var storage = getSessionStorage();\n    if (!storage || typeof storage.setItem !== 'function') return;\n    try {\n      storage.setItem(DECLINED_STORAGE_KEY, JSON.stringify(next && typeof next === 'object' ? next : {}));\n    } catch (_err) {}\n  }\n\n  function getBlockIdentifier(block) {\n    if (!block || typeof block.getAttribute !== 'function') return '';\n    var key = normalizeText(block.getAttribute('data-line-key') || block.getAttribute('data-line-index'));\n    var slot = normalizeText(block.getAttribute('data-line-message-slot'));\n    return slot ? key + ':' + slot : key;\n  }\n\n  function getBaseMessageName(block) {\n    if (!block || typeof block.getAttribute !== 'function') return '';\n    var explicit = normalizeText(block.getAttribute('data-line-message-base-name'));\n    if (explicit) return explicit;\n    return normalizeText(block.getAttribute('data-line-message-name'));\n  }\n\n  function buildSlotKey(baseName, slotIdx, totalSlots) {\n    var base = normalizeText(baseName);\n    if (!base) return '';\n    if (!totalSlots || totalSlots <= 1) return base;\n    return base + ' ' + slotIdx + ' of ' + totalSlots;\n  }\n\n  function resolveMessagePropertyName(block, fallbackName) {\n    if (!block || typeof block.getAttribute !== 'function') return normalizeText(fallbackName);\n    var existingName = normalizeText(block.getAttribute('data-line-message-name'));\n    if (existingName) return existingName;\n\n    var baseName = normalizeText(block.getAttribute('data-line-message-base-name')) || normalizeText(fallbackName);\n    var slotIdx = Number(block.getAttribute('data-line-message-slot')) || 0;\n    var totalSlots = Number(block.getAttribute('data-line-message-total-slots')) || 0;\n    return buildSlotKey(baseName, slotIdx, totalSlots) || normalizeText(fallbackName);\n  }\n\n  function isSlotKeyForBase(propertyName, baseName) {\n    var name = normalizeText(propertyName);\n    var base = normalizeText(baseName);\n    if (!name || !base) return false;\n    if (name === base) return true;\n    if (name.indexOf(base + ' ') !== 0) return false;\n    var rest = name.substring(base.length + 1);\n    return /^\\d+\\s+of\\s+\\d+$/i.test(rest);\n  }\n\n  function extractSlotIndex(propertyName, baseName) {\n    var name = normalizeText(propertyName);\n    var base = normalizeText(baseName);\n    if (!name || !base || name.indexOf(base + ' ') !== 0) return 0;\n    var match = name.substring(base.length + 1).match(/^(\\d+)\\s+of\\s+(\\d+)$/i);\n    if (!match) return 0;\n    return parseInt(match[1], 10) || 0;\n  }\n\n  function getStatusEl(block) {\n    return block && typeof block.querySelector === 'function'\n      ? block.querySelector('[data-wf-line-message-status]')\n      : null;\n  }\n\n  function getInput(block) {\n    return block && typeof block.querySelector === 'function'\n      ? block.querySelector('[data-wf-line-message-input]')\n      : null;\n  }\n\n  function getPropsEl(block) {\n    return block && typeof block.querySelector === 'function'\n      ? block.querySelector('script[data-wf-line-message-properties]')\n      : null;\n  }\n\n  function getSkipBtn(block) {\n    return block && typeof block.querySelector === 'function'\n      ? block.querySelector('[data-wf-line-message-skip]')\n      : null;\n  }\n\n  function getSaveBtn(block) {\n    return block && typeof block.querySelector === 'function'\n      ? block.querySelector('[data-wf-line-message-save]')\n      : null;\n  }\n\n  function setStatus(statusEl, message, isError) {\n    if (!statusEl) return;\n    statusEl.textContent = message || '';\n    statusEl.style.color = isError ? '#b42318' : '';\n  }\n\n  function flashSuccess(block, message) {\n    var statusEl = getStatusEl(block);\n    if (!statusEl) return;\n    setStatus(statusEl, message, false);\n    statusEl.style.color = '#2e7d32';\n    setTimeout(function () {\n      setStatus(statusEl, '', false);\n    }, 2500);\n  }\n\n  function clearBlockStatus(block) {\n    setStatus(getStatusEl(block), '', false);\n  }\n\n  function setDeclinedState(block, next) {\n    if (!block || typeof block.setAttribute !== 'function') return;\n    var normalizedNext = !!next;\n    if (normalizedNext) {\n      block.setAttribute('data-line-message-declined', 'true');\n    } else if (typeof block.removeAttribute === 'function') {\n      block.removeAttribute('data-line-message-declined');\n    }\n\n    var skipBtn = getSkipBtn(block);\n    if (skipBtn) {\n      if (typeof skipBtn.setAttribute === 'function') {\n        skipBtn.setAttribute('aria-pressed', normalizedNext ? 'true' : 'false');\n      }\n      if (normalizedNext) {\n        if (typeof skipBtn.setAttribute === 'function') skipBtn.setAttribute('data-selected', 'true');\n      } else if (typeof skipBtn.removeAttribute === 'function') {\n        skipBtn.removeAttribute('data-selected');\n      }\n    }\n\n    var blockId = getBlockIdentifier(block);\n    if (!blockId) return;\n    var declinedSelections = readDeclinedSelections();\n    if (normalizedNext) declinedSelections[blockId] = true;\n    else delete declinedSelections[blockId];\n    writeDeclinedSelections(declinedSelections);\n  }\n\n  function isDeclined(block) {\n    if (!block || typeof block.getAttribute !== 'function') return false;\n    if (normalizeText(block.getAttribute('data-line-message-declined')).toLowerCase() === 'true') return true;\n    var blockId = getBlockIdentifier(block);\n    if (!blockId) return false;\n    return !!readDeclinedSelections()[blockId];\n  }\n\n  function isEligibleBlock(block) {\n    if (!block || typeof block.getAttribute !== 'function') return false;\n    if (normalizeText(block.getAttribute('data-line-message-excluded')).toLowerCase() === 'true') return false;\n    return !(block.style && block.style.display === 'none');\n  }\n\n  /**\n   * Shopify outputs {{ item.properties | json }} as either:\n   *   - object: {\"key\":\"val\",...}\n   *   - array of pairs: [[\"key\",\"val\"],[\"key2\",\"val2\"],...]\n   * We must handle both formats.\n   */\n  function parseProperties(raw) {\n    if (!raw) return {};\n    try {\n      var parsed = JSON.parse(raw);\n      if (Array.isArray(parsed)) {\n        var obj = {};\n        for (var i = 0; i < parsed.length; i++) {\n          var pair = parsed[i];\n          if (Array.isArray(pair) && pair.length >= 2) {\n            obj[String(pair[0])] = pair[1];\n          }\n        }\n        return obj;\n      }\n      return parsed && typeof parsed === 'object' ? parsed : {};\n    } catch (_err) {\n      return {};\n    }\n  }\n\n  function buildUpdatedProperties(existingProperties, propertyName, nextValue, options) {\n    var props = {};\n    var existing = existingProperties && typeof existingProperties === 'object' ? existingProperties : {};\n    Object.keys(existing).forEach(function (key) {\n      var val = existing[key];\n      props[key] = val == null ? '' : String(val);\n    });\n\n    var targetName = normalizeText(propertyName);\n    if (!targetName) return props;\n\n    var value = normalizeMessageText(nextValue);\n    if (value) props[targetName] = value;\n    else delete props[targetName];\n\n    var opts = options && typeof options === 'object' ? options : {};\n    var baseName = normalizeText(opts.baseName);\n    var totalSlots = Number(opts.totalSlots) || 0;\n    if (baseName && totalSlots > 0) {\n      Object.keys(props).forEach(function (key) {\n        if (!isSlotKeyForBase(key, baseName)) return;\n        var slot = extractSlotIndex(key, baseName);\n        if (totalSlots === 1) {\n          if (key !== baseName) delete props[key];\n          return;\n        }\n        if (slot === 0 && key === baseName) {\n          delete props[key];\n          return;\n        }\n        if (slot > totalSlots) delete props[key];\n      });\n    }\n\n    return props;\n  }\n\n  function getRawStoredMessageValue(block) {\n    var propsEl = getPropsEl(block);\n    var propertyName = normalizeText(block && typeof block.getAttribute === 'function'\n      ? block.getAttribute('data-line-message-name')\n      : '');\n    if (!propsEl || !propertyName) return '';\n    var existing = parseProperties(propsEl.textContent || '');\n    return normalizeText(existing[propertyName]);\n  }\n\n  function getStoredMessageValue(block) {\n    return normalizeMessageText(getRawStoredMessageValue(block));\n  }\n\n  function syncDeclinedState(block) {\n    if (!block) return;\n    var input = getInput(block);\n    var currentValue = normalizeMessageText(input && typeof input.value === 'string' ? input.value : '');\n    var storedValue = getStoredMessageValue(block);\n    if (currentValue || storedValue) {\n      setDeclinedState(block, false);\n      return;\n    }\n    setDeclinedState(block, isDeclined(block));\n  }\n\n  /** Raw XHR to bypass MWS/APO's window.fetch monkey-patch. */\n  function xhrPost(url, payload) {\n    return new Promise(function (resolve, reject) {\n      var xhr = new XMLHttpRequest();\n      xhr.open('POST', url, true);\n      xhr.setRequestHeader('Content-Type', 'application/json');\n      xhr.onload = function () {\n        if (xhr.status >= 200 && xhr.status < 300) {\n          if (!xhr.responseText) {\n            resolve({});\n            return;\n          }\n          try {\n            resolve(JSON.parse(xhr.responseText));\n          } catch (_err) {\n            resolve({ raw: xhr.responseText });\n          }\n        } else {\n          reject(new Error(xhr.responseText || ('Cart change failed: ' + xhr.status)));\n        }\n      };\n      xhr.onerror = function () { reject(new Error('Network error')); };\n      xhr.send(JSON.stringify(payload));\n    });\n  }\n\n  /**\n   * BUG-025 silent refresh: snapshot every editor's in-progress state so we can re-apply it\n   * after swapping the cart section HTML. Without this, customers typing into \"slot 2\" while\n   * \"slot 1\" is being saved would lose their text on every save round-trip.\n   */\n  function snapshotEditorState(root) {\n    var snapshot = {};\n    var doc = root || (typeof document !== 'undefined' ? document : null);\n    if (!doc || typeof doc.querySelectorAll !== 'function') return snapshot;\n    var blocks = doc.querySelectorAll('[data-wf-line-message-block]');\n    for (var i = 0; i < blocks.length; i++) {\n      var block = blocks[i];\n      var id = getBlockIdentifier(block);\n      if (!id) continue;\n      var input = getInput(block);\n      if (!input) continue;\n      var stored = getStoredMessageValue(block);\n      var storedRaw = getRawStoredMessageValue(block);\n      var current = normalizeMessageText(input.value);\n      snapshot[id] = {\n        current: current,\n        dirty: current !== stored || storedRaw !== current,\n        declined: isDeclined(block),\n        focused: typeof document !== 'undefined' && document.activeElement === input,\n        selectionStart: typeof input.selectionStart === 'number' ? input.selectionStart : null,\n        selectionEnd: typeof input.selectionEnd === 'number' ? input.selectionEnd : null,\n      };\n    }\n    return snapshot;\n  }\n\n  function applyEditorSnapshot(root, snapshot) {\n    if (!snapshot || typeof snapshot !== 'object') return;\n    var doc = root || (typeof document !== 'undefined' ? document : null);\n    if (!doc || typeof doc.querySelectorAll !== 'function') return;\n    var blocks = doc.querySelectorAll('[data-wf-line-message-block]');\n    for (var i = 0; i < blocks.length; i++) {\n      var block = blocks[i];\n      var id = getBlockIdentifier(block);\n      var snap = id ? snapshot[id] : null;\n      if (!snap) continue;\n      var input = getInput(block);\n      if (!input) continue;\n      if (snap.dirty) {\n        input.value = snap.current || '';\n        setDeclinedState(block, false);\n      } else if (snap.declined) {\n        setDeclinedState(block, true);\n      }\n      if (snap.focused && typeof input.focus === 'function') {\n        try {\n          input.focus();\n          if (snap.selectionStart != null && snap.selectionEnd != null && typeof input.setSelectionRange === 'function') {\n            input.setSelectionRange(snap.selectionStart, snap.selectionEnd);\n          }\n        } catch (_err) {}\n      }\n    }\n  }\n\n  /**\n   * Swap the cart section's contents in-place using Shopify's Sections Rendering API\n   * response. Falls back to no-op if the response is missing or malformed \u2014 never blanks the cart.\n   *\n   * HF Pipeline renders cart rows inside `[data-line-items]`, while the API\n   * section returns `[data-api-content]`. Swap only that row container so the\n   * delivery form and checkout controls are not duplicated.\n   */\n  function swapCartSection(sectionsHtml) {\n    if (!sectionsHtml || typeof sectionsHtml !== 'object') return false;\n    if (typeof document === 'undefined' || typeof document.createElement !== 'function') return false;\n\n    var liveCartForm = document.getElementById('cart_form') || document.querySelector('.cart__form');\n    var liveSectionRoot = null;\n    if (liveCartForm && typeof liveCartForm.closest === 'function') {\n      liveSectionRoot = liveCartForm.closest('[id^=\"shopify-section-\"]');\n    }\n    if (!liveSectionRoot && typeof document.querySelector === 'function') {\n      liveSectionRoot = document.querySelector('[data-section-type=\"cart\"]');\n    }\n    if (!liveSectionRoot) liveSectionRoot = liveCartForm; // last resort\n    if (!liveSectionRoot) {\n      console.warn('[wf-cart-line-messages] swap aborted: no live cart form on page');\n      return false;\n    }\n\n    var sectionKeys = Object.keys(sectionsHtml);\n    if (sectionKeys.length === 0) return false;\n    /**\n     * In `shopify theme dev`, the response can contain MANY keys (preview wrappers\n     * keyed by hashes, plus the actual section markup). Pick by signal, not order:\n     *   1. Exact key 'api-cart-items' (the HF row refresh section).\n     *   2. Any key whose value looks like a cart fragment (`[data-line-items]` / `[data-api-content]` / `id=\"cart_form\"`).\n     *   3. Longest string value (fallback \u2014 preview-key strings are tiny, ~60 chars).\n     */\n    var html = '';\n    var pickedKey = '';\n    var cartSignals = /data-line-items|data-api-content|id=[\"']cart_form[\"']|class=[\"'][^\"']*\\bcart__(form|item-list|items)\\b|class=[\"'][^\"']*\\bcart-items\\b/;\n    if (typeof sectionsHtml['api-cart-items'] === 'string' && cartSignals.test(sectionsHtml['api-cart-items'])) {\n      html = sectionsHtml['api-cart-items'];\n      pickedKey = 'api-cart-items';\n    } else if (typeof sectionsHtml['cart__main'] === 'string' && cartSignals.test(sectionsHtml['cart__main'])) {\n      html = sectionsHtml['cart__main'];\n      pickedKey = 'cart__main';\n    }\n    if (!html) {\n      for (var i = 0; i < sectionKeys.length; i++) {\n        var candidate = sectionsHtml[sectionKeys[i]];\n        if (typeof candidate === 'string' && cartSignals.test(candidate)) {\n          html = candidate;\n          pickedKey = sectionKeys[i];\n          break;\n        }\n      }\n    }\n    if (!html) {\n      var longestLen = 0;\n      for (var j = 0; j < sectionKeys.length; j++) {\n        var v = sectionsHtml[sectionKeys[j]];\n        if (typeof v === 'string' && v.length > longestLen) {\n          longestLen = v.length;\n          html = v;\n          pickedKey = sectionKeys[j];\n        }\n      }\n    }\n    if (!html) {\n      console.warn('[wf-cart-line-messages] swap aborted: empty sections payload', { sectionKeys: sectionKeys });\n      return false;\n    }\n\n    var staging = null;\n    if (typeof window !== 'undefined' && typeof window.DOMParser === 'function') {\n      try {\n        var parsed = new window.DOMParser().parseFromString('<!doctype html><html><body>' + html + '</body></html>', 'text/html');\n        staging = parsed && parsed.body ? parsed.body : null;\n      } catch (_err) {\n        staging = null;\n      }\n    }\n    if (!staging) {\n      staging = document.createElement('div');\n      staging.innerHTML = html;\n    }\n\n    var nextLineItems = staging.querySelector('[data-line-items]');\n    var nextApiContent = staging.querySelector('[data-api-content]');\n    var nextItemList = nextLineItems || nextApiContent || staging.querySelector('.cart__item-list') || staging.querySelector('.cart-items');\n    var nextCartForm = staging.querySelector('#cart_form') || staging.querySelector('.cart__form');\n    if (!nextItemList && !nextCartForm) {\n      console.warn(\n        '[wf-cart-line-messages] swap aborted: no cart rows in response',\n        { responseKeys: sectionKeys, pickedKey: pickedKey, htmlLength: html.length, htmlHead: html.substring(0, 600), htmlTail: html.substring(Math.max(0, html.length - 300)) }\n      );\n      return false;\n    }\n\n    var currentItemList = liveSectionRoot.querySelector('[data-line-items]') || liveSectionRoot.querySelector('.cart__item-list') || liveSectionRoot.querySelector('.cart-items');\n\n    var snapshot = snapshotEditorState(document);\n\n    var swapped = false;\n    var swapMode = '';\n    if (nextApiContent && currentItemList) {\n      currentItemList.innerHTML = nextApiContent.innerHTML;\n      swapped = true;\n      swapMode = 'api-content';\n    } else if (nextItemList && currentItemList && currentItemList.parentNode) {\n      currentItemList.parentNode.replaceChild(nextItemList, currentItemList);\n      swapped = true;\n      swapMode = 'item-list';\n    } else if (nextCartForm && liveCartForm && liveCartForm.parentNode) {\n      liveCartForm.parentNode.replaceChild(nextCartForm, liveCartForm);\n      swapped = true;\n      swapMode = 'cart-form';\n    } else {\n      console.warn('[wf-cart-line-messages] swap aborted: no compatible target', {\n        hasNextItemList: !!nextItemList,\n        hasCurrentItemList: !!currentItemList,\n        hasNextCartForm: !!nextCartForm,\n        hasLiveCartForm: !!liveCartForm,\n      });\n      return false;\n    }\n\n    applyEditorSnapshot(document, snapshot);\n    if (typeof document.dispatchEvent === 'function' && typeof CustomEvent === 'function') {\n      try {\n        document.dispatchEvent(new CustomEvent('wf:cart:refreshed', { detail: { source: 'wf-cart-line-messages', swapped: swapped } }));\n      } catch (_err) {}\n    }\n    return true;\n  }\n\n  /**\n   * BUG-025 follow-up: when ANYTHING else (e.g. the theme's quantity stepper at\n   * `utilities.js \u2192 quantityBox.updateCart`) mutates the cart via /cart/change.js,\n   * the existing `jsCart.updateView` only patches `.cart__total`/`.quantity-input`\n   * piecemeal \u2014 it never re-renders `.cart__item-list` unless line-item COUNT\n   * changes. So increasing qty 1 \u2192 2 leaves only one message editor on screen\n   * until a full page refresh. We silently re-render the cart section here using\n   * the same Sections Rendering API + snapshot/restore plumbing as `saveLineMessage`.\n   */\n  function _shouldSilentRefreshOnCart() {\n    if (typeof document === 'undefined' || typeof document.querySelector !== 'function') return false;\n    return !!document.querySelector('[data-line-items]') || !!document.querySelector('.cart__form') || !!document.querySelector('[data-wf-line-message-block]');\n  }\n\n  var _silentRefreshTimer = null;\n  var _silentRefreshInFlight = false;\n  var _silentRefreshPending = false;\n\n  /**\n   * HF Pipeline already has a narrow cart-row section (`api-cart-items`).\n   * Refresh that instead of the whole `/cart` page so delivery state stays live.\n   */\n  function _runSilentCartRefresh() {\n    if (_silentRefreshInFlight) {\n      _silentRefreshPending = true;\n      return;\n    }\n    _silentRefreshInFlight = true;\n    var rootUrl = (typeof window !== 'undefined' && window.theme && window.theme.routes && window.theme.routes.root_url) || '/';\n    var url = rootUrl + '?section_id=api-cart-items&_=' + Date.now();\n    var fetchFn = (typeof window !== 'undefined' && typeof window.fetch === 'function')\n      ? window.fetch.bind(window)\n      : null;\n    var done = function (html) {\n      if (html && typeof html === 'string' && html.length > 0) {\n        try { swapCartSection({ 'api-cart-items': html }); }\n        catch (err) { console.warn('[wf-cart-line-messages] silent refresh swap failed', err); }\n      }\n      _silentRefreshInFlight = false;\n      if (_silentRefreshPending) {\n        _silentRefreshPending = false;\n        _runSilentCartRefresh();\n      }\n    };\n    if (fetchFn) {\n      fetchFn(url, { credentials: 'same-origin', headers: { Accept: 'text/html' } })\n        .then(function (res) { return res && res.ok ? res.text() : null; })\n        .then(done)\n        .catch(function () { done(null); });\n    } else {\n      try {\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', url, true);\n        xhr.setRequestHeader('Accept', 'text/html');\n        xhr.onload = function () {\n          done(xhr.status >= 200 && xhr.status < 300 ? xhr.responseText : null);\n        };\n        xhr.onerror = function () { done(null); };\n        xhr.send();\n      } catch (_e) { done(null); }\n    }\n  }\n\n  function _scheduleSilentCartRefresh() {\n    if (!_shouldSilentRefreshOnCart()) return;\n    if (_silentRefreshTimer) clearTimeout(_silentRefreshTimer);\n    _silentRefreshTimer = setTimeout(function () {\n      _silentRefreshTimer = null;\n      _runSilentCartRefresh();\n    }, 200);\n  }\n\n  function _isCartMutationUrl(url) {\n    if (typeof url !== 'string' || !url) return false;\n    return url.indexOf('/cart/change') !== -1\n      || url.indexOf('/cart/update') !== -1\n      || url.indexOf('/cart/add') !== -1\n      || url.indexOf('/cart/clear') !== -1;\n  }\n\n  function _isOurOwnSectionedRequest(url, body) {\n    if (typeof url !== 'string') return false;\n    if (url.indexOf('/cart/change') === -1 && url.indexOf('/cart/update') === -1) return false;\n    var bodyStr = '';\n    if (typeof body === 'string') bodyStr = body;\n    else if (body && typeof body === 'object') {\n      try { bodyStr = JSON.stringify(body); } catch (_e) {}\n    }\n    return bodyStr.indexOf('\"sections\":\"api-cart-items\"') !== -1\n      || bodyStr.indexOf('sections=api-cart-items') !== -1\n      || bodyStr.indexOf('\"sections\":\"cart__main\"') !== -1\n      || bodyStr.indexOf('sections=cart__main') !== -1;\n  }\n\n  function _installExternalCartHook() {\n    if (typeof window === 'undefined') return;\n    if (window.__WF_CART_MSG_EXTERNAL_HOOK__) return;\n    window.__WF_CART_MSG_EXTERNAL_HOOK__ = true;\n    if (window.jQuery && typeof window.jQuery === 'function') {\n      try {\n        window.jQuery(document).on('ajaxComplete.wfCartMessages', function (_event, xhr, settings) {\n          if (!settings || !settings.url) return;\n          if (!_isCartMutationUrl(settings.url)) return;\n          if (_isOurOwnSectionedRequest(settings.url, settings.data)) return;\n          if (xhr && xhr.status >= 200 && xhr.status < 300) _scheduleSilentCartRefresh();\n        });\n      } catch (_e) {}\n    }\n  }\n\n  function setButtonLoadingState(block, next, mode) {\n    var saveBtn = getSaveBtn(block);\n    var skipBtn = getSkipBtn(block);\n    if (saveBtn) {\n      saveBtn.disabled = !!next;\n      saveBtn.textContent = next && mode !== 'decline' ? 'Saving...' : SAVE_LABEL;\n    }\n    if (skipBtn) {\n      skipBtn.disabled = !!next;\n      skipBtn.textContent = next && mode === 'decline' ? 'Saving...' : SKIP_LABEL;\n    }\n  }\n\n  // Shopify inserts a newly-added line (e.g. the delivery-fee product) at\n  // position 1, which shifts every other line's 1-based index, and recalculates\n  // a line's key whenever its properties change. So a cart/change.js write keyed\n  // on the render-time `line` index lands on the wrong line once the fee is\n  // added (the personal message ended up on the invisible fee line). Target the\n  // stable line KEY instead \u2014 read from the group wrapper \u2014 and refresh it from\n  // each response, because the key changes after every successful write.\n  function getLineItemKey(block) {\n    if (!block || typeof block.getAttribute !== 'function') return '';\n    var group = typeof block.closest === 'function' ? block.closest('[data-wf-line-message-group]') : null;\n    if (group && typeof group.getAttribute === 'function') {\n      var groupKey = normalizeText(group.getAttribute('data-line-key'));\n      if (groupKey) return groupKey;\n    }\n    // Fallback: strip the trailing \":<slot>\" suffix off the per-slot block key.\n    return normalizeText(block.getAttribute('data-line-key')).replace(/:\\d+$/, '');\n  }\n\n  function freshLineKeyFromCart(cart, writtenProperties) {\n    if (!cart || !Array.isArray(cart.items)) return '';\n    var keys = Object.keys(writtenProperties || {});\n    if (!keys.length) return '';\n    for (var i = 0; i < cart.items.length; i++) {\n      var item = cart.items[i];\n      var props = item && item.properties;\n      if (!props || typeof props !== 'object') continue;\n      var match = true;\n      for (var j = 0; j < keys.length; j++) {\n        if (normalizeText(props[keys[j]]) !== normalizeText(writtenProperties[keys[j]])) { match = false; break; }\n      }\n      if (match && item.key) return item.key;\n    }\n    return '';\n  }\n\n  function setLineItemKey(block, freshKey) {\n    if (!block || !freshKey) return;\n    var group = typeof block.closest === 'function' ? block.closest('[data-wf-line-message-group]') : null;\n    if (group && typeof group.setAttribute === 'function') group.setAttribute('data-line-key', freshKey);\n  }\n\n  function saveLineMessage(block, options) {\n    var opts = options || {};\n    if (!block || block.getAttribute('data-saving') === 'true') return Promise.resolve(false);\n\n    var input = getInput(block);\n    var statusEl = getStatusEl(block);\n    var propsEl = getPropsEl(block);\n    var lineKey = getLineItemKey(block);\n    var lineQuantity = Number(block.getAttribute('data-line-quantity')) || 1;\n    var propertyName = normalizeText(block.getAttribute('data-line-message-name'));\n    var baseName = getBaseMessageName(block);\n    var totalSlots = Number(block.getAttribute('data-line-message-total-slots')) || 0;\n    var mode = opts.mode === 'decline' ? 'decline' : 'save';\n\n    if (!input || !propsEl || !lineKey || !propertyName) {\n      if (!opts.silent) setStatus(statusEl, 'We could not update your message. Please refresh and try again.', true);\n      return Promise.resolve(false);\n    }\n\n    var nextValue = mode === 'decline' ? '' : input.value;\n    if (mode !== 'decline' && !normalizeText(nextValue)) {\n      setDeclinedState(block, false);\n      if (!opts.silent) setStatus(statusEl, BLANK_SAVE_PROMPT, true);\n      return Promise.resolve(false);\n    }\n\n    var existingParsed = parseProperties(propsEl.textContent || '');\n    var nextProperties = buildUpdatedProperties(existingParsed, propertyName, nextValue, {\n      baseName: baseName,\n      totalSlots: totalSlots || lineQuantity,\n    });\n    block.setAttribute('data-saving', 'true');\n    if (!opts.silent) setButtonLoadingState(block, true, mode);\n\n    var requestPayload = {\n      id: lineKey,\n      quantity: lineQuantity,\n      properties: nextProperties,\n    };\n    var wantsSilentRefresh = !opts.silent && opts.skipSectionRefresh !== true;\n    if (wantsSilentRefresh) {\n      requestPayload.sections = 'api-cart-items';\n      requestPayload.sections_url = '/cart';\n    }\n\n    return xhrPost('/cart/change.js', requestPayload)\n      .then(function (response) {\n        propsEl.textContent = JSON.stringify(nextProperties);\n        // The write just changed this line's properties, recalculating its key;\n        // refresh the cached key so the next save targets the new one.\n        var freshLineItemKey = freshLineKeyFromCart(response, nextProperties);\n        if (freshLineItemKey) setLineItemKey(block, freshLineItemKey);\n        if (mode === 'decline') {\n          input.value = '';\n          setDeclinedState(block, true);\n          if (!opts.silent) flashSuccess(block, SKIP_SUCCESS_MESSAGE);\n        } else {\n          input.value = normalizeMessageText(input.value);\n          setDeclinedState(block, false);\n          if (!opts.silent) flashSuccess(block, 'Saved');\n        }\n        if (wantsSilentRefresh && response && response.sections) {\n          try { swapCartSection(response.sections); } catch (refreshErr) { console.warn('[wf-cart-line-messages] silent refresh failed', refreshErr); }\n        }\n        return true;\n      })\n      .catch(function (err) {\n        console.error('[wf-cart-line-messages] save failed', err);\n        if (!opts.silent) setStatus(statusEl, 'We could not save your message. Please try again.', true);\n        return false;\n      })\n      .finally(function () {\n        block.removeAttribute('data-saving');\n        if (!opts.silent) setButtonLoadingState(block, false, mode);\n      });\n  }\n\n  function declineLineMessage(block, options) {\n    var opts = options || {};\n    if (!block) return Promise.resolve(false);\n\n    var input = getInput(block);\n    var propsEl = getPropsEl(block);\n    var propertyName = normalizeText(block.getAttribute('data-line-message-name'));\n    if (!input || !propsEl || !propertyName) {\n      if (!opts.silent) setStatus(getStatusEl(block), 'We could not update your message. Please refresh and try again.', true);\n      return Promise.resolve(false);\n    }\n\n    var storedValue = getStoredMessageValue(block);\n    input.value = '';\n    clearBlockStatus(block);\n\n    if (!storedValue) {\n      propsEl.textContent = JSON.stringify(buildUpdatedProperties(parseProperties(propsEl.textContent || ''), propertyName, ''));\n      setDeclinedState(block, true);\n      if (!opts.silent) flashSuccess(block, SKIP_SUCCESS_MESSAGE);\n      return Promise.resolve(true);\n    }\n\n    return saveLineMessage(block, {\n      mode: 'decline',\n      silent: !!opts.silent,\n    });\n  }\n\n  /**\n   * Saves all message editors that have unsaved changes.\n   * Skips page reload \u2014 intended for pre-checkout auto-save.\n   * Returns a Promise that resolves with the save results.\n   */\n  function saveAllUnsavedMessages() {\n    var blocks = document.querySelectorAll('[data-wf-line-message-block]');\n    var saves = [];\n\n    blocks.forEach(function (block) {\n      if (!isEligibleBlock(block)) return;\n\n      var input = getInput(block);\n      var propsEl = getPropsEl(block);\n      var propertyName = normalizeText(block.getAttribute('data-line-message-name'));\n      if (!input || !propsEl || !propertyName) return;\n\n      var currentValue = normalizeMessageText(input.value);\n      var existing = parseProperties(propsEl.textContent || '');\n      var storedRaw = normalizeText(existing[propertyName]);\n      var storedValue = normalizeMessageText(storedRaw);\n\n      if (!currentValue) return;\n      if (currentValue === storedValue && storedRaw === currentValue) return;\n\n      saves.push(saveLineMessage(block, { skipReload: true, silent: true, skipSectionRefresh: true }));\n    });\n\n    if (saves.length === 0) return Promise.resolve([]);\n    return Promise.all(saves);\n  }\n\n  function getCheckoutBlockingState() {\n    var blocks = document.querySelectorAll('[data-wf-line-message-block]');\n    var blockingBlocks = [];\n\n    blocks.forEach(function (block) {\n      if (!isEligibleBlock(block)) return;\n      var input = getInput(block);\n      var propsEl = getPropsEl(block);\n      var propertyName = normalizeText(block.getAttribute('data-line-message-name'));\n      if (!input || !propsEl || !propertyName) return;\n\n      if (normalizeMessageText(input.value)) return;\n      if (isDeclined(block)) return;\n      blockingBlocks.push(block);\n    });\n\n    if (blockingBlocks.length === 0) {\n      return { ok: true, blockingBlocks: [], message: '' };\n    }\n\n    return {\n      ok: false,\n      blockingBlocks: blockingBlocks,\n      message: blockingBlocks.length > 1 ? CHECKOUT_PROMPT_MULTI : CHECKOUT_PROMPT_SINGLE,\n    };\n  }\n\n  function promptCheckoutBlockers(state) {\n    if (!state || state.ok || !state.blockingBlocks || !state.blockingBlocks.length) return;\n    var firstBlock = state.blockingBlocks[0];\n    setStatus(getStatusEl(firstBlock), INLINE_CHECKOUT_PROMPT, true);\n    var input = getInput(firstBlock);\n    if (input && typeof input.focus === 'function') input.focus();\n    if (firstBlock && typeof firstBlock.scrollIntoView === 'function') {\n      try {\n        firstBlock.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      } catch (_err) {\n        firstBlock.scrollIntoView();\n      }\n    }\n  }\n\n  function prepareMessagesForCheckout() {\n    var blockingState = getCheckoutBlockingState();\n    if (!blockingState.ok) {\n      promptCheckoutBlockers(blockingState);\n      return Promise.resolve(blockingState);\n    }\n\n    return saveAllUnsavedMessages().then(function (results) {\n      var saveResults = Array.isArray(results) ? results : [];\n      var hasFailure = saveResults.some(function (result) { return result === false; });\n      if (hasFailure) {\n        return {\n          ok: false,\n          blockingBlocks: [],\n          message: 'We could not save one of your messages. Please try again.',\n        };\n      }\n      return { ok: true, blockingBlocks: [], message: '' };\n    });\n  }\n\n  function onDocumentClick(event) {\n    var target = event.target;\n    if (!target || typeof target.closest !== 'function') return;\n\n    var skipBtn = target.closest('[data-wf-line-message-skip]');\n    if (skipBtn) {\n      event.preventDefault();\n      event.stopPropagation();\n      declineLineMessage(skipBtn.closest('[data-wf-line-message-block]'));\n      return;\n    }\n\n    var saveBtn = target.closest('[data-wf-line-message-save]');\n    if (!saveBtn) return;\n    event.preventDefault();\n    event.stopPropagation();\n    saveLineMessage(saveBtn.closest('[data-wf-line-message-block]'));\n  }\n\n  function onDocumentInput(event) {\n    var target = event.target;\n    if (!target || typeof target.closest !== 'function') return;\n    var input = target.closest('[data-wf-line-message-input]');\n    if (!input) return;\n    var block = input.closest('[data-wf-line-message-block]');\n    if (!block) return;\n    if (normalizeMessageText(input.value)) {\n      setDeclinedState(block, false);\n    }\n    clearBlockStatus(block);\n  }\n\n  function onDocumentKeydown(event) {\n    var target = event.target;\n    if (!target || typeof target.closest !== 'function') return;\n    if (event.key !== 'Enter' || (!event.metaKey && !event.ctrlKey)) return;\n    var input = target.closest('[data-wf-line-message-input]');\n    if (!input) return;\n    event.preventDefault();\n    saveLineMessage(input.closest('[data-wf-line-message-block]'));\n  }\n\n  document.addEventListener('click', onDocumentClick);\n  document.addEventListener('input', onDocumentInput);\n  document.addEventListener('keydown', onDocumentKeydown);\n  _installExternalCartHook();\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', _installExternalCartHook, { once: true });\n  }\n\n  function initMessageCards(messageCardConfig) {\n    var config = messageCardConfig && typeof messageCardConfig === 'object' ? messageCardConfig : {};\n    var propertyName = normalizeText(config.propertyName);\n    var canInitializeEditor = Boolean(config.enabled && propertyName);\n\n    function appendIds(target, values) {\n      if (!Array.isArray(values)) return;\n      values.forEach(function (id) {\n        var key = String(id || '').trim();\n        if (key) target.push(key);\n      });\n    }\n\n    var excludedIds = Array.isArray(config.excludedProductIds)\n      ? config.excludedProductIds.map(String)\n      : [];\n    var excludedVariantIds = Array.isArray(config.excludedVariantIds)\n      ? config.excludedVariantIds.map(String)\n      : [];\n    var deliveryConfig = window.WF_LD_DEBUG_STATE && window.WF_LD_DEBUG_STATE.delivery;\n    if (deliveryConfig && typeof deliveryConfig === 'object') {\n      appendIds(excludedIds, deliveryConfig.excluded_products);\n      appendIds(excludedVariantIds, deliveryConfig.excluded_variants);\n    }\n    var excludedSet = {};\n    var excludedVariantSet = {};\n    excludedIds.forEach(function (id) { excludedSet[id] = true; });\n    excludedVariantIds.forEach(function (id) { excludedVariantSet[id] = true; });\n\n    var pending = document.querySelectorAll('[data-wf-line-message-pending]');\n    pending.forEach(function (block) {\n      var productId = block.getAttribute('data-product-id') || '';\n      var variantId = block.getAttribute('data-variant-id') || '';\n      var productTitle = normalizeText(block.getAttribute('data-product-title')).toLowerCase();\n      var isAddOnProduct = productTitle.indexOf('add-ons:') === 0 || productTitle.indexOf('add ons') === 0;\n      if (isAddOnProduct || excludedSet[productId] || excludedVariantSet[variantId]) {\n        block.setAttribute('data-line-message-excluded', 'true');\n        block.removeAttribute('data-wf-line-message-pending');\n        block.style.display = 'none';\n        return;\n      }\n      if (!canInitializeEditor) return;\n      var input = getInput(block);\n      var hasExisting = input && normalizeText(input.value);\n      if (!hasExisting) {\n        var existingPropertyName = normalizeText(block.getAttribute('data-line-message-name'));\n        var nextPropertyName = resolveMessagePropertyName(block, propertyName);\n        block.setAttribute('data-line-message-name', nextPropertyName);\n        if (!normalizeText(block.getAttribute('data-line-message-base-name'))) {\n          block.setAttribute('data-line-message-base-name', propertyName);\n        }\n        if (!existingPropertyName) {\n          var label = block.querySelector('.hf-line-message__label') || block.querySelector('.afc-line-message__label');\n          if (label) label.textContent = propertyName;\n        }\n      }\n      block.removeAttribute('data-line-message-excluded');\n      block.removeAttribute('data-wf-line-message-pending');\n      block.style.display = '';\n      if (input && typeof input.value === 'string') {\n        var normalizedInput = normalizeMessageText(input.value);\n        if (input.value !== normalizedInput) input.value = normalizedInput;\n      }\n      syncDeclinedState(block);\n    });\n  }\n\n  window.WF_CART_LINE_MESSAGES = {\n    parseProperties: parseProperties,\n    normalizeMessageText: normalizeMessageText,\n    buildUpdatedProperties: buildUpdatedProperties,\n    isSlotKeyForBase: isSlotKeyForBase,\n    extractSlotIndex: extractSlotIndex,\n    buildSlotKey: buildSlotKey,\n    saveLineMessage: saveLineMessage,\n    declineLineMessage: declineLineMessage,\n    saveAllUnsavedMessages: saveAllUnsavedMessages,\n    getCheckoutBlockingState: getCheckoutBlockingState,\n    prepareMessagesForCheckout: prepareMessagesForCheckout,\n    initMessageCards: initMessageCards,\n    snapshotEditorState: snapshotEditorState,\n    applyEditorSnapshot: applyEditorSnapshot,\n    swapCartSection: swapCartSection,\n  };\n})();\n"],
  "mappings": "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",
  "names": []
}
