{
  "version": 3,
  "sources": ["/cdn/shop/t/69/assets/tnf-mobile-search.js?cb=1778247210"],
  "sourcesContent": ["/* TNF Mobile Search Popup \u2014 self-contained, mobile-only.\n   Empty state: recent searches, category bubbles, \"discover\" (new products\n   filtered against cart + recently-viewed), recently viewed.\n   Typing state: predictive results via /search/suggest.json.\n   Triggers on the header magnifying glass [data-action=\"toggle-search\"].\n   Does NOT touch desktop search.\n*/\n(function () {\n  if (window._tnfMobileSearchPopup) return;\n  window._tnfMobileSearchPopup = true;\n\n  var DEBOUNCE_MS = 180;\n  var LS_RECENT_SEARCHES = 'tnf:recent-searches';\n  var LS_RECENT_VIEWED = 'tnf:recent-viewed';\n  var MAX_RECENT_SEARCHES = 6;\n  var MAX_RECENT_VIEWED = 12;\n\n  var lastQ = '';\n  var debounceTimer = null;\n  var inFlight = null;\n  var modal = null;\n  var input = null;\n  var resultsEl = null;\n  var cartProductIds = null; // populated on first open\n\n  // \u2500\u2500\u2500 Categories (clickable bubbles) \u2014 niche / less-visited collections to drive exposure\n  // (verified handles via /collections.json) \u2500\u2500\u2500\n  var CATEGORIES = [\n    { name: 'Vegan', handle: 'vegan', emoji: '\uD83C\uDF31' },\n    { name: 'Gluten-Free', handle: 'gluten-free-protein-snacks', emoji: '\uD83C\uDF3E' },\n    { name: 'Keto', handle: 'keto-low-carb', emoji: '\uD83E\uDD51' },\n    { name: 'Greens', handle: 'greens-antioxidants', emoji: '\uD83E\uDD6C' },\n    { name: 'Collagen', handle: 'collagen-beauty-supplements', emoji: '\u2728' },\n    { name: 'Hydration', handle: 'electrolytes-sport-gels', emoji: '\uD83D\uDCA7' },\n    { name: 'BCAAs / EAA', handle: 'bcaas-amino-acids', emoji: '\uD83E\uDDEC' },\n    { name: 'Low Sugar', handle: 'low-sugar-candies-chocolates', emoji: '\uD83C\uDF6C' },\n    { name: 'Aqua Omega', handle: 'aqua-omega', emoji: '\uD83D\uDC1F' },\n    { name: 'Clearance', handle: 'clearance', emoji: '\uD83D\uDD25' }\n  ];\n\n  function isMobile() { return window.matchMedia('(max-width: 767px)').matches; }\n  function isDesktop() { return window.matchMedia('(min-width: 768px)').matches; }\n\n  // \u2500\u2500\u2500 GA4 dataLayer pushes \u2014 uses tnf_predictive_search namespace\n  // (DISTINCT from tnf_search_query which is reserved for Ask TNF) \u2500\u2500\u2500\n  function ga4Push(event, params) {\n    try {\n      window.dataLayer = window.dataLayer || [];\n      var payload = { event: event, surface: isMobile() ? 'mobile' : 'desktop', page_path: window.location.pathname };\n      Object.keys(params || {}).forEach(function (k) { payload[k] = params[k]; });\n      window.dataLayer.push(payload);\n    } catch (e) {}\n  }\n  function escHtml(str) {\n    return String(str || '').replace(/[&<>\"']/g, function (c) {\n      return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c];\n    });\n  }\n  function moneyFmt(cents) { var n = (cents || 0) / 100; return '$' + n.toFixed(2); }\n\n  // \u2500\u2500\u2500 localStorage helpers \u2500\u2500\u2500\n  function lsGet(key) {\n    try { var v = localStorage.getItem(key); return v ? JSON.parse(v) : []; }\n    catch (e) { return []; }\n  }\n  function lsSet(key, val) {\n    try { localStorage.setItem(key, JSON.stringify(val)); } catch (e) {}\n  }\n  function pushRecentSearch(q) {\n    q = (q || '').trim();\n    if (!q) return;\n    var list = lsGet(LS_RECENT_SEARCHES);\n    list = list.filter(function (x) { return x.toLowerCase() !== q.toLowerCase(); });\n    list.unshift(q);\n    list = list.slice(0, MAX_RECENT_SEARCHES);\n    lsSet(LS_RECENT_SEARCHES, list);\n  }\n  function pushRecentViewed(product) {\n    if (!product || !product.handle) return;\n    var list = lsGet(LS_RECENT_VIEWED);\n    list = list.filter(function (x) { return x.handle !== product.handle; });\n    list.unshift(product);\n    list = list.slice(0, MAX_RECENT_VIEWED);\n    lsSet(LS_RECENT_VIEWED, list);\n  }\n\n  // \u2500\u2500\u2500 Track PDP visits \u2192 recently viewed \u2500\u2500\u2500\n  function trackPDPVisit() {\n    var m = window.location.pathname.match(/\\/products\\/([^\\/?#]+)/);\n    if (!m) return;\n    var handle = m[1];\n    // Read meta tags from the page for product info\n    var titleEl = document.querySelector('meta[property=\"og:title\"]');\n    var imageEl = document.querySelector('meta[property=\"og:image\"]');\n    var priceEl = document.querySelector('meta[property=\"og:price:amount\"]') ||\n                  document.querySelector('meta[property=\"product:price:amount\"]');\n    var product = {\n      handle: handle,\n      title: (titleEl && titleEl.content) || document.title || handle,\n      image: (imageEl && imageEl.content) || '',\n      price: (priceEl && parseFloat(priceEl.content) * 100) || null\n    };\n    pushRecentViewed(product);\n  }\n  if (window.location.pathname.indexOf('/products/') === 0) {\n    if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', trackPDPVisit);\n    else trackPDPVisit();\n  }\n\n  // \u2500\u2500\u2500 Cart fetch (for filtering \"discover\" products) \u2500\u2500\u2500\n  function fetchCartProductIds() {\n    if (cartProductIds !== null) return Promise.resolve(cartProductIds);\n    return fetch('/cart.js', { credentials: 'same-origin' })\n      .then(function (r) { return r.json(); })\n      .then(function (cart) {\n        cartProductIds = (cart.items || []).map(function (i) { return String(i.product_id); });\n        return cartProductIds;\n      })\n      .catch(function () { cartProductIds = []; return cartProductIds; });\n  }\n\n  // \u2500\u2500\u2500 Discover: fetch newest products across all types/vendors, filter cart + viewed \u2500\u2500\u2500\n  function fetchDiscover() {\n    return fetchCartProductIds().then(function (cartIds) {\n      var viewed = lsGet(LS_RECENT_VIEWED).map(function (v) { return v.handle; });\n      // Pull a wider pool from /products.json (all products, sorted newest first),\n      // then dedupe by vendor + product_type for variety.\n      return fetch('/products.json?limit=50', { credentials: 'same-origin' })\n        .then(function (r) { return r.ok ? r.json() : { products: [] }; })\n        .then(function (data) {\n          var products = data.products || [];\n          var filtered = products.filter(function (p) {\n            if (cartIds.indexOf(String(p.id)) !== -1) return false;\n            if (viewed.indexOf(p.handle) !== -1) return false;\n            // Skip out-of-stock products\n            if (p.variants && p.variants.length > 0 && p.variants.every(function (v) { return v.available === false; })) return false;\n            return true;\n          });\n          // Round-robin by vendor + product_type for variety\n          var byVendor = {};\n          filtered.forEach(function (p) {\n            var key = (p.vendor || 'misc') + '|' + (p.product_type || '');\n            if (!byVendor[key]) byVendor[key] = [];\n            byVendor[key].push(p);\n          });\n          var keys = Object.keys(byVendor);\n          var picks = [];\n          // Take 1 from each unique vendor+type until we have 8\n          while (picks.length < 8 && keys.length > 0) {\n            for (var i = 0; i < keys.length && picks.length < 8; i++) {\n              var k = keys[i];\n              if (byVendor[k] && byVendor[k].length > 0) {\n                picks.push(byVendor[k].shift());\n              }\n            }\n            // Remove exhausted keys\n            keys = keys.filter(function (k) { return byVendor[k] && byVendor[k].length > 0; });\n          }\n          return picks;\n        })\n        .catch(function () { return []; });\n    });\n  }\n\n  function injectStyles() {\n    if (document.getElementById('tnf-mobile-search-styles')) return;\n    var s = document.createElement('style');\n    s.id = 'tnf-mobile-search-styles';\n    s.textContent =\n      '#tnf-mobile-search-modal { position: fixed; inset: 0; z-index: 2147483647; display: none; font-family: Barlow, system-ui, sans-serif; }' +\n      '#tnf-mobile-search-modal.is-open { display: block; }' +\n      '#tnf-mobile-search-modal .tnf-msm-back { position: absolute; inset: 0; background: rgba(15,25,50,0.55); }' +\n      '#tnf-mobile-search-modal .tnf-msm-card { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: #fff; display: flex; flex-direction: column; animation: tnfMsmSlide 0.22s ease; }' +\n      '@keyframes tnfMsmSlide { from { transform: translateY(-12px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }' +\n      '#tnf-mobile-search-modal .tnf-msm-head { display: flex; align-items: center; gap: 8px; padding: 12px 14px; border-bottom: 1px solid #ebeef2; flex-shrink: 0; }' +\n      '#tnf-mobile-search-modal .tnf-msm-icon { color: #1e2d7d; flex-shrink: 0; }' +\n      '#tnf-mobile-search-modal .tnf-msm-input { flex: 1; border: none; outline: none; font-size: 16px; color: #1e2d7d; font-family: inherit; padding: 8px 0; background: transparent; min-width: 0; }' +\n      '#tnf-mobile-search-modal .tnf-msm-input::placeholder { color: #95a0aa; }' +\n      '#tnf-mobile-search-modal .tnf-msm-close { border: none; background: transparent; color: #677279; cursor: pointer; padding: 6px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; border-radius: 50%; }' +\n      '#tnf-mobile-search-modal .tnf-msm-close:hover { background: #f0f4f8; color: #1e2d7d; }' +\n      '#tnf-mobile-search-modal .tnf-msm-results { flex: 1; overflow-y: auto; padding: 10px 14px 24px; }' +\n      // Empty-state sections\n      '#tnf-mobile-search-modal .tnf-msm-section { margin-bottom: 18px; }' +\n      '#tnf-mobile-search-modal .tnf-msm-section-title { font-size: 13px; font-weight: 700; color: #1e2d7d; margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.4px; display: flex; align-items: center; gap: 6px; }' +\n      '#tnf-mobile-search-modal .tnf-msm-clear-btn { margin-left: auto; font-size: 11px; font-weight: 600; color: #95a0aa; background: none; border: none; cursor: pointer; text-transform: none; letter-spacing: 0; padding: 0; }' +\n      '#tnf-mobile-search-modal .tnf-msm-clear-btn:hover { color: #e32c2b; }' +\n      // Recent search chips\n      '#tnf-mobile-search-modal .tnf-msm-chips { display: flex; flex-wrap: wrap; gap: 6px; }' +\n      '#tnf-mobile-search-modal .tnf-msm-chip { padding: 6px 12px; background: #f0f4f8; color: #1e2d7d; font-size: 13px; font-weight: 600; border-radius: 999px; border: none; cursor: pointer; font-family: inherit; }' +\n      '#tnf-mobile-search-modal .tnf-msm-chip:hover { background: #e0e6ec; }' +\n      // Category bubbles\n      '#tnf-mobile-search-modal .tnf-msm-bubbles { display: flex; gap: 10px; overflow-x: auto; padding-bottom: 6px; -webkit-overflow-scrolling: touch; }' +\n      '#tnf-mobile-search-modal .tnf-msm-bubbles::-webkit-scrollbar { display: none; }' +\n      '#tnf-mobile-search-modal .tnf-msm-bubble { flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; gap: 5px; min-width: 70px; text-decoration: none; color: inherit; }' +\n      '#tnf-mobile-search-modal .tnf-msm-bubble-icon { width: 56px; height: 56px; border-radius: 50%; background: linear-gradient(135deg, #e6f0ff 0%, #f7f9fb 100%); display: flex; align-items: center; justify-content: center; font-size: 26px; border: 1.5px solid #ebeef2; }' +\n      '#tnf-mobile-search-modal .tnf-msm-bubble:hover .tnf-msm-bubble-icon { border-color: #006fdb; transform: scale(1.05); }' +\n      '#tnf-mobile-search-modal .tnf-msm-bubble-name { font-size: 11px; font-weight: 600; color: #1e2d7d; text-align: center; line-height: 1.2; }' +\n      // Product cards (predictive + discover + recently viewed)\n      '#tnf-mobile-search-modal .tnf-msm-empty { text-align: center; color: #95a0aa; font-size: 13px; padding: 20px 16px; }' +\n      '#tnf-mobile-search-modal .tnf-msm-item { display: flex; align-items: center; gap: 12px; padding: 8px 4px; border-bottom: 1px solid #f0f4f8; text-decoration: none; color: inherit; }' +\n      '#tnf-mobile-search-modal .tnf-msm-item:hover { background: #f7f9fb; }' +\n      '#tnf-mobile-search-modal .tnf-msm-img { width: 48px; height: 48px; border-radius: 6px; object-fit: cover; flex-shrink: 0; background: #f0f4f8; }' +\n      '#tnf-mobile-search-modal .tnf-msm-info { flex: 1; min-width: 0; }' +\n      '#tnf-mobile-search-modal .tnf-msm-title { font-size: 13px; color: #1e2d7d; line-height: 1.3; font-weight: 600; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }' +\n      '#tnf-mobile-search-modal .tnf-msm-vendor { font-size: 10.5px; color: #677279; margin-top: 2px; text-transform: uppercase; letter-spacing: 0.4px; }' +\n      '#tnf-mobile-search-modal .tnf-msm-price { font-size: 12.5px; color: #006fdb; font-weight: 700; margin-top: 2px; }' +\n      '#tnf-mobile-search-modal .tnf-msm-price-compare { color: #95a0aa; font-weight: 500; text-decoration: line-through; margin-left: 6px; font-size: 11px; }' +\n      '#tnf-mobile-search-modal .tnf-msm-viewall { display: block; text-align: center; padding: 14px; margin-top: 8px; background: linear-gradient(135deg, #1e2d7d 0%, #006fdb 100%); color: #fff; font-weight: 700; font-size: 14px; border-radius: 8px; text-decoration: none; }' +\n      // Shop-collection / shop-vendor row (top of results)\n      '#tnf-mobile-search-modal .tnf-msm-shop-links { display: flex; flex-direction: column; gap: 6px; margin-bottom: 14px; }' +\n      '#tnf-mobile-search-modal .tnf-msm-shop-link { display: flex; align-items: center; gap: 10px; padding: 12px 14px; background: linear-gradient(135deg, #f0f7ff 0%, #e6f0ff 100%); border: 1.5px solid #d0e3ff; border-radius: 8px; text-decoration: none; color: #1e2d7d; font-weight: 600; font-size: 13.5px; transition: border-color 0.15s ease, transform 0.15s ease; }' +\n      '#tnf-mobile-search-modal .tnf-msm-shop-link:hover { border-color: #006fdb; transform: translateX(2px); }' +\n      '#tnf-mobile-search-modal .tnf-msm-shop-icon { font-size: 18px; flex-shrink: 0; }' +\n      '#tnf-mobile-search-modal .tnf-msm-shop-text { flex: 1; }' +\n      '#tnf-mobile-search-modal .tnf-msm-shop-text strong { color: #006fdb; font-weight: 700; }' +\n      'body.tnf-msm-open { overflow: hidden; }' +\n      // Desktop variant \u2014 centered modal with backdrop, max width\n      '@media (min-width: 768px) {' +\n        '#tnf-mobile-search-modal .tnf-msm-card { top: 6vh !important; bottom: auto !important; left: 50% !important; right: auto !important; transform: translateX(-50%); width: 90%; max-width: 720px; max-height: 86vh; border-radius: 12px; box-shadow: 0 20px 60px rgba(0,0,0,0.25); animation: tnfMsmDesktopPop 0.22s ease; }' +\n        '@keyframes tnfMsmDesktopPop { from { transform: translateX(-50%) scale(0.96); opacity: 0; } to { transform: translateX(-50%) scale(1); opacity: 1; } }' +\n        '#tnf-mobile-search-modal .tnf-msm-input { font-size: 18px; padding: 10px 0; }' +\n        '#tnf-mobile-search-modal .tnf-msm-results { padding: 14px 22px 28px; }' +\n        '#tnf-mobile-search-modal .tnf-msm-bubble-icon { width: 64px; height: 64px; font-size: 30px; }' +\n        '#tnf-mobile-search-modal .tnf-msm-bubble-name { font-size: 12px; }' +\n      '}';\n    document.head.appendChild(s);\n  }\n\n  function buildModal() {\n    var m = document.createElement('div');\n    m.id = 'tnf-mobile-search-modal';\n    m.setAttribute('aria-hidden', 'true');\n    m.innerHTML =\n      '<div class=\"tnf-msm-back\" data-msm-close=\"1\"></div>' +\n      '<div class=\"tnf-msm-card\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Search\">' +\n        '<div class=\"tnf-msm-head\">' +\n          '<svg class=\"tnf-msm-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\"/></svg>' +\n          '<input type=\"text\" class=\"tnf-msm-input\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" placeholder=\"Search products, brands, flavors\u2026\">' +\n          '<button type=\"button\" class=\"tnf-msm-close\" aria-label=\"Close\" data-msm-close=\"1\">' +\n            '<svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>' +\n          '</button>' +\n        '</div>' +\n        '<div class=\"tnf-msm-results\" data-msm-results=\"1\"></div>' +\n      '</div>';\n    document.body.appendChild(m);\n    return m;\n  }\n\n  function getProductImg(p) {\n    // /search/suggest.json: featured_image is { url: '...' }, also returns image string\n    // /products.json: images is array of { src: '...', position: ... } OR array of strings\n    // /collections/X/products.json: similar\n    if (p.featured_image) {\n      if (typeof p.featured_image === 'string') return p.featured_image;\n      if (p.featured_image.url) return p.featured_image.url;\n      if (p.featured_image.src) return p.featured_image.src;\n    }\n    if (p.image) {\n      if (typeof p.image === 'string') return p.image;\n      if (p.image.url) return p.image.url;\n      if (p.image.src) return p.image.src;\n    }\n    if (Array.isArray(p.images) && p.images.length > 0) {\n      var first = p.images[0];\n      if (typeof first === 'string') return first;\n      if (first.src) return first.src;\n      if (first.url) return first.url;\n    }\n    return '';\n  }\n  function getProductPrice(p) {\n    // /search/suggest.json: price is in cents (number) + compare_at_price\n    // /products.json: variants[0].price is a string in dollars\n    if (typeof p.price === 'number') {\n      var hi = (typeof p.compare_at_price === 'number' && p.compare_at_price > p.price);\n      if (hi) {\n        return '<span class=\"tnf-msm-price\">' + moneyFmt(p.price) + '<span class=\"tnf-msm-price-compare\">' + moneyFmt(p.compare_at_price) + '</span></span>';\n      }\n      return '<span class=\"tnf-msm-price\">' + moneyFmt(p.price) + '</span>';\n    }\n    if (p.variants && p.variants[0]) {\n      var v = p.variants[0];\n      var price = parseFloat(v.price);\n      var cmp = parseFloat(v.compare_at_price);\n      if (isNaN(price)) return '';\n      if (!isNaN(cmp) && cmp > price) {\n        return '<span class=\"tnf-msm-price\">$' + price.toFixed(2) + '<span class=\"tnf-msm-price-compare\">$' + cmp.toFixed(2) + '</span></span>';\n      }\n      return '<span class=\"tnf-msm-price\">$' + price.toFixed(2) + '</span>';\n    }\n    return '';\n  }\n  function renderProductRow(p) {\n    var img = getProductImg(p);\n    var price = getProductPrice(p);\n    return '<a class=\"tnf-msm-item\" href=\"' + escHtml(p.url || ('/products/' + p.handle)) + '\">' +\n      (img ? '<img class=\"tnf-msm-img\" src=\"' + escHtml(img) + '\" alt=\"\" loading=\"lazy\">' : '<div class=\"tnf-msm-img\"></div>') +\n      '<div class=\"tnf-msm-info\">' +\n        '<div class=\"tnf-msm-title\">' + escHtml(p.title) + '</div>' +\n        (p.vendor ? '<div class=\"tnf-msm-vendor\">' + escHtml(p.vendor) + '</div>' : '') +\n        price +\n      '</div>' +\n    '</a>';\n  }\n\n  function renderEmpty() {\n    if (!resultsEl) return;\n    resultsEl.innerHTML = '<div class=\"tnf-msm-empty\">Loading\u2026</div>';\n\n    var html = '';\n\n    // Recent searches\n    var recentSearches = lsGet(LS_RECENT_SEARCHES);\n    if (recentSearches.length > 0) {\n      html += '<div class=\"tnf-msm-section\">';\n      html += '<div class=\"tnf-msm-section-title\">\uD83D\uDD58 Recent searches' +\n        '<button class=\"tnf-msm-clear-btn\" data-msm-clear-searches=\"1\">Clear</button>' +\n      '</div>';\n      html += '<div class=\"tnf-msm-chips\">';\n      recentSearches.forEach(function (q) {\n        html += '<button class=\"tnf-msm-chip\" data-msm-search=\"' + escHtml(q) + '\">' + escHtml(q) + '</button>';\n      });\n      html += '</div></div>';\n    }\n\n    // Category bubbles\n    html += '<div class=\"tnf-msm-section\">';\n    html += '<div class=\"tnf-msm-section-title\">\uD83D\uDED2 Browse by category</div>';\n    html += '<div class=\"tnf-msm-bubbles\">';\n    CATEGORIES.forEach(function (c) {\n      html += '<a class=\"tnf-msm-bubble\" href=\"/collections/' + escHtml(c.handle) + '\">' +\n        '<div class=\"tnf-msm-bubble-icon\">' + c.emoji + '</div>' +\n        '<div class=\"tnf-msm-bubble-name\">' + escHtml(c.name) + '</div>' +\n      '</a>';\n    });\n    html += '</div></div>';\n\n    // Discover (new products, filtered)\n    html += '<div class=\"tnf-msm-section\" data-msm-discover=\"1\">' +\n      '<div class=\"tnf-msm-section-title\">\u2728 Discover something new</div>' +\n      '<div data-msm-discover-list=\"1\"><div class=\"tnf-msm-empty\">Loading\u2026</div></div>' +\n    '</div>';\n\n    // Recently viewed\n    var recentViewed = lsGet(LS_RECENT_VIEWED);\n    if (recentViewed.length > 0) {\n      html += '<div class=\"tnf-msm-section\">';\n      html += '<div class=\"tnf-msm-section-title\">\uD83D\uDC41\uFE0F Recently viewed' +\n        '<button class=\"tnf-msm-clear-btn\" data-msm-clear-viewed=\"1\">Clear</button>' +\n      '</div>';\n      recentViewed.slice(0, 5).forEach(function (p) {\n        html += renderProductRow(p);\n      });\n      html += '</div>';\n    }\n\n    resultsEl.innerHTML = html;\n\n    // Async-load discover\n    var discoverList = resultsEl.querySelector('[data-msm-discover-list]');\n    if (discoverList) {\n      fetchDiscover().then(function (products) {\n        if (!products.length) {\n          var section = resultsEl.querySelector('[data-msm-discover]');\n          if (section) section.style.display = 'none';\n          return;\n        }\n        var ph = '';\n        products.forEach(function (p) { ph += renderProductRow(p); });\n        discoverList.innerHTML = ph;\n      });\n    }\n  }\n\n  function renderNoResults(q) {\n    if (!resultsEl) return;\n    ga4Push('tnf_predictive_search_no_results', { query: q });\n    var html = '<div class=\"tnf-msm-empty\">No products match \"' + escHtml(q) + '\" exactly</div>';\n    // Still offer vendor + all-results fallback\n    html += '<div class=\"tnf-msm-section\">' +\n      '<a class=\"tnf-msm-shop-link\" href=\"/collections/vendors?q=' + encodeURIComponent(q) + '\">' +\n        '<span class=\"tnf-msm-shop-icon\">\uD83C\uDFF7\uFE0F</span>' +\n        '<span class=\"tnf-msm-shop-text\">Shop \"' + escHtml(q) + '\" brand collection \u2192</span>' +\n      '</a>' +\n      '<a class=\"tnf-msm-shop-link\" href=\"/search?q=' + encodeURIComponent(q) + '\">' +\n        '<span class=\"tnf-msm-shop-icon\">\uD83D\uDD0D</span>' +\n        '<span class=\"tnf-msm-shop-text\">Browse all \"' + escHtml(q) + '\" results \u2192</span>' +\n      '</a>' +\n    '</div>';\n    resultsEl.innerHTML = html;\n  }\n\n  function renderResults(data, q) {\n    if (!resultsEl) return;\n    var results = (data && data.resources && data.resources.results) || {};\n    var products = results.products || [];\n    var collections = results.collections || [];\n    var pages = results.pages || [];\n\n    // Detect if any product's vendor matches the query \u2014 surface a \"Shop {vendor}\" link\n    var qLower = q.toLowerCase().trim();\n    var vendorMatch = '';\n    var seenVendors = {};\n    products.forEach(function (p) {\n      if (!p.vendor) return;\n      var vLower = p.vendor.toLowerCase();\n      if (seenVendors[vLower]) return;\n      seenVendors[vLower] = true;\n      // Match if vendor contains the query OR query contains the vendor\n      if (vLower.indexOf(qLower) !== -1 || qLower.indexOf(vLower) !== -1) {\n        vendorMatch = p.vendor;\n      }\n    });\n\n    // Fire GA4 event for every search result render\n    ga4Push('tnf_predictive_search', {\n      query: q,\n      result_count: products.length,\n      collection_count: collections.length,\n      has_vendor_match: !!vendorMatch,\n      vendor_matched: vendorMatch || null\n    });\n\n    if (!products.length && !collections.length) { renderNoResults(q); return; }\n\n    var html = '';\n\n    // SHOP LINKS (vendor + RELATED collection \u2014 never duplicates of vendor) \u2014 above products\n    var shopLinks = '';\n    var vendorHandle = '';\n    var vendorTitle = '';\n    if (vendorMatch) {\n      vendorHandle = vendorMatch.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n      vendorTitle = vendorMatch.toLowerCase();\n      // TNF 2026-08-17 \u2014 link to the REAL brand collection, never a guessed handle.\n      // Guessing /collections/<slug(vendor)> landed shoppers on a catch-all category\n      // page when that exact handle didn't exist (e.g. \"David Protein\" ->\n      // /collections/david-protein, whose real page is /collections/david-protein-bars).\n      // 1) Prefer a collection from the predictive results that IS this brand's page\n      //    (exact title/handle match, or title/handle that begins with the full vendor\n      //    name at a word/segment boundary \u2014 so \"David Protein\" matches \"David Protein\n      //    Bars\" but \"Believe Supplements\" never grabs the generic \"Supplements\").\n      var vendorColl = null;\n      for (var _vi = 0; _vi < collections.length; _vi++) {\n        var _vc = collections[_vi];\n        var _vch = (_vc.handle || '').toLowerCase();\n        var _vct = (_vc.title || '').toLowerCase();\n        if (_vct === vendorTitle || _vch === vendorHandle ||\n            _vct.indexOf(vendorTitle + ' ') === 0 ||\n            _vch.indexOf(vendorHandle + '-') === 0) { vendorColl = _vc; break; }\n      }\n      // 2) Fallback = Shopify's automatic all-products-by-vendor page (always valid,\n      //    never 404 / never the wrong category page).\n      var vendorUrl = vendorColl ? (vendorColl.url || ('/collections/' + vendorColl.handle))\n                                  : ('/collections/vendors?q=' + encodeURIComponent(vendorMatch));\n      if (vendorColl && vendorColl.handle) { vendorHandle = vendorColl.handle.toLowerCase(); }\n      shopLinks += '<a class=\"tnf-msm-shop-link\" href=\"' + escHtml(vendorUrl) + '\">' +\n        '<span class=\"tnf-msm-shop-icon\">\uD83C\uDFF7\uFE0F</span>' +\n        '<span class=\"tnf-msm-shop-text\">Shop all <strong>' + escHtml(vendorMatch) + '</strong> products \u2192</span>' +\n      '</a>';\n    }\n    // Related collections: filter out the vendor's own collection (no duplicates),\n    // and prefer category/ingredient/diet collections that span multiple brands.\n    var seenHandles = {};\n    if (vendorHandle) seenHandles[vendorHandle] = true;\n    var relatedAdded = 0;\n    collections.forEach(function (c) {\n      if (relatedAdded >= 2) return;\n      var ch = (c.handle || '').toLowerCase();\n      var ct = (c.title || '').toLowerCase();\n      if (!ch) return;\n      if (seenHandles[ch]) return;\n      // Skip if collection handle/title is essentially the same as the vendor (different formatting)\n      if (vendorTitle && (ch.indexOf(vendorTitle.replace(/\\s+/g, '-')) !== -1 || ct === vendorTitle)) return;\n      seenHandles[ch] = true;\n      shopLinks += '<a class=\"tnf-msm-shop-link\" href=\"' + escHtml(c.url || ('/collections/' + c.handle)) + '\">' +\n        '<span class=\"tnf-msm-shop-icon\">\uD83D\uDED2</span>' +\n        '<span class=\"tnf-msm-shop-text\">' + (vendorMatch ? 'Discover similar \u2014 ' : 'Shop ') + '<strong>' + escHtml(c.title) + '</strong> collection \u2192</span>' +\n      '</a>';\n      relatedAdded++;\n    });\n    if (shopLinks) html += '<div class=\"tnf-msm-shop-links\">' + shopLinks + '</div>';\n\n    // PRODUCT RESULTS\n    if (products.length) {\n      html += '<div class=\"tnf-msm-section\">';\n      if (shopLinks) html += '<div class=\"tnf-msm-section-title\">\uD83D\uDCE6 Products</div>';\n      products.slice(0, 12).forEach(function (p) { html += renderProductRow(p); });\n      html += '</div>';\n    }\n\n    html += '<a class=\"tnf-msm-viewall\" href=\"/search?q=' + encodeURIComponent(q) + '\">View all results for \"' + escHtml(q) + '\" \u2192</a>';\n    resultsEl.innerHTML = html;\n  }\n\n  function search(q) {\n    if (!q || !q.trim()) { renderEmpty(); return; }\n    if (q === lastQ) return;\n    lastQ = q;\n    if (inFlight) try { inFlight.abort(); } catch (e) {}\n    var ctrl = new AbortController();\n    inFlight = ctrl;\n    // Fetch products + collections so we can surface vendor / category / ingredient pages too\n    fetch('/search/suggest.json?q=' + encodeURIComponent(q) +\n          '&resources[type]=product,collection' +\n          '&resources[limit]=12' +\n          '&resources[options][fields]=title,product_type,variants.title,vendor,tag' +\n          '&resources[options][unavailable_products]=last', {\n      signal: ctrl.signal\n    })\n      .then(function (r) { return r.json(); })\n      .then(function (data) { renderResults(data, q); })\n      .catch(function (err) { if (err && err.name !== 'AbortError') {} });\n  }\n\n  function debouncedSearch(q) {\n    clearTimeout(debounceTimer);\n    debounceTimer = setTimeout(function () {\n      // Only save to recent searches if user committed (3+ chars + idle)\n      if (q && q.trim().length >= 3) pushRecentSearch(q);\n      search(q);\n    }, DEBOUNCE_MS);\n  }\n\n  function open() {\n    if (!modal) {\n      injectStyles();\n      modal = buildModal();\n      input = modal.querySelector('.tnf-msm-input');\n      resultsEl = modal.querySelector('[data-msm-results]');\n      input.addEventListener('input', function () { debouncedSearch(input.value); });\n      input.addEventListener('keydown', function (e) {\n        if (e.key === 'Enter' && input.value.trim()) {\n          pushRecentSearch(input.value);\n          ga4Push('tnf_predictive_search_submit', { query: input.value.trim() });\n          window.location.href = '/search?q=' + encodeURIComponent(input.value.trim());\n        }\n      });\n      modal.addEventListener('click', function (e) {\n        if (e.target.closest('[data-msm-close]')) { close(); return; }\n        // Recent search chip click \u2192 run search\n        var chip = e.target.closest('[data-msm-search]');\n        if (chip) {\n          var qval = chip.getAttribute('data-msm-search');\n          ga4Push('tnf_predictive_search_chip_click', { query: qval });\n          input.value = qval;\n          search(qval);\n          return;\n        }\n        // Clear searches\n        if (e.target.closest('[data-msm-clear-searches]')) {\n          lsSet(LS_RECENT_SEARCHES, []);\n          renderEmpty();\n          return;\n        }\n        // Clear viewed\n        if (e.target.closest('[data-msm-clear-viewed]')) {\n          lsSet(LS_RECENT_VIEWED, []);\n          renderEmpty();\n          return;\n        }\n        // Track every clickable result link with the right event name\n        var bubbleLink = e.target.closest('.tnf-msm-bubble');\n        if (bubbleLink) {\n          ga4Push('tnf_predictive_search_category_click', { category_url: bubbleLink.getAttribute('href') });\n          return;\n        }\n        var shopLink = e.target.closest('.tnf-msm-shop-link');\n        if (shopLink) {\n          ga4Push('tnf_predictive_search_shoplink_click', { query: input.value || lastQ, target_url: shopLink.getAttribute('href') });\n          return;\n        }\n        var viewAll = e.target.closest('.tnf-msm-viewall');\n        if (viewAll) {\n          ga4Push('tnf_predictive_search_view_all_click', { query: input.value || lastQ });\n          return;\n        }\n        var productLink = e.target.closest('.tnf-msm-item');\n        if (productLink) {\n          ga4Push('tnf_predictive_search_result_click', { query: input.value || lastQ, product_url: productLink.getAttribute('href') });\n          return;\n        }\n      });\n      document.addEventListener('keydown', function (e) {\n        if (e.key === 'Escape' && modal.classList.contains('is-open')) close();\n      });\n    }\n    modal.classList.add('is-open');\n    modal.setAttribute('aria-hidden', 'false');\n    document.body.classList.add('tnf-msm-open');\n    input.value = '';\n    lastQ = '';\n    cartProductIds = null; // refresh cart on each open\n    ga4Push('tnf_predictive_search_open', {});\n    renderEmpty();\n    setTimeout(function () { input && input.focus(); }, 60);\n  }\n\n  function close() {\n    if (!modal) return;\n    modal.classList.remove('is-open');\n    modal.setAttribute('aria-hidden', 'true');\n    document.body.classList.remove('tnf-msm-open');\n  }\n\n  // \u2500\u2500\u2500 MOBILE: hijack magnifier click \u2500\u2500\u2500\n  document.addEventListener('click', function (e) {\n    if (!isMobile()) return;\n    var btn = e.target.closest('[data-action=\"toggle-search\"]');\n    if (!btn) return;\n    e.preventDefault();\n    e.stopImmediatePropagation();\n    open();\n  }, true);\n  function bindMagnifier() {\n    document.querySelectorAll('[data-action=\"toggle-search\"]').forEach(function (a) {\n      if (a.tagName === 'A' && a.getAttribute('href') !== '#') {\n        a.setAttribute('data-tnf-orig-href', a.getAttribute('href') || '');\n        a.setAttribute('href', '#');\n      }\n      a.setAttribute('role', 'button');\n      if (!a.dataset.tnfMsBound) {\n        a.dataset.tnfMsBound = '1';\n        a.addEventListener('click', function (e) {\n          if (!isMobile()) return;\n          e.preventDefault();\n          e.stopPropagation();\n          open();\n          return false;\n        }, true);\n      }\n    });\n  }\n\n  // \u2500\u2500\u2500 DESKTOP: hijack search-bar input focus + submit click \u2500\u2500\u2500\n  // Capture-phase fires BEFORE the existing variant-bundle search hijack,\n  // and stopImmediatePropagation prevents that one from running.\n  document.addEventListener('focus', function (e) {\n    if (!isDesktop()) return;\n    var t = e.target;\n    if (!t || !t.classList || !t.classList.contains('search-bar__input')) return;\n    e.preventDefault();\n    e.stopImmediatePropagation();\n    try { t.blur(); } catch (err) {}\n    open();\n  }, true);\n  document.addEventListener('mousedown', function (e) {\n    if (!isDesktop()) return;\n    var t = e.target;\n    if (!t) return;\n    if (t.closest && t.closest('.search-bar__input')) {\n      e.preventDefault();\n      e.stopImmediatePropagation();\n      open();\n    }\n  }, true);\n  document.addEventListener('click', function (e) {\n    if (!isDesktop()) return;\n    if (e.target.closest('.search-bar__submit')) {\n      var inp = document.querySelector('.search-bar__input');\n      if (inp && !inp.value.trim()) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        open();\n      }\n    }\n  }, true);\n\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', bindMagnifier);\n  else bindMagnifier();\n  setTimeout(bindMagnifier, 1000);\n  setTimeout(bindMagnifier, 3000);\n})();\n"],
  "mappings": "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",
  "names": ["k"]
}
