{
  "version": 3,
  "sources": ["/cdn/shop/t/69/assets/tnf-personalize.js?cb=20260530a"],
  "sourcesContent": ["/*!\n * tnf-personalize.js \u2014 Universal collection personalization + sold-out floor.\n *\n * Phase A (always):  push sold-out cards to bottom (replaces Nada).\n * Phase B (signals): subtle per-row reorder on viewport entry. Skips first 20\n *                    cards on /collections/new-arrivals. Blends stock urgency\n *                    on /collections/selling-out-soon + /collections/selling-out-fast-snacks.\n *\n * Performance budget: <6KB minified. Async. No external libs. No global resort.\n *\n * @file assets/tnf-personalize.js\n */\n(function () {\n  'use strict';\n  if (window.__tnfPersonalizeLoaded) return;\n  window.__tnfPersonalizeLoaded = true;\n\n  // Run on collection pages AND search pages\n  if (!/^\\/collections\\//.test(location.pathname) && !/^\\/search/.test(location.pathname)) return;\n\n  var IS_SEARCH = /^\\/search/.test(location.pathname);\n  var COLLECTION_HANDLE = (location.pathname.match(/^\\/collections\\/([^\\/?#]+)/) || [])[1] || (IS_SEARCH ? 'search' : '');\n  var IS_NEW_ARRIVALS = COLLECTION_HANDLE === 'new-arrivals';\n  var IS_MIXMATCH = COLLECTION_HANDLE === 'individual-protein-snacks';  // Mix&Match deal: boost clearance + well-stocked to top (new already boosted, sold-out still bottom)\n  var IS_URGENCY = ['selling-out-soon', 'selling-out-fast-snacks'].indexOf(COLLECTION_HANDLE) !== -1;\n  // 2026-05-27 \u2014 lock first 4 cards across all collections for fast initial paint (esp. mobile).\n  // Personalization rebuilds positions 5+ instead. /new-arrivals keeps a 20-lock for manual curation (owner 2026-10-26).\n  // 2026-06-02 \u2014 /search locks first 8 cards (relevance-first; only re-rank long tail).\n  var LOCKED_TOP = IS_NEW_ARRIVALS ? 20 : (IS_SEARCH ? 8 : (IS_MIXMATCH ? 0 : 4));\n\n  var LIST_SEL = '.product-list, [data-product-list], .product-grid';\n  var SWAP_THRESHOLD = 1.5;     // Permissive \u2014 let recency + tail + any signal bubble cards up\n  var PICKED_BADGE_CAP = 3;\n  // Debug banner is OPT-IN only \u2014 appears only when ?tnfdebug=1 is in URL AND viewer is on\n  // draft theme preview OR Shopify Admin \"View store\" (has preview_theme_id). Customers never see it.\n  var DEBUG = (window.__tnfPersonalizeDebug === true) || (\n    /[?&]tnfdebug=1/.test(location.search) &&\n    /[?&]preview_theme_id=/.test(location.search)\n  );\n  var __swapCount = 0;\n  var pickedCount = 0;\n\n  // ---- 1. SIGNAL COLLECTION ----------------------------------------------\n\n  function getSearchHistory() {\n    try { return JSON.parse(sessionStorage.getItem('tnf_search_history') || '[]'); }\n    catch (e) { return []; }\n  }\n\n  // 2026-05-27: capture ?q= search query on page load \u2192 sessionStorage history (FIFO, max 20).\n  function captureSearchQuery() {\n    try {\n      var m = (location.search || '').match(/[?&]q=([^&]+)/);\n      if (!m) return;\n      var q = decodeURIComponent((m[1] || '').replace(/\\+/g, ' ')).trim();\n      if (!q || q.length < 2) return;\n      var hist = getSearchHistory();\n      var lower = q.toLowerCase();\n      hist = hist.filter(function (h) { return (h || '').toLowerCase() !== lower; });\n      hist.unshift(q);\n      hist = hist.slice(0, 20);\n      sessionStorage.setItem('tnf_search_history', JSON.stringify(hist));\n    } catch (e) {}\n  }\n\n  // Token-based search match (handles \"fat burning powder\" \u2192 matches \"fat-burners\" via \"burn\" token)\n  function searchMatches(handle, searchHistory) {\n    for (var i = 0; i < searchHistory.length; i++) {\n      var q = (searchHistory[i] || '').toLowerCase().trim();\n      if (q.length < 3) continue;\n      // Whole-phrase match\n      if (handle.indexOf(q) >= 0) return true;\n      // Token match (tokens 4+ chars to avoid false positives like \"fat\", \"the\")\n      var tokens = q.split(/[\\s\\-_]+/);\n      for (var j = 0; j < tokens.length; j++) {\n        var t = tokens[j];\n        if (t.length >= 4 && handle.indexOf(t) >= 0) return true;\n      }\n    }\n    return false;\n  }\n\n  var __cartCache = null;\n  var __cartTs = 0;\n  function refreshCart() {\n    fetch('/cart.js', { credentials: 'same-origin' })\n      .then(function (r) { return r.json(); })\n      .then(function (c) {\n        __cartCache = (c.items || []).map(function (i) { return (i.handle || '').toLowerCase(); });\n        __cartTs = Date.now();\n      })\n      .catch(function () {});\n  }\n  function getCart() {\n    var now = Date.now();\n    if (!__cartCache || (now - __cartTs) > 5000) refreshCart();\n    return __cartCache || [];\n  }\n\n  function getMenuHistory() {\n    try {\n      var raw = JSON.parse(sessionStorage.getItem('tnf_menu_history') || '[]');\n      return raw.map(function (e) { return (e && e.label) ? String(e.label) : ''; }).filter(Boolean);\n    } catch (e) { return []; }\n  }\n\n  function getSignals() {\n    var cust = window.__tnfCustomer || {};\n    var rv = window.__tnfRecentlyViewed || [];\n    if (typeof rv === 'string') { try { rv = JSON.parse(rv); } catch (e) { rv = []; } }\n    return {\n      orders: (cust.orders || []).map(function (h) { return (h || '').toLowerCase(); }),\n      wishlist: (cust.wishlist || []).map(function (h) { return (h || '').toLowerCase(); }),\n      brands: cust.brand_affinity || {},\n      types: cust.type_affinity || {},\n      tags: cust.tag_affinity || {},\n      recent: rv.slice(0, 50).map(function (h) { return (h || '').toLowerCase(); }),\n      search: getSearchHistory(),\n      menu: getMenuHistory(),\n      cart: getCart()\n    };\n  }\n\n  function hasSignals(sigs) {\n    return (sigs.orders.length > 0) ||\n           (sigs.wishlist.length > 0) ||\n           (sigs.recent.length >= 3);\n  }\n\n  // ---- 2. CARD UTILITIES -------------------------------------------------\n\n  function getHandle(card) {\n    return (card.getAttribute('data-product-handle') || '').toLowerCase();\n  }\n  function getVendor(card) {\n    var el = card.querySelector('.product-item__vendor');\n    return el ? (el.textContent || '').trim() : '';\n  }\n  function isSoldOut(card) {\n    var inv = card.querySelector('.product-item__inventory');\n    if (!inv) return false;\n    var txt = (inv.textContent || '').trim().toLowerCase();\n    return txt.indexOf('sold out') === 0 || txt === 'sold out';\n  }\n  function hasIncoming(card) {\n    return card.getAttribute('data-incoming') === 'true';\n  }\n  function isLocked(card) {\n    return card.getAttribute('data-locked') === '1';\n  }\n  function getStock(card) {\n    // Read inventory count from text if available\n    var inv = card.querySelector('.product-item__inventory');\n    if (!inv) return 0;\n    var m = (inv.textContent || '').match(/(\\d+)\\s*units?/i);\n    return m ? parseInt(m[1], 10) : 0;\n  }\n  function getPerfScore(card) {\n    var v = card.getAttribute('data-perf-score');\n    return v ? parseFloat(v) : null;\n  }\n  // 2026-05-30 Diana: products with 0 sales in last 7 days get a small extra push.\n  // Written weekly by Apps Script (or one-off seeded). Boolean metafield tnf.no_sale_7d.\n  function hasNoSale7d(card) {\n    return card.getAttribute('data-no-sale-7d') === '1';\n  }\n\n  // 2026-06-25 Diana: push genuinely NEW products up site-wide (true publish-date age via data-pub-age,\n  // not just the product-ID proxy). Strong for the freshest, decays to 0 over NEW_DAYS. Accessories/tanning get 1/5.\n  var NEW_DAYS = 60, NEW_MAX = 10;\n  function pubAge(card) { var v = card.getAttribute('data-pub-age'); if (v === null || v === '') return null; var n = parseInt(v, 10); return isNaN(n) ? null : n; }\n  function newnessBoost(card) {\n    var a = pubAge(card);\n    if (a === null || a < 0 || a >= NEW_DAYS) return 0;\n    var b = (NEW_DAYS - a) / NEW_DAYS * NEW_MAX;\n    return tailEligibility(card) === 'full' ? b : b / 5;\n  }\n\n  // 2026-06-25 Diana: also push RESTOCKED products (membership in smart collection 'recent-new-arrivals-restocks',\n  // e.g. Max Sweets \u2014 old product page, new stock, so newnessBoost misses it). Flat strong boost via data-new-restock.\n  function isRestock(card) { return card.getAttribute('data-new-restock') === '1'; }\n  function restockBoost(card) { if (!isRestock(card)) return 0; var b = 8; return tailEligibility(card) === 'full' ? b : b / 5; }\n  // combined discovery push = the HIGHER of new vs restock (no double-stacking for items that are both)\n  function discoveryBoost(card) { var n = newnessBoost(card), r = restockBoost(card); return n > r ? n : r; }\n\n  // 2026-05-27 Diana: tail detection from DOM position (Shopify default sort = best-selling,\n  // so bottom of list = catalog tail). Free proxy until GA4-driven perf_score pipeline ships.\n  // Accessories/tanning STILL ELIGIBLE but with reduced boost so they mix in subtly without crowding top.\n  var TAIL_SUBTLE_RE = /accessor|tanning|sun ?bed|tanning bed|gym bag|shaker|towel|bottle|merch|appar|grip|strap|band\\b/i;\n  function tailEligibility(card) {\n    // Returns 'full' (supplements/snacks) or 'subtle' (accessories/tanning/apparel)\n    var vendor = getVendor(card);\n    var titleEl = card.querySelector('.product-item__title, .product-item__product-title');\n    var title = titleEl ? (titleEl.textContent || '').trim() : '';\n    if (TAIL_SUBTLE_RE.test(vendor) || TAIL_SUBTLE_RE.test(title)) return 'subtle';\n    return 'full';\n  }\n  function buildTailMap(cards) {\n    var n = cards.length;\n    if (n < 8) return {};\n    var tailStart = Math.ceil(n * 0.7);\n    var map = {};\n    for (var i = tailStart; i < n; i++) {\n      var c = cards[i];\n      var h = getHandle(c);\n      if (h) map[h] = tailEligibility(c);   // 'full' or 'subtle'\n    }\n    return map;\n  }\n\n  // ---- 3. SCORING --------------------------------------------------------\n\n  // Baseline scoring (applies to EVERYONE, signal or no signal):\n  //   - Recency: newer products (higher Shopify product ID) bubble up subtly\n  //   - Tail boost: bottom-30% perf_score products get small lift for visibility\n  // Personalization scoring (signed-in / returning visitor): layers on top.\n\n  function computeIdRange(cards) {\n    var ids = [];\n    for (var i = 0; i < cards.length; i++) {\n      var v = parseInt(cards[i].getAttribute('data-product-id') || '0', 10);\n      if (v > 0) ids.push(v);\n    }\n    if (!ids.length) return null;\n    var min = Math.min.apply(null, ids);\n    var max = Math.max.apply(null, ids);\n    return { min: min, max: max, span: max - min };\n  }\n\n  function recencyBoost(card, idRange) {\n    if (!idRange || !idRange.span) return 0;\n    var pid = parseInt(card.getAttribute('data-product-id') || '0', 10);\n    if (!pid) return 0;\n    var normalized = (pid - idRange.min) / idRange.span; // 0..1\n    return normalized * 4; // up to +4 for the newest in the collection \u2014 bubbles newer up more visibly\n  }\n\n  function scoreCard(card, sigs, idRange) {\n    var handle = getHandle(card);\n    if (!handle) return 0;\n    var vendor = getVendor(card);\n    var s = 0;\n\n    // -- Baseline (everyone) --\n    s += recencyBoost(card, idRange);\n    s += discoveryBoost(card); // 2026-06-25: new + restocked product discovery push\n    var perf = getPerfScore(card);\n    // 2026-05-29 Diana: real perf_score now populated weekly from 30d purchase counts.\n    // 2026-06-02 Diana: bumped tail boost from +4 to +6 \u2014 push buried products harder everywhere.\n    if (perf !== null && perf <= 0.2) {\n      s += tailEligibility(card) === 'full' ? 6 : 1; // accessories/tanning still subtle\n    }\n    // 2026-05-30 Diana: products with 0 sales in last 7 days get an additional push.\n    // 2026-06-02 Diana: bumped from +3 to +5 \u2014 recent slowdowns get even stronger push.\n    if (hasNoSale7d(card)) {\n      s += tailEligibility(card) === 'full' ? 5 : 1;\n    }\n\n    // -- Personalization (returning / signed-in) --\n    if (sigs.orders.indexOf(handle) >= 0) s += 5;\n    if (vendor && sigs.brands[vendor]) s += 3;\n    if (sigs.wishlist.indexOf(handle) >= 0) s += 4;   // bumped from +3 \u2014 wishlist is a strong intent signal\n    if (sigs.recent.indexOf(handle) >= 0) s += 2;\n    if (sigs.cart.indexOf(handle) >= 0) s -= 2;\n    for (var i = 0; i < sigs.search.length; i++) {\n      var q = (sigs.search[i] || '').toLowerCase();\n      if (q.length >= 3 && handle.indexOf(q) >= 0) { s += 1; break; }\n    }\n\n    // -- Urgency (collection-specific) --\n    if (IS_URGENCY) {\n      var stock = getStock(card);\n      if (stock > 0 && stock <= 5) s += 4;\n      else if (stock > 5 && stock <= 12) s += 2;\n    }\n    return s;\n  }\n\n  // ---- 4. PHASE A \u2014 sold-out push + freshness boost ----------------------\n  //\n  // Order of operations on first paint:\n  //   1) pushSoldOutDown    \u2192 all sold-out at the bottom\n  //   2) freshnessBoost     \u2192 top N in-stock cards (newer + tail + light personalization) move to positions 1-N\n  //\n  // Then Phase B (per-row subtle reorder) runs on positions N+1 onward.\n  // CLS is one-time and similar magnitude to the sold-out push.\n\n  var TOP_N = 8;   // first 1-2 rows above-fold get the bulk move\n\n  function pushSoldOutDown(list) {\n    if (!list) return;\n    var cards = Array.prototype.slice.call(list.querySelectorAll('.product-item'));\n    if (cards.length < 2) return;\n    var soldOutIncoming = [];\n    var soldOutPlain = [];\n    cards.forEach(function (c) {\n      if (isLocked(c)) return;\n      if (isSoldOut(c)) {\n        (hasIncoming(c) ? soldOutIncoming : soldOutPlain).push(c);\n      }\n    });\n    if (!soldOutIncoming.length && !soldOutPlain.length) return;\n    var frag = document.createDocumentFragment();\n    // Order: in-stock (already there), then incoming-soon sold-out, then plain sold-out\n    soldOutIncoming.forEach(function (c) { frag.appendChild(c); });\n    soldOutPlain.forEach(function (c) { frag.appendChild(c); });\n    list.appendChild(frag);\n  }\n\n  function isClearanceCard(c){return c.getAttribute('data-clearance')==='1';}\n  function isTanningCard(c){return c.getAttribute('data-tanning')==='1';}\n  function getStockAttr(c){var v=c.getAttribute('data-stock');return v?parseInt(v,10):0;}\n  // 2026-09-21 Diana: Mix&Match deal collection only \u2014 float clearance + high-inventory up (new arrivals already boosted via recency/discovery; sold-out untouched).\n  function mixmatchBoost(c){var s=0;if(isClearanceCard(c))s+=9;var st=getStockAttr(c);if(st>=50)s+=6;else if(st>=20)s+=4;else if(st>=10)s+=2;return s;}\n  function freshnessBoost(list, sigs, idRange) {\n    if (!list) return;\n    var cards = Array.prototype.slice.call(list.querySelectorAll('.product-item'));\n    if (cards.length <= LOCKED_TOP + TOP_N) return;\n\n    var locked = cards.slice(0, LOCKED_TOP);\n    var rest = cards.slice(LOCKED_TOP);\n\n    // Split in-stock vs sold-out (sold-out stays in current order \u2014 already bottom-sorted)\n    var inStock = [], soldOut = [], tanning = [];\n    rest.forEach(function (c) {\n      if (isSoldOut(c)) soldOut.push(c);\n      else if (IS_MIXMATCH && isTanningCard(c)) tanning.push(c);\n      else inStock.push(c);\n    });\n    if (inStock.length < 2) return;\n\n    // Build position-based tail map (catalog bottom-30%, supplements/snacks only)\n    var tailMap = buildTailMap(inStock);\n\n    // Score each in-stock card on freshness factors.\n    var scored = inStock.map(function (c) {\n      var recency = recencyBoost(c, idRange);          // 0..4   (newer products)\n      var handlePos = getHandle(c);\n      // Tail score (weighted): supplements/snacks = +6, accessories/tanning = +2 (subtle mix-in)\n      var perf = getPerfScore(c);\n      var tailType = tailMap[handlePos];               // 'full', 'subtle', or undefined (DOM fallback)\n      var tailScore = 0;\n      // 2026-05-29 Diana: real perf_score from 30d purchase data overrides DOM proxy.\n      // Bottom 20% by purchase count \u2192 push HARD (low-purchase = buried good products).\n      // 2026-06-02 Diana: bumped from +8 to +10 for buried-gem boost in top-N positions.\n      if (perf !== null && perf <= 0.2) {\n        tailScore = tailEligibility(c) === 'full' ? 10 : 2;\n      } else if (tailType === 'full') {\n        tailScore = 6;\n      } else if (tailType === 'subtle') {\n        tailScore = 2;\n      }\n      var handle = getHandle(c);\n      var wish = sigs.wishlist.indexOf(handle) >= 0 ? 1 : 0;\n      var bought = sigs.orders.indexOf(handle) >= 0 ? 1 : 0;\n      var viewed = sigs.recent.indexOf(handle) >= 0 ? 1 : 0;\n      var searched = searchMatches(handle, sigs.search) ? 1 : 0;\n      var menuMatched = searchMatches(handle, sigs.menu) ? 1 : 0;\n      var vendor = getVendor(c);\n      var vendorMatch = (vendor && sigs.brands[vendor]) ? 1 : 0;\n      // Signal weights \u2014 strong intent signals dominate over baseline recency (max +8):\n      //   wishlist (+10), bought (+8), recent-view (+5), search-match (+5),\n      //   tail (+6 supplements/snacks, +2 accessories/tanning \u2014 subtle mix-in), menu-match (+3), vendor (+2)\n      // 2026-05-30 Diana: 0-sales-in-7d adds a small extra push for recent slowdowns\n      // 2026-06-02 Diana: bumped from +3 to +5.\n      var noSale7d = hasNoSale7d(c) ? (tailEligibility(c) === 'full' ? 5 : 1) : 0;\n      var fresh = recency * 2 + tailScore + discoveryBoost(c) + wish * 10 + bought * 8 + viewed * 5 + searched * 5 + menuMatched * 3 + vendorMatch * 2 + noSale7d + (IS_MIXMATCH ? mixmatchBoost(c) : 0);\n      return { card: c, fresh: fresh };\n    });\n\n    // Sort by freshness desc; pick top N for the boost\n    scored.sort(function (a, b) { return b.fresh - a.fresh; });\n    var topN = scored.slice(0, TOP_N).map(function (x) { return x.card; });\n    var topSet = {};\n    topN.forEach(function (c) { topSet[getHandle(c)] = true; });\n\n    // 2026-05-28 \u2014 stamp markers on cards that actually moved UP, for GA4 attribution downstream.\n    // Read-only attrs; no layout impact.\n    try {\n      var elevatedCards = [];\n      topN.forEach(function (c, newIdxInTop) {\n        var origIdxInStock = inStock.indexOf(c);\n        if (origIdxInStock < 0) return;\n        var origPos = LOCKED_TOP + origIdxInStock;\n        var newPos = LOCKED_TOP + newIdxInTop;\n        if (origPos > newPos) {\n          c.setAttribute('data-tnf-personalized', '1');\n          c.setAttribute('data-tnf-orig-pos', String(origPos));\n          c.setAttribute('data-tnf-new-pos', String(newPos));\n          elevatedCards.push(c);\n        }\n      });\n      list.__tnfElevated = elevatedCards;\n    } catch (e) {}\n    var restInStock = inStock.filter(function (c) { return !topSet[getHandle(c)]; });\n\n    // Single atomic rebuild \u2014 locked + boosted top N + remaining in-stock + sold-out\n    var frag = document.createDocumentFragment();\n    locked.forEach(function (c) { frag.appendChild(c); });\n    topN.forEach(function (c) { frag.appendChild(c); });\n    restInStock.forEach(function (c) { frag.appendChild(c); });\n    tanning.forEach(function (c) { frag.appendChild(c); });\n    soldOut.forEach(function (c) { frag.appendChild(c); });\n    list.appendChild(frag);\n\n    if (DEBUG && window.console) {\n      console.log('[tnf-personalize] freshness boost \u2014 top ' + topN.length + ' cards:',\n        topN.map(function (c) { return c.getAttribute('data-product-handle'); }).join(', '));\n    }\n  }\n\n  // ---- 5. PHASE B \u2014 per-row subtle reorder -------------------------------\n\n  function getRowSize() {\n    var w = window.innerWidth;\n    if (w >= 1280) return 6;\n    if (w >= 1000) return 5;\n    if (w >= 700) return 4;\n    return 3;\n  }\n\n  function reorderRow(rowCards, sigs, idRange) {\n    if (rowCards.length < 2) return;\n    var scored = rowCards.map(function (c) { return { card: c, score: scoreCard(c, sigs, idRange) }; });\n    var sorted = scored.slice().sort(function (a, b) { return b.score - a.score; });\n    var delta = sorted[0].score - sorted[sorted.length - 1].score;\n    if (delta < SWAP_THRESHOLD) return;\n    // Apply ONLY the top swap \u2014 keep changes minimal, low CLS\n    var top = sorted[0];\n    var topIdx = scored.indexOf(top);\n    if (topIdx <= 0) return;\n    var firstCard = rowCards[0];\n    if (firstCard === top.card) return;\n    firstCard.parentNode.insertBefore(top.card, firstCard);\n    __swapCount += 1;\n    // 2026-05-28 \u2014 stamp marker for GA4 attribution. Read-only attrs.\n    try {\n      top.card.setAttribute('data-tnf-personalized', '1');\n      var allCardsForPos = Array.prototype.slice.call(top.card.parentNode.querySelectorAll('.product-item'));\n      var newAbsPos = allCardsForPos.indexOf(top.card);\n      if (newAbsPos >= 0) {\n        top.card.setAttribute('data-tnf-new-pos', String(newAbsPos));\n        top.card.setAttribute('data-tnf-orig-pos', String(newAbsPos + topIdx));\n      }\n    } catch (eE) {}\n    if (top.score >= 4 && pickedCount < PICKED_BADGE_CAP) {\n      addPickedBadge(top.card);\n      pickedCount += 1;\n    }\n    if (DEBUG && window.console) {\n      console.log('[tnf-personalize] \u2191 swap', top.card.getAttribute('data-product-handle'), 'score=', top.score.toFixed(2), 'delta=', delta.toFixed(2));\n      updateDebugBanner();\n    }\n  }\n\n  function updateDebugBanner() {\n    if (!DEBUG) return;\n    var el = document.getElementById('tnf-debug-banner');\n    if (!el) {\n      el = document.createElement('div');\n      el.id = 'tnf-debug-banner';\n      el.style.cssText = 'position:fixed;top:8px;right:8px;z-index:99999;background:#1e2d7d;color:#fff;font-family:monospace;font-size:11px;padding:6px 10px;border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.2);pointer-events:none;';\n      document.body.appendChild(el);\n    }\n    var sigCount = 0;\n    if (window.__tnfCustomer) {\n      sigCount = (window.__tnfCustomer.wishlist||[]).length + (window.__tnfCustomer.orders||[]).length;\n    }\n    el.textContent = 'TNF Phase B: ' + __swapCount + ' swap' + (__swapCount===1?'':'s') + ' \u00B7 sigs=' + sigCount;\n  }\n\n  var rowsObserved = new WeakSet();\n\n  function setupRowObserver(list, sigs) {\n    if (!('IntersectionObserver' in window)) return;\n    var rowSize = getRowSize();\n    var allCards = Array.prototype.slice.call(list.querySelectorAll('.product-item'));\n    // Skip both locked-top (new-arrivals) AND the freshness-boosted top N\n    var startIdx = LOCKED_TOP + TOP_N;\n    if (allCards.length <= startIdx) return;\n    var idRange = computeIdRange(allCards.slice(startIdx));\n    var io = new IntersectionObserver(function (entries) {\n      entries.forEach(function (e) {\n        if (!e.isIntersecting) return;\n        var anchor = e.target;\n        if (rowsObserved.has(anchor)) return;\n        rowsObserved.add(anchor);\n        var rowCards = anchor.__tnfRow;\n        if (rowCards) reorderRow(rowCards, sigs, idRange);\n        io.unobserve(anchor);\n      });\n    }, { rootMargin: '120px 0px', threshold: 0.1 });\n    for (var i = startIdx; i < allCards.length; i += rowSize) {\n      var row = allCards.slice(i, i + rowSize);\n      if (row.length < 2) continue;\n      if (rowsObserved.has(row[0])) continue;\n      row[0].__tnfRow = row;\n      io.observe(row[0]);\n    }\n  }\n\n  // ---- 6. BADGES ---------------------------------------------------------\n\n  function addPickedBadge(card) {\n    if (card.querySelector('.tnf-picked-badge')) return;\n    // Append to native .product-item__label-list (stacks below \"Save N%\" / sale labels \u2014 no overlap)\n    var labelList = card.querySelector('.product-item__label-list');\n    if (!labelList) {\n      labelList = document.createElement('div');\n      labelList.className = 'product-item__label-list';\n      // Native list lives at the top of .product-item, before the image link\n      var imgLink = card.querySelector('.product-item__image-wrapper');\n      if (imgLink && imgLink.parentNode) imgLink.parentNode.insertBefore(labelList, imgLink);\n      else card.insertBefore(labelList, card.firstChild);\n    }\n    var b = document.createElement('span');\n    b.className = 'product-label tnf-picked-badge active';\n    b.textContent = 'Picked for you';\n    labelList.appendChild(b);\n  }\n\n  function injectIncomingBadges(list) {\n    var cards = list.querySelectorAll('.product-item');\n    Array.prototype.slice.call(cards).forEach(function (c) {\n      if (hasIncoming(c) && isSoldOut(c) && !c.querySelector('.tnf-incoming-badge')) {\n        var b = document.createElement('span');\n        b.className = 'tnf-incoming-badge';\n        b.textContent = 'Incoming Soon';\n        var img = c.querySelector('.product-item__image-wrapper');\n        if (img) img.appendChild(b);\n      }\n    });\n  }\n\n  function injectCss() {\n    if (document.getElementById('tnf-personalize-css')) return;\n    var s = document.createElement('style');\n    s.id = 'tnf-personalize-css';\n    s.textContent =\n      // \"Picked for you\" \u2014 inherits .product-label sizing/position from theme, just recolors\n      '.product-label.tnf-picked-badge{background:#1e2d7d!important;color:#fff!important;}' +\n      // \"Incoming Soon\" \u2014 sits absolute on image (sold-out cards have no sale labels)\n      '.tnf-incoming-badge{' +\n        'position:absolute;top:8px;left:8px;z-index:2;' +\n        'background:#f59e0b;color:#fff;font-family:Barlow,sans-serif;font-size:10px;font-weight:600;' +\n        'padding:3px 8px;border-radius:4px;letter-spacing:.3px;line-height:1.2;' +\n        'pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,.15);' +\n      '}' +\n      '@media (max-width:699px){.tnf-incoming-badge{font-size:9px;padding:2px 6px;top:6px;left:6px;}}';\n    document.head.appendChild(s);\n  }\n\n  // ---- 7. MAIN -----------------------------------------------------------\n\n  function fireFiredEvent(list, signalsActive, topHandles) {\n    try {\n      window.dataLayer = window.dataLayer || [];\n      window.dataLayer.push({\n        event: 'tnf_personalization_fired',\n        source_section: 'collection_personalize',\n        source_path: location.pathname,\n        collection_handle: COLLECTION_HANDLE,\n        has_signals: signalsActive ? 1 : 0,\n        swap_count: __swapCount || 0,\n        top_handles: (topHandles || []).slice(0, 8).join(',')\n      });\n    } catch (e) {}\n  }\n\n  function run() {\n    var list = document.querySelector(LIST_SEL);\n    if (!list) return;\n    injectCss();\n    refreshCart();\n    captureSearchQuery();  // 2026-05-27: persist ?q= query for personalization on next pages\n    pushSoldOutDown(list);\n    // 2026-05-27 Diana: removed Incoming Soon badge per request.\n    // Stratification preserved \u2014 incoming sold-out cards still rank above other sold-out via -9.5 floor.\n    var sigs = getSignals();\n    // Phase A2 \u2014 freshness boost: bubble newer + tail (+ light personalization) to positions 1..TOP_N\n    var allCards = list.querySelectorAll('.product-item');\n    var globalIdRange = computeIdRange(Array.prototype.slice.call(allCards).slice(LOCKED_TOP));\n    freshnessBoost(list, sigs, globalIdRange);\n    // Phase B \u2014 subtle per-row reorder for positions LOCKED_TOP + TOP_N onward\n    setupRowObserver(list, sigs);\n    // Fire audit-trail event so GA4 can analyze what was personalized + which positions later got clicks\n    var topHandlesAfter = Array.prototype.slice.call(list.querySelectorAll('.product-item')).slice(0, 8)\n      .map(function (c) { return c.getAttribute('data-product-handle'); }).filter(Boolean);\n    fireFiredEvent(list, hasSignals(sigs), topHandlesAfter);\n\n    // 2026-05-28 \u2014 new cleaner per-page swap event (used for GA4 funnel: swap \u2192 click \u2192 atc \u2192 purchase).\n    // Lists only the cards that ACTUALLY moved up.\n    try {\n      var elevated = list.__tnfElevated || [];\n      if (elevated.length) {\n        window.dataLayer = window.dataLayer || [];\n        window.dataLayer.push({\n          event: 'tnf_personalized_swap',\n          page_path: location.pathname,\n          collection_handle: COLLECTION_HANDLE,\n          swap_count: elevated.length,\n          handles: elevated.map(function (c) { return c.getAttribute('data-product-handle'); }).filter(Boolean).slice(0, 10).join(',')\n        });\n      }\n    } catch (eS) {}\n    if (DEBUG) {\n      if (window.console) {\n        console.log('[tnf-personalize] init', {\n          handle: COLLECTION_HANDLE,\n          loaded: true,\n          customer_present: !!window.__tnfCustomer,\n          orders_count: (window.__tnfCustomer && window.__tnfCustomer.orders || []).length,\n          wishlist_count: (window.__tnfCustomer && window.__tnfCustomer.wishlist || []).length,\n          brands_count: Object.keys((window.__tnfCustomer && window.__tnfCustomer.brand_affinity) || {}).length\n        });\n      }\n      updateDebugBanner();\n    }\n  }\n\n  function watchListMutations() {\n    var list = document.querySelector(LIST_SEL);\n    if (!list) return;\n    var debounce;\n    var mo = new MutationObserver(function (mutations) {\n      var added = false;\n      mutations.forEach(function (m) {\n        if (m.addedNodes.length) {\n          for (var i = 0; i < m.addedNodes.length; i++) {\n            var n = m.addedNodes[i];\n            if (n.nodeType === 1 && (n.classList && n.classList.contains('product-item'))) {\n              added = true; break;\n            }\n          }\n        }\n      });\n      if (!added) return;\n      clearTimeout(debounce);\n      debounce = setTimeout(function () {\n        pushSoldOutDown(list);\n        // For infinite scroll batches we only push sold-out + setup row observer for new cards.\n        // Freshness boost is NOT re-run \u2014 it's a one-time above-fold thing on initial load.\n        var sigs = getSignals();\n        setupRowObserver(list, sigs);\n      }, 200);\n    });\n    mo.observe(list, { childList: true });\n  }\n\n  function boot() {\n    run();\n    watchListMutations();\n    // Listen for cart events to refresh\n    document.addEventListener('tnf:cart:item-added', refreshCart);\n    document.addEventListener('cart:updated', refreshCart);\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', boot);\n  } else {\n    boot();\n  }\n})();\n"],
  "mappings": "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",
  "names": []
}
