{
  "version": 3,
  "sources": ["/cdn/shop/t/54/assets/bb-delivery-line.js?b=1794152934740"],
  "sourcesContent": ["/* bb-delivery-line.js \u2014 a condensed delivery + ETA line directly under the PDP price.\n *\n * \u2B50 IT DOES NO MATHS AND HOLDS NO FIGURE. It reads the text the announcement bar has already\n *    resolved (#bb-dynamic-banner) and reformats it. That matters here: the rate card has moved\n *    five times in five weeks, and bb-shipping-estimator is NOT loaded on this page, so the\n *    banner is the only thing on a PDP that knows the answer. One source, no second copy to drift.\n *\n * \u26D4 IF IT CANNOT PARSE THE BANNER IT RENDERS NOTHING. A blank space is fine; a wrong delivery\n *    promise under a price is not.\n */\n(function () {\n  'use strict';\n\n  var ID = 'bb-dline';\n  var BANNER = 'bb-dynamic-banner';\n\n  /* \"\uD83D\uDE9A Delivered to Summerland, BC for $49 \u00B7 ETA Nov 23 \u2013 Dec 21 change\"\n     ->  { where:\"Summerland, BC\", cost:\"$49\", eta:\"Nov 23 \u2013 Dec 21\" }            */\n  /* \u26D4\u26D4 THE BANNER HAS FOUR SHAPES, NOT ONE, and both stores share the same source:\n   *     \"Delivered to Summerland, BC for $49 \u00B7 ETA Nov 23 \u2013 Dec 21\"      (CA, geo resolved)\n   *     \"Delivered & Unloaded in New Smyrna Beach, FL \u00B7 FREE \u00B7 Nov 28 \u2013 Dec 12\"\n   *     \"Delivered & Unloaded in AL \u00B7 $149\"                               (no dates)\n   *     \"Delivered & Unloaded for $49 \u00B7 FREE $2,500+\"                     (NO LOCATION)\n   * A single rigid regex matched only the first and reported USA as unparseable. So read the\n   * three pieces INDEPENDENTLY, and treat \"no location\" as the ZIP/postal prompt rather than\n   * as a failure \u2014 that last shape is the normal un-geolocated state, not an error. */\n  function parse(text) {\n    if (!text) return null;\n    var t = text.replace(/\\s+/g, ' ').replace(/&amp;/g, '&').trim();\n\n    /* \u26D4\u26D4 A PAUSE IS A READING, NOT A PARSE FAILURE. owner 2026-11-08: \"if i enter a pause\n       zone here it loads the same message\". Measured live: the ZIP resolved, the bar showed\n       its pause sentence, and this chip dropped back to the postal prompt and stayed there.\n       It had no pause branch, so a region we refuse at checkout looked identical to a visitor\n       we had simply never resolved.\n       \u26D4 Returning null here would be worse than useless: render() answers null from\n          _lastGood, which would quote the PREVIOUS region's price and dates to a shopper we\n          cannot deliver to. Read the pause explicitly and let render() say so. */\n    var pz = t.match(/\\b([A-Z]{2})\\b\\s*:\\s*(?:All\\s+)?Trucks\\s+Full/i);\n    if (pz) {\n      var bk = t.match(/\\bBack\\s+(Q[1-4]\\s*20\\d\\d)/i) ||\n               t.match(/\\b(?:Again|Reopening)\\s+(Q[1-4]\\s*20\\d\\d)/i);\n      return { paused: true, st: pz[1].toUpperCase(), back: bk ? bk[1] : null };\n    }\n\n    /* a location only counts after \"to\"/\"in\" \u2014 \"for $49\" is a price, not a place */\n    var w = t.match(/Delivered\\s*(?:&\\s*Unloaded\\s*)?(?:to|in)\\s+([^\u00B7]+?)(?=\\s+for\\b|\\s*\u00B7|\\s*$)/i);\n    var where = w ? w[1].trim() : null;\n    if (!where || /^(us|usa|united states)$/i.test(where)) where = where || null;\n\n    /* \u26D4\u26D4 NO `\\b` BEFORE THE `$`. `$` is not a word character, so `\\b\\$` never matches and the\n       price silently disappears while FREE still works \u2014 which is exactly how this shipped\n       once, reading \"Delivered & Unloaded \u00B7 Arrives Nov\u2013Dec\" with no figure at all. */\n    var c = t.match(/(FREE\\b|\\$\\s?[\\d,]+(?:\\.\\d{2})?)/i);\n    var cost = c ? c[1].replace(/\\s/g, '') : null;\n\n    /* \"Nov 23 \u2013 Dec 21\", with or without a leading ETA */\n    var d = t.match(/\\b([A-Z][a-z]{2}\\.?\\s*\\d{1,2}\\s*[\u2013\u2014-]\\s*[A-Z][a-z]{2}\\.?\\s*\\d{1,2})\\b/);\n    var eta = d ? d[1].trim() : null;\n\n    if (!where) return null;              /* no place \u21D2 show the ZIP / postal prompt */\n    return { where: where, cost: cost, eta: eta };\n  }\n\n  /* \"Nov 23 \u2013 Dec 21\" -> \"Nov\u2013Dec\"; \"Dec 2 \u2013 Dec 19\" -> \"Dec\". Months only: shorter, and it\n     does not read as a hard date we are promising to hit. */\n  function months(eta) {\n    var m = String(eta).match(/[A-Z][a-z]{2}/g);\n    if (!m || !m.length) return eta;\n    var a = m[0], b = m[m.length - 1];\n    return a === b ? a : a + '\u2013' + b;\n  }\n\n  function CA() { return /\\.ca$/i.test(location.hostname); }\n\n\n  /* one owner for the \"change\" control: it always defers to the banner's own picker rather than\n     reimplementing a postal/ZIP form that would then need its own rate lookup */\n  /* \u2B50 ONE OWNER FOR \"open the postal entry in place\". Both the region-code control and the\n     fallback \"change\" button call this \u2014 the behaviour here is subtle enough (never click the\n     bar's own control; focus without scrolling) that a second copy would drift. */\n  function openEntry(ev) {\n    if (ev) ev.preventDefault();\n    /* \u2B50 remember WHICH reading was on screen when the box was opened. render() drops the forced\n       entry as soon as a different one arrives, so answering in the announcement bar releases\n       this chip too. Without it the latch is cleared only by our own Go button and a shopper who\n       used the bar is stranded on an empty ZIP box. */\n    render._entrySig = lastSig || 'NONE';\n    window.__bbForceEntry = true;\n    lastSig = null;            /* force a re-render even though the reading has not changed */\n    render();\n    var f = document.getElementById('bb-dline-zip');\n    if (f) {\n      var sy = window.scrollY, sx = window.scrollX;\n      try { f.focus({ preventScroll: true }); } catch (_) { try { f.focus(); } catch (__) {} }\n      if (window.scrollY !== sy || window.scrollX !== sx) window.scrollTo(sx, sy);\n    }\n  }\n\n  /* \u2B50 owner 2026-11-08: \"make the state code the zip box\". The two-letter region becomes the\n     control, so the row loses the ~33px \"change\" costs without losing the way to re-enter a\n     postal code.\n     \u26D4 A <button>, not a span \u2014 it is a control, so keyboard and screen readers must reach it.\n     \u26D4 aria-label spells out the action: \"TX\" on its own announces nothing useful. */\n  function regionControl(code, banner) {\n    if (!code || !banner.querySelector('a, button, [role=\"button\"]')) return null;\n    var b = document.createElement('button');\n    b.type = 'button';\n    b.className = 'bb-dline__reg';\n    b.textContent = code;\n    b.setAttribute('aria-label', 'Delivering to ' + code + ' \u2014 tap to change your postal code');\n    b.addEventListener('click', openEntry);\n    return b;\n  }\n\n  function addChanger(el, banner, label) {\n    var changer = banner.querySelector('a, button, [role=\"button\"]');\n    if (!changer) return;\n    var b = document.createElement('button');\n    b.type = 'button';\n    b.className = 'bb-dline__change';\n    b.textContent = label;\n    b.addEventListener('click', function (ev) {\n      openEntry(ev);\n    });\n    el.appendChild(b);\n  }\n\n  /* \u26D4\u26D4 THE BANNER IS ANIMATED. Observing it with characterData+subtree fires on every\n     character the typewriter writes, and the first version rebuilt the whole chip each time \u2014\n     measurable as a slow page. Two guards: coalesce bursts into one run, and bail out entirely\n     when the rendered answer has not changed. */\n  var lastSig = null;\n  var queued = false;\n  function schedule() {\n    if (queued) return;\n    queued = true;\n    setTimeout(function () { queued = false; render(); }, 250);\n  }\n\n  /* \u2B50 COLLECTION / SEARCH CARDS \u2014 owner 2026-11-07: the same delivery reading, under each\n     card title.\n     \u26D4 IT COMPUTES NOTHING. It renders exactly what parse() already took off the announcement\n        bar, so a card can never disagree with the bar or the PDP. One owner for the number,\n        the same rule every other freight surface follows.\n     \u26D4 NO \"change\" LINK HERE. There is no per-card entry state to open, and a control that\n        goes nowhere is worse than no control.\n     \u26A0\uFE0F Cards are re-rendered by filtering, sorting and pagination, so this is idempotent per\n        card (it updates text in place) and runs on every render rather than once at load. */\n  function renderCards(d) {\n    if (!d || !d.cost) return;\n    var cards = document.querySelectorAll('.product-card, .product-card-wrapper');\n    if (!cards.length) return;\n    var txt = '\uD83D\uDE9A ' + d.cost + ' Delivery' + (d.eta ? ' \u00B7 ' + months(d.eta) : '');\n    for (var i = 0; i < cards.length; i++) {\n      var card = cards[i];\n      var title = card.querySelector('.item__title, .item__link-title, .product-card__link-title');\n      if (!title) continue;\n      /* the title is often wrapped in its own <a>; anchor to the outermost of the two so the\n         line lands under the whole title block, never inside the link */\n      var after = title.closest('a') || title;\n      var host = after.parentNode;\n      if (!host) continue;\n      var line = card.querySelector('.bb-dcard');\n      if (!line) {\n        line = document.createElement('div');\n        line.className = 'bb-dcard';\n        if (after.nextSibling) host.insertBefore(line, after.nextSibling);\n        else host.appendChild(line);\n      }\n      if (line.textContent !== txt) line.textContent = txt;\n    }\n  }\n\n  function render() {\n    try {\n      var banner = document.getElementById(BANNER);\n      if (!banner) return;\n\n      var d = parse(banner.innerText);\n\n      /* \u26D4\u26D4 THE BANNER ROTATES between the geo line, the free-tier offer and a volume tip.\n         The free message carries NO location, so a plain parse failure used to downgrade the\n         chip to the ZIP prompt and the delivery figure disappeared mid-rotation. Remember the\n         last good reading and keep showing it; the prompt is only for a visitor we have never\n         resolved at all. */\n      /* \u26D4\u26D4 THE MEMO MUST NOT ANSWER FOR A PAUSE. It exists so the chip survives the bar\n         rotating through its free-tier line, which parses to null \u2014 but a PAUSED region\n         parses to null too, and letting the memo fill that gap quotes the last served\n         region's figure to someone we refuse at checkout. A pause is therefore never stored\n         and never substituted. */\n      if (d && d.paused) { /* authoritative: neither memoised nor overridden */ }\n      else if (d) { render._lastGood = d; }\n      else if (render._lastGood) { d = render._lastGood; }\n\n      /* \u26D4 COLLECTION CARDS WERE TRIED AND REMOVED (owner 2026-11-07: \"Super messy remove\n         from collections\"). The line landed between the title and the review stars and broke\n         the card rhythm. renderCards() is left defined but UNCALLED; do not re-enable it\n         without a card design that has somewhere of its own to sit. */\n\n      var price = document.querySelector('.product__price');\n      if (!price) return;\n\n      /* the cheap exit: if the answer is identical to what is already on screen, touch nothing.\n         This is what turns a typewriter's hundreds of mutations into zero DOM work. */\n      var sig = d ? (d.paused ? 'PAUSED|' + d.st + '|' + d.back\n                               : d.where + '|' + d.cost + '|' + d.eta) : 'UNKNOWN';\n\n      /* \u26D4\u26D4 RELEASE THE FORCED ENTRY WHEN THE QUESTION GETS ANSWERED SOMEWHERE ELSE. The\n         announcement bar asks for the same postal code this chip does, but only this chip's own\n         send() ever cleared the latch \u2014 so answering in the BAR left the chip showing an empty\n         ZIP box forever, and the box is wide enough to wrap under the price. Owner 2026-11-08:\n         \"I updated the header and the bottom didn't date and it's sitting under price\".\n         \u2B50 Deliberately knows NOTHING about who answered: a reading that differs from the one\n            on screen when the box was opened means somebody answered. That holds for the bar,\n            for geo resolving late, and for whatever surface gets added next. */\n      if (window.__bbForceEntry === true && d && render._entrySig && sig !== render._entrySig) {\n        window.__bbForceEntry = false;\n        render._entrySig = null;\n      }\n      var existing = document.getElementById(ID);\n      if (existing && sig === lastSig) return;\n      lastSig = sig;\n\n      var el = existing;\n      /* \u2B50 owner 2026-11-07: when nothing is detected, DON'T go blank \u2014 offer the postal entry.\n         A shopper with no resolved location is exactly the one who needs to be told they can\n         get a figure. We still never invent a price or a date. */\n      /* \u26D4\u26D4 DO NOT RE-ADD A PAUSE TEST TO THIS LINE. It reads like it protects the paused\n         reading from the postal prompt; what it actually does is make the paused reading unable\n         to OPEN the prompt, because the region control works by setting __bbForceEntry and\n         re-rendering. Owner 2026-11-08: \"I'm clicking NY and it's not prompting a zip.\"\n         \u2B50 A pause IS a reading, so `!d` is already false for it and it already beats an\n            implicit unknown. Only an EXPLICIT request for the box should beat a pause, and that\n            is precisely what __bbForceEntry means. */\n      var unknown = !d || window.__bbForceEntry === true;\n\n      if (!el) {\n        el = document.createElement('span');\n        el.id = ID;\n        /* owner wants it ON the price line. The theme wraps the money in an inner flex row\n           inside .product__price, so append THERE and let it sit beside the price. The host\n           gets wrap + centre alignment, so a narrow screen drops the chip to its own line\n           instead of overflowing. Falls back to sitting under the price if that row is gone. */\n        /* \u26D4\u26D4 ANCHOR TO THE PRICE, NOT THE H1. Anchoring to the H1 put the chip ABOVE the price\n           every time the banner re-rendered (geo resolving a city), because bb-price-first had\n           already moved it below \u2014 two scripts disagreeing about one element's home. One owner:\n           this inserts after the price, bb-price-first orders the column.\n           \u26D4 ALWAYS A SIBLING, NEVER A CHILD OF THE PRICE ROW \u2014 appending into that flex row\n           re-centred the price and `justify-content: flex-start !important` would not pin it. */\n        /* owner 2026-11-09: ON the price line. The chip stays a SIBLING after .product__price\n           - its documented home, and the one bb-price-first agrees with. What puts it on the\n           same LINE is #bb-priceline becoming a flex row in CSS, not a different insertion\n           point.\n           \u26D4 An earlier attempt today inserted it BEFORE the price on mobile; it rendered below\n              anyway, because bb-price-first re-orders this column after we run. A DOM move here\n              cannot win that argument - do not try it again. */\n        price.insertAdjacentElement('afterend', el);\n      }\n\n      el.textContent = '';\n      /* \u26D4\u26D4 THE UNKNOWN BRANCH ADDS `is-unknown` AND NOTHING EVER TOOK IT OFF. Once geo\n         resolved, the chip showed text content while still wearing the entry state's padding \u2014\n         a different height for the same row, which is the layout squeeze. Clear it every pass. */\n      el.classList.remove('is-unknown');\n\n      /* owner 2026-11-07: \"try brackets\" \u2014 (9 Delivery ...). The brackets are their own\n         aria-hidden spans so screen readers do not read punctuation as content. */\n      var open = document.createElement('span');\n      open.className = 'bb-dline__brk';\n      open.setAttribute('aria-hidden', 'true');\n      open.textContent = '\u2014';\n      el.appendChild(open);\n\n      var truck = document.createElement('span');\n      truck.className = 'bb-dline__ico';\n      truck.textContent = '\uD83D\uDE9A';\n      el.appendChild(truck);\n\n      if (unknown) {\n        /* owner 2026-11-07: \"leave a blank zip or postal entry box if not detected\". A real\n           input, not a link \u2014 but it does NOT do its own rate lookup. It hands the value to the\n           announcement bar's own field and presses the bar's own button, so there is exactly one\n           thing on this page that knows how to turn a postal code into a rate. */\n        /* \u2B50 owner 2026-11-08: \"it has to all live on the one row?\" \u2014 these words are ~150px of\n           a ~350px row that already spends ~115px on the price, so they are hidden on phones\n           (see bb-delivery-line.css). The meaning is not lost: the truck icon and the input's\n           placeholder carry it visually, and the same sentence is attached to the input as an\n           accessible name below. Desktop keeps the words. */\n        var ask = document.createElement('span');\n        ask.className = 'bb-dline__rest bb-dline__ask';\n        ask.textContent = 'Delivery & ETA for';\n        el.appendChild(ask);\n\n        var input = document.createElement('input');\n        input.type = 'text';\n        input.className = 'bb-dline__zip';\n        input.id = 'bb-dline-zip';\n        /* \u26D4\u26D4 THE VISIBLE LABEL IS HIDDEN ON PHONES, SO THE CONTROL NEEDS A NAME OF ITS OWN.\n           A placeholder is NOT an accessible name \u2014 it is a hint, it is not announced by every\n           screen reader, and it disappears the moment anything is typed. Say it properly. */\n        input.setAttribute('aria-label', CA() ? 'Delivery postal code' : 'Delivery ZIP code');\n        input.autocomplete = CA() ? 'postal-code' : 'postal-code';\n        input.placeholder = CA() ? 'Post code' : 'ZIP';\n        input.setAttribute('aria-label', CA() ? 'Postal code for delivery estimate' : 'ZIP code for delivery estimate');\n        input.maxLength = CA() ? 7 : 5;\n        if (!CA()) { input.inputMode = 'numeric'; }\n        el.appendChild(input);\n\n        var go = document.createElement('button');\n        go.type = 'button';\n        go.className = 'bb-dline__go';\n        go.textContent = 'Go';\n        el.appendChild(go);\n\n        /* hold the scroll position across the bar's reaction, and yield the moment the\n           person scrolls for themselves. */\n        var holdScroll = function (ms) {\n          var sx = window.scrollX, sy = window.scrollY, live = true;\n          var keep = function () {\n            if (!live) return;\n            if (window.scrollY !== sy || window.scrollX !== sx) window.scrollTo(sx, sy);\n          };\n          var stop = function () {\n            live = false;\n            window.removeEventListener('scroll', keep, true);\n            window.removeEventListener('wheel', stop, true);\n            window.removeEventListener('touchstart', stop, true);\n          };\n          window.addEventListener('scroll', keep, true);\n          window.addEventListener('wheel', stop, true);\n          window.addEventListener('touchstart', stop, true);\n          [0, 1, 50, 150, 300].forEach(function (t) { setTimeout(keep, t); });\n          try { requestAnimationFrame(keep); } catch (_) {}\n          setTimeout(stop, ms || 700);\n        };\n\n        var send = function () {\n          var v = (input.value || '').trim();\n          window.__bbForceEntry = false;   /* back to the reading once a value is submitted */\n          if (!v) { input.focus(); return; }\n          /* \u26D4 THE BAR SCROLLS ITSELF INTO VIEW when its field takes focus. Keep the shopper\n             where they are while the bar does its work. */\n          holdScroll(700);\n          try { input.blur(); } catch (_) {}\n          /* \u26D4\u26D4 NEVER `banner.querySelector('button')` \u2014 the FIRST control in the bar is its\n             \"change\" button, and that handler CLEARS the geo, re-prompts and focuses its own\n             field. That is the jump to the top, the empty \"Enter Postal\", and the two clicks.\n             Use the bar's own API, exactly as its submit handler does. */\n          var G = window.BBGeo;\n          if (G && typeof G.resolveCode === 'function') {\n            var _r = null;\n            try { _r = G.resolveCode(v); } catch (_) {}\n            var st = _r ? _r.region : null;\n            if (!st) {\n              /* the same refusal the bar gives an unparseable code \u2014 in place, no scroll */\n              input.value = '';\n              input.placeholder = 'Check it';\n              window.__bbForceEntry = true;\n              try { input.focus({ preventScroll: true }); } catch (_) { try { input.focus(); } catch (__) {} }\n              return;\n            }\n            try { G.set({ region: st, source: 'user' }, { silent: true }); } catch (_) {}\n            try { document.dispatchEvent(new CustomEvent('bb:geo-change')); } catch (_) {}\n            try { G.resolveCity(v, st, function () {}); } catch (_) {}\n            lastSig = null;   /* the reading has changed; let render() rebuild */\n            return;\n          }\n\n          /* fallback only: BBGeo missing. Target the REAL Go, never the first button. */\n          var field = banner.querySelector('#bb-zip-input') ||\n                      banner.querySelector('input[type=\"text\"], input:not([type]), input[inputmode]');\n          if (field) {\n            field.value = v;\n            field.dispatchEvent(new Event('input', { bubbles: true }));\n            field.dispatchEvent(new Event('change', { bubbles: true }));\n            var frm = banner.querySelector('#bb-zip-form');\n            if (frm) {\n              frm.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n              return;\n            }\n            field.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', keyCode: 13, bubbles: true }));\n          }\n        };\n        go.addEventListener('click', send);\n        input.addEventListener('keydown', function (e) { if (e.key === 'Enter') { e.preventDefault(); send(); } });\n\n        /* \u26D4 the closing bracket lived only in the resolved branch, so the ZIP state rendered\n           '[ ... Go' with no closing bracket. Both states must close what they open. */\n        var closeZ = document.createElement('span');\n        closeZ.className = 'bb-dline__brk';\n        closeZ.setAttribute('aria-hidden', 'true');\n        closeZ.textContent = '';\n        el.appendChild(closeZ);\n\n        el.classList.add('is-unknown');\n        el.removeAttribute('title');\n        return;\n      }\n\n      /* owner 2026-11-07: \"maybe no city mention\". The announcement bar directly above already\n         says \"Delivered to <city>\", so repeating it here was both redundant and the reason the\n         chip kept wrapping onto four lines in a narrow product column. ETA + dates only.\n         `d.where` is still parsed and is what the title attribute uses. */\n      /* owner 2026-11-07: \"Delivered & Unloaded ETA Nov - Dec\". No city \u2014 the announcement bar\n         directly above already names it, and repeating it is what wrapped this onto four lines.\n         Months only, no day numbers: shorter, and it does not read as a hard date we must hit. */\n      /* owner 2026-11-07: \"just the truck and the price and dates super condensed\", \"$49\n         Delivery\", \"Need to have dates here\" \u2014 real dates, not the month range. */\n      /* \u2B50 THE PAUSED READING. Owner picked the wording 2026-11-08: \"NY Delivery Paused \u2014\n         Back Q2 2028\". It states the queue and the date; it never states a price, because a\n         price beside a pause is the contradiction that started this.\n         \u26D4 No ETA, no cost, no title claiming delivery \u2014 those come from d, and d has none. */\n      if (d.paused) {\n        var pl = document.createElement('span');\n        pl.className = 'bb-dline__lead';\n        /* \u26D4\u26D4 THE PAUSED READING NEEDS THE CONTROL MORE THAN THE RESOLVED ONE DOES. A shopper\n           told we do not deliver to them will try their postal code again \u2014 owner 2026-11-08,\n           \"paused zones ain't clickable\", after an earlier pass removed \"change\" from BOTH\n           readings but only rebuilt the control on one of them. */\n        var pBtn = regionControl(d.st, banner);\n        if (pBtn) pl.appendChild(pBtn);\n        else pl.appendChild(document.createTextNode(d.st));\n        pl.appendChild(document.createTextNode(' Delivery Paused' + (d.back ? ' \u2014 Back ' + d.back : '')));\n        el.appendChild(pl);\n        el.title = 'New orders paused for ' + d.st + (d.back ? ' \u00B7 back ' + d.back : '') + ' \u2014 tap ' + d.st + ' to change your postal code';\n        return;\n      }\n\n      var strong = document.createElement('span');\n      strong.className = 'bb-dline__lead';\n      /* owner 2026-11-07: \"orange the $49 or Free and the 23 and 21\" \u2014 the FIGURE carries the\n         highlight, not the whole phrase, so the amount gets its own span and the word\n         \"Delivery\" stays a plain text node that the painter leaves black. */\n      /* \u2B50 owner 2026-11-08: \"$49 CA Delivery\", \"Free California Delivery etc\", then \"dont\n         spell it out\" / \"do liek the abbreviation\". So: the two-letter code only.\n         \u2B50 Read off d.where, which the bar has already resolved \u2014 \"Summerland, BC\",\n            \"New Smyrna Beach, FL\", or a bare \"AL\". No new global, no second source of truth,\n            and it works unchanged on the CA store where the same field carries a province.\n         \u26D4 If the bar gives no region the chip simply says \"$49 Delivery\" as before. It must\n            degrade to the old line, never to a guessed one. */\n      var ab = (String(d.where || '').match(/,\\s*([A-Za-z]{2})\\s*$/) ||\n                String(d.where || '').match(/^([A-Za-z]{2})$/) || [])[1];\n      var reg = ab ? ab.toUpperCase() : '';\n      var regBtn = regionControl(reg, banner);\n      var amtTxt = d.cost ? (/free/i.test(d.cost) ? 'Free' : d.cost) : '';\n      /* \u2B50 owner 2026-11-09: \"Unloaded in WA \u2014 $149\". BENEFIT FIRST, FIGURE SECOND \u2014 the old\n         order led with the price, which on a $41 panel anchors on a number 3.6x the product\n         before the reader learns what it buys. The region is appended below, then the amount. */\n      /* \u26D4 if the control could not be built (no picker in the bar) fall back to PLAIN TEXT, so\n         the region is still stated. Never drop information just because it cannot be clicked. */\n      /* owner 2026-11-09, settled after three passes: \"BC Delivery $49\". REGION LEADS.\n         \u26D4 I had just taken the region OUT on the previous instruction (\"Unloaded $49 - Nov\n            etc?\") and the owner put it straight back: \"No we need region\". It is the part that\n            proves the figure is THIS shopper's rather than a national average, and it is the\n            click target that opens the region picker - so it is appended FIRST and the picker\n            control goes with it. */\n      /* owner 2026-11-09: \"Do this \uD83D\uDE9A to BC \u2014 $49\" + \"The truck implies Shipping or\n         Delivery\". So the NOUN is dropped and only the preposition carries the region.\n         \u26D4 The no-region fallback keeps the word, because without a region \"\uD83D\uDE9A \u2014 $49\" reads as\n            a fragment. Degrade to the old wording, never to a broken one. */\n      strong.appendChild(document.createTextNode(reg ? 'to ' : 'Delivery'));\n      if (regBtn) strong.appendChild(regBtn);\n      else if (reg) strong.appendChild(document.createTextNode(reg));\n      if (amtTxt) {\n        strong.appendChild(document.createTextNode(' \\u2014 '));\n        var amt = document.createElement('span');\n        amt.className = 'bb-dline__amt';\n        amt.textContent = amtTxt;\n        strong.appendChild(amt);\n      }\n      el.appendChild(strong);\n\n      /* dates are optional \u2014 \"Delivered & Unloaded in AL \u00B7 $149\" carries none, and inventing\n         one would be the single worst thing this chip could do */\n      if (d.eta) {\n        var sep = document.createElement('span');\n        sep.className = 'bb-dline__sep';\n        /* owner 2026-11-07: \"between delivery and the date should we put like by or ETA or\n           something?\" \u2014 a bare middot left the reader to guess what the dates were.\n           \u26D4 NOT \"by\": \"$49 Delivery by Nov 23 \u2013 Dec 21\" promises the first date, and the\n              window exists because we cannot promise it.\n           \u26D4 aria-hidden is REMOVED on purpose \u2014 it was right for a decorative middot and\n              wrong for a word that carries the meaning of the dates that follow. */\n        sep.textContent = '\\u00B7';   /* owner 2026-11-09: one line is the constraint; \"ETA\" costs 3 chars */\n        el.appendChild(sep);\n\n        var rest = document.createElement('span');\n        rest.className = 'bb-dline__rest';\n        /* \u2B50 owner 2026-11-07: \"add a space here between the dash on both sides\".\n           The dash was deliberately tightened to \"Nov 23\u2013Dec 21\" to save width on the price\n           line; that is now reversed to \"Nov 23 \u2013 Dec 21\".\n           \u26A0\uFE0F This costs ~6px on a line that already shares its row with the price. If the chip\n              starts wrapping on a phone, this is the change that did it. */\n        /* owner 2026-11-07: the DAY NUMBERS are orange, the month names are not. Split on\n           runs of digits and wrap each run.\n           \u26D4 createElement + text nodes, never innerHTML \u2014 d.eta is assembled from live geo\n              and lead-time data, and this line renders on every PDP. */\n        var etaTxt = d.eta.replace(/\\s*[\u2013\u2014-]\\s*/, '\\u2013');   /* tightened again 2026-11-09 to hold one line */\n        var segs = etaTxt.split(/(\\d+)/);\n        for (var si = 0; si < segs.length; si++) {\n          if (!segs[si]) continue;\n          if (/^\\d+$/.test(segs[si])) {\n            var dnum = document.createElement('span');\n            dnum.className = 'bb-dline__d';\n            dnum.textContent = segs[si];\n            rest.appendChild(dnum);\n          } else {\n            rest.appendChild(document.createTextNode(segs[si]));\n          }\n        }\n        el.appendChild(rest);\n      }\n\n      /* the full answer stays available on hover without taking a pixel of width */\n      el.title = 'Delivered to ' + d.where + (d.eta ? ' \u00B7 ' + d.eta : '');\n\n      /* \u26D4 no \"change\" here any more \u2014 the region code IS the control (owner 2026-11-08).\n         addChanger stays DEFINED and is still used by the postal-prompt state, which has no\n         region code to tap. */\n\n      var close = document.createElement('span');\n      close.className = 'bb-dline__brk';\n      close.setAttribute('aria-hidden', 'true');\n      close.textContent = '';\n      el.appendChild(close);\n    } catch (e) {\n      var stale = document.getElementById(ID);\n      if (stale) stale.remove();\n      if (window.console) console.warn('[bb-delivery-line] stood down:', e && e.message);\n    }\n  }\n\n  function start() {\n    render();\n    var banner = document.getElementById(BANNER);\n    if (!banner) return;\n    /* observe the BANNER and write to a DIFFERENT element, so the callback can never retrigger\n       itself \u2014 an observer that mutates its own target took this site down once already. */\n    try {\n      new MutationObserver(schedule).observe(banner, { childList: true, subtree: true, characterData: true });\n    } catch (_) {}\n  }\n\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start);\n  else start();\n  document.addEventListener('shopify:section:load', render);\n})();\n"],
  "mappings": "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",
  "names": []
}
