{
  "version": 3,
  "sources": ["/cdn/shop/t/69/assets/tnf-search-typo-suggest.js?cb=20260519m"],
  "sourcesContent": ["/*\n * tnf-search-typo-suggest.js\n *\n * Adds a \"Did you mean: <suggestion>?\" line to the TNF search overlay when the\n * customer's query is a likely typo of a known brand / category and the search\n * returned 0\u2013few results.\n *\n * Hooks into the existing search built in variant-bundle-common.js:\n *   - Input element:    .tnf-search-input\n *   - Results container: .tnf-search-results\n *   - Product items:    .tnf-product-item\n *   - \"See all results\" link: .tnf-view-all (used as a result-count signal)\n *\n * The module is purely additive and never modifies the existing predictive\n * search render. It watches .tnf-search-results for changes (MutationObserver),\n * counts result items, and prepends/updates the suggestion node when warranted.\n *\n * Build: dictionary pulled from Shopify Admin GraphQL on 2026-05-15 (vendor\n * list, top product categories). 284 entries total.\n */\n(function () {\n  \"use strict\";\n\n  if (window.__tnfTypoSuggestLoaded) return;\n  window.__tnfTypoSuggestLoaded = true;\n\n  // ----- DICTIONARY (pulled from Shopify Admin, see file header) -----\n  var VENDORS = [\"321GLO\",\"3D Energy\",\"4ever Fit\",\"ABE\",\"alani nu\",\"Allmax Nutrition\",\"Allo\",\"Aloha\",\"Alora Naturals\",\"Alpha Prime\",\"ALT\",\"Ambrosia Planta\",\"Animal\",\"Applied Nutrition\",\"Aqua Omega\",\"Arnold\",\"ATF Sports\",\"Australian Gold\",\"Barebells\",\"Believe Supplements\",\"Better Bears\",\"Better Bovine\",\"Better Than Good\",\"Betty Crocker\",\"Biosteel\",\"Bite and More\",\"BlenderBottle\",\"Bowmar Nutrition\",\"Brain Gains\",\"Bucked Up\",\"Built Bar\",\"CanDo Foam Rollers\",\"Candy Can\",\"CanPrev\",\"Catalina Crunch\",\"Cellucor\",\"Certified Lab\",\"ChocoRite\",\"ChocZero\",\"ChunkyFit\",\"Crisp Power\",\"David Protein\",\"Designer Skin\",\"Diva Rice\",\"Double Wood Supplements\",\"Effin' Good Snacks\",\"EHP Labs\",\"elavi\",\"Emerald Bay\",\"Ener-LIfe\",\"FeelingOK\",\"Fiber Gourmet\",\"Finaflex\",\"Fitcrunch\",\"fizzique\",\"Flavolicious\",\"Freshfield\",\"FULFIL\",\"G Butter\",\"G Hughes\",\"Genius Gourmet\",\"Genuine Health\",\"GFUEL\",\"GHOST\",\"Go Nutrition\",\"GoFit\",\"Goodles\",\"Gorilla Mind\",\"Grenade\",\"Grit Nutrition\",\"Grizzly\",\"Guerrero\",\"HangryBoy\",\"Heal+Co\",\"Healthy Hippo\",\"Helixx\",\"Herbaland\",\"Hershey's\",\"Highkey\",\"Himalaya\",\"HiProtein\",\"Hydra Cup\",\"Hydro Case\",\"Ice Shaker\",\"IQ Bar\",\"Iron Bull Strength\",\"Iron Kingdom\",\"IWON Organics\",\"Jell-O\",\"Joseph's Bakery\",\"Joyride\",\"JWOWW\",\"Kalaya\",\"keto wise\",\"Khloud\",\"Killer Labz\",\"Kingline Nutition\",\"KissMyKeto\",\"Krisda\",\"La Banderita\",\"Land Art\",\"Leanfit\",\"Legendary Foods\",\"Lenny & Larry\",\"LIFT TECH\",\"Liquid Grip\",\"Magic Spoon\",\"Mammoth\",\"Max Protein\",\"Max Sweets\",\"Maxi Nutrition\",\"Mid-Day Squares\",\"Mind Blow\",\"Misfits\",\"Mission\",\"Mountain Joe's\",\"MOVEWEIGHT\",\"Mr. Tortilla\",\"Mrs Taste\",\"MuscleMac\",\"MuscleMeds\",\"MuscleSport\",\"MuscleTech\",\"Mutant\",\"My Protein\",\"MyProtein\",\"Nano Supplements\",\"Natural Stacks\",\"New Nordic Supplements\",\"NICK'S\",\"No Cow\",\"North Coast Naturals\",\"Nova Forme\",\"Nu Life\",\"Nutrabolics\",\"Nutraphase\",\"NutriWise\",\"Nutry Nuts\",\"Nuts 'n More\",\"Nuun Sport\",\"Oh my spice\",\"Ohana Liquids\",\"Ole Mexican Foods\",\"Omaha\",\"ONE Bar\",\"Optimum Nutrition\",\"Orange Naturals\",\"Palmini\",\"PB2\",\"PERF4M Nutrition\",\"Performa\",\"PEScience\",\"Pharma-Grade\",\"PhD\",\"Platinum Naturals\",\"Power Crunch\",\"prairie naturals\",\"PRIME\",\"ProBites\",\"Progressive\",\"Protein Candy\",\"Protein Source\",\"Prozis\",\"Pure Vita Labs\",\"Purus Labs\",\"PVL\",\"PWR4ALL\",\"qnt\",\"Quamtrax Nutrition\",\"Quest\",\"Quest Nutrition\",\"Rabeko\",\"Red Vines\",\"Redcon1\",\"Redefine Foods\",\"Reese\",\"RenewLife\",\"repp sports\",\"Revive MD\",\"Rip Van\",\"Rule1\",\"RYSE\",\"SANA\",\"Santte Foods\",\"schoolyard snacks\",\"Scivation\",\"Shameless Snacks\",\"Shrewd Food\",\"SIIP\",\"Simply Scrumptous\",\"SimplyProtein\",\"Sinfit Nutrition\",\"Sinless\",\"SIS\",\"SmartBaking\",\"Smarter Snacks\",\"Snackhouse\",\"SNCK\",\"Soloray\",\"Southern Recipe\",\"Sportneer\",\"SteelFit\",\"Steeves\",\"Swedish Beauty\",\"Swedish Protein Deli\",\"sweet nothings\",\"Sweet Nutrition Canada\",\"Swerve\",\"SWISS Natural\",\"Tested Nutrition\",\"Think!\",\"TRUBAR\",\"TRUELY\",\"TRUFF\",\"USN\",\"Velomix\",\"VMI Sports\",\"WANA\",\"warrior supplements\",\"WELLBAR\",\"Wilde\",\"Wispy Protein\",\"XPLabs\",\"Zone Smelling Salts\"];\n\n  var CATEGORIES = [\"protein powder\",\"protein bar\",\"protein bars\",\"whey protein\",\"whey isolate\",\"vegan protein\",\"casein\",\"mass gainer\",\"pre-workout\",\"preworkout\",\"creatine\",\"bcaa\",\"eaa\",\"amino acids\",\"glutamine\",\"electrolytes\",\"energy drink\",\"energy drinks\",\"caffeine\",\"multivitamin\",\"vitamins\",\"omega 3\",\"fish oil\",\"collagen\",\"fat burner\",\"thermogenic\",\"l-carnitine\",\"carnitine\",\"greens\",\"probiotics\",\"nootropic\",\"sleep aid\",\"testosterone booster\",\"protein snacks\",\"protein snack\",\"keto snacks\",\"low carb\",\"sugar free\",\"chips\",\"cookies\",\"candy\",\"chocolate\",\"peanut butter\",\"shaker\",\"shaker bottle\",\"tanning lotion\",\"gift card\",\"meal replacement\",\"protein cookies\",\"protein puffs\",\"protein chips\",\"rice cakes\",\"jerky\",\"beef jerky\",\"gummies\",\"protein gummies\",\"cereal\",\"protein cereal\",\"granola\",\"protein granola\"];\n\n  // Normalize for matching: lowercase, strip non-alnum (so \"Lenny & Larry\" -> \"lennylarry\").\n  function normalize(s) {\n    return String(s || \"\").toLowerCase().replace(/[^a-z0-9]+/g, \"\");\n  }\n  // Soft-normalize: keep spaces so we can match multi-word categories.\n  function softNormalize(s) {\n    return String(s || \"\").toLowerCase().replace(/[^a-z0-9 ]+/g, \" \").replace(/\\s+/g, \" \").trim();\n  }\n\n  // Build matching pool: { display: original, key: normalized, soft: softNormalized }\n  var POOL = [];\n  function addPoolEntry(display) {\n    var key = normalize(display);\n    var soft = softNormalize(display);\n    if (!key || key.length < 3) return;\n    POOL.push({ display: display, key: key, soft: soft });\n  }\n  VENDORS.forEach(addPoolEntry);\n  CATEGORIES.forEach(addPoolEntry);\n\n  // High-confidence overrides for real-world typos/variants seen in GA4 search\n  // data (2026-06-13) that Levenshtein's distance threshold misses \u2014 e.g.\n  // \"barbell\" -> \"Barebells\" is edit-distance 3, over the cap for a 7-char\n  // query. Keyed by NORMALIZED query (lowercase, alnum only). Deterministic:\n  // only fires on an exact normalized match, so normal queries are untouched.\n  var OVERRIDES = {\n    \"barbell\": \"Barebells\",\n    \"barbells\": \"Barebells\",\n    \"barebell\": \"Barebells\",\n    \"barbel\": \"Barebells\",\n    \"probite\": \"ProBites\",\n    \"probits\": \"ProBites\",\n    \"chocolatezero\": \"ChocZero\",\n    \"davidbar\": \"David Protein\",\n    \"davidbars\": \"David Protein\",\n    \"davidprotien\": \"David Protein\",\n    \"protien\": \"protein powder\",\n    \"preworkout\": \"pre-workout\",\n    \"magicspoons\": \"Magic Spoon\"\n  };\n\n  // ----- Levenshtein distance (iterative, O(n*m), capped) -----\n  function levenshtein(a, b, cap) {\n    var n = a.length, m = b.length;\n    if (n === 0) return m;\n    if (m === 0) return n;\n    if (Math.abs(n - m) > cap) return cap + 1;\n    var prev = new Array(m + 1);\n    for (var j = 0; j <= m; j++) prev[j] = j;\n    for (var i = 1; i <= n; i++) {\n      var curr = [i];\n      var rowMin = i;\n      for (var k = 1; k <= m; k++) {\n        var cost = a.charCodeAt(i - 1) === b.charCodeAt(k - 1) ? 0 : 1;\n        var v = Math.min(prev[k] + 1, curr[k - 1] + 1, prev[k - 1] + cost);\n        curr.push(v);\n        if (v < rowMin) rowMin = v;\n      }\n      if (rowMin > cap) return cap + 1; // early-exit\n      prev = curr;\n    }\n    return prev[m];\n  }\n\n  /**\n   * Suggest a correction for the user's query. Returns { suggestion, distance }\n   * or null if no good match.\n   *\n   * Rules:\n   *   - Query must be >= 4 chars (after normalize)\n   *   - Compare both normalized (no spaces) and soft (spaces preserved)\n   *   - Distance threshold = 2 absolute OR <= 25% of query length, whichever larger\n   *   - Suggestion must differ from query (not a case-only rename)\n   *   - If query already EXACTLY matches a known term, return null\n   */\n  function suggestCorrection(query) {\n    var raw = String(query || \"\").trim();\n    if (raw.length < 4) return null;\n    var qKey = normalize(raw);\n    var qSoft = softNormalize(raw);\n    if (qKey.length < 4) return null;\n\n    // Exact match (no typo) -> no suggestion\n    for (var i = 0; i < POOL.length; i++) {\n      if (POOL[i].key === qKey || POOL[i].soft === qSoft) return null;\n    }\n\n    // Curated overrides \u2014 catch real-world typos Levenshtein's threshold misses.\n    if (OVERRIDES[qKey]) return { suggestion: OVERRIDES[qKey], distance: 1 };\n\n    // Tight threshold for short queries to avoid noise like \"test\" -> \"Quest\".\n    // Loosen slightly for longer queries to catch multi-char typos in compound\n    // brand/category names (\"mussel sport\" -> \"MuscleSport\" is distance 3).\n    var maxDist;\n    if (qKey.length <= 5) {\n      maxDist = 1;\n    } else if (qKey.length <= 8) {\n      maxDist = 2;\n    } else {\n      maxDist = Math.max(2, Math.ceil(qKey.length * 0.28));\n    }\n    var best = null;\n\n    for (var j = 0; j < POOL.length; j++) {\n      var entry = POOL[j];\n      // Try the tighter normalized form first (cheap, ignores spaces/punct)\n      var d1 = levenshtein(qKey, entry.key, maxDist);\n      var d2 = levenshtein(qSoft, entry.soft, maxDist);\n      var d = Math.min(d1, d2);\n      if (d <= maxDist) {\n        // Prefer suggestions where the user's query is a partial/substring\n        // (small bias to break ties).\n        var score = d;\n        if (entry.key.indexOf(qKey) !== -1 || qKey.indexOf(entry.key) !== -1) {\n          score -= 0.5;\n        }\n        if (!best || score < best.score) {\n          best = { display: entry.display, distance: d, score: score };\n        }\n      }\n    }\n\n    if (!best) return null;\n    // Don't suggest something the user already typed (different case only)\n    if (normalize(best.display) === qKey) return null;\n    return { suggestion: best.display, distance: best.distance };\n  }\n  // Expose for testing / GA debugging\n  window.tnfSuggestCorrection = suggestCorrection;\n\n  // ----- DOM integration -----\n  var STYLE_ID = \"tnf-typo-suggest-style\";\n  var SUGGEST_NODE_ID = \"tnf-typo-suggest\";\n\n  function injectStyle() {\n    if (document.getElementById(STYLE_ID)) return;\n    var style = document.createElement(\"style\");\n    style.id = STYLE_ID;\n    style.textContent = [\n      \"#tnf-typo-suggest{\",\n      \"  margin:0 0 12px 0;\",\n      \"  padding:10px 14px;\",\n      \"  background:#fff8d6;\",\n      \"  border:1px solid #ffd800;\",\n      \"  border-radius:8px;\",\n      \"  font-family:Barlow,system-ui,sans-serif;\",\n      \"  font-size:14px;\",\n      \"  line-height:1.4;\",\n      \"  color:#1e2d7d;\",\n      \"}\",\n      \"#tnf-typo-suggest .tnf-typo-label{\",\n      \"  font-weight:500;\",\n      \"  margin-right:4px;\",\n      \"}\",\n      \"#tnf-typo-suggest button.tnf-typo-link{\",\n      \"  background:none;\",\n      \"  border:none;\",\n      \"  padding:0;\",\n      \"  margin:0;\",\n      \"  color:#1e2d7d;\",\n      \"  font:inherit;\",\n      \"  font-weight:700;\",\n      \"  text-decoration:underline;\",\n      \"  cursor:pointer;\",\n      \"}\",\n      \"#tnf-typo-suggest button.tnf-typo-link:hover{\",\n      \"  color:#006fdb;\",\n      \"}\",\n      \"@media (max-width:480px){\",\n      \"  #tnf-typo-suggest{font-size:13px;padding:9px 12px;}\",\n      \"}\"\n    ].join(\"\");\n    document.head.appendChild(style);\n  }\n\n  function buildSuggestNode(suggestion, queryNormalized) {\n    var wrap = document.createElement(\"div\");\n    wrap.id = SUGGEST_NODE_ID;\n    wrap.setAttribute(\"role\", \"status\");\n    wrap.setAttribute(\"aria-live\", \"polite\");\n\n    var label = document.createElement(\"span\");\n    label.className = \"tnf-typo-label\";\n    label.textContent = \"Did you mean: \";\n\n    var btn = document.createElement(\"button\");\n    btn.type = \"button\";\n    btn.className = \"tnf-typo-link\";\n    btn.textContent = suggestion; // textContent escapes \u2014 safe\n    btn.dataset.tnfTypoFor = queryNormalized;\n\n    btn.addEventListener(\"click\", function () {\n      var input = document.querySelector(\".tnf-search-input\");\n      if (!input) return;\n      input.value = suggestion;\n      // Fire input event so existing searchAndRender() picks it up\n      input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n      input.focus();\n      // GA4: record acceptance\n      try {\n        window.dataLayer = window.dataLayer || [];\n        window.dataLayer.push({\n          event: \"tnf_typo_suggest_click\",\n          original_query: queryNormalized,\n          suggested_query: suggestion\n        });\n      } catch (e) {}\n    });\n\n    var qm = document.createTextNode(\"?\");\n\n    wrap.appendChild(label);\n    wrap.appendChild(btn);\n    wrap.appendChild(qm);\n    return wrap;\n  }\n\n  function currentResultCount(resultsEl) {\n    if (!resultsEl) return 0;\n    return resultsEl.querySelectorAll(\".tnf-product-item, .tnf-coll-item, .tnf-page-item\").length;\n  }\n\n  function hasEmptyState(resultsEl) {\n    if (!resultsEl) return false;\n    return !!resultsEl.querySelector(\".tnf-empty-state\");\n  }\n\n  var lastSuggestionForQuery = null; // GA debouncer\n\n  function updateSuggestion() {\n    var resultsEl = document.querySelector(\".tnf-search-results\");\n    var input = document.querySelector(\".tnf-search-input\");\n    if (!resultsEl || !input) return;\n\n    var q = (input.value || \"\").trim();\n    var existing = resultsEl.querySelector(\"#\" + SUGGEST_NODE_ID);\n\n    if (!q || q.length < 4) {\n      if (existing) existing.remove();\n      return;\n    }\n\n    var resultCount = currentResultCount(resultsEl);\n    var empty = hasEmptyState(resultsEl);\n\n    // Only consider suggesting if results are scarce: empty state OR < 3 items\n    if (!empty && resultCount >= 3) {\n      if (existing) existing.remove();\n      return;\n    }\n\n    var sugg = suggestCorrection(q);\n    if (!sugg) {\n      if (existing) existing.remove();\n      return;\n    }\n\n    // Don't churn the DOM if same suggestion is already shown\n    if (existing && existing.querySelector(\".tnf-typo-link\") &&\n        existing.querySelector(\".tnf-typo-link\").textContent === sugg.suggestion) {\n      return;\n    }\n\n    if (existing) existing.remove();\n    var node = buildSuggestNode(sugg.suggestion, q);\n    // Prepend inside results, above any rendered sections / empty state\n    resultsEl.insertBefore(node, resultsEl.firstChild);\n\n    // GA4: record impression (debounce per query+suggestion to avoid spam)\n    var key = q + \"->\" + sugg.suggestion;\n    if (lastSuggestionForQuery !== key) {\n      lastSuggestionForQuery = key;\n      try {\n        window.dataLayer = window.dataLayer || [];\n        window.dataLayer.push({\n          event: \"tnf_typo_suggest_shown\",\n          original_query: q,\n          suggested_query: sugg.suggestion,\n          edit_distance: sugg.distance,\n          result_count: resultCount\n        });\n      } catch (e) {}\n    }\n  }\n\n  // Debounced update\n  var pendingTimer = null;\n  function scheduleUpdate() {\n    if (pendingTimer) clearTimeout(pendingTimer);\n    pendingTimer = setTimeout(updateSuggestion, 80);\n  }\n\n  // ----- Boot: wait for the search overlay to appear, then attach observer -----\n  var attachedTo = null;\n\n  function tryAttach() {\n    var resultsEl = document.querySelector(\".tnf-search-results\");\n    if (!resultsEl || resultsEl === attachedTo) return;\n    attachedTo = resultsEl;\n    injectStyle();\n\n    var mo = new MutationObserver(scheduleUpdate);\n    mo.observe(resultsEl, { childList: true, subtree: true });\n\n    // Also listen on the input directly so we react even before predictive\n    // search has returned (covers the no-network and very-fast-typing cases).\n    var input = document.querySelector(\".tnf-search-input\");\n    if (input) {\n      input.addEventListener(\"input\", scheduleUpdate);\n    }\n    scheduleUpdate();\n  }\n\n  // Look for overlay on each click anywhere (search button can be in many places),\n  // plus periodic poll in case overlay is built/destroyed dynamically.\n  document.addEventListener(\"click\", function () {\n    setTimeout(tryAttach, 50);\n  }, true);\n\n  // Poll for first 30 seconds after load (cheap, stops once attached)\n  var pollCount = 0;\n  var poll = setInterval(function () {\n    pollCount++;\n    tryAttach();\n    if (attachedTo || pollCount > 60) clearInterval(poll);\n  }, 500);\n\n  // Re-attach if the overlay node is replaced (rare but observed in SPA-style apps)\n  var bodyObs = new MutationObserver(function () {\n    var resultsEl = document.querySelector(\".tnf-search-results\");\n    if (resultsEl && resultsEl !== attachedTo) {\n      attachedTo = null;\n      tryAttach();\n    }\n  });\n  if (document.body) {\n    bodyObs.observe(document.body, { childList: true, subtree: false });\n  } else {\n    document.addEventListener(\"DOMContentLoaded\", function () {\n      bodyObs.observe(document.body, { childList: true, subtree: false });\n    });\n  }\n})();\n"],
  "mappings": "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",
  "names": []
}
