{
  "version": 3,
  "sources": ["/cdn/shop/t/325/assets/nbt-cart-addon-selects.js?x=1794498454592"],
  "sourcesContent": ["/*\n * NBT 11/10: Cart drawer add-ons (pinned footer) show each size/color choice as a\n * compact dropdown instead of rows of buttons, so a 3-option product (LTR: Color /\n * Waist / Inseam) stays one short card. The original buttons stay in the page,\n * hidden; each dropdown simply clicks the matching button, so variant picking and\n * ADD keep using the theme's own logic. Drawer add-on row only.\n */\n(() => {\n  const ROW = '[data-modal-id=\"modal--cart-drawer\"] [data-style-id$=\"slider_zGFfgV\"] .grid-container > *';\n  const shortName = (t) => {\n    t = (t || '').replace(/\\s+/g, ' ').trim();\n    if (/inseam|length/i.test(t)) return 'Length';\n    return t || 'Option';\n  };\n  const valueOf = (l) => l.getAttribute('aria-label');\n  // Some products store option values in lowercase (LTR Slim: \"black\"); show them capitalized.\n  const pretty = (v) => (v || '').replace(/\\b([a-z])/g, (m) => m.toUpperCase());\n  const visible = (l) => l.style.display !== 'none';\n\n  // Every card gets the same choices row so all cards are the same height:\n  // 2+ choices = dropdown; 1 choice = a fixed box showing it (e.g. Color: Black,\n  // Length: 30); no size option at all (belt, hat) = \"Size: One size fits all\".\n  function slot(row, i) {\n    let wrap = row.children[i];\n    if (!wrap) {\n      wrap = document.createElement('label');\n      wrap.className = 'nbt-addon-select';\n      wrap.innerHTML = '<span></span><select></select><b class=\"nbt-addon-fixed\"></b>';\n      row.appendChild(wrap);\n    }\n    return wrap;\n  }\n  function setText(el, t) { if (el.textContent !== t) el.textContent = t; }\n\n  function buildCard(card) {\n    const link = card.querySelector(':scope > a');\n    if (!link) return;\n    const fieldsets = [...card.querySelectorAll('fieldset')];\n    // Full-width row under the card, OUTSIDE the card link, so a tap on a dropdown\n    // can never open the product page.\n    let row = card.querySelector(':scope > .nbt-addon-selects');\n    if (!row) {\n      row = document.createElement('div');\n      row.className = 'nbt-addon-selects';\n      card.appendChild(row);\n    }\n    let hasSize = false;\n    fieldsets.forEach((fs, i) => {\n      fs.parentElement.classList.add('nbt-addon-option-hidden');\n      const labels = [...fs.querySelectorAll('label[aria-label]')];\n      const vis = labels.filter(visible);\n      const wrap = slot(row, i);\n      // An empty group (the theme draws a spare third slot for 2-choice products).\n      wrap.hidden = !labels.length;\n      if (!labels.length) return;\n      const select = wrap.querySelector('select');\n      if (!select.dataset.bound) {\n        select.dataset.bound = '1';\n        select.addEventListener('change', (e) => {\n          const target = [...fs.querySelectorAll('label[aria-label]')].find((l) => valueOf(l) === e.target.value);\n          if (target) (target.querySelector('input') || target).click();\n        });\n      }\n      // Two ways the theme draws the choice name: a legend linked by id, or (when the\n      // card is built in the browser) a plain legend beside the group with no id.\n      const legend = document.getElementById(fs.getAttribute('aria-labelledby')) || fs.parentElement.querySelector('legend');\n      const raw = legend?.dataset.legend && !/\\[heading\\]/.test(legend.dataset.legend) ? legend.dataset.legend.replace(/<[^>]+>/g, '') : legend?.textContent;\n      const name = shortName(/^\\s*undefined\\s*$/.test(raw || '') ? '' : raw);\n      if (/size|waist/i.test(name)) hasSize = true;\n      setText(wrap.querySelector('span'), name);\n      const current = valueOf(vis.find((l) => l.classList.contains('active')) || vis[0] || labels[0]);\n      const sig = vis.map(valueOf).join('|') + '#' + current;\n      if (select.dataset.sig !== sig) {\n        select.innerHTML = vis.map((l) => `<option value=\"${valueOf(l).replace(/\"/g, '&quot;')}\">${pretty(valueOf(l))}</option>`).join('');\n        select.value = current;\n        select.dataset.sig = sig;\n        select.setAttribute('aria-label', name);\n      }\n      const fixed = vis.length <= 1;\n      if (wrap.classList.contains('is-fixed') !== fixed) wrap.classList.toggle('is-fixed', fixed);\n      setText(wrap.querySelector('.nbt-addon-fixed'), pretty(current || ''));\n      if (wrap.hidden) wrap.hidden = false;\n    });\n    // No size choice on this product (belt, hat): say so, so the card matches the others.\n    let n = fieldsets.length;\n    if (!hasSize) {\n      const wrap = slot(row, n);\n      wrap.classList.add('is-fixed');\n      setText(wrap.querySelector('span'), 'Size');\n      setText(wrap.querySelector('.nbt-addon-fixed'), 'One size fits all');\n      if (wrap.hidden) wrap.hidden = false;\n      n += 1;\n    }\n    [...row.children].slice(n).forEach((w) => { if (!w.hidden) w.hidden = true; });\n    // The choice name (\"Size\") sits inside the box; push the value past it.\n    [...row.children].forEach((w) => {\n      const sp = w.querySelector('span');\n      // A color name speaks for itself (\"Black\"), and so does \"One size fits all\",\n      // so those drop their label to save room.\n      const hide = /^colou?r$/i.test(sp?.textContent || '') || /one size/i.test(w.querySelector('.nbt-addon-fixed')?.textContent || '');\n      if (sp && sp.hidden !== hide) sp.hidden = hide;\n      const px = hide ? '9px' : (sp && sp.offsetWidth ? (sp.offsetWidth + 11) + 'px' : '');\n      if (px && w.style.getPropertyValue('--nbt-label-w') !== px) w.style.setProperty('--nbt-label-w', px);\n    });\n    if (row.hidden) row.hidden = false;\n  }\n\n  // \"Riders Also Snagged\" sits under the cart items as a vertical list (Scott 11/11). When the cart\n  // is long enough to push it below Subtotal, its heading and the top of the first card stay\n  // peeking above Subtotal (CSS sticky with a negative bottom), so shoppers know to scroll.\n  // CSS reads --nbt-peek; PEEK is how much stays visible.\n  const BOX = '[data-modal-id=\"modal--cart-drawer\"] [data-style-id$=\"main_cart_container_At9Un6\"]';\n  const PEEK = 96;\n  function buildPeek(box) {\n    const v = Math.min(0, PEEK - box.offsetHeight) + 'px';\n    if (box.style.getPropertyValue('--nbt-peek') !== v) box.style.setProperty('--nbt-peek', v);\n  }\n\n  let timer;\n  const run = () => {\n    document.querySelectorAll(ROW).forEach(buildCard);\n    document.querySelectorAll(BOX).forEach(buildPeek);\n    // Free gift lines get a class so the gift artwork (theme settings) can replace the plain product photo.\n    document.querySelectorAll('[data-line-item-id]').forEach((el) => {\n      let gift = false;\n      try { gift = !!window.Alpine?.$data(el)?.line_card?.line_item?.properties?._gift_with_purchase; } catch (e) { /* not ready yet */ }\n      if (el.classList.contains('nbt-gift-line') !== gift) el.classList.toggle('nbt-gift-line', gift);\n    });\n  };\n  new MutationObserver(() => { clearTimeout(timer); timer = setTimeout(run, 80); })\n    .observe(document.documentElement, { subtree: true, childList: true, attributes: true, attributeFilter: ['class', 'style'] });\n  run();\n})();\n\n/*\n * NBT 11/12 (Justin's QA): Checkout, then Back, then delete an item sent people\n * straight back to checkout. Safari restores the page from its back/forward cache\n * frozen mid-checkout (spinning button, checkout still pending), so the next cart\n * change finishes that old checkout. If we left for checkout and the page comes\n * back from that cache, reload it once so the cart starts fresh. Normal Back\n * navigation that didn't go through checkout is left alone.\n */\n(() => {\n  const KEY = 'nbt-left-for-checkout';\n  const mark = () => { try { sessionStorage.setItem(KEY, '1'); } catch (e) {} };\n  document.addEventListener('click', (e) => {\n    if (e.target.closest && e.target.closest('[name=\"checkout\"], a[href*=\"/checkout\"]')) mark();\n  }, true);\n  document.addEventListener('submit', (e) => {\n    if (e.submitter && e.submitter.name === 'checkout') mark();\n  }, true);\n  window.addEventListener('pageshow', (e) => {\n    let left = false;\n    try { left = sessionStorage.getItem(KEY) === '1'; sessionStorage.removeItem(KEY); } catch (err) {}\n    if (e.persisted && left) location.reload();\n  });\n})();\n"],
  "mappings": "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",
  "names": []
}
