{
  "version": 3,
  "sources": ["/cdn/shop/t/24/assets/wmn-for-you-feed.js?wmn=20261026cover1"],
  "sourcesContent": ["/**\n * WMN endless Picked for you feed (Phase 2 + Phase 3 signals).\n * Owns #wmn-for-you when present: append pages, sentinel IO, seenLocked,\n * viewport-forward rebuild on affinity/prefs (never wipe locked cards).\n * Lock only after meaningful view (IO \u22650.35) or scroll-past \u2014 not on append.\n * Phase 3: hover/click/skip/visible observers \u2192 recordFeedSignal.\n */\n(function (window, document) {\n  'use strict';\n\n  var PAGE_SIZE_DEFAULT = 12;\n  var RANK_LIMIT = 500;\n  var REBUILD_DEBOUNCE_MS = 350;\n  var SOURCE = 'for-you-feed';\n  var HOVER_MS = 500;\n  var VISIBLE_MS = 1000;\n  var SKIP_MS = 200;\n  var LOCK_IO_RATIO = 0.35;\n\n  var controller = null;\n\n\n  function qs(sel, root) {\n    return (root || document).querySelector(sel);\n  }\n\n  function pageSizeFromRoot(root) {\n    if (!root) return PAGE_SIZE_DEFAULT;\n    var raw = parseInt(root.getAttribute('data-page-size') || '', 10);\n    if (!isFinite(raw) || raw < 6) return PAGE_SIZE_DEFAULT;\n    return Math.min(24, raw);\n  }\n\n  function shopRoot() {\n    return window.Shopify && window.Shopify.routes && window.Shopify.routes.root\n      ? window.Shopify.routes.root\n      : '/';\n  }\n\n  function escapeHtml(str) {\n    return String(str || '')\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;');\n  }\n\n  function normalizeImageUrl(url) {\n    if (!url || url === 'NULL') return '';\n    var u = String(url);\n    if (u.indexOf('//') === 0) u = 'https:' + u;\n    return u;\n  }\n\n  function withImageWidth(url, width) {\n    var u = normalizeImageUrl(url);\n    if (!u) return '';\n    var w = width || 800;\n    if (/_\\d+x(?=\\.|\\?|$)/.test(u)) {\n      return u.replace(/_\\d+x(?=\\.|\\?|$)/, '_' + w + 'x');\n    }\n    return u.replace(/(\\.(?:jpe?g|png|webp|gif))(\\?|$)/i, '_' + w + 'x$1$2');\n  }\n\n  function graphReady() {\n    return !!(\n      window.wmnCatalogGraph &&\n      typeof window.wmnCatalogGraph.getData === 'function' &&\n      window.wmnCatalogGraph.getData()\n    );\n  }\n\n  function ensureGraph() {\n    if (!window.wmnCatalogGraph || typeof window.wmnCatalogGraph.ensureLoaded !== 'function') {\n      return Promise.resolve(null);\n    }\n    return window.wmnCatalogGraph.ensureLoaded().catch(function () {\n      return null;\n    });\n  }\n\n  function productImage(handle, fallback) {\n    var img = fallback || '';\n    try {\n      if (\n        window.wmnCatalogGraph &&\n        typeof window.wmnCatalogGraph.getProductImage === 'function'\n      ) {\n        img = window.wmnCatalogGraph.getProductImage(handle) || img;\n      }\n    } catch (e) {\n      /* ignore */\n    }\n    return withImageWidth(img, 800);\n  }\n\n  function toSized(url, size) {\n    if (!url) return '';\n    var u = String(url);\n    if (u.indexOf('_') !== -1 && /_\\d+x/.test(u)) {\n      return u.replace(/_\\d+x(?=\\.|\\?|$)/, '_' + size);\n    }\n    return u.replace(/(\\.\\w+)(\\?|$)/, '_' + size + '$1$2');\n  }\n\n  var priceCache = {};\n\n  function formatMoneyCents(cents) {\n    if (cents == null || !(cents > 0)) return '';\n    try {\n      if (window.wmnMoney && typeof window.wmnMoney.formatCents === 'function') {\n        return window.wmnMoney.formatCents(cents);\n      }\n    } catch (e) {\n      /* fall through */\n    }\n    try {\n      if (window.Shopify && typeof Shopify.formatMoney === 'function') {\n        var fmt =\n          (document.body && document.body.getAttribute('data-money-format')) ||\n          '\u00A3{{amount}}';\n        return Shopify.formatMoney(cents, fmt);\n      }\n    } catch (e2) {\n      /* fall through */\n    }\n    return '\u00A3' + (cents / 100).toFixed(2);\n  }\n\n  function parsePriceToCents(raw) {\n    if (raw == null || raw === '') return null;\n    if (typeof raw === 'number') {\n      if (!isFinite(raw) || raw < 0) return null;\n      if (raw !== Math.floor(raw)) return Math.round(raw * 100);\n      return Math.round(raw);\n    }\n    var s = String(raw).replace(/^\\s+|\\s+$/g, '');\n    if (!s) return null;\n    if (s.indexOf('.') !== -1) {\n      var f = parseFloat(s);\n      return isFinite(f) ? Math.round(f * 100) : null;\n    }\n    var n = parseInt(s, 10);\n    return isFinite(n) ? n : null;\n  }\n\n  function priceMetaFromProductJs(p) {\n    if (!p) return null;\n    var min = parsePriceToCents(p.price_min != null ? p.price_min : p.price);\n    var max = parsePriceToCents(p.price_max != null ? p.price_max : p.price);\n    if (min == null || min <= 0) {\n      var variants = p.variants || [];\n      var i;\n      for (i = 0; i < variants.length; i++) {\n        var c = parsePriceToCents(variants[i] && variants[i].price);\n        if (c == null || c <= 0) continue;\n        if (min == null || c < min) min = c;\n        if (max == null || c > max) max = c;\n      }\n    }\n    if (min == null || min <= 0) return null;\n    return {\n      min: min,\n      varies: !!(p.price_varies || (max != null && max > min))\n    };\n  }\n\n  function priceHtmlFromMeta(meta) {\n    if (!meta) return '';\n    var label = formatMoneyCents(meta.min);\n    if (!label) return '';\n    if (meta.varies) {\n      return (\n        '<p class=\"wmn-rg-rail__price\">From <span class=\"wmn-card-price\">' +\n        escapeHtml(label) +\n        '</span></p>'\n      );\n    }\n    return (\n      '<p class=\"wmn-rg-rail__price\"><span class=\"wmn-card-price\">' +\n      escapeHtml(label) +\n      '</span></p>'\n    );\n  }\n\n  function applyPriceToCard(card, meta) {\n    if (!card || !meta) return;\n    var html = priceHtmlFromMeta(meta);\n    if (!html) return;\n    var metaEl = card.querySelector('.wmn-rg-rail__meta');\n    if (!metaEl) return;\n    var existing = metaEl.querySelector('.wmn-rg-rail__price');\n    if (existing) {\n      existing.outerHTML = html;\n    } else {\n      metaEl.insertAdjacentHTML('beforeend', html);\n    }\n  }\n\n  function hydrateCardPrice(card) {\n    if (!card) return;\n    var handle = card.getAttribute('data-wmn-handle');\n    if (!handle) return;\n    if (card.getAttribute('data-wmn-fy-price') === '1') return;\n    if (priceCache[handle]) {\n      applyPriceToCard(card, priceCache[handle]);\n      card.setAttribute('data-wmn-fy-price', '1');\n      return;\n    }\n    if (typeof fetch !== 'function') return;\n    var url = shopRoot() + 'products/' + encodeURIComponent(handle) + '.js';\n    fetch(url, { credentials: 'same-origin' })\n      .then(function (res) {\n        if (!res || !res.ok) throw new Error('price');\n        return res.json();\n      })\n      .then(function (p) {\n        var meta = priceMetaFromProductJs(p);\n        if (!meta) return;\n        priceCache[handle] = meta;\n        applyPriceToCard(card, meta);\n        card.setAttribute('data-wmn-fy-price', '1');\n      })\n      .catch(function () {\n        /* ignore */\n      });\n  }\n\n  function spotifyPathForHandle(handle) {\n    if (!handle) return '';\n    try {\n      if (\n        window.wmnCatalogGraph &&\n        typeof window.wmnCatalogGraph.getSpotifyPath === 'function'\n      ) {\n        return window.wmnCatalogGraph.getSpotifyPath(handle) || '';\n      }\n    } catch (e) {\n      /* ignore */\n    }\n    return '';\n  }\n\n  function playButtonHtml(handle, sp) {\n    if (!handle || !sp) return '';\n    return (\n      '<button type=\"button\" class=\"wmn-rg-rail__play\" data-wmn-play data-wmn-listen data-wmn-handle=\"' +\n      escapeHtml(handle) +\n      '\" data-wmn-spotify=\"' +\n      escapeHtml(sp) +\n      '\" data-wmn-play-source=\"for-you-feed\" aria-label=\"Play preview\" aria-pressed=\"false\">' +\n      '<svg class=\"wmn-rg-rail__play-icon wmn-rg-rail__play-icon--play\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M8 5v14l11-7z\"/></svg>' +\n      '<svg class=\"wmn-rg-rail__play-icon wmn-rg-rail__play-icon--pause\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M6 5h4v14H6zm8 0h4v14h-4z\"/></svg>' +\n      '</button>'\n    );\n  }\n\n  function buildCard(item) {\n    if (!item || !item.handle) return null;\n    var img = productImage(item.handle, item.image || '');\n    if (!img) return null; // cover-safe: never append blank covers\n\n    var href = item.url || shopRoot() + 'products/' + encodeURIComponent(item.handle);\n    var title = escapeHtml(item.title || item.handle.replace(/-/g, ' '));\n    var artistLine = item.artist || '';\n    if (window.wmnCardKicker) {\n      artistLine = window.wmnCardKicker({\n        handle: item.handle,\n        title: item.title,\n        artist: item.artist || '',\n        tags: item.tags\n      });\n    }\n    var artist = escapeHtml(artistLine || '');\n    var src400 = toSized(img, '400x');\n    var src300 = toSized(img, '300x');\n    var src600 = toSized(img, '600x');\n    var cachedPrice = priceCache[item.handle]\n      ? priceHtmlFromMeta(priceCache[item.handle])\n      : '';\n    var sp = spotifyPathForHandle(item.handle);\n\n    // Exact Rough Guides rail cell markup (+ price + optional play)\n    var li = document.createElement('li');\n    li.className = 'wmn-rg-rail__cell';\n    li.setAttribute('data-wmn-handle', item.handle);\n    li.setAttribute('data-wmn-title', item.title || '');\n    li.setAttribute('data-wmn-fy-locked', '0');\n    if (sp) li.setAttribute('data-wmn-spotify', sp);\n    if (cachedPrice) li.setAttribute('data-wmn-fy-price', '1');\n    if (item.pi != null) li.setAttribute('data-wmn-fy-pi', String(item.pi));\n    if (item.rank != null) li.setAttribute('data-wmn-fy-rank', String(item.rank));\n    if (item.piSlot != null) {\n      li.setAttribute('data-wmn-fy-pi-slot', String(item.piSlot));\n    }\n    if (item.branch) li.setAttribute('data-wmn-fy-branch', String(item.branch));\n    if (item.policy) li.setAttribute('data-wmn-fy-policy', String(item.policy));\n    if (item.explore != null) {\n      li.setAttribute('data-wmn-fy-explore', item.explore ? '1' : '0');\n    }\n    li.innerHTML =\n      '<a class=\"wmn-rg-rail__card\" href=\"' +\n      escapeHtml(href) +\n      '\">' +\n      '<div class=\"wmn-rg-rail__cover\">' +\n      '<img src=\"' +\n      escapeHtml(src400) +\n      '\" srcset=\"' +\n      escapeHtml(src300) +\n      ' 300w, ' +\n      escapeHtml(src400) +\n      ' 400w, ' +\n      escapeHtml(src600) +\n      ' 600w\" sizes=\"(max-width: 640px) 78vw, 520px\" alt=\"\" width=\"400\" height=\"400\" loading=\"lazy\" decoding=\"async\" />' +\n      '</div>' +\n      '<div class=\"wmn-rg-rail__meta\">' +\n      (artist ? '<p class=\"wmn-rg-rail__artist\">' + artist + '</p>' : '') +\n      '<p class=\"wmn-rg-rail__name\">' +\n      title +\n      '</p>' +\n      cachedPrice +\n      '</div></a>' +\n      playButtonHtml(item.handle, sp);\n\n    return li;\n  }\n\n  function endOfRailMessage(ctrl) {\n    var label = '';\n    try {\n      if (ctrl && ctrl.subtitleEl) {\n        var sub = String(ctrl.subtitleEl.textContent || '');\n        var m = sub.match(/interest in\\s+(.+)$/i);\n        if (m && m[1]) label = m[1].replace(/\\s+/g, ' ').trim();\n      }\n      if (!label && window.wmnEngagement && typeof window.wmnEngagement.getFocus === 'function') {\n        var f = window.wmnEngagement.getFocus();\n        if (f && f.primaryKind === 'country' && f.primaryCountry) {\n          label = f.primaryCountry.replace(/-/g, ' ');\n        } else if (f && f.primaryKind === 'region' && f.primaryRegion) {\n          label = f.primaryRegion.replace(/-/g, ' ');\n        } else if (f && f.primaryGenre) {\n          label = f.primaryGenre.replace(/-/g, ' ');\n        }\n      }\n    } catch (e) {\n      /* ignore */\n    }\n    if (label) {\n      return \"You've seen all picks for \" + label;\n    }\n    return \"You've seen the full catalogue\";\n  }\n\n  function setStatus(ctrl, text, isEnd) {\n    if (!ctrl || !ctrl.statusEl) return;\n    if (!text) {\n      ctrl.statusEl.setAttribute('hidden', 'hidden');\n      ctrl.statusEl.textContent = '';\n      ctrl.statusEl.removeAttribute('data-wmn-fy-end');\n      return;\n    }\n    ctrl.statusEl.removeAttribute('hidden');\n    ctrl.statusEl.textContent = text;\n    if (isEnd) ctrl.statusEl.setAttribute('data-wmn-fy-end', '1');\n    else ctrl.statusEl.removeAttribute('data-wmn-fy-end');\n  }\n\n  function updateSubtitle(ctrl, labels) {\n    if (!ctrl || !ctrl.subtitleEl) return;\n    if (labels && labels.length) {\n      ctrl.subtitleEl.textContent =\n        'Based on your interest in ' + labels.join(' & ');\n    }\n  }\n\n  function scoreFullCatalog(excludeHandles, pinRecent) {\n    if (\n      !window.wmnEngagement ||\n      typeof window.wmnEngagement.scoreCatalogForYou !== 'function'\n    ) {\n      return null;\n    }\n    return window.wmnEngagement.scoreCatalogForYou({\n      limit: RANK_LIMIT,\n      excludeHandles: excludeHandles || [],\n      explore: false,\n      pinRecent: pinRecent !== false\n    });\n  }\n\n  function gridCards(ctrl) {\n    if (!ctrl || !ctrl.grid) return [];\n    if (ctrl.grid.children && ctrl.grid.children.length != null) {\n      return Array.prototype.slice.call(ctrl.grid.children);\n    }\n    return [];\n  }\n\n  function hasGridCards(ctrl) {\n    return gridCards(ctrl).length > 0;\n  }\n\n  function lockHandle(ctrl, handle, card) {\n    if (!ctrl || !handle) return;\n    if (ctrl.seenLocked[handle]) {\n      if (card) card.setAttribute('data-wmn-fy-locked', '1');\n      return;\n    }\n    ctrl.seenLocked[handle] = true;\n    ctrl.renderedOrder.push(handle);\n    if (card) card.setAttribute('data-wmn-fy-locked', '1');\n  }\n\n  function unobserveCard(ctrl, card) {\n    if (!ctrl || !card) return;\n    if (ctrl.cardIo) {\n      try {\n        ctrl.cardIo.unobserve(card);\n      } catch (e) {\n        /* ignore */\n      }\n    }\n    if (ctrl.signalIo) {\n      try {\n        ctrl.signalIo.unobserve(card);\n      } catch (e2) {\n        /* ignore */\n      }\n    }\n  }\n\n  function appendItems(ctrl, items) {\n    if (!ctrl || !ctrl.grid || !items || !items.length) return 0;\n    var added = 0;\n    var i;\n    for (i = 0; i < items.length; i++) {\n      var item = items[i];\n      if (!item || !item.handle) continue;\n      if (ctrl.seenLocked[item.handle]) continue;\n      var absRank = gridCards(ctrl).length;\n      var cardItem = item;\n      if (absRank !== item.rank) {\n        var pi = item.pi != null ? item.pi : 0;\n        cardItem = {\n          handle: item.handle,\n          title: item.title,\n          artist: item.artist,\n          url: item.url,\n          image: item.image,\n          genres: item.genres,\n          fromGraph: item.fromGraph,\n          score: item.score,\n          pi: pi,\n          rank: absRank,\n          piSlot:\n            typeof window.wmnEngagement !== 'undefined' &&\n            window.wmnEngagement.slotWeight\n              ? Math.round(pi * window.wmnEngagement.slotWeight(absRank) * 1e8) /\n                1e8\n              : Math.round((pi / (1 + absRank)) * 1e8) / 1e8,\n          branch: item.branch,\n          policy: item.policy,\n          explore: item.explore\n        };\n      }\n      var card = buildCard(cardItem);\n      if (!card) continue;\n      card.setAttribute('data-wmn-fy-locked', '0');\n      ctrl.grid.appendChild(card);\n      observeCard(ctrl, card);\n      bindCardSignals(ctrl, card);\n      hydrateCardPrice(card);\n      added++;\n    }\n    return added;\n  }\n\n  /** Lock cells fully scrolled past the scroller's left edge. */\n  function lockScrolledPast(ctrl) {\n    if (!ctrl || !ctrl.scroller || !ctrl.grid) return;\n    var scrollerRect;\n    try {\n      scrollerRect = ctrl.scroller.getBoundingClientRect();\n    } catch (e) {\n      return;\n    }\n    if (!scrollerRect) return;\n    var cells = gridCards(ctrl);\n    var i;\n    for (i = 0; i < cells.length; i++) {\n      var card = cells[i];\n      var handle = card.getAttribute('data-wmn-handle');\n      if (!handle || ctrl.seenLocked[handle]) continue;\n      var rect;\n      try {\n        rect = card.getBoundingClientRect();\n      } catch (e2) {\n        continue;\n      }\n      if (rect && rect.right < scrollerRect.left) {\n        lockHandle(ctrl, handle, card);\n      }\n    }\n  }\n\n  function findFirstUnlockedIndex(ctrl) {\n    var cells = gridCards(ctrl);\n    var i;\n    for (i = 0; i < cells.length; i++) {\n      var handle = cells[i].getAttribute('data-wmn-handle');\n      if (!handle || !ctrl.seenLocked[handle]) return i;\n    }\n    return -1;\n  }\n\n  /** Remove unlocked cells from cutIndex forward (locked stay). */\n  function removeUnlockedFrom(ctrl, cutIndex) {\n    if (!ctrl || !ctrl.grid || cutIndex < 0) return;\n    var cells = gridCards(ctrl);\n    var i;\n    for (i = cells.length - 1; i >= cutIndex; i--) {\n      var card = cells[i];\n      var handle = card.getAttribute('data-wmn-handle');\n      if (handle && ctrl.seenLocked[handle]) continue;\n      unobserveCard(ctrl, card);\n      try {\n        ctrl.grid.removeChild(card);\n      } catch (e) {\n        /* ignore */\n      }\n    }\n  }\n\n  function observeCard(ctrl, card) {\n    if (!ctrl || !card) return;\n    if (ctrl.cardIo) {\n      try {\n        ctrl.cardIo.observe(card);\n      } catch (e) {\n        /* ignore */\n      }\n    }\n    if (ctrl.signalIo) {\n      try {\n        ctrl.signalIo.observe(card);\n      } catch (e2) {\n        /* ignore */\n      }\n    }\n  }\n\n  function cellMeta(cell) {\n    if (!cell) return null;\n    var handle = cell.getAttribute('data-wmn-handle');\n    if (!handle) return null;\n    var piRaw = cell.getAttribute('data-wmn-fy-pi');\n    var rankRaw = cell.getAttribute('data-wmn-fy-rank');\n    var piSlotRaw = cell.getAttribute('data-wmn-fy-pi-slot');\n    var pi = piRaw != null && piRaw !== '' ? parseFloat(piRaw) : null;\n    var rank = rankRaw != null && rankRaw !== '' ? parseInt(rankRaw, 10) : null;\n    var piSlot =\n      piSlotRaw != null && piSlotRaw !== '' ? parseFloat(piSlotRaw) : null;\n    var policyMeta = null;\n    if (pi != null || rank != null || cell.getAttribute('data-wmn-fy-branch')) {\n      policyMeta = {\n        pi: isFinite(pi) ? pi : null,\n        rank: isFinite(rank) ? rank : null,\n        piSlot: isFinite(piSlot) ? piSlot : null,\n        branch: cell.getAttribute('data-wmn-fy-branch') || null,\n        policy: cell.getAttribute('data-wmn-fy-policy') || null,\n        explore: cell.getAttribute('data-wmn-fy-explore') === '1'\n      };\n    }\n    return {\n      handle: handle,\n      title: cell.getAttribute('data-wmn-title') || '',\n      artist: (function () {\n        var el = cell.querySelector && cell.querySelector('.wmn-rg-rail__artist');\n        return el ? (el.textContent || '').trim() : '';\n      })(),\n      policyMeta: policyMeta\n    };\n  }\n\n  function emitFeedSignal(meta, kind, extra) {\n    if (!meta || !meta.handle) return;\n    try {\n      if (\n        window.wmnEngagement &&\n        typeof window.wmnEngagement.recordFeedSignal === 'function'\n      ) {\n        var payload = {\n          handle: meta.handle,\n          title: meta.title || '',\n          artist: meta.artist || '',\n          kind: kind,\n          source: SOURCE\n        };\n        if (meta.policyMeta) payload.meta = meta.policyMeta;\n        if (extra) {\n          if (extra.dwellMs != null) payload.dwellMs = extra.dwellMs;\n          if (extra.amount != null) payload.amount = extra.amount;\n        }\n        window.wmnEngagement.recordFeedSignal(payload);\n      }\n    } catch (e) {\n      /* ignore */\n    }\n  }\n\n  /** Re-hover on For You: do NOT promote focus (Rough Guides owns session intent). */\n  function promoteFeedHoverFocus(meta) {\n    // Intentionally no-op \u2014 inspecting recommendations must not rewrite \"Based on\u2026\"\n    if (!meta || !meta.handle) return;\n  }\n\n  /**\n   * Confirm pointer still over the pending feed cell when HOVER_MS fires.\n   */\n  function hoverStillOnHandle(expectedHandle, clientX, clientY) {\n    if (!expectedHandle) return false;\n    if (typeof clientX !== 'number' || typeof clientY !== 'number') return false;\n    try {\n      if (typeof document.elementFromPoint !== 'function') return true;\n      var el = document.elementFromPoint(clientX, clientY);\n      if (!el || !el.closest) return false;\n      var cell = el.closest('.wmn-rg-rail__cell');\n      if (!cell) return false;\n      return cell.getAttribute('data-wmn-handle') === expectedHandle;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  /**\n   * Mirror Rough Guides: hover\u2265500, click, skip (&lt;200ms leave), visible\u22651s log-only.\n   * Lock IO stays separate; signals do not change lock semantics.\n   */\n  function bindCardSignals(ctrl, cell) {\n    if (!ctrl || !cell) return;\n    if (cell.getAttribute('data-wmn-fy-sig') === '1') return;\n    cell.setAttribute('data-wmn-fy-sig', '1');\n\n    var meta = cellMeta(cell);\n    if (!meta) return;\n\n    cell.addEventListener('pointerenter', function (e) {\n      var m = cellMeta(cell);\n      if (!m) return;\n      if (e && typeof e.clientX === 'number') {\n        ctrl._lastPtrX = e.clientX;\n        ctrl._lastPtrY = e.clientY;\n      }\n      if (ctrl._hoverHandle === m.handle && ctrl._hoverTimer) return;\n      clearFeedHover(ctrl);\n      ctrl._hoverHandle = m.handle;\n      ctrl._hoverStartedAt = Date.now();\n      ctrl._hoverTimer = setTimeout(\n        (function (mm) {\n          return function () {\n            ctrl._hoverTimer = 0;\n            var dwell = Date.now() - (ctrl._hoverStartedAt || 0);\n            if (dwell < HOVER_MS) return;\n            if (\n              !hoverStillOnHandle(mm.handle, ctrl._lastPtrX, ctrl._lastPtrY)\n            ) {\n              return;\n            }\n            if (ctrl._hoverHandle !== mm.handle) return;\n            if (ctrl.signalHoverLogged[mm.handle]) {\n              promoteFeedHoverFocus(mm);\n              return;\n            }\n            ctrl.signalHoverLogged[mm.handle] = true;\n            ctrl.signalHadIntent[mm.handle] = true;\n            emitFeedSignal(mm, 'hover', { dwellMs: dwell });\n          };\n        })(m),\n        HOVER_MS\n      );\n    });\n\n    cell.addEventListener('pointerleave', function () {\n      var m = cellMeta(cell);\n      if (m && m.handle === ctrl._hoverHandle) clearFeedHover(ctrl);\n    });\n\n    var link = cell.querySelector && cell.querySelector('.wmn-rg-rail__card');\n    if (link) {\n      link.addEventListener(\n        'click',\n        function () {\n          var m = cellMeta(cell);\n          if (!m) return;\n          ctrl.signalHadIntent[m.handle] = true;\n          emitFeedSignal(m, 'click');\n        },\n        false\n      );\n    }\n  }\n\n  function clearFeedHover(ctrl) {\n    if (!ctrl) return;\n    if (ctrl._hoverTimer) {\n      clearTimeout(ctrl._hoverTimer);\n      ctrl._hoverTimer = 0;\n    }\n    ctrl._hoverHandle = null;\n    ctrl._hoverStartedAt = 0;\n  }\n\n  function bindFeedHoverPointer(ctrl) {\n    if (!ctrl || ctrl._hoverPtrBound) return;\n    ctrl._hoverPtrBound = true;\n    ctrl._lastPtrX = null;\n    ctrl._lastPtrY = null;\n    function onPtrMove(e) {\n      if (!e) return;\n      if (typeof e.clientX === 'number') ctrl._lastPtrX = e.clientX;\n      if (typeof e.clientY === 'number') ctrl._lastPtrY = e.clientY;\n    }\n    var moveRoot = ctrl.scroller || ctrl.grid;\n    if (moveRoot && typeof moveRoot.addEventListener === 'function') {\n      moveRoot.addEventListener('pointermove', onPtrMove, { passive: true });\n    }\n    if (\n      ctrl.grid &&\n      ctrl.grid !== moveRoot &&\n      typeof ctrl.grid.addEventListener === 'function'\n    ) {\n      ctrl.grid.addEventListener('pointermove', onPtrMove, { passive: true });\n    }\n    if (ctrl.scroller && typeof ctrl.scroller.addEventListener === 'function') {\n      ctrl.scroller.addEventListener(\n        'scroll',\n        function () {\n          if (ctrl._hoverTimer) clearFeedHover(ctrl);\n        },\n        { passive: true }\n      );\n    }\n  }\n\n  function bindSignalIo(ctrl) {\n    if (typeof window.IntersectionObserver !== 'function') return;\n    ctrl.signalIo = new IntersectionObserver(\n      function (entries) {\n        for (var i = 0; i < entries.length; i++) {\n          var entry = entries[i];\n          var card = entry.target;\n          var m = cellMeta(card);\n          if (!m) continue;\n          var h = m.handle;\n\n          if (entry.isIntersecting && entry.intersectionRatio >= 0.5) {\n            if (!ctrl.cellFirstVisibleAt[h]) {\n              ctrl.cellFirstVisibleAt[h] = Date.now();\n            }\n            if (\n              !ctrl.signalVisibleLogged[h] &&\n              !ctrl.visibleTimers[h]\n            ) {\n              ctrl.visibleTimers[h] = setTimeout(\n                (function (mm) {\n                  return function () {\n                    ctrl.visibleTimers[mm.handle] = null;\n                    if (ctrl.signalVisibleLogged[mm.handle]) return;\n                    // Still mostly visible?\n                    ctrl.signalVisibleLogged[mm.handle] = true;\n                    emitFeedSignal(mm, 'visible', { dwellMs: VISIBLE_MS });\n                  };\n                })(m),\n                VISIBLE_MS\n              );\n            }\n          } else if (!entry.isIntersecting) {\n            if (ctrl.visibleTimers[h]) {\n              clearTimeout(ctrl.visibleTimers[h]);\n              ctrl.visibleTimers[h] = null;\n            }\n            var firstAt = ctrl.cellFirstVisibleAt[h];\n            if (\n              firstAt &&\n              !ctrl.signalHadIntent[h] &&\n              !ctrl.signalSkipLogged[h]\n            ) {\n              var elapsed = Date.now() - firstAt;\n              if (elapsed > 0 && elapsed < SKIP_MS) {\n                ctrl.signalSkipLogged[h] = true;\n                emitFeedSignal(m, 'skip');\n              }\n            }\n            // Allow a later re-entry to count as a new first-visible for skip\n            // only if we never logged skip/intent; keep firstAt if intented.\n            if (!ctrl.signalHadIntent[h] && !ctrl.signalSkipLogged[h]) {\n              delete ctrl.cellFirstVisibleAt[h];\n            }\n          }\n        }\n      },\n      {\n        root: ctrl.scroller || null,\n        rootMargin: '0px',\n        threshold: [0, 0.5, 0.75]\n      }\n    );\n  }\n\n  function takeFromTail(ctrl, n) {\n    var out = [];\n    if (!ctrl || !ctrl.pendingTail) return out;\n    while (out.length < n && ctrl.pendingTail.length) {\n      var item = ctrl.pendingTail.shift();\n      if (!item || !item.handle) continue;\n      if (ctrl.seenLocked[item.handle]) continue;\n      out.push(item);\n    }\n    return out;\n  }\n\n  function appendNext(ctrl, n) {\n    if (!ctrl || ctrl.appending) return;\n    ctrl.appending = true;\n    try {\n      var want = n || ctrl.pageSize;\n      var batch = takeFromTail(ctrl, want);\n      // Skip blank-cover items already filtered in buildCard; pull more if needed\n      var guard = 0;\n      while (batch.length < want && ctrl.pendingTail.length && guard < 40) {\n        guard++;\n        batch = batch.concat(takeFromTail(ctrl, want - batch.length));\n      }\n      var added = appendItems(ctrl, batch);\n      if (!ctrl.pendingTail.length) {\n        setStatus(ctrl, endOfRailMessage(ctrl), true);\n        if (ctrl.sentinel) ctrl.sentinel.setAttribute('hidden', 'hidden');\n      } else {\n        setStatus(ctrl, '', false);\n        if (ctrl.sentinel) ctrl.sentinel.removeAttribute('hidden');\n      }\n      ctrl.root.setAttribute('data-wmn-for-you-live', String(Date.now()));\n      ctrl.root.setAttribute('data-wmn-fy-count', String(gridCards(ctrl).length));\n      ctrl.root.setAttribute(\n        'data-wmn-fy-locked',\n        String(Object.keys(ctrl.seenLocked).length)\n      );\n      return added;\n    } finally {\n      ctrl.appending = false;\n    }\n  }\n\n  function intentFingerprint() {\n    try {\n      var f =\n        window.wmnEngagement && typeof window.wmnEngagement.getFocus === 'function'\n          ? window.wmnEngagement.getFocus()\n          : null;\n      if (!f) return '';\n      return [\n        f.primaryKind || '',\n        f.primaryGenre || '',\n        f.primaryCountry || '',\n        f.primaryRegion || '',\n        f.primaryArtist || ''\n      ].join('|');\n    } catch (e) {\n      return '';\n    }\n  }\n\n  /**\n   * Re-rank the rail. When session intent changes (Jazz vs Mali), REMOUNT \u2014\n   * locked geo cards must not block genre products from appearing on screen.\n   * Soft rebuild only when intent fingerprint is unchanged.\n   * Pass reason containing \"force-remount\" (or opts.force) to always remount\n   * after Rough Guides intentional hover/click.\n   */\n  function rebuildTail(ctrl, reason, opts) {\n    if (!ctrl || !ctrl.root) return;\n    if (!graphReady()) {\n      ensureGraph().then(function () {\n        rebuildTail(ctrl, reason, opts);\n      });\n      return;\n    }\n\n    var forceRemount =\n      !!(opts && opts.force) ||\n      (reason && String(reason).indexOf('force-remount') !== -1);\n\n    var fp = intentFingerprint();\n    // Use _intentReady \u2014 empty fingerprint '' is falsy and must still count\n    // as a baseline so the first Jazz/Mali hover remounts the Cuba paint.\n    var intentChanged = !!(ctrl._intentReady && ctrl._intentFp !== fp);\n    if (forceRemount) intentChanged = true;\n    ctrl._intentFp = fp;\n    ctrl._intentReady = true;\n\n    // Peek score early when soft path might keep stale locked non-matches\n    // (e.g. Spiritual India locked before fy-focus-hard-v2).\n    // Force remount when policy changed OR focusDominant + locked handle\n    // would not be in the current prefer pool.\n    if (!intentChanged) {\n      lockScrolledPast(ctrl);\n      var excludePeek = Object.keys(ctrl.seenLocked);\n      var builtPeek = scoreFullCatalog(excludePeek, false);\n      var policy =\n        (builtPeek && builtPeek.policy) ||\n        (window.wmnEngagement && window.wmnEngagement.FY_POLICY_ID) ||\n        '';\n      if (policy && policy !== ctrl._fyPolicy) {\n        intentChanged = true;\n      } else if (\n        builtPeek &&\n        builtPeek.focusDominant &&\n        excludePeek.length\n      ) {\n        // Drop locked cards that would not be preferred under current focus.\n        var preferHandles = {};\n        var fullPrefer = scoreFullCatalog([], false);\n        if (fullPrefer && fullPrefer.picks) {\n          for (var pi = 0; pi < fullPrefer.picks.length; pi++) {\n            if (fullPrefer.picks[pi] && fullPrefer.picks[pi].handle) {\n              preferHandles[fullPrefer.picks[pi].handle] = true;\n            }\n          }\n        }\n        var stale = false;\n        for (var li = 0; li < excludePeek.length; li++) {\n          if (!preferHandles[excludePeek[li]]) {\n            stale = true;\n            break;\n          }\n        }\n        if (stale) intentChanged = true;\n      }\n      if (policy && !intentChanged) ctrl._fyPolicy = policy;\n    }\n\n    if (intentChanged) {\n      // Score before wiping \u2014 empty hard-focus must not clear a visible rail.\n      var builtHard = scoreFullCatalog([], false);\n      if (!builtHard || !builtHard.picks || !builtHard.picks.length) {\n        ctrl.pendingTail = [];\n        updateSubtitle(ctrl, (builtHard && builtHard.labels) || []);\n        // Keep existing cards if any; only hide when truly empty.\n        if (!hasGridCards(ctrl)) {\n          ctrl.root.setAttribute('hidden', 'hidden');\n        }\n        return;\n      }\n      ctrl.seenLocked = {};\n      ctrl.renderedOrder = [];\n      if (ctrl.grid) {\n        try {\n          var holdFy = ctrl.grid.offsetHeight;\n          if (holdFy > 40) ctrl.grid.style.minHeight = holdFy + 'px';\n          ctrl.grid.innerHTML = '';\n        } catch (eClr) {\n          /* ignore */\n        }\n      }\n      if (builtHard.policy) ctrl._fyPolicy = builtHard.policy;\n      ctrl.pendingTail = builtHard.picks.filter(function (p) {\n        return p && p.handle && productImage(p.handle, p.image);\n      });\n      if (!ctrl.pendingTail.length) {\n        if (!hasGridCards(ctrl)) {\n          ctrl.root.setAttribute('hidden', 'hidden');\n        }\n        return;\n      }\n      updateSubtitle(ctrl, builtHard.labels);\n      ctrl.root.removeAttribute('hidden');\n      if (ctrl.scroller && typeof ctrl.scroller.scrollLeft === 'number') {\n        ctrl.scroller.scrollLeft = 0;\n      }\n      appendNext(ctrl, ctrl.pageSize);\n      if (ctrl.pendingTail.length) appendNext(ctrl, ctrl.pageSize);\n      if (ctrl.sentinel) ctrl.sentinel.removeAttribute('hidden');\n      setStatus(ctrl, '', false);\n      ctrl.root.setAttribute('data-wmn-fy-tail', String(ctrl.pendingTail.length));\n      ctrl.root.setAttribute(\n        'data-wmn-fy-reason',\n        (reason || 'rebuild') + ':remount'\n      );\n      ctrl.root.setAttribute('data-wmn-fy-locked', '0');\n      ctrl.root.setAttribute('data-wmn-fy-intent', fp);\n      if (ctrl._fyPolicy) {\n        ctrl.root.setAttribute('data-wmn-fy-policy', ctrl._fyPolicy);\n      }\n      if (typeof window.requestAnimationFrame === 'function') {\n        window.requestAnimationFrame(function () {\n          try {\n            if (ctrl.grid) ctrl.grid.style.minHeight = '';\n          } catch (eUnlockR) {\n            /* ignore */\n          }\n        });\n      }\n      return;\n    }\n\n    lockScrolledPast(ctrl);\n\n    var exclude = Object.keys(ctrl.seenLocked);\n    var built = scoreFullCatalog(exclude, false);\n    if (built && built.policy) ctrl._fyPolicy = built.policy;\n    if (!built || !built.picks || !built.picks.length) {\n      ctrl.pendingTail = [];\n      if (hasGridCards(ctrl) && exclude.length) {\n        setStatus(ctrl, endOfRailMessage(ctrl), true);\n        if (ctrl.sentinel) ctrl.sentinel.setAttribute('hidden', 'hidden');\n      }\n      return;\n    }\n\n    ctrl.pendingTail = built.picks.filter(function (p) {\n      return (\n        p && p.handle && !ctrl.seenLocked[p.handle] && productImage(p.handle, p.image)\n      );\n    });\n    updateSubtitle(ctrl, built.labels);\n\n    var savedScroll =\n      ctrl.scroller && typeof ctrl.scroller.scrollLeft === 'number'\n        ? ctrl.scroller.scrollLeft\n        : 0;\n\n    if (!hasGridCards(ctrl)) {\n      ctrl.root.removeAttribute('hidden');\n      appendNext(ctrl, ctrl.pageSize);\n      if (ctrl.pendingTail.length) appendNext(ctrl, ctrl.pageSize);\n    } else {\n      var cut = findFirstUnlockedIndex(ctrl);\n      // Everything locked \u2192 soft rebuild can't refresh viewport; force remount\n      if (cut < 0 && hasGridCards(ctrl)) {\n        ctrl._intentReady = true;\n        ctrl._intentFp = '__force_remount__';\n        rebuildTail(ctrl, (reason || 'rebuild') + ':all-locked');\n        return;\n      }\n      if (cut >= 0) {\n        removeUnlockedFrom(ctrl, cut);\n      }\n      if (ctrl.pendingTail.length) {\n        appendNext(ctrl, ctrl.pageSize);\n        if (ctrl.pendingTail.length) appendNext(ctrl, ctrl.pageSize);\n        if (ctrl.sentinel) ctrl.sentinel.removeAttribute('hidden');\n        setStatus(ctrl, '', false);\n      } else if (!hasGridCards(ctrl) || findFirstUnlockedIndex(ctrl) < 0) {\n        setStatus(ctrl, endOfRailMessage(ctrl), true);\n        if (ctrl.sentinel) ctrl.sentinel.setAttribute('hidden', 'hidden');\n      }\n      if (ctrl.scroller && typeof ctrl.scroller.scrollLeft === 'number') {\n        ctrl.scroller.scrollLeft = savedScroll;\n      }\n    }\n\n    ctrl.root.setAttribute('data-wmn-fy-tail', String(ctrl.pendingTail.length));\n    ctrl.root.setAttribute('data-wmn-fy-reason', reason || 'rebuild');\n    ctrl.root.setAttribute(\n      'data-wmn-fy-locked',\n      String(Object.keys(ctrl.seenLocked).length)\n    );\n  }\n\n  function initialPaint(ctrl) {\n    if (!ctrl) return;\n    var built = null;\n    try {\n      built = scoreFullCatalog([], true);\n    } catch (ePaint) {\n      built = null;\n    }\n    if (!built || !built.picks || built.picks.length < 3) {\n      if (!hasGridCards(ctrl)) {\n        ctrl.root.setAttribute('hidden', 'hidden');\n      }\n      return;\n    }\n\n    ctrl.pendingTail = built.picks.filter(function (p) {\n      return p && p.handle && productImage(p.handle, p.image);\n    });\n    if (ctrl.pendingTail.length < 3) {\n      if (!hasGridCards(ctrl)) {\n        ctrl.root.setAttribute('hidden', 'hidden');\n      }\n      return;\n    }\n    updateSubtitle(ctrl, built.labels);\n    ctrl.root.removeAttribute('hidden');\n    try {\n      var holdInit = ctrl.grid.offsetHeight;\n      if (holdInit > 40) ctrl.grid.style.minHeight = holdInit + 'px';\n    } catch (eHoldI) {\n      /* ignore */\n    }\n    ctrl.grid.innerHTML = '';\n    ctrl.grid.className = 'wmn-rg-rail__track';\n    ctrl.seenLocked = {};\n    ctrl.renderedOrder = [];\n    ctrl._fyPolicy =\n      built.policy ||\n      (window.wmnEngagement && window.wmnEngagement.FY_POLICY_ID) ||\n      '';\n    if (ctrl._fyPolicy) {\n      ctrl.root.setAttribute('data-wmn-fy-policy', ctrl._fyPolicy);\n    }\n    appendNext(ctrl, ctrl.pageSize);\n    if (ctrl.pendingTail.length) appendNext(ctrl, ctrl.pageSize);\n    ctrl._intentFp = intentFingerprint();\n    ctrl._intentReady = true;\n    if (typeof window.requestAnimationFrame === 'function') {\n      window.requestAnimationFrame(function () {\n        try {\n          if (ctrl.grid) ctrl.grid.style.minHeight = '';\n        } catch (eUnlock) {\n          /* ignore */\n        }\n      });\n    }\n  }\n\n  function bindSentinel(ctrl) {\n    if (!ctrl.sentinel) return;\n    var scrollRoot = ctrl.scroller || null;\n\n    // Horizontal rail \u2014 observe against the scroller (not the page).\n    if (typeof window.IntersectionObserver !== 'function') {\n      ctrl.onScrollFallback = function () {\n        if (!ctrl.pendingTail.length || !scrollRoot) return;\n        var remaining =\n          scrollRoot.scrollWidth - scrollRoot.scrollLeft - scrollRoot.clientWidth;\n        if (remaining < 480) appendNext(ctrl, ctrl.pageSize);\n      };\n      if (scrollRoot) {\n        scrollRoot.addEventListener('scroll', ctrl.onScrollFallback, {\n          passive: true\n        });\n      }\n      return;\n    }\n\n    ctrl.sentinelIo = new IntersectionObserver(\n      function (entries) {\n        for (var i = 0; i < entries.length; i++) {\n          if (entries[i].isIntersecting && ctrl.pendingTail.length) {\n            appendNext(ctrl, ctrl.pageSize);\n          }\n        }\n      },\n      {\n        root: scrollRoot,\n        rootMargin: '0px 400px 0px 0px',\n        threshold: 0\n      }\n    );\n    ctrl.sentinelIo.observe(ctrl.sentinel);\n  }\n\n  function bindCardLockIo(ctrl) {\n    if (typeof window.IntersectionObserver !== 'function') return;\n    ctrl.cardIo = new IntersectionObserver(\n      function (entries) {\n        for (var i = 0; i < entries.length; i++) {\n          var entry = entries[i];\n          if (!entry.isIntersecting) continue;\n          if (entry.intersectionRatio < LOCK_IO_RATIO) continue;\n          var card = entry.target;\n          var handle = card.getAttribute('data-wmn-handle');\n          if (handle) lockHandle(ctrl, handle, card);\n        }\n      },\n      {\n        root: ctrl.scroller || null,\n        rootMargin: '0px',\n        threshold: [0, LOCK_IO_RATIO, 0.5, 0.75, 1]\n      }\n    );\n\n    // Also lock cells that fully leave to the left while scrolling.\n    if (ctrl.scroller && !ctrl._onLockScroll) {\n      ctrl._onLockScroll = function () {\n        lockScrolledPast(ctrl);\n      };\n      ctrl.scroller.addEventListener('scroll', ctrl._onLockScroll, {\n        passive: true\n      });\n    }\n  }\n\n  function scheduleRebuild(ctrl, reason) {\n    if (!ctrl) return;\n    if (ctrl.rebuildTimer) clearTimeout(ctrl.rebuildTimer);\n    ctrl.rebuildTimer = setTimeout(function () {\n      ctrl.rebuildTimer = 0;\n      rebuildTail(ctrl, reason || 'state');\n    }, REBUILD_DEBOUNCE_MS);\n  }\n\n  function bindStateListeners(ctrl) {\n    function onState(ev) {\n      var type = (ev && ev.type) || 'state';\n      scheduleRebuild(ctrl, type);\n    }\n    ctrl._onPrefs = function () {\n      onState({ type: 'preferences-updated' });\n    };\n    ctrl._onRail = function () {\n      // Rough Guides owns intent \u2014 always remount, don't soft-rebuild\n      if (ctrl.rebuildTimer) clearTimeout(ctrl.rebuildTimer);\n      ctrl.rebuildTimer = 0;\n      rebuildTail(ctrl, 'force-remount:rail-affinity', { force: true });\n    };\n    ctrl._onField = function () {\n      onState({ type: 'intent-field-updated' });\n    };\n    ctrl._onForYouState = function (ev) {\n      onState({ type: (ev && ev.detail && ev.detail.reason) || 'for-you-state' });\n    };\n    document.addEventListener('wmn:preferences-updated', ctrl._onPrefs);\n    document.addEventListener('wmn:rail-affinity', ctrl._onRail);\n    document.addEventListener('wmn:intent-field-updated', ctrl._onField);\n    document.addEventListener('wmn:for-you-state', ctrl._onForYouState);\n  }\n\n  function unbindStateListeners(ctrl) {\n    if (!ctrl) return;\n    if (ctrl._onPrefs) {\n      document.removeEventListener('wmn:preferences-updated', ctrl._onPrefs);\n    }\n    if (ctrl._onRail) {\n      document.removeEventListener('wmn:rail-affinity', ctrl._onRail);\n    }\n    if (ctrl._onField) {\n      document.removeEventListener('wmn:intent-field-updated', ctrl._onField);\n    }\n    if (ctrl._onForYouState) {\n      document.removeEventListener('wmn:for-you-state', ctrl._onForYouState);\n    }\n  }\n\n  function destroy(ctrl) {\n    if (!ctrl) return;\n    if (ctrl.rebuildTimer) clearTimeout(ctrl.rebuildTimer);\n    clearFeedHover(ctrl);\n    if (ctrl.visibleTimers) {\n      var vk;\n      for (vk in ctrl.visibleTimers) {\n        if (\n          Object.prototype.hasOwnProperty.call(ctrl.visibleTimers, vk) &&\n          ctrl.visibleTimers[vk]\n        ) {\n          clearTimeout(ctrl.visibleTimers[vk]);\n        }\n      }\n    }\n    unbindStateListeners(ctrl);\n    if (ctrl.sentinelIo) {\n      try {\n        ctrl.sentinelIo.disconnect();\n      } catch (e) {\n        /* ignore */\n      }\n    }\n    if (ctrl.cardIo) {\n      try {\n        ctrl.cardIo.disconnect();\n      } catch (e2) {\n        /* ignore */\n      }\n    }\n    if (ctrl.signalIo) {\n      try {\n        ctrl.signalIo.disconnect();\n      } catch (e3) {\n        /* ignore */\n      }\n    }\n    if (ctrl.onScrollFallback) {\n      var scrollTarget = ctrl.scroller || window;\n      scrollTarget.removeEventListener('scroll', ctrl.onScrollFallback);\n    }\n    if (ctrl._onLockScroll && ctrl.scroller) {\n      ctrl.scroller.removeEventListener('scroll', ctrl._onLockScroll);\n      ctrl._onLockScroll = null;\n    }\n    if (ctrl.root) {\n      ctrl.root.removeAttribute('data-wmn-fy-feed');\n      ctrl.root.removeAttribute('data-wmn-fy-active');\n    }\n  }\n\n  function createController(root) {\n    var grid = qs('#wmn-for-you-grid', root) || qs('[data-wmn-for-you-grid]', root);\n    if (!grid) return null;\n    var scroller =\n      qs('[data-wmn-fy-scroller]', root) ||\n      qs('.wmn-rg-rail__scroller', root) ||\n      qs('.wmn-for-you__scroller', root);\n    var sentinel =\n      qs('[data-wmn-fy-sentinel]', root) ||\n      qs('.wmn-rg-rail__sentinel', root) ||\n      qs('.wmn-for-you__sentinel', root);\n    var statusEl =\n      qs('[data-wmn-fy-status]', root) ||\n      qs('.wmn-rg-rail__status', root) ||\n      qs('.wmn-for-you__status', root);\n    var subtitleEl = qs('.wmn-for-you__subtitle', root);\n\n    var ctrl = {\n      root: root,\n      grid: grid,\n      scroller: scroller,\n      sentinel: sentinel,\n      statusEl: statusEl,\n      subtitleEl: subtitleEl,\n      pageSize: pageSizeFromRoot(root),\n      seenLocked: {},\n      renderedOrder: [],\n      pendingTail: [],\n      appending: false,\n      rebuildTimer: 0,\n      sentinelIo: null,\n      cardIo: null,\n      signalIo: null,\n      onScrollFallback: null,\n      source: SOURCE,\n      signalHoverLogged: {},\n      signalSkipLogged: {},\n      signalVisibleLogged: {},\n      signalHadIntent: {},\n      cellFirstVisibleAt: {},\n      visibleTimers: {},\n      _hoverTimer: 0,\n      _hoverHandle: null,\n      _hoverStartedAt: 0,\n      _intentFp: '',\n      _intentReady: false,\n      _fyPolicy: ''\n    };\n\n    root.setAttribute('data-wmn-fy-feed', '1');\n    root.setAttribute('data-wmn-fy-active', '1');\n    root.setAttribute('data-wmn-fy-scroll', 'horizontal');\n    grid.className = 'wmn-rg-rail__track';\n\n    bindCardLockIo(ctrl);\n    bindSignalIo(ctrl);\n    bindSentinel(ctrl);\n    bindStateListeners(ctrl);\n    bindFeedHoverPointer(ctrl);\n    return ctrl;\n  }\n\n  function ensure() {\n    var root = document.getElementById('wmn-for-you');\n    if (!root) {\n      if (controller) {\n        destroy(controller);\n        controller = null;\n      }\n      return null;\n    }\n\n    // Re-bind if InstantClick swapped DOM\n    if (controller && controller.root !== root) {\n      destroy(controller);\n      controller = null;\n    }\n\n    if (!controller) {\n      controller = createController(root);\n      if (!controller) return null;\n      ensureGraph().then(function () {\n        if (!controller || controller.root !== root) return;\n        initialPaint(controller);\n      });\n    } else if (!hasGridCards(controller)) {\n      ensureGraph().then(function () {\n        if (controller) initialPaint(controller);\n      });\n    }\n    return controller;\n  }\n\n  function destroyFeed() {\n    if (controller) {\n      destroy(controller);\n      controller = null;\n    }\n  }\n\n  function rebuildTailPublic(reason) {\n    var ctrl = ensure();\n    if (!ctrl) return;\n    if (!hasGridCards(ctrl)) {\n      ensureGraph().then(function () {\n        if (controller) initialPaint(controller);\n      });\n      return;\n    }\n    var force =\n      reason && String(reason).indexOf('force-remount') !== -1;\n    if (force) {\n      // Immediate remount \u2014 Rough Guides intentional signal\n      if (ctrl.rebuildTimer) clearTimeout(ctrl.rebuildTimer);\n      ctrl.rebuildTimer = 0;\n      rebuildTail(ctrl, reason || 'force-remount', { force: true });\n      return;\n    }\n    scheduleRebuild(ctrl, reason || 'api');\n  }\n\n  function remountPublic(reason) {\n    var ctrl = ensure();\n    if (!ctrl) return;\n    if (ctrl.rebuildTimer) clearTimeout(ctrl.rebuildTimer);\n    ctrl.rebuildTimer = 0;\n    if (!graphReady()) {\n      ensureGraph().then(function () {\n        if (controller) {\n          rebuildTail(controller, reason || 'force-remount', { force: true });\n        }\n      });\n      return;\n    }\n    rebuildTail(ctrl, reason || 'force-remount', { force: true });\n  }\n\n  function getState() {\n    if (!controller) return null;\n    return {\n      locked: Object.keys(controller.seenLocked).length,\n      rendered: controller.renderedOrder.slice(),\n      pending: controller.pendingTail.length,\n      cards: gridCards(controller).length,\n      pageSize: controller.pageSize\n    };\n  }\n\n  window.wmnForYouFeed = {\n    ensure: ensure,\n    destroy: destroyFeed,\n    rebuildTail: rebuildTailPublic,\n    remount: remountPublic,\n    appendNext: function (n) {\n      if (controller) appendNext(controller, n);\n    },\n    getState: getState,\n    /** Test helper: lock handles (and matching DOM cards) without IO */\n    _testLock: function (handles) {\n      var ctrl = ensure();\n      if (!ctrl) return;\n      var want = {};\n      (handles || []).forEach(function (h) {\n        if (h) want[h] = true;\n      });\n      gridCards(ctrl).forEach(function (card) {\n        var h = card.getAttribute('data-wmn-handle');\n        if (h && want[h]) lockHandle(ctrl, h, card);\n      });\n      (handles || []).forEach(function (h) {\n        if (h && !ctrl.seenLocked[h]) lockHandle(ctrl, h, null);\n      });\n    }\n  };\n\n  function boot() {\n    ensure();\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', boot);\n  } else {\n    boot();\n  }\n\n  function onInstantNav() {\n    destroyFeed();\n    // Defer so engagement/init and new DOM settle\n    setTimeout(function () {\n      ensure();\n    }, 0);\n  }\n  document.addEventListener('instantclick:newpage', onInstantNav);\n  if (window.InstantClick && typeof InstantClick.on === 'function') {\n    try {\n      InstantClick.on('change', onInstantNav);\n    } catch (errIc) {\n      /* ignore */\n    }\n  }\n})(window, document);\n"],
  "mappings": "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",
  "names": ["window", "document"]
}
