{
  "version": 3,
  "sources": ["/cdn/shop/t/67/assets/cs-reco-sort.js?x=1792523339498"],
  "sourcesContent": ["(() => {\n  // CHINASQUAD: personalise collection order with the ERP recommendation engine (same engine as the App \"For You\").\n  // Shopify renders its own order; we re-rank the already-loaded cards client-side. Explicit sort_by is left alone.\n  const cfg = window.csRecoSort;\n  if (!cfg || !cfg.handle || !cfg.erp || !cfg.pk) return;\n  const grid = () => document.getElementById('product-grid');\n  const reveal = () => { const g = grid(); if (g) g.removeAttribute('data-cs-reco-pending'); };\n  const params = new URLSearchParams(location.search);\n  if (params.has('sort_by') || !grid() || grid().classList.contains('collection--empty')) { reveal(); return; }\n\n  const ls = {\n    get: k => { try { return localStorage.getItem(k); } catch { return null; } },\n    set: (k, v) => { try { localStorage.setItem(k, v); } catch {} }\n  };\n  // Same visitor id as the chat widget / cc-reco, so the profile is shared.\n  let vid = ls.get('cb_vid');\n  if (!vid) { vid = 'v' + Date.now().toString(36) + Math.random().toString(36).slice(2, 10); ls.set('cb_vid', vid); }\n\n  // Server returns 14 per call and keeps a per-visitor pool of up to 120; fetch enough pages to cover the configured pool.\n  const PAGE = 14, TTL = 10 * 60 * 1000;\n  const PAGES = Math.min(9, Math.max(1, Math.ceil((Number(cfg.pool) || 120) / PAGE)));\n  const cacheKey = 'csRecoSort:' + cfg.handle + ':' + vid;\n  const readCache = () => { try { const c = JSON.parse(sessionStorage.getItem(cacheKey) || 'null'); return c && Date.now() - c.at < TTL ? c.handles : null; } catch { return null; } };\n  const writeCache = handles => { try { sessionStorage.setItem(cacheKey, JSON.stringify({ at: Date.now(), handles })); } catch {} };\n\n  const handleOf = li => {\n    if (li.dataset.csHandle !== undefined) return li.dataset.csHandle;\n    const a = li.querySelector('a[href*=\"/products/\"]');\n    const m = a && (a.getAttribute('href') || '').match(/\\/products\\/([^/?#]+)/);\n    li.dataset.csHandle = m ? m[1] : '';\n    return li.dataset.csHandle;\n  };\n  let rank = null; // Map handle -> position\n  const setRank = handles => { rank = new Map(); handles.forEach((h, i) => { if (!rank.has(h)) rank.set(h, i); }); };\n\n  // Stable sort: ranked items first in rank order, everything else keeps Shopify's order.\n  const order = items => items\n    .map((li, i) => ({ li, i, r: rank.has(handleOf(li)) ? rank.get(handleOf(li)) : Infinity }))\n    .sort((a, b) => a.r - b.r || a.i - b.i)\n    .map(x => x.li);\n  const applyBatch = (container, items) => {\n    if (!rank || items.length < 2) { items.forEach(li => { li.dataset.csRecoSeen = '1'; }); return; }\n    const sorted = order(items);\n    items.forEach(li => { li.dataset.csRecoSeen = '1'; });\n    if (sorted.every((li, i) => li === items[i])) return;\n    const anchor = items[items.length - 1].nextSibling; // keep the batch where it was\n    const frag = document.createDocumentFragment();\n    sorted.forEach(li => frag.appendChild(li));\n    container.insertBefore(frag, anchor);\n    container.dataset.csRecoApplied = String((Number(container.dataset.csRecoApplied) || 0) + 1);\n  };\n  const applyAll = () => { const g = grid(); if (g) applyBatch(g, Array.from(g.children).filter(n => n.tagName === 'LI')); reveal(); };\n\n  // New grids (filters/sort re-render via facets.js) and new batches (infinite scroll) get ranked as they arrive,\n  // inside the mutation callback so nothing is painted in the wrong order first.\n  const container = document.getElementById('ProductGridContainer') || document.body;\n  new MutationObserver(records => {\n    if (!rank) return;\n    const fresh = new Set();\n    records.forEach(r => r.addedNodes.forEach(n => {\n      if (n.nodeType !== 1) return;\n      if (n.tagName === 'LI' && n.parentElement && n.parentElement.id === 'product-grid' && !n.dataset.csRecoSeen) fresh.add(n);\n      const g = n.id === 'product-grid' ? n : n.querySelector && n.querySelector('#product-grid');\n      if (g) Array.from(g.children).forEach(li => { if (li.tagName === 'LI' && !li.dataset.csRecoSeen) fresh.add(li); });\n    }));\n    if (!fresh.size) return;\n    const g = grid(); if (!g) return;\n    applyBatch(g, dedupe(Array.from(g.children).filter(li => fresh.has(li))));\n    reveal();\n  }).observe(container, { childList: true, subtree: true });\n\n  const post = (offset, signal) => fetch(cfg.erp + '/api/support/widget/reco', {\n    method: 'POST', credentials: 'omit', signal,\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({ publicKey: cfg.pk, visitorId: vid, customer: cfg.customer || undefined, kind: 'collection', handle: cfg.handle, limit: PAGE, offset, locale: cfg.locale })\n  }).then(r => r.ok ? r.json() : null).then(d => (d && d.ok !== false && Array.isArray(d.products)) ? d.products.map(p => p && p.handle).filter(Boolean) : []).catch(() => []);\n\n  // Top picks that are not on the loaded page get pulled in as real theme cards (rendered by sections/cs-reco-card.liquid).\n  // Only when no storefront filter is active, so injected products always belong to the visible result set.\n  const INJECT = Math.max(0, Number(cfg.inject) || 0);\n  const filtered = Array.from(params.keys()).some(k => k.indexOf('filter.') === 0);\n  const onPage = () => new Set(Array.from(grid() ? grid().children : []).map(handleOf));\n  let injecting = false;\n  const injectMissing = () => {\n    const g = grid();\n    if (!g || !rank || !INJECT || filtered || injecting) return Promise.resolve();\n    const present = onPage();\n    const wanted = Array.from(rank.keys()).filter(h => !present.has(h)).slice(0, INJECT);\n    if (!wanted.length) return Promise.resolve();\n    injecting = true;\n    return Promise.all(wanted.map(h => fetch('/products/' + encodeURIComponent(h) + '?section_id=cs-reco-card', { credentials: 'same-origin' })\n      .then(r => r.ok ? r.text() : '').catch(() => '')\n      .then(html => { const li = new DOMParser().parseFromString(html, 'text/html').querySelector('li[data-cs-reco-injected]'); return li && !li.hasAttribute('data-cs-sold-out') ? li : null; })))\n      .then(cards => {\n        const live = grid(); if (!live) return;\n        const have = onPage();\n        const frag = document.createDocumentFragment();\n        cards.forEach(li => { if (!li) return; const h = li.dataset.csHandle; if (!h || have.has(h)) return; have.add(h); li.dataset.csRecoSeen = '1'; frag.appendChild(document.adoptNode(li)); });\n        if (frag.childNodes.length) live.insertBefore(frag, live.firstChild);\n      }).finally(() => { injecting = false; });\n  };\n  // Infinite scroll may bring a product we already injected: drop the late duplicate.\n  const dedupe = items => items.filter(li => { const h = handleOf(li); const dup = h && grid().querySelector('li[data-cs-reco-injected][data-cs-handle=\"' + h + '\"]'); if (dup && dup !== li) { li.remove(); return false; } return true; });\n\n  const cached = readCache();\n  if (cached && cached.length) { setRank(cached); injectMissing().then(applyAll); return; }\n\n  const safety = setTimeout(reveal, Number(cfg.revealAfter) || 1000);\n  const ctrl = new AbortController();\n  const abortTimer = setTimeout(() => ctrl.abort(), 6000);\n  // First page warms the server-side pool and ranks the first screen; the rest refine below the fold.\n  post(0, ctrl.signal).then(first => {\n    if (!first.length) { clearTimeout(safety); reveal(); return null; }\n    setRank(first);\n    const rest = Promise.all(Array.from({ length: PAGES - 1 }, (_, i) => post((i + 1) * PAGE, ctrl.signal)));\n    // First page: pull in its missing picks, rank, show. Remaining pages only refine rows below the fold.\n    return injectMissing().then(() => { clearTimeout(safety); applyAll(); return rest; }).then(more => {\n      setRank(first.concat(...more)); writeCache(Array.from(rank.keys()));\n      if (window.scrollY < 60) applyAll();\n    });\n  }).catch(() => { clearTimeout(safety); reveal(); }).finally(() => clearTimeout(abortTimer));\n})();\n"],
  "mappings": "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",
  "names": ["container", "g"]
}
