{
  "version": 3,
  "sources": ["/cdn/shop/t/8/assets/theme.js?cb=20260913-110"],
  "sourcesContent": ["// Auto-trim: a lot of the consignment catalog's source photos (reseller-marketplace\n// style, e.g. eBay listing exports) have a large amount of built-in blank canvas\n// around the actual shoe rather than a tight product-photography crop. Shopify's\n// CDN can only crop to fixed presets (center/top/etc.) against the image's own\n// bounds, not detect where the subject actually is, so there's no server-side fix.\n// This scans each loaded image on an offscreen canvas, finds the bounding box of\n// non-background pixels, and zooms/re-centers via a CSS transform so the subject\n// fills the frame the way a normal product photo would, without cropping it off\n// (unlike object-fit:cover, which crops blind to where the subject is).\n(function () {\n  var SAMPLE = 120;\n  var DIFF_THRESHOLD = 42;\n  var MIN_LINE_FRACTION = 0.02;\n  var EDGE_PADDING = 0.06;\n  // Previously 2.2 \u2014 since this scale is computed per-photo from that photo's own detected\n  // subject bounding box, two cards sitting side by side in the same grid could legitimately\n  // land at 1.0x and 2.2x respectively depending on how much blank canvas each source photo\n  // happened to have. That's the concrete \"some images are too zoomed in and it makes it\n  // unorganized\" complaint \u2014 inconsistent zoom across a grid reads as broken, not intentional.\n  // Capping lower keeps every photo's zoom in a tighter, less visually jarring band.\n  var MAX_ZOOM = 1.5;\n  var MIN_ZOOM_TO_APPLY = 1.0;\n\n  function trimImage(img) {\n    if (!img || img.dataset.autotrimDone) return;\n    img.dataset.autotrimDone = '1';\n    if (!img.naturalWidth || !img.naturalHeight || img.naturalWidth < 20 || img.naturalHeight < 20) return;\n\n    try {\n      var scale = SAMPLE / Math.max(img.naturalWidth, img.naturalHeight);\n      var w = Math.max(1, Math.round(img.naturalWidth * scale));\n      var h = Math.max(1, Math.round(img.naturalHeight * scale));\n      var canvas = document.createElement('canvas');\n      canvas.width = w;\n      canvas.height = h;\n      var ctx = canvas.getContext('2d', { willReadFrequently: true });\n      ctx.drawImage(img, 0, 0, w, h);\n      var data = ctx.getImageData(0, 0, w, h).data;\n\n      function px(x, y) {\n        var i = (y * w + x) * 4;\n        return [data[i], data[i + 1], data[i + 2]];\n      }\n      // Eight edge samples (corners + edge midpoints), combined by MEDIAN rather than mean.\n      // Four corners alone were too few and too easily skewed: a photo with a faint corner\n      // vignette read as 246 when its actual backdrop is pure white, and the plate was then\n      // painted 246 against a 255 photo \u2014 a mismatch the sampler itself created. The median\n      // ignores one or two odd samples instead of averaging them in.\n      var corners = [\n        px(0, 0), px(w - 1, 0), px(0, h - 1), px(w - 1, h - 1),\n        px(Math.floor(w / 2), 0), px(Math.floor(w / 2), h - 1),\n        px(0, Math.floor(h / 2)), px(w - 1, Math.floor(h / 2))\n      ];\n      function median(ch) {\n        var vals = corners.map(function (c) { return c[ch]; }).sort(function (a, b) { return a - b; });\n        var mid = vals.length >> 1;\n        return (vals.length % 2) ? vals[mid] : (vals[mid - 1] + vals[mid]) / 2;\n      }\n      var bg = [median(0), median(1), median(2)];\n\n      function isContent(x, y) {\n        var c = px(x, y);\n        return (Math.abs(c[0] - bg[0]) + Math.abs(c[1] - bg[1]) + Math.abs(c[2] - bg[2])) > DIFF_THRESHOLD;\n      }\n\n      var minRow = Math.ceil(w * MIN_LINE_FRACTION);\n      var minCol = Math.ceil(h * MIN_LINE_FRACTION);\n\n      function rowHasContent(y) {\n        var count = 0;\n        for (var x = 0; x < w; x++) { if (isContent(x, y) && ++count >= minRow) return true; }\n        return false;\n      }\n      function colHasContent(x) {\n        var count = 0;\n        for (var y = 0; y < h; y++) { if (isContent(x, y) && ++count >= minCol) return true; }\n        return false;\n      }\n\n      var top = 0, bottom = h - 1, left = 0, right = w - 1;\n      while (top < h - 1 && !rowHasContent(top)) top++;\n      while (bottom > top && !rowHasContent(bottom)) bottom--;\n      while (left < w - 1 && !colHasContent(left)) left++;\n      while (right > left && !colHasContent(right)) right--;\n\n      var bboxW = (right - left + 1) / w;\n      var bboxH = (bottom - top + 1) / h;\n      if (bboxW <= 0 || bboxH <= 0) return;\n\n      var cx = ((left + right + 1) / 2) / w;\n      var cy = ((top + bottom + 1) / 2) / h;\n\n      // A lot of these consignment photos have a studio backdrop that isn't white \u2014 grey,\n      // beige, sometimes a colored seamless \u2014 which clashes against this theme's plain white\n      // card frames as a visible seam/box around the photo. `bg` above is already the sampled\n      // corner-average color used for content detection; reuse it as the card's own frame\n      // background so each photo sits on ITS OWN backdrop color instead of a mismatched white\n      // one. Skip this for near-white backdrops (the common case) to avoid a pointless\n      // off-white tint on otherwise-clean photos.\n      // Was `> 235 on all channels`, i.e. \"close enough to white, leave it alone\" \u2014 but the plate\n      // is pure #fff, so anything from 236-254 still drew a faint rectangle. Compare against the\n      // plate colour directly instead and apply the sampled colour whenever it differs at all\n      // perceptibly (>3 levels on any channel).\n      // Only tint the plate when the four corners actually AGREE on a colour. Averaging them\n      // blindly let a single dark corner (a shadow, a vignette, a stray edge) drag the average\n      // off \u2014 that is how a photo on pure #fff ended up sitting on a 246 plate, which is a\n      // worse mismatch than doing nothing. If they disagree there is no single backdrop colour\n      // to match, so the photo keeps the default plate.\n      // Spread is measured against the MEDIAN, not min-to-max: a backdrop that is genuinely\n      // textured (fabric, a rug, a seamless with a gradient) still has one dominant colour worth\n      // matching, and a strict min/max range rejected those outright and left the photo floating\n      // on plain white. Counting how many samples sit near the median instead tolerates texture\n      // while still refusing images that have no single backdrop at all.\n      var agree = 0;\n      corners.forEach(function (c) {\n        if (Math.abs(c[0] - bg[0]) <= 26 && Math.abs(c[1] - bg[1]) <= 26 && Math.abs(c[2] - bg[2]) <= 26) agree++;\n      });\n      var spread = agree >= 6 ? 0 : 99;\n      var r8 = Math.round(bg[0]), g8 = Math.round(bg[1]), b8 = Math.round(bg[2]);\n      // Anything this close to white IS white. The page is white, so for the very common case of\n      // a product shot on a near-white seamless the correct plate is simply no plate at all \u2014\n      // tinting it to a sampled 246 puts a faint grey rectangle around a photo that would\n      // otherwise have sat on the page invisibly. Threshold is deliberately generous for that\n      // reason; genuinely grey/beige/black backdrops are far below it and still get matched.\n      if (r8 >= 242 && g8 >= 242 && b8 >= 242) { r8 = 255; g8 = 255; b8 = 255; }\n      if (spread <= 10) {\n        var frameColor = 'rgb(' + r8 + ',' + g8 + ',' + b8 + ')';\n        img.dataset.frameBg = frameColor;   // rotating tiles read this back on swap\n        var frame = img.closest('.product-card__media, .product__media-slide, .product__thumbnail, .brand-panel__thumb, .brands-grid__tile-media, .category-hero__tile-media, .category-stacked__tile-media, .gender-grid__tile-media, .brand-showcase__tile-media');\n        if (frame && (img.classList.contains('is-active') || !frame.querySelector('img.is-active'))) {\n          frame.style.setProperty('--frame-bg', frameColor);\n        }\n      }\n\n      var paddedW = Math.min(1, bboxW + EDGE_PADDING);\n      var paddedH = Math.min(1, bboxH + EDGE_PADDING);\n      var zoom = Math.min(MAX_ZOOM, 1 / Math.max(paddedW, paddedH));\n      if (zoom < MIN_ZOOM_TO_APPLY) return;\n\n      img.style.setProperty('--trim-origin', (cx * 100).toFixed(2) + '% ' + (cy * 100).toFixed(2) + '%');\n      img.style.setProperty('--trim-scale', zoom.toFixed(3));\n    } catch (e) {\n      // Tainted canvas (CORS) or decode failure \u2014 leave the image untouched.\n    }\n  }\n\n  // Every frame type that can carry a sampled plate colour. This list used to be just product\n  // cards and PDP slides, so the brand tiles, category tiles and coming-soon tiles were never\n  // sampled at all no matter what the frame lookup above accepted \u2014 they simply kept the\n  // default white plate under photos shot on grey, beige or black backdrops.\n  var SAMPLE_SELECTOR = [\n    '.product-card__media img', '.product__media-slide img', '.product__thumbnail img',\n    '.brand-panel__thumb img', '.brands-grid__tile-media img', '.category-hero__tile-media img',\n    '.category-stacked__tile-media img', '.gender-grid__tile-media img',\n    '.brand-showcase__tile-media img'\n  ].join(',');\n\n  function processAll(root) {\n    var scope = root || document;\n    var imgs = scope.querySelectorAll(SAMPLE_SELECTOR);\n    Array.prototype.forEach.call(imgs, function (img) {\n      if (img.complete && img.naturalWidth) trimImage(img);\n      else img.addEventListener('load', function () { trimImage(img); }, { once: true });\n    });\n  }\n\n  document.addEventListener('DOMContentLoaded', function () {\n    processAll(document);\n    // Most tiles on this site are rendered client-side after a catalogue fetch (brands grid,\n    // trending rail, category feature), so a single pass at DOMContentLoaded misses them\n    // entirely. Watching for inserted nodes covers every render path without having to find\n    // and hand-instrument each one.\n    if (!('MutationObserver' in window)) return;\n    var pending = null;\n    new MutationObserver(function (records) {\n      var hit = false;\n      records.forEach(function (rec) {\n        Array.prototype.forEach.call(rec.addedNodes, function (n) {\n          if (n.nodeType !== 1) return;\n          if (n.matches && (n.matches(SAMPLE_SELECTOR) || n.querySelector(SAMPLE_SELECTOR))) hit = true;\n        });\n      });\n      if (!hit || pending) return;\n      pending = requestAnimationFrame(function () { pending = null; processAll(document); });\n    }).observe(document.body, { childList: true, subtree: true });\n  });\n  window.ClienteleAutoTrim = { processAll: processAll };\n})();\n\ndocument.addEventListener('DOMContentLoaded', function () {\n\n  // ---- Cart session priming ----\n  // Real, documented Shopify edge case (confirmed via the Shopify community forum \u2014 carts\n  // going empty right after a successful add, with no reliable single root cause pinned\n  // down even by experienced theme devs, most often traced to the cart session/cookie not\n  // being fully established yet on a shopper's very first request of the visit before the\n  // first add-to-cart fires). A cold GET to /cart.js here, before any add-to-cart is\n  // possible, forces that session to exist ahead of time instead of letting the very first\n  // cart write of the visit also be the request that has to establish it.\n  fetch('/cart.js', { cache: 'no-store', credentials: 'same-origin' }).catch(function () {});\n\n  // ---- Full catalog index (client-side) ----\n  // The server-rendered #ProductSearchIndex JSON (snippets/search-index.liquid) is built\n  // inside a single Liquid {% paginate %} pass, which only ever renders its first page \u2014\n  // it silently truncates once the published catalog passes that page size (confirmed live:\n  // 826 published products but only 219 ever made it into the embedded index, which is why\n  // the Shop by Brand dropdown was only showing 2-3 vendors instead of the ~40 actually live).\n  // This fetches the complete published catalog at runtime via Shopify's public /products.json\n  // endpoint, which paginates properly with no such cap, and upgrades both search and the\n  // brand menu once it's ready. The embedded index is used first so neither is empty while\n  // this loads, then gets replaced transparently.\n  var FULL_CATALOG_CACHE_KEY = 'clientele_full_catalog_v1';\n  var FULL_CATALOG_CACHE_MS = 10 * 60 * 1000;\n\n  function formatPrice(raw) {\n    var n = Number(raw);\n    if (isNaN(n)) return '';\n    return '$' + n.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n  }\n\n  function sizedImageUrl(src, width) {\n    if (!src) return '';\n    return src + (src.indexOf('?') > -1 ? '&' : '?') + 'width=' + width;\n  }\n\n  // Same normalization as the Liquid case-map in snippets/product-card.liquid \u2014 keep both\n  // in sync if the catalog's real product_type values ever change.\n  var CATEGORY_MAP = {\n    'CLOTHING': 'Clothing', 'SHOES': 'Shoes', 'SNEAKERS': 'Shoes',\n    'HATS': 'Hats', 'ACCESSORIES': 'Accessories', 'PANTS': 'Pants', 'SOCKS': 'Socks'\n  };\n\n  function mapCatalogProduct(p) {\n    if (!p.images || !p.images.length) return null;\n    var rawSrc = p.images[0].src;\n    var variants = p.variants || [];\n    var firstVariant = variants.length ? variants[0] : null;\n    // Real sizes only \u2014 a product whose only variant is \"Default Title\" has no actual size\n    // data (common for single-pair sneaker listings), so it gets an empty array, not a guess.\n    var sizes = [];\n    if (!(variants.length === 1 && (variants[0].option1 === 'Default Title' || variants[0].option1 == null))) {\n      variants.forEach(function (v) {\n        if (v.option1 && v.option1 !== 'Default Title' && sizes.indexOf(v.option1) === -1) sizes.push(v.option1);\n      });\n    }\n    return {\n      title: p.title,\n      vendor: p.vendor,\n      url: '/products/' + p.handle,\n      price: firstVariant ? formatPrice(firstVariant.price) : '',\n      priceCents: firstVariant ? Math.round(parseFloat(firstVariant.price) * 100) : 0,\n      category: CATEGORY_MAP[(p.product_type || '').toUpperCase()] || '',\n      // Raw type as Shopify stores it. `category` above is a friendly display bucket and is\n      // lossy (anything not in CATEGORY_MAP becomes ''), so it cannot be used to reproduce a\n      // ?filter.p.product_type= query \u2014 see the grid fallback's filter block.\n      productType: p.product_type || '',\n      sizes: sizes,\n      image: sizedImageUrl(rawSrc, 120),\n      imageLarge: sizedImageUrl(rawSrc, 600),\n      imageAlt: p.images.length > 1 ? sizedImageUrl(p.images[1].src, 600) : '',\n      available: firstVariant ? !!firstVariant.available : true,\n      createdAt: p.created_at || ''\n    };\n  }\n\n  var SEARCH_EXCLUDE_VENDORS = { 'CLIENTELE': 1, 'CLIENTELE MENLO PARK MALL': 1, 'MENLO INPUT': 1, 'NYC6': 1, 'NEW': 1, 'TEST': 1, 'STORE ACCOUNT': 1 };\n  var SEARCH_FALLBACK_BRANDS = ['AIR JORDAN', 'ADIDAS', 'ASICS', 'NIKE', 'VANS', 'SUPREME', 'VINTAGE'];\n\n  // Real \"new arrivals\" fallback for weak/empty search results (e.g. searching the shop's\n  // own name, or a generic term that doesn't literally appear in any title) \u2014 surfaces real\n  // recently-added, in-stock products from real brands instead of a dead-end empty page.\n  // Never fabricated: if the catalog genuinely has nothing to show, this returns nothing.\n  function pickSearchFallback(products, limit) {\n    var eligible = products.filter(function (p) {\n      if (!p.vendor) return false;\n      var upper = p.vendor.trim().toUpperCase();\n      return !SEARCH_EXCLUDE_VENDORS[upper];\n    });\n    var known = eligible.filter(function (p) { return SEARCH_FALLBACK_BRANDS.indexOf(p.vendor.trim().toUpperCase()) !== -1; });\n    var pool = known.length >= limit ? known : eligible;\n    return pool\n      .slice()\n      .sort(function (a, b) { return new Date(b.createdAt) - new Date(a.createdAt); })\n      .slice(0, limit);\n  }\n\n  function escapeHtml(s) {\n    var d = document.createElement('div');\n    d.textContent = s == null ? '' : s;\n    return d.innerHTML;\n  }\n\n  // Shared product-card markup for anything rendered client-side from the fetched catalog\n  // (search results, collection-bug fallback below) \u2014 matches snippets/product-card.liquid\n  // closely enough to inherit its CSS, minus the quick-add controls (no variant data here).\n  function renderProductCardHtml(p) {\n    var img = p.imageLarge || p.image || '';\n    var attrs = 'data-vendor=\"' + escapeHtml(p.vendor || '') + '\"' +\n      (p.category ? ' data-category=\"' + escapeHtml(p.category) + '\"' : '') +\n      (p.sizes && p.sizes.length ? ' data-sizes=\"' + escapeHtml(p.sizes.join(',')) + '\"' : '') +\n      ' data-price=\"' + (p.priceCents || 0) + '\"';\n    return '<div class=\"product-card\" data-product-card ' + attrs + '>' +\n      '<div class=\"product-card__media\">' +\n        '<a href=\"' + p.url + '\" class=\"product-card__media-link\">' +\n          (img ? '<img crossorigin=\"anonymous\" src=\"' + img + '\" alt=\"' + escapeHtml(p.title) + '\" loading=\"lazy\" width=\"600\" height=\"686\">' : '') +\n          (p.imageAlt ? '<img crossorigin=\"anonymous\" class=\"product-card__media-img--alt\" src=\"' + p.imageAlt + '\" alt=\"\" aria-hidden=\"true\" loading=\"lazy\" width=\"600\" height=\"686\">' : '') +\n        '</a>' +\n      '</div>' +\n      '<a href=\"' + p.url + '\" class=\"product-card__info-link\">' +\n        '<div class=\"product-card__info\">' +\n          (p.vendor ? '<span class=\"product-card__vendor\">' + escapeHtml(p.vendor) + '</span>' : '') +\n          '<span class=\"product-card__title\">' + escapeHtml(p.title) + '</span>' +\n          '<span class=\"product-card__price\">' + escapeHtml(p.price) + '</span>' +\n        '</div>' +\n      '</a>' +\n    '</div>';\n  }\n\n  // Was one page at a time, each waiting for the previous to finish \u2014 with the catalog at\n  // its current real size (4 pages, ~900 products) that's ~2s of pure sequential network\n  // time before search/the brand menu/homepage tile rotation are usable, on every page load\n  // this cache misses. Fetches in parallel batches instead (a real, measured ~4x cut in wall-\n  // clock time for the common case): fire a batch of pages at once, and only keep requesting\n  // the next batch if the last page in the current one actually came back full \u2014 an empty or\n  // partial page means the catalog ends somewhere in that batch, no need to guess further.\n  function fetchAllProductsJson() {\n    var BATCH_SIZE = 4;\n    var MAX_PAGES = 40; // hard stop (10,000 products) so a fetch error can't loop forever\n    var all = [];\n\n    function fetchPage(page) {\n      return fetch('/products.json?limit=250&page=' + page)\n        .then(function (r) { return r.ok ? r.json() : { products: [] }; })\n        .then(function (j) { return j.products || []; });\n    }\n\n    function nextBatch(startPage) {\n      var pages = [];\n      for (var i = 0; i < BATCH_SIZE && startPage + i <= MAX_PAGES; i++) pages.push(startPage + i);\n      return Promise.all(pages.map(fetchPage)).then(function (results) {\n        var lastPageWasFull = true;\n        results.forEach(function (products) {\n          all = all.concat(products);\n          lastPageWasFull = products.length === 250;\n        });\n        // Every page in this batch came back full \u2014 the catalog might keep going past it,\n        // worth another batch. Any page short of a full 250 (including empty) means that's\n        // genuinely the end, matching the same \"don't stop on a merely-partial page\" logic\n        // the old sequential version had, just applied per-batch instead of per-page.\n        if (lastPageWasFull && startPage + BATCH_SIZE - 1 < MAX_PAGES) {\n          return nextBatch(startPage + BATCH_SIZE);\n        }\n        return all;\n      });\n    }\n\n    return nextBatch(1);\n  }\n\n  function getFullCatalog() {\n    try {\n      var cached = JSON.parse(sessionStorage.getItem(FULL_CATALOG_CACHE_KEY) || 'null');\n      if (cached && cached.at && (Date.now() - cached.at) < FULL_CATALOG_CACHE_MS) {\n        return Promise.resolve(cached.data);\n      }\n    } catch (e) {}\n    return fetchAllProductsJson().then(function (raw) {\n      var mapped = raw.map(mapCatalogProduct).filter(Boolean);\n      try { sessionStorage.setItem(FULL_CATALOG_CACHE_KEY, JSON.stringify({ at: Date.now(), data: mapped })); } catch (e) {}\n      return mapped;\n    }).catch(function () { return null; });\n  }\n\n  var fullCatalogPromise = getFullCatalog();\n\n  // ---- Vendor filter counts: correct Shopify's native facet count to the real photographed\n  // count. Real bug found via live inspection: the \"Product vendor\" filter on /collections/all\n  // shows e.g. \"GODSPEED (35)\" \u2014 Shopify's own facet count of every published Godspeed listing,\n  // photographed or not. product-card.liquid already refuses to render a photo-less product\n  // (the same \"no placeholder\" rule applied everywhere on this site), so checking that filter\n  // shows 2 real cards, not 35 \u2014 reads as broken/empty, not like a working filter. mapCatalogProduct\n  // already drops any product with zero images, so fullCatalogPromise's resolved array is exactly\n  // \"photographed products only\" \u2014 counting per-vendor gives the real number for free, no extra\n  // filtering needed. Only rewrites the visible label text; the underlying filter/count value\n  // Shopify uses to actually filter results is untouched, so filtering still works correctly. ----\n  (function () {\n    var vendorInputs = document.querySelectorAll('input[name=\"filter.p.vendor\"]');\n    if (!vendorInputs.length) return;\n    fullCatalogPromise.then(function (full) {\n      if (!full || !full.length) return;\n      var counts = {};\n      full.forEach(function (p) {\n        if (!p.vendor) return;\n        var v = p.vendor.trim().toUpperCase();\n        counts[v] = (counts[v] || 0) + 1;\n      });\n      vendorInputs.forEach(function (input) {\n        var v = (input.value || '').trim().toUpperCase();\n        var real = counts[v] || 0;\n        var label = input.parentElement ? input.parentElement.querySelector('span') : null;\n        if (!label) return;\n        label.textContent = label.textContent.replace(/\\(\\d+\\)\\s*$/, '(' + real + ')');\n      });\n    });\n  })();\n\n  // ---- Magnetic pull on primary CTAs (subtle, pointer devices only) ----\n  if (window.matchMedia('(hover: hover) and (pointer: fine)').matches &&\n      !window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n    var magneticEls = document.querySelectorAll('.btn--primary');\n    magneticEls.forEach(function (el) {\n      el.addEventListener('mousemove', function (e) {\n        var rect = el.getBoundingClientRect();\n        var x = e.clientX - rect.left - rect.width / 2;\n        var y = e.clientY - rect.top - rect.height / 2;\n        el.style.transform = 'translate(' + (x * 0.15) + 'px, ' + (y * 0.25) + 'px)';\n      });\n      el.addEventListener('mouseleave', function () {\n        el.style.transform = '';\n      });\n    });\n  }\n\n  // ---- Transparent header on scroll (homepage only, sits over the hero) ----\n  (function () {\n    var header = document.getElementById('SiteHeader');\n    if (!header || !header.classList.contains('header--transparent')) return;\n    var threshold = 140;\n    function onScroll() {\n      header.classList.toggle('is-scrolled', window.scrollY > threshold);\n    }\n    onScroll();\n    window.addEventListener('scroll', onScroll, { passive: true });\n  })();\n\n  // ---- Header predictive search ----\n  (function () {\n    var toggle = document.getElementById('HeaderSearchToggle');\n    var panel = document.getElementById('HeaderSearchPanel');\n    var closeBtn = document.getElementById('HeaderSearchClose');\n    var input = document.getElementById('HeaderSearchInput');\n    var results = document.getElementById('HeaderSearchResults');\n    if (!toggle || !panel || !input || !results) return;\n\n    var RECENT_KEY = 'clientele_recent_searches';\n    function getRecentSearches() {\n      try { return JSON.parse(localStorage.getItem(RECENT_KEY) || '[]'); } catch (e) { return []; }\n    }\n    function saveRecentSearch(q) {\n      q = q.trim();\n      if (!q) return;\n      try {\n        var list = getRecentSearches().filter(function (r) { return r.toLowerCase() !== q.toLowerCase(); });\n        list.unshift(q);\n        localStorage.setItem(RECENT_KEY, JSON.stringify(list.slice(0, 6)));\n      } catch (e) {}\n    }\n    function renderRecentSearches() {\n      var recents = getRecentSearches();\n      if (!recents.length) { results.innerHTML = ''; return; }\n      results.innerHTML = '<p class=\"search-panel__recent-title\">Recent Searches</p>' +\n        '<div class=\"search-panel__recent-list\">' +\n        recents.map(function (r) {\n          return '<button type=\"button\" class=\"search-panel__recent-chip\">' + escapeHtml(r) + '</button>';\n        }).join('') + '</div>';\n      results.querySelectorAll('.search-panel__recent-chip').forEach(function (chip) {\n        chip.addEventListener('click', function () {\n          input.value = chip.textContent;\n          runSearch(chip.textContent);\n        });\n      });\n    }\n\n    var siteHeader = document.getElementById('SiteHeader');\n    // Two-step show/hide so the panel can animate: `hidden` is display:none, and you cannot\n    // transition out of display:none in the same frame you remove it. Unhide, let a frame land,\n    // then add .is-open; on close reverse it and only re-apply `hidden` after the transition, so\n    // a closed panel still leaves the accessibility tree and tab order exactly as before.\n    var hideTimer = null;\n// `closeTimer` only exists in the two hover-driven mega-menus; the search panel has no\n// hover-close, so declare it here without an initialiser. A bare `var` hoists and merges\n// with the existing declaration where there is one (leaving its value untouched) and is\n// simply undefined where there isn't \u2014 clearTimeout(undefined) is a no-op.\nvar closeTimer;\n    function openPanel() {\n      clearTimeout(closeTimer); clearTimeout(hideTimer);\n      panel.hidden = false;\n      requestAnimationFrame(function () {\n        requestAnimationFrame(function () { panel.classList.add('is-open'); });\n      });\n      toggle.setAttribute('aria-expanded', 'true');\n      if (siteHeader) siteHeader.classList.add('header--panel-open');\n      document.body.classList.add('has-panel-open');\n    }\n    function closePanel() {\n      clearTimeout(hideTimer);\n      panel.classList.remove('is-open');\n      var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      hideTimer = setTimeout(function () { panel.hidden = true; }, reduce ? 0 : 200);\n      toggle.setAttribute('aria-expanded', 'false');\n      if (siteHeader) siteHeader.classList.remove('header--panel-open');\n      document.body.classList.remove('has-panel-open');\n    }\n\n    toggle.addEventListener('click', function () {\n      panel.classList.contains('is-open') ? closePanel() : openPanel();\n    });\n    if (closeBtn) closeBtn.addEventListener('click', closePanel);\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape' && panel.classList.contains('is-open')) closePanel();\n    });\n    var searchForm = document.getElementById('HeaderSearchForm');\n    if (searchForm) searchForm.addEventListener('submit', function () { saveRecentSearch(input.value); });\n\n    // Shopify's own search backend does loose/fuzzy relevance matching \u2014 a \"yeezy\" search\n    // was returning unrelated Adidas Forum products because it matches broadly (vendor,\n    // type, tags, related terms), not because a shopper searching a specific model wants\n    // that. This filters a local index of every live product by strict \"title contains\n    // query\" instead, which is what a search box searching a fixed catalog should do.\n    var productIndex = null;\n    function getIndex() {\n      if (productIndex) return productIndex;\n      var el = document.getElementById('ProductSearchIndex');\n      try { productIndex = el ? JSON.parse(el.textContent) : []; } catch (e) { productIndex = []; }\n      return productIndex;\n    }\n    // Swap in the complete catalog once it's fetched, so a search typed right after\n    // page load isn't silently limited to the truncated embedded index.\n    fullCatalogPromise.then(function (full) {\n      if (full && full.length) productIndex = full;\n    });\n\n    var debounceTimer;\n    input.addEventListener('input', function () {\n      var q = input.value.trim();\n      clearTimeout(debounceTimer);\n      if (q.length < 2) { renderRecentSearches(); return; }\n      debounceTimer = setTimeout(function () { runSearch(q); }, 150);\n    });\n\n    function escapeHtml(s) {\n      var d = document.createElement('div');\n      d.textContent = s == null ? '' : s;\n      return d.innerHTML;\n    }\n\n    function runSearch(q) {\n      // Word-by-word AND matching, not one single substring \u2014 so word order in the\n      // typed query doesn't have to match word order in the product title.\n      var words = q.toLowerCase().split(/\\s+/).filter(Boolean);\n      var matches = getIndex().filter(function (p) {\n        if (!p.title) return false;\n        var titleLower = p.title.toLowerCase();\n        return words.every(function (w) { return titleLower.indexOf(w) !== -1; });\n      }).slice(0, 8);\n\n      if (!matches.length) {\n        results.innerHTML = '<p class=\"search-panel__empty\">No products found for \"' + escapeHtml(q) + '\"</p>';\n        return;\n      }\n      results.innerHTML = matches.map(function (p) {\n        return '<a href=\"' + p.url + '\" class=\"search-panel__result\">' +\n          (p.image ? '<img crossorigin=\"anonymous\" src=\"' + p.image + '\" alt=\"\" width=\"60\" height=\"60\" loading=\"lazy\">' : '<span class=\"search-panel__result-placeholder\"></span>') +\n          '<span class=\"search-panel__result-info\"><span class=\"search-panel__result-title\">' + escapeHtml(p.title) + '</span>' +\n          '<span class=\"search-panel__result-price\">' + escapeHtml(p.price) + '</span></span></a>';\n      }).join('');\n      results.querySelectorAll('.search-panel__result').forEach(function (a) {\n        a.addEventListener('click', function () { saveRecentSearch(q); });\n      });\n    }\n  })();\n\n  // ---- Shop by brand menu: built from the product index, first from the embedded\n  // (possibly truncated) index for an instant paint, then rebuilt from the complete\n  // fetched catalog once that's ready \u2014 see fullCatalogPromise above. ----\n  (function () {\n    var EXCLUDES = { 'CLIENTELE': 1, 'CLIENTELE MENLO PARK MALL': 1, 'MENLO INPUT': 1, 'NYC6': 1, 'NEW': 1, 'TEST': 1, 'STORE ACCOUNT': 1 };\n    var POPULAR = { 'NIKE': 1, 'ADIDAS': 1, 'AIR JORDAN': 1, 'JORDAN': 1, 'NEW BALANCE': 1, 'PUMA': 1, 'ASICS': 1, 'VANS': 1, 'SAUCONY': 1 };\n\n    function link(vendor) {\n      var a = document.createElement('a');\n      // Was /search?q=vendor:X \u2014 a bare, filter-less results page. This lands on the\n      // real shop page instead (collection filters/sort/chips/density all intact),\n      // pre-filtered to the brand via Shopify's native vendor filter param.\n      a.href = '/collections/all?filter.p.vendor=' + encodeURIComponent(vendor);\n      a.textContent = vendor;\n      var li = document.createElement('li');\n      li.appendChild(a);\n      return li;\n    }\n\n    function clearList(el) { if (el) el.innerHTML = ''; }\n\n    // Owner correction: the per-brand photo-thumbnail wall (~17+ small image tiles) was never\n    // asked for and reads as cluttered. Restockar's real dropdown is plain stacked text links\n    // grouped under short headers (Popular / everything else) plus exactly ONE image column \u2014\n    // that single image lives in the \"Just In\" featured tile below, not per-brand thumbnails.\n    // So every vendor here renders through the same plain-text link() helper; the only\n    // grouping is \"known/popular name\" vs. \"everything else\", both alphabetical.\n    function buildBrandMenu(products) {\n      var seen = {};\n      var labelByVendor = {};\n      products.forEach(function (p) {\n        if (!p.vendor) return;\n        var trimmed = p.vendor.trim();\n        var upper = trimmed.toUpperCase();\n        if (!upper || EXCLUDES[upper]) return;\n        if (!labelByVendor[upper]) labelByVendor[upper] = trimmed;\n        seen[upper] = true;\n      });\n      var popular = [];\n      var others = [];\n      Object.keys(seen).forEach(function (upper) {\n        (POPULAR[upper] ? popular : others).push(labelByVendor[upper]);\n      });\n      popular.sort();\n      others.sort();\n\n      var popularCol = document.getElementById('BrandPanelPopularCol');\n      var popularList = document.getElementById('BrandPanelPopularList');\n      var mPopularTitle = document.getElementById('MobileBrandPopularTitle');\n      var mPopularList = document.getElementById('MobileBrandPopularList');\n      var textCol = document.getElementById('BrandPanelTextCol');\n      var textList = document.getElementById('BrandPanelTextList');\n      var mTextTitle = document.getElementById('MobileBrandTextTitle');\n      var mTextList = document.getElementById('MobileBrandTextList');\n\n      clearList(popularList); clearList(mPopularList); clearList(textList); clearList(mTextList);\n\n      if (popular.length) {\n        if (popularCol && popularList) { popular.forEach(function (v) { popularList.appendChild(link(v)); }); popularCol.hidden = false; }\n        if (mPopularTitle && mPopularList) { popular.forEach(function (v) { mPopularList.appendChild(link(v)); }); mPopularTitle.hidden = false; }\n      } else {\n        if (popularCol) popularCol.hidden = true;\n        if (mPopularTitle) mPopularTitle.hidden = true;\n      }\n      if (others.length) {\n        if (textCol && textList) { others.forEach(function (v) { textList.appendChild(link(v)); }); textCol.hidden = false; }\n        if (mTextTitle && mTextList) { others.forEach(function (v) { mTextList.appendChild(link(v)); }); mTextTitle.hidden = false; }\n      } else {\n        if (textCol) textCol.hidden = true;\n        if (mTextTitle) mTextTitle.hidden = true;\n      }\n      // The panel's photo is static Liquid now (a real in-store frame, see header.liquid),\n      // so there is no featured-tile injection here any more \u2014 it used to pick the newest\n      // catalogue product and render it as a cutout on a white plate, which is not what the\n      // reference menu does and meant the image popped in only after the catalogue fetch.\n\n      if (popular.length || others.length) {\n        var menu = document.getElementById('HeaderBrandMenu');\n        if (menu) menu.hidden = false;\n        var mobileMenu = document.getElementById('MobileBrandMenu');\n        if (mobileMenu) mobileMenu.hidden = false;\n      }\n    }\n\n    var indexEl = document.getElementById('ProductSearchIndex');\n    var initial = [];\n    if (indexEl) { try { initial = JSON.parse(indexEl.textContent); } catch (e) { initial = []; } }\n    var latestCatalog = initial;\n    if (initial.length) buildBrandMenu(initial);\n\n    fullCatalogPromise.then(function (full) {\n      if (full && full.length) {\n        latestCatalog = full;\n        buildBrandMenu(full);\n      }\n    });\n\n    // Defensive re-render on drawer open \u2014 the mobile hamburger menu sits behind a\n    // `hidden` attribute until opened, and independently of whatever caused it, it's been\n    // observed showing only the stale first-paint brand list (2 brands) even minutes after\n    // the full catalog fetch should have resolved and updated it fine everywhere else\n    // (confirmed working on desktop with identical code/data at the same moment). Cheap\n    // insurance: re-run the exact same build against whatever's the latest resolved data\n    // right when the drawer opens, so it can never show stale content no matter what\n    // caused the DOM update to not \"stick\" the first time.\n    var mobileToggle = document.querySelector('.header__menu-toggle');\n    if (mobileToggle) {\n      mobileToggle.addEventListener('click', function () {\n        if (latestCatalog.length) buildBrandMenu(latestCatalog);\n        // Belt-and-suspenders on top of the latestCatalog snapshot above: re-chaining onto\n        // the already-resolved promise itself (cheap \u2014 it's memoized, no re-fetch) rules\n        // out any possibility that latestCatalog's assignment specifically was the broken\n        // link even if the promise resolved correctly.\n        fullCatalogPromise.then(function (full) {\n          if (full && full.length) buildBrandMenu(full);\n        });\n      });\n    }\n  })();\n\n  // ---- New Arrivals / Featured nav dropdowns \u2014 restockar-style top-nav mega-menus, real\n  // product previews instead of static links. Same hover/click/aria-expanded toggle pattern\n  // as the Brands mega-menu above (a reusable version of that same open/close logic, so\n  // there's one interaction implementation instead of three copies), and the\n  // .brand-panel__thumb-grid/.brand-panel__thumb-link markup+CSS for the desktop preview\n  // tiles (a real product-photo grid \u2014 unlike the Brands menu, which dropped per-item photo\n  // tiles per the owner's correction, these two panels ARE meant to be photo grids, restockar\n  // shows 6-8+ items per dropdown here). New Arrivals pulls the newest real live products out\n  // of the same full-catalog fetch the brand menu/search already use; Featured fetches the\n  // real \"Featured Picks\" collection directly (collection membership isn't part of the mapped\n  // catalog shape). Mobile gets the same content in the <details>/<summary> accordions in the\n  // drawer. ----\n  (function () {\n    var EXCLUDES = { 'CLIENTELE': 1, 'CLIENTELE MENLO PARK MALL': 1, 'MENLO INPUT': 1, 'NYC6': 1, 'NEW': 1, 'TEST': 1, 'STORE ACCOUNT': 1 };\n\n    function wireDropdown(wrapId, toggleId, panelId) {\n      var wrap = document.getElementById(wrapId);\n      var toggle = document.getElementById(toggleId);\n      var panel = document.getElementById(panelId);\n      if (!wrap || !toggle || !panel) return;\n\n      var siteHeader = document.getElementById('SiteHeader');\n      var closeTimer = null;\n      // Two-step show/hide so the panel can animate: `hidden` is display:none, and you cannot\n      // transition out of display:none in the same frame you remove it. Unhide, let a frame land,\n      // then add .is-open; on close reverse it and only re-apply `hidden` after the transition, so\n      // a closed panel still leaves the accessibility tree and tab order exactly as before.\n      var hideTimer = null;\n// `closeTimer` only exists in the two hover-driven mega-menus; the search panel has no\n// hover-close, so declare it here without an initialiser. A bare `var` hoists and merges\n// with the existing declaration where there is one (leaving its value untouched) and is\n// simply undefined where there isn't \u2014 clearTimeout(undefined) is a no-op.\nvar closeTimer;\n      function openPanel() {\n        clearTimeout(closeTimer); clearTimeout(hideTimer);\n        panel.hidden = false;\n        requestAnimationFrame(function () {\n          requestAnimationFrame(function () { panel.classList.add('is-open'); });\n        });\n        toggle.setAttribute('aria-expanded', 'true');\n        if (siteHeader) siteHeader.classList.add('header--panel-open');\n        document.body.classList.add('has-panel-open');\n      }\n      function closePanel() {\n        clearTimeout(hideTimer);\n        panel.classList.remove('is-open');\n        var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n        hideTimer = setTimeout(function () { panel.hidden = true; }, reduce ? 0 : 200);\n        toggle.setAttribute('aria-expanded', 'false');\n        if (siteHeader) siteHeader.classList.remove('header--panel-open');\n        document.body.classList.remove('has-panel-open');\n      }\n      function scheduleClose() {\n        clearTimeout(closeTimer);\n        closeTimer = setTimeout(closePanel, 150);\n      }\n\n      var canHover = window.matchMedia('(hover: hover) and (pointer: fine)').matches;\n      if (canHover) {\n        wrap.addEventListener('mouseenter', openPanel);\n        wrap.addEventListener('mouseleave', scheduleClose);\n      }\n      toggle.addEventListener('click', function (e) {\n        e.stopPropagation();\n        panel.classList.contains('is-open') ? closePanel() : openPanel();\n      });\n      document.addEventListener('click', function (e) {\n        if (panel.classList.contains('is-open') && !panel.contains(e.target) && e.target !== toggle) closePanel();\n      });\n      document.addEventListener('keydown', function (e) {\n        if (e.key === 'Escape' && panel.classList.contains('is-open')) closePanel();\n      });\n    }\n\n    wireDropdown('HeaderNewArrivalsMenu', 'HeaderNewArrivalsToggle', 'HeaderNewArrivalsPanel');\n    wireDropdown('HeaderFeaturedMenu', 'HeaderFeaturedToggle', 'HeaderFeaturedPanel');\n\n    // Both these panels' photos are static Liquid now as well (see header.liquid), so the\n    // catalogue fetch and the featured-picks fetch that existed purely to choose an image\n    // are gone. Dropdown open/close wiring above is all this block still needs to do.\n  })();\n\n  // ---- Homepage \"Popular Brands\" tile grid \u2014 same live-catalog upgrade pattern as the\n  // brand dropdown above: static blocks paint instantly, then this replaces them with the\n  // boss's curated brand list once the full catalog is fetched, each tile cycling through\n  // that brand's own real product photos (up to 4) every ~12s. No merchant upkeep beyond\n  // this list itself as the catalog changes. ----\n  (function () {\n    var grids = document.querySelectorAll('[data-brands-grid]');\n    var featureRotate = document.querySelectorAll('[data-feature-rotate]');\n    var genericTiles = document.querySelectorAll('[data-tile-rotate]');\n    var trendingGrid = document.querySelector('[data-trending-grid]');\n    var trendingWrap = trendingGrid && trendingGrid.closest('.section--trending-now');\n    if (!grids.length && !featureRotate.length && !genericTiles.length && !trendingGrid) return;\n    var EXCLUDES = { 'CLIENTELE': 1, 'CLIENTELE MENLO PARK MALL': 1, 'MENLO INPUT': 1, 'NYC6': 1, 'NEW': 1, 'TEST': 1, 'STORE ACCOUNT': 1 };\n\n    // Curated by the boss. Saint Michael is still left out \u2014 zero photographed products\n    // (verified via the Admin API), and this theme never renders a photo-less product\n    // anywhere. Chrome Hearts and Supreme ARE real, active vendors with real listed\n    // products \u2014 they just have zero photographed products among those listings\n    // specifically, so both use a manual brand-level fallback image (real photography\n    // dropped into the project this round) instead of the usual per-product photo pool.\n    // Boredom Kills and Vintage were both re-checked live this pass and pulled from this\n    // list: Boredom Kills' 4 photographed products show Active + Published in Admin but\n    // 404 on their own live product pages (a genuine Shopify-side data/indexing issue,\n    // not fixable from theme code \u2014 flagged separately); Vintage currently has zero\n    // photographed products across a 100-product sample despite earlier notes claiming\n    // otherwise (trusting this fresh check over stale memory). Add either back the moment\n    // real, actually-live photos exist.\n    // Clothing-forward order: this drives the live homepage \"Popular Brands\" rail once the\n    // full catalog loads (it overrides the static blocks in sections/brands-grid.liquid /\n    // templates/index.json). Was led by AIR JORDAN, a shoe brand, on what's a clothing store's\n    // homepage \u2014 reordered so clothing/streetwear brands lead and AIR JORDAN sits last as the\n    // one sneaker entry, not first.\n    var POPULAR_BRANDS = ['SUPREME', 'BRAVEST STUDIOS', 'GV GALLERY', 'SAINT VANITY', 'CHROME HEARTS', 'HMDD', 'VANS', 'AIR JORDAN'];\n    // \"-v2\" files: same real garments, reprocessed same as the Brand Showcase pass \u2014 AI\n    // background-removal cutout where it segmented cleanly (chrome-hearts-tile-2), a plain\n    // tighter crop where it didn't (supreme-tile-2/-3, just needed the rug strip trimmed off,\n    // not a full cutout). chrome-hearts-tile-v2 (the silver chain) had a genuinely bad AI\n    // cutout \u2014 visible ghosting/halo around the fine chain links, which an AI matting model\n    // struggles with on thin, detailed objects \u2014 replaced with a plain crop on its own real\n    // natural background instead of attempting silhouette extraction again. chrome-hearts-tile-3\n    // was removed entirely \u2014 it turned out to be a mismatched, completely unrelated graphic\n    // tank top with no Chrome Hearts branding at all (a labeling mistake from an earlier pass,\n    // not this brand's actual product).\n    var MANUAL_BRAND_IMAGE = {\n      // chrome-hearts-tile-4.png (shirt+beanie flat lay) dropped from rotation \u2014 real defect\n      // found in its alpha channel (an opaque black region tangled into the real shirt collar,\n      // not a clean separable artifact) with no raw source photo left to re-crop from. Rather\n      // than patch a defect that can't be cleanly isolated, keeping just the two verified-clean\n      // real photos below.\n      // Third image found via a real search: Wikimedia Commons file \"Chrome_Hearts_Rings.jpg\",\n      // CC BY-SA 2.0, photographer credited as [puamelia] on Flickr (uploaded to Commons by\n      // Zelinlin) \u2014 genuine real Chrome Hearts rings, not a stock/generic match. Attribution\n      // required by the license: kept in thumbnails/Chrome Hearts/SOURCE.txt.\n      // chrome-hearts-rings-cc.jpg dropped per owner feedback (not a quality issue found on\n      // our end \u2014 genuinely CC-licensed and correctly cropped \u2014 just didn't look right to\n      // them). Replaced with a real photo the owner supplied directly (a flat-lay of real\n      // Chrome Hearts tees/beanies), cropped to a clean square centered on one legible\n      // horseshoe logo.\n      'CHROME HEARTS': [\n        'https://cdn.shopify.com/s/files/1/0936/9206/8024/files/chrome-hearts-chain-v2.jpg',\n        'https://cdn.shopify.com/s/files/1/0936/9206/8024/files/chrome-hearts-tile-2-v2.png',\n        'https://cdn.shopify.com/s/files/1/0936/9206/8024/files/chrome-hearts-shirts-thumb.jpg'\n      ],\n      'SUPREME': [\n        'https://cdn.shopify.com/s/files/1/0936/9206/8024/files/supreme-tile-v2.png',\n        'https://cdn.shopify.com/s/files/1/0936/9206/8024/files/supreme-tile-2-v2.jpg',\n        'https://cdn.shopify.com/s/files/1/0936/9206/8024/files/supreme-tile-3-v2.jpg'\n      ]\n    };\n    // Clothing-only subset (no sneaker vendors) for the homepage \"Shop Clothing\" feature tile.\n    var CLOTHING_BRANDS = ['VALE', 'BRAVEST STUDIOS', 'SAINT VANITY', 'HMDD', 'BOREDOM KILLS', 'GV GALLERY', 'VINTAGE', 'SUPREME', 'CHROME HEARTS', 'SAINT MICHAEL'];\n\n    var prefersReducedMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    var ROTATE_MS = 12000;\n    var STAGGER_MS = 1400;\n\n    // \"N styles\" counts on category/brand tiles \u2014 a real, concrete pattern restockar itself\n    // uses everywhere (their tiles all show real style counts, e.g. \"520 STYLES\"), which this\n    // site had nowhere. Always the real number of currently-photographed, browsable products\n    // for that filter \u2014 same \"no placeholder\" honesty rule as everywhere else in this codebase,\n    // never a rounded/inflated figure.\n    function tileHtml(vendor, images, url, imgClass, count) {\n      var imgs = images.map(function (src, i) {\n        return '<img crossorigin=\"anonymous\" class=\"' + imgClass + (i === 0 ? ' is-active' : '') + '\" data-rotate-img src=\"' + src + '\" alt=\"' + escapeHtml(vendor) + '\" loading=\"lazy\" width=\"600\" height=\"600\">';\n      }).join('');\n      var countHtml = count ? '<span class=\"brands-grid__tile-count\">' + count + (count === 1 ? ' style' : ' styles') + '</span>' : '';\n      return '<a href=\"' + url + '\" class=\"brands-grid__tile\">' +\n        '<div class=\"brands-grid__tile-media\">' + imgs + '</div>' +\n        '<div class=\"brands-grid__tile-info\"><span class=\"brands-grid__tile-label\">' + escapeHtml(vendor) + '</span>' + countHtml + '</div>' +\n      '</a>';\n    }\n\n    // Starts a staggered crossfade rotation across `tiles` (each a tile element containing\n    // several `[data-rotate-img]`s, one already marked `.is-active`). Paused off-screen via\n    // IntersectionObserver on `visibilityRoot`, skipped entirely under prefers-reduced-motion.\n    function startRotation(tiles, visibilityRoot) {\n      if (prefersReducedMotion || !tiles.length) return;\n      var timers = [];\n\n      function tick(imgs) {\n        var current = 0;\n        return setInterval(function () {\n          imgs[current].classList.remove('is-active');\n          current = (current + 1) % imgs.length;\n          imgs[current].classList.add('is-active');\n          // Each photo in a rotating tile can have its own backdrop colour; without this the\n          // plate kept the FIRST photo's colour and every later frame sat on a mismatched one.\n          var nextBg = imgs[current].dataset.frameBg;\n          var host = imgs[current].parentElement;\n          if (nextBg && host) host.style.setProperty('--frame-bg', nextBg);\n        }, ROTATE_MS);\n      }\n\n      function startAll() {\n        tiles.forEach(function (tile, i) {\n          var imgs = Array.prototype.slice.call(tile.querySelectorAll('[data-rotate-img]'));\n          if (imgs.length < 2) return;\n          setTimeout(function () { timers.push(tick(imgs)); }, i * STAGGER_MS);\n        });\n      }\n      function stopAll() {\n        timers.forEach(function (t) { clearInterval(t); });\n        timers.length = 0;\n      }\n\n      if (!('IntersectionObserver' in window)) { startAll(); return; }\n      var active = false;\n      var obs = new IntersectionObserver(function (entries) {\n        var visible = entries[0].isIntersecting;\n        if (visible === active) return;\n        active = visible;\n        if (visible) startAll(); else stopAll();\n      }, { threshold: 0.1 });\n      obs.observe(visibilityRoot);\n    }\n\n    function pickImages(products) {\n      var byVendor = {};\n      products.forEach(function (p) {\n        if (!p.vendor) return;\n        var upper = p.vendor.trim().toUpperCase();\n        if (EXCLUDES[upper]) return;\n        if (!byVendor[upper]) byVendor[upper] = { label: p.vendor.trim(), images: [], available: [] };\n        var src = p.imageLarge || p.image;\n        if (!src) return;\n        byVendor[upper].count = (byVendor[upper].count || 0) + 1;\n        if (byVendor[upper].images.length < 4) {\n          if (p.available) { byVendor[upper].images.unshift(src); byVendor[upper].available.unshift(true); }\n          else { byVendor[upper].images.push(src); byVendor[upper].available.push(false); }\n        }\n      });\n      return byVendor;\n    }\n\n    function renderBrandsGrid(grid, products) {\n      var byVendor = pickImages(products);\n      // A POPULAR_BRANDS vendor counts as usable if it has real per-product photos OR a\n      // manual brand-level fallback image (Chrome Hearts/Supreme \u2014 see MANUAL_BRAND_IMAGE).\n      var curated = POPULAR_BRANDS.filter(function (v) {\n        return (byVendor[v] && byVendor[v].images.length) || MANUAL_BRAND_IMAGE[v];\n      });\n      // Fallback: if fewer than 8 curated brands have real photos, top-up by product count.\n      if (curated.length < 8) {\n        var counts = {};\n        Object.keys(byVendor).forEach(function (v) { counts[v] = byVendor[v].images.length; });\n        var byCount = Object.keys(byVendor)\n          .filter(function (v) { return curated.indexOf(v) === -1; })\n          .sort(function (a, b) { return byVendor[b].images.length - byVendor[a].images.length; });\n        curated = curated.concat(byCount).slice(0, 8);\n      }\n      if (!curated.length) return;\n      grid.innerHTML = curated.map(function (v) {\n        var entry = byVendor[v] || { label: v.charAt(0) + v.slice(1).toLowerCase(), images: [], count: 0 };\n        var images = entry.images.length ? entry.images : MANUAL_BRAND_IMAGE[v];\n        var label = entry.label || v;\n        return tileHtml(label, images, '/collections/all?filter.p.vendor=' + encodeURIComponent(label), 'brands-grid__tile-img', entry.count);\n      }).join('');\n      startRotation(Array.prototype.slice.call(grid.querySelectorAll('a')), grid);\n    }\n\n    // Numbered \"Trending Now\" rail \u2014 newest real, in-stock, photographed products, real title\n    // + price on every tile via the same renderProductCardHtml used by search/recently-viewed.\n    // Section starts `hidden` (trending-now.liquid) and is only revealed once real tiles are\n    // in the DOM \u2014 same no-placeholder discipline as recently-viewed, never an empty flash.\n    function renderTrendingNow(wrap, grid, products) {\n      var pool = products.filter(function (p) {\n        return p.vendor && !EXCLUDES[p.vendor.trim().toUpperCase()] && (p.imageLarge || p.image) && p.available;\n      }).slice().sort(function (a, b) { return new Date(b.createdAt) - new Date(a.createdAt); }).slice(0, 8);\n      if (pool.length < 4) return; // not enough real matches \u2014 leave the section hidden rather than show a thin row\n      grid.innerHTML = pool.map(function (p, i) {\n        var num = (i + 1 < 10 ? '0' : '') + (i + 1);\n        return '<div class=\"trending-now__tile\"><span class=\"trending-now__num\">' + num + '</span>' + renderProductCardHtml(p) + '</div>';\n      }).join('');\n      wrap.hidden = false;\n      wireTrendingArrows(wrap, grid);\n    }\n\n    // Arrows are wired here rather than on DOMContentLoaded because the tiles they page\n    // through don't exist until this render runs off the catalogue fetch.\n    function wireTrendingArrows(wrap, grid) {\n      var prev = wrap.querySelector('[data-trending-prev]');\n      var next = wrap.querySelector('[data-trending-next]');\n      if (!prev || !next) return;\n      function step() {\n        var tile = grid.querySelector('.trending-now__tile');\n        return tile ? tile.getBoundingClientRect().width + 20 : 260;\n      }\n      function sync() {\n        var max = grid.scrollWidth - grid.clientWidth;\n        prev.disabled = grid.scrollLeft <= 2;\n        next.disabled = grid.scrollLeft >= max - 2;\n      }\n      prev.addEventListener('click', function () { grid.scrollBy({ left: -step() * 2, behavior: 'smooth' }); });\n      next.addEventListener('click', function () { grid.scrollBy({ left: step() * 2, behavior: 'smooth' }); });\n      grid.addEventListener('scroll', sync, { passive: true });\n      window.addEventListener('resize', sync);\n      sync();\n    }\n\n    function renderFeatureTile(anchor, products) {\n      var byVendor = pickImages(products);\n      var images = [];\n      var totalCount = 0;\n      CLOTHING_BRANDS.forEach(function (v) {\n        if (byVendor[v]) { images = images.concat(byVendor[v].images); totalCount += byVendor[v].count || 0; }\n      });\n      images = images.slice(0, 5);\n      if (images.length < 2) return; // not enough real photos yet \u2014 leave the existing static image alone\n      var existingImg = anchor.querySelector('img');\n      var mediaEl = anchor.querySelector('.category-hero__feature-media');\n      var contentEl = anchor.querySelector('.category-hero__feature-content');\n      if (totalCount) {\n        var subEl = anchor.querySelector('.category-hero__feature-sub');\n        if (subEl && !subEl.querySelector('.tile-count')) {\n          var countEl = document.createElement('span');\n          countEl.className = 'tile-count';\n          countEl.textContent = totalCount + (totalCount === 1 ? ' style' : ' styles');\n          subEl.appendChild(countEl);\n        }\n      }\n      var stack = images.map(function (src, i) {\n        return '<img class=\"category-hero__feature-img' + (i === 0 ? ' is-active' : '') + '\" data-rotate-img src=\"' + src + '\" alt=\"\" loading=\"lazy\" width=\"1200\" height=\"900\">';\n      }).join('');\n      if (existingImg) existingImg.outerHTML = stack; else anchor.insertAdjacentHTML('afterbegin', stack);\n      // contentEl has to stay INSIDE mediaEl (not appended to anchor directly) \u2014 its\n      // position:absolute overlay is positioned relative to .category-hero__feature-media,\n      // not the outer <a>. Re-parenting to anchor here (the old behavior, back when the\n      // label sat below the photo as a separate block rather than overlaid on it) would\n      // silently break the overlay positioning now that it needs to stay nested.\n      if (contentEl && mediaEl) mediaEl.appendChild(contentEl);\n      startRotation([anchor], anchor);\n    }\n\n    // Generic tile rotation \u2014 every other homepage category tile (Category Hero's grid\n    // tiles, Category Stacked's feature + tiles, Gender Grid's tiles), each tagged with\n    // data-tile-match describing what it's actually about (\"vendor:AIR JORDAN\",\n    // \"title:jordan 1\", or \"newest\"), so each tile cycles through real photos that\n    // genuinely match its own label instead of one static photo. Same rotation mechanics\n    // as the brand tiles above \u2014 just a different, more flexible matching rule per tile.\n    function matchesTile(p, match) {\n      if (match.indexOf('vendor:') === 0) {\n        return (p.vendor || '').trim().toUpperCase() === match.slice(7).toUpperCase();\n      }\n      if (match.indexOf('title:') === 0) {\n        return (p.title || '').toLowerCase().indexOf(match.slice(6).toLowerCase()) !== -1;\n      }\n      return false;\n    }\n    function renderGenericTile(anchor, products) {\n      var match = anchor.getAttribute('data-tile-match');\n      if (!match) return;\n      var pool;\n      if (match === 'newest') {\n        pool = products.filter(function (p) {\n          return p.vendor && !EXCLUDES[p.vendor.trim().toUpperCase()] && (p.imageLarge || p.image);\n        }).slice().sort(function (a, b) { return new Date(b.createdAt) - new Date(a.createdAt); });\n      } else {\n        pool = products.filter(function (p) { return (p.imageLarge || p.image) && matchesTile(p, match); })\n          .slice().sort(function (a, b) { return (b.available ? 1 : 0) - (a.available ? 1 : 0); });\n      }\n      var images = [];\n      pool.forEach(function (p) {\n        var src = p.imageLarge || p.image;\n        if (images.length < 4 && src && images.indexOf(src) === -1) images.push(src);\n      });\n      if (images.length < 2) return; // not enough real matches \u2014 leave the existing static photo alone\n      var existingImg = anchor.querySelector('img');\n      var others = Array.prototype.slice.call(anchor.children).filter(function (el) { return el !== existingImg; });\n      var stack = images.map(function (src, i) {\n        return '<img class=\"tile-rotate-img' + (i === 0 ? ' is-active' : '') + '\" data-rotate-img src=\"' + src + '\" alt=\"\" loading=\"lazy\" width=\"600\" height=\"600\">';\n      }).join('');\n      if (existingImg) existingImg.outerHTML = stack; else anchor.insertAdjacentHTML('afterbegin', stack);\n      others.forEach(function (el) { anchor.appendChild(el); });\n      startRotation([anchor], anchor);\n\n      // Real style count, same restockar-matched pattern as the brand tiles above \u2014 attached\n      // to whichever static label element this tile type actually uses (they differ per\n      // section) rather than duplicated markup per section type.\n      if (match !== 'newest' && pool.length) {\n        var labelEl = anchor.querySelector('.category-hero__tile-bar, .category-stacked__tile-bar, .gender-grid__tile-label, .category-stacked__feature-sub, .category-stacked__feature-label');\n        if (labelEl && !labelEl.querySelector('.tile-count')) {\n          var countEl = document.createElement('span');\n          countEl.className = 'tile-count';\n          countEl.textContent = pool.length + (pool.length === 1 ? ' style' : ' styles');\n          labelEl.appendChild(countEl);\n        }\n      }\n    }\n\n    fullCatalogPromise.then(function (full) {\n      if (!full || !full.length) return;\n      grids.forEach(function (grid) { renderBrandsGrid(grid, full); });\n      featureRotate.forEach(function (anchor) { renderFeatureTile(anchor, full); });\n      genericTiles.forEach(function (anchor) { renderGenericTile(anchor, full); });\n      if (trendingGrid && trendingWrap) renderTrendingNow(trendingWrap, trendingGrid, full);\n    });\n  })();\n\n  // ---- /search results page: rendered from the complete fetched catalog (see\n  // fullCatalogPromise above), not a server-side Liquid loop \u2014 same truncation issue the\n  // brand menu had. Falls back to the embedded (possibly truncated) index if the fetch fails. ----\n  (function () {\n    var grid = document.getElementById('SearchResultsGrid');\n    if (!grid) return;\n    var countEl = document.getElementById('SearchResultsCount');\n    var emptyEl = document.getElementById('SearchEmptyState');\n    var rawQuery = (grid.getAttribute('data-raw-query') || '').trim();\n    var displayTerm = grid.getAttribute('data-display-term') || rawQuery;\n    var queryLower = rawQuery.toLowerCase();\n    var isVendorQuery = queryLower.indexOf('vendor:') !== -1;\n    var vendorQuery = isVendorQuery ? queryLower.replace('vendor:', '').trim() : '';\n    var queryWords = queryLower.split(/\\s+/).filter(Boolean);\n\n    function render(products) {\n      var matches = products.filter(function (p) {\n        if (isVendorQuery) {\n          return (p.vendor || '').toLowerCase().trim() === vendorQuery;\n        }\n        var titleLower = (p.title || '').toLowerCase();\n        return queryWords.every(function (w) { return titleLower.indexOf(w) !== -1; });\n      });\n      grid.innerHTML = matches.map(renderProductCardHtml).join('');\n      if (countEl) {\n        countEl.textContent = matches.length + ' result' + (matches.length !== 1 ? 's' : '') + ' for \u201C' + displayTerm + '\u201D';\n        countEl.hidden = false;\n      }\n      if (emptyEl) emptyEl.hidden = matches.length !== 0;\n\n      // Weak/empty real matches (e.g. searching the shop's own name, a vague term, a typo) \u2014\n      // show real new-arrival products from real brands instead of a dead end.\n      var fallbackWrap = document.getElementById('SearchFallback');\n      var fallbackGrid = document.getElementById('SearchFallbackGrid');\n      if (fallbackWrap && fallbackGrid && !isVendorQuery) {\n        if (matches.length < 4) {\n          var picks = pickSearchFallback(products, 12);\n          if (picks.length) {\n            fallbackGrid.innerHTML = picks.map(renderProductCardHtml).join('');\n            fallbackWrap.hidden = false;\n          } else {\n            fallbackWrap.hidden = true;\n          }\n        } else {\n          fallbackWrap.hidden = true;\n        }\n      }\n    }\n\n    fullCatalogPromise.then(function (full) {\n      if (full && full.length) { render(full); return; }\n      var el = document.getElementById('ProductSearchIndex');\n      if (el) {\n        try { render(JSON.parse(el.textContent)); } catch (e) {}\n      }\n    });\n  })();\n\n  // ---- Fixed header: publish the real bar height, and flag scrolled state ----\n  // The header group is position:fixed, so the page below has to be offset by however tall the\n  // bar actually is. Measuring it (rather than hardcoding 108px) keeps that correct when the\n  // announcement ticker is edited, hidden, or wraps at a narrow width.\n  (function () {\n    var group = document.querySelector('.site-header-stack');\n    if (!group) return;\n    var body = document.body;\n    // Offset must be the bar's UNCOLLAPSED height and must not change on scroll. Measuring the\n    // live height would shrink it by 36px the moment the ticker collapses, shifting the whole\n    // page up under the reader; once scrolled, that offset region is off-screen anyway, so the\n    // full height is the correct constant. scrollHeight is used for the ticker because it is\n    // unaffected by the max-height collapse.\n    var ann = group.querySelector('.announcement-bar');\n    var headerEl = group.querySelector('.header');\n    function publishHeight() {\n      var annH = ann ? ann.scrollHeight : 0;\n      var hdrH = headerEl ? Math.round(headerEl.getBoundingClientRect().height) : 0;\n      document.documentElement.style.setProperty('--header-h', (annH + hdrH) + 'px');\n    }\n    var ticking = false;\n    function onScroll() {\n      if (ticking) return;\n      ticking = true;\n      requestAnimationFrame(function () {\n        body.classList.toggle('is-scrolled', window.scrollY > 90);\n        ticking = false;\n      });\n    }\n    publishHeight();\n    onScroll();\n    window.addEventListener('scroll', onScroll, { passive: true });\n    window.addEventListener('resize', publishHeight);\n  })();\n\n  // ---- Shop by brand mega-menu \u2014 hover-triggered on pointer devices, click still\n  // works for touch/keyboard so it's not pointer-only ----\n  (function () {\n    var wrap = document.getElementById('HeaderBrandMenu');\n    var toggle = document.getElementById('HeaderBrandToggle');\n    var panel = document.getElementById('HeaderBrandPanel');\n    if (!wrap || !toggle || !panel) return;\n\n    var siteHeader = document.getElementById('SiteHeader');\n    var closeTimer = null;\n    // Two-step show/hide so the panel can animate: `hidden` is display:none, and you cannot\n    // transition out of display:none in the same frame you remove it. Unhide, let a frame land,\n    // then add .is-open; on close reverse it and only re-apply `hidden` after the transition, so\n    // a closed panel still leaves the accessibility tree and tab order exactly as before.\n    var hideTimer = null;\n// `closeTimer` only exists in the two hover-driven mega-menus; the search panel has no\n// hover-close, so declare it here without an initialiser. A bare `var` hoists and merges\n// with the existing declaration where there is one (leaving its value untouched) and is\n// simply undefined where there isn't \u2014 clearTimeout(undefined) is a no-op.\nvar closeTimer;\n    function openPanel() {\n      clearTimeout(closeTimer); clearTimeout(hideTimer);\n      panel.hidden = false;\n      requestAnimationFrame(function () {\n        requestAnimationFrame(function () { panel.classList.add('is-open'); });\n      });\n      toggle.setAttribute('aria-expanded', 'true');\n      if (siteHeader) siteHeader.classList.add('header--panel-open');\n      document.body.classList.add('has-panel-open');\n    }\n    function closePanel() {\n      clearTimeout(hideTimer);\n      panel.classList.remove('is-open');\n      var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      hideTimer = setTimeout(function () { panel.hidden = true; }, reduce ? 0 : 200);\n      toggle.setAttribute('aria-expanded', 'false');\n      if (siteHeader) siteHeader.classList.remove('header--panel-open');\n      document.body.classList.remove('has-panel-open');\n    }\n    function scheduleClose() {\n      clearTimeout(closeTimer);\n      closeTimer = setTimeout(closePanel, 150);\n    }\n\n    var canHover = window.matchMedia('(hover: hover) and (pointer: fine)').matches;\n    if (canHover) {\n      wrap.addEventListener('mouseenter', openPanel);\n      wrap.addEventListener('mouseleave', scheduleClose);\n    }\n    toggle.addEventListener('click', function (e) {\n      e.stopPropagation();\n      panel.classList.contains('is-open') ? closePanel() : openPanel();\n    });\n    document.addEventListener('click', function (e) {\n      if (panel.classList.contains('is-open') && !panel.contains(e.target) && e.target !== toggle) closePanel();\n    });\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape' && panel.classList.contains('is-open')) closePanel();\n    });\n  })();\n\n  // ---- Hero banner rotating headline \u2014 crossfades between several real, plain-voiced lines\n  // (see the \"line\" blocks in hero-banner.liquid) instead of one static sentence. Respects\n  // reduced-motion by just leaving the first line showing, same as every other rotation on\n  // this page. ----\n  document.querySelectorAll('[data-rotate-heading]').forEach(function (heading) {\n    var lines = Array.prototype.slice.call(heading.querySelectorAll('.hero-banner__heading-line'));\n    if (lines.length < 2 || window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n    var current = 0;\n    setInterval(function () {\n      lines[current].classList.remove('is-active');\n      current = (current + 1) % lines.length;\n      lines[current].classList.add('is-active');\n    }, 4000);\n  });\n\n  // ---- Featured collection pill tabs ----\n  document.querySelectorAll('.featured-collection-tabs__nav').forEach(function (nav) {\n    var wrapper = nav.closest('.section--featured-collection-tabs');\n    if (!wrapper) return;\n    var tabs = nav.querySelectorAll('.featured-collection-tabs__tab');\n    var panels = wrapper.querySelectorAll('.featured-collection-tabs__panel');\n\n    tabs.forEach(function (tab, i) {\n      tab.addEventListener('click', function () {\n        tabs.forEach(function (t) { t.removeAttribute('data-active'); });\n        panels.forEach(function (p) { p.removeAttribute('data-active'); });\n        tab.setAttribute('data-active', '');\n        if (panels[i]) panels[i].setAttribute('data-active', '');\n      });\n    });\n  });\n\n  // ---- Mobile menu drawer ----\n  var toggle = document.querySelector('.header__menu-toggle');\n  var drawer = document.getElementById('MobileMenu');\n  var closeBtn = drawer ? drawer.querySelector('.mobile-menu-drawer__close') : null;\n\n  if (toggle && drawer) {\n    toggle.addEventListener('click', function () {\n      var open = drawer.hasAttribute('open');\n      if (open) {\n        drawer.removeAttribute('open');\n        toggle.setAttribute('aria-expanded', 'false');\n      } else {\n        drawer.setAttribute('open', '');\n        toggle.setAttribute('aria-expanded', 'true');\n      }\n    });\n  }\n  if (closeBtn && drawer) {\n    closeBtn.addEventListener('click', function () {\n      drawer.removeAttribute('open');\n      if (toggle) toggle.setAttribute('aria-expanded', 'false');\n    });\n  }\n\n  // ---- Cart drawer \u2014 slide-out panel instead of a full navigation to /cart for the\n  // common case (clicking the cart icon, adding a product). /cart itself is untouched.\n  // Rendered entirely from the real Cart AJAX API (/cart.js) so it can be opened and\n  // refreshed from any add-to-cart action on any page. ----\n  var CartDrawer = (function () {\n    var drawer = document.getElementById('CartDrawer');\n    var overlay = document.getElementById('CartDrawerOverlay');\n    if (!drawer || !overlay) return { open: function () {}, refresh: function () {} };\n\n    var closeBtn = document.getElementById('CartDrawerClose');\n    var itemsEl = document.getElementById('CartDrawerItems');\n    var emptyEl = document.getElementById('CartDrawerEmpty');\n    var footerEl = document.getElementById('CartDrawerFooter');\n    var subtotalEl = document.getElementById('CartDrawerSubtotal');\n    var countEl = document.getElementById('CartDrawerCount');\n    var shippingWrap = document.getElementById('CartDrawerShipping');\n    var shippingText = document.getElementById('CartDrawerShippingText');\n    var shippingFill = document.getElementById('CartDrawerShippingFill');\n    var protectionWrap = document.getElementById('CartDrawerProtection');\n    var protectionPriceEl = document.getElementById('CartDrawerProtectionPrice');\n    var checkoutBtn = document.getElementById('CartDrawerCheckout');\n    var threshold = parseInt(drawer.getAttribute('data-free-shipping-threshold'), 10) || 25000;\n    var cartToggle = document.getElementById('HeaderCartToggle');\n    var protectionAutoApplying = false;\n\n    function open() {\n      drawer.hidden = false;\n      overlay.hidden = false;\n      requestAnimationFrame(function () { drawer.setAttribute('data-open', ''); overlay.setAttribute('data-open', ''); });\n      document.body.style.overflow = 'hidden';\n      drawer.setAttribute('aria-hidden', 'false');\n      if (cartToggle) cartToggle.setAttribute('aria-expanded', 'true');\n    }\n    function close() {\n      drawer.removeAttribute('data-open');\n      overlay.removeAttribute('data-open');\n      document.body.style.overflow = '';\n      drawer.setAttribute('aria-hidden', 'true');\n      if (cartToggle) cartToggle.setAttribute('aria-expanded', 'false');\n      setTimeout(function () { drawer.hidden = true; overlay.hidden = true; }, 300);\n    }\n\n    function itemHtml(item) {\n      var img = item.image ? sizedImageUrl(item.image, 160) : '';\n      var variantLine = (item.variant_title && item.variant_title !== 'Default Title')\n        ? '<span class=\"cart-drawer__item-variant\">' + escapeHtml(item.variant_title) + '</span>' : '';\n      return '<div class=\"cart-drawer__item\" data-cart-drawer-item data-key=\"' + item.key + '\">' +\n        '<a href=\"' + item.url + '\" class=\"cart-drawer__item-media\">' +\n          (img ? '<img crossorigin=\"anonymous\" src=\"' + img + '\" alt=\"\" loading=\"lazy\" width=\"160\" height=\"183\">' : '') +\n        '</a>' +\n        '<div class=\"cart-drawer__item-details\">' +\n          '<a href=\"' + item.url + '\" class=\"cart-drawer__item-title\">' + escapeHtml(item.product_title) + '</a>' +\n          variantLine +\n          '<span class=\"cart-drawer__item-price\">' + formatPrice(item.price / 100) + '</span>' +\n          '<div class=\"cart-drawer__item-controls\">' +\n            '<div class=\"cart-drawer__item-stepper\">' +\n              '<button type=\"button\" data-cart-drawer-step=\"-1\" aria-label=\"Decrease quantity\">&minus;</button>' +\n              '<span data-cart-drawer-qty>' + item.quantity + '</span>' +\n              '<button type=\"button\" data-cart-drawer-step=\"1\" aria-label=\"Increase quantity\">+</button>' +\n            '</div>' +\n            '<button type=\"button\" class=\"cart-drawer__item-remove\" data-cart-drawer-remove>Remove</button>' +\n          '</div>' +\n        '</div>' +\n      '</div>';\n    }\n\n    function pickProtectionTier(tiers, subtotalCents) {\n      for (var i = 0; i < tiers.length; i++) {\n        var t = tiers[i];\n        if (subtotalCents >= t.min && (t.max == null || subtotalCents < t.max)) return t;\n      }\n      return tiers[tiers.length - 1];\n    }\n\n    function render(cart) {\n      if (countEl) countEl.textContent = '(' + cart.item_count + ')';\n      document.querySelectorAll('[data-cart-count]').forEach(function (el) { el.textContent = cart.item_count; });\n\n      // Order protection tiers/state, computed up front \u2014 needed below both to decide the\n      // real (non-protection) item count and to auto-apply/remove the line itself.\n      var tiers = [];\n      var protectionEnabled = protectionWrap && protectionWrap.getAttribute('data-enabled') === 'true';\n      try { tiers = JSON.parse((protectionWrap && protectionWrap.getAttribute('data-variants')) || '[]'); } catch (e) {}\n      var tierVariantIds = tiers.map(function (t) { return String(t.variantId); });\n      var existingProtectionItem = cart.items.filter(function (i) { return tierVariantIds.indexOf(String(i.variant_id)) !== -1; })[0];\n\n      // Real bug found: cart.item_count includes the order-protection line itself, so\n      // removing the last real product left item_count at 1 (protection only) \u2014 the empty\n      // check below never fired, and protection just sat there with nothing to protect. Every\n      // \"is the cart empty\" decision (here and for auto-applying/removing protection) needs to\n      // be based on real product count, not Shopify's raw item_count.\n      var realItemCount = cart.item_count - (existingProtectionItem ? existingProtectionItem.quantity : 0);\n\n      if (realItemCount === 0) {\n        itemsEl.innerHTML = '';\n        emptyEl.hidden = false;\n        footerEl.hidden = true;\n        shippingWrap.hidden = true;\n        if (protectionWrap) protectionWrap.hidden = true;\n        // Nothing left to protect \u2014 remove a lingering protection line instead of leaving it\n        // as the one thing still sitting in an otherwise-empty cart.\n        if (existingProtectionItem && !protectionAutoApplying) {\n          protectionAutoApplying = true;\n          fetch('/cart/change.js', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify({ id: existingProtectionItem.key, quantity: 0 }) })\n            .then(function () { protectionAutoApplying = false; refresh(); })\n            .catch(function () { protectionAutoApplying = false; });\n        }\n        return;\n      }\n      emptyEl.hidden = true;\n      footerEl.hidden = false;\n\n      // Order Protection has its own dedicated toggle row directly below this list (real\n      // Shopify cart line either way, so its cost is still included in items_subtotal_price)\n      // \u2014 showing it a second time here as a normal product row, with its own quantity\n      // stepper and Remove button, is what read as \"why did you put order protection as a\n      // product\": visually identical to every real item above it instead of an add-on.\n      var visibleItems = cart.items.filter(function (i) { return i.handle !== 'order-protection'; });\n      itemsEl.innerHTML = visibleItems.map(itemHtml).join('');\n      var subtotalCents = cart.items_subtotal_price;\n      if (subtotalEl) subtotalEl.textContent = formatPrice(subtotalCents / 100);\n\n      shippingWrap.hidden = false;\n      var remaining = threshold - subtotalCents;\n      if (remaining <= 0) {\n        shippingText.textContent = 'Free shipping unlocked';\n        shippingFill.style.width = '100%';\n      } else {\n        shippingText.textContent = formatPrice(remaining / 100) + ' away from free shipping';\n        shippingFill.style.width = Math.max(4, Math.min(100, (subtotalCents / threshold) * 100)) + '%';\n      }\n\n      // Order protection \u2014 always on, no opt-out in the cart (removable only at checkout).\n      // Auto-added at the correct tier the moment the cart has real items; if the subtotal\n      // moves into a different tier band (items added/removed) the wrong-tier line is\n      // swapped for the correct one automatically, same auto-apply path.\n      if (protectionWrap && protectionEnabled && tiers.length) {\n        protectionWrap.hidden = false;\n        var tier = pickProtectionTier(tiers, subtotalCents);\n        if (protectionPriceEl) protectionPriceEl.textContent = formatPrice(tier.price / 100);\n\n        var correctTierPresent = existingProtectionItem && String(existingProtectionItem.variant_id) === String(tier.variantId);\n\n        if (!correctTierPresent && !protectionAutoApplying) {\n          protectionAutoApplying = true;\n          var removeOld = existingProtectionItem\n            ? fetch('/cart/change.js', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify({ id: existingProtectionItem.key, quantity: 0 }) })\n            : Promise.resolve();\n          removeOld\n            .then(function () {\n              return fetch('/cart/add.js', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify({ id: tier.variantId, quantity: 1 }) });\n            })\n            .then(function () { protectionAutoApplying = false; refresh(); })\n            .catch(function () { protectionAutoApplying = false; });\n        }\n      } else if (protectionWrap) {\n        protectionWrap.hidden = true;\n      }\n    }\n\n    function fetchCart() {\n      return fetch('/cart.js', { cache: 'no-store' }).then(function (r) {\n        // Real hardening: /cart.js can occasionally come back as a non-JSON response (a\n        // transient proxy/edge error page, a network hiccup) instead of throwing outright \u2014\n        // r.json() on that silently rejects with a cryptic parse error and, uncaught anywhere\n        // in this file, leaves the drawer frozen in whatever state it was already in (which on\n        // a first open looks exactly like \"the cart is empty\" even though the real cart has\n        // items). Fail loud and let refresh()/refreshAfterAdd() retry instead of chancing an\n        // uncaught rejection.\n        if (!r.ok) throw new Error('cart.js responded ' + r.status);\n        return r.json();\n      });\n    }\n    // One retry, short delay, on any fetchCart failure \u2014 covers both a genuinely-empty cart\n    // right after add (see refreshAfterAdd's own comment below) and a one-off bad response,\n    // rather than leaving the drawer stuck on stale/blank content with no way to recover short\n    // of the shopper closing and reopening it.\n    function refresh() {\n      return fetchCart().then(render).catch(function () {\n        return new Promise(function (resolve) { setTimeout(resolve, 500); })\n          .then(fetchCart).then(render).catch(function () {});\n      });\n    }\n    // Called right after a confirmed-successful /cart/add.js \u2014 if this immediate read\n    // somehow comes back showing an empty cart (the exact \"just added, but drawer shows\n    // empty\" report), that's a real contradiction worth one retry before trusting it,\n    // rather than rendering \"Your cart is empty\" a beat after the shopper watched an add\n    // succeed. A genuinely empty cart after the retry is rendered as-is.\n    function refreshAfterAdd() {\n      return fetchCart().then(function (cart) {\n        if (cart.item_count === 0) {\n          return new Promise(function (resolve) { setTimeout(resolve, 400); })\n            .then(fetchCart).then(render);\n        }\n        render(cart);\n      }).catch(function () {\n        return new Promise(function (resolve) { setTimeout(resolve, 500); })\n          .then(fetchCart).then(render).catch(function () {});\n      });\n    }\n    function openAndRefresh() {\n      open();\n      refresh();\n    }\n    function openAndRefreshAfterAdd() {\n      open();\n      refreshAfterAdd();\n    }\n\n    if (cartToggle) {\n      cartToggle.addEventListener('click', function (e) {\n        e.preventDefault();\n        openAndRefresh();\n      });\n    }\n    if (closeBtn) closeBtn.addEventListener('click', close);\n    overlay.addEventListener('click', close);\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape' && drawer.hasAttribute('data-open')) close();\n    });\n    drawer.addEventListener('click', function (e) {\n      if (e.target.closest('[data-cart-drawer-close]')) close();\n    });\n\n    // Line item qty/remove \u2014 same /cart/change.js pattern as the full cart page.\n    itemsEl.addEventListener('click', function (e) {\n      var row = e.target.closest('[data-cart-drawer-item]');\n      if (!row) return;\n      var key = row.getAttribute('data-key');\n      var qtyEl = row.querySelector('[data-cart-drawer-qty]');\n      var stepBtn = e.target.closest('[data-cart-drawer-step]');\n      var removeBtn = e.target.closest('[data-cart-drawer-remove]');\n      var newQty = null;\n      if (stepBtn) newQty = Math.max(0, parseInt(qtyEl.textContent, 10) + parseInt(stepBtn.getAttribute('data-cart-drawer-step'), 10));\n      else if (removeBtn) newQty = 0;\n      else return;\n      row.classList.add('is-updating');\n      fetch('/cart/change.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n        body: JSON.stringify({ id: key, quantity: newQty })\n      })\n        .then(function (r) { return r.json(); })\n        .then(render)\n        .catch(function () { row.classList.remove('is-updating'); });\n    });\n\n    if (checkoutBtn) {\n      checkoutBtn.addEventListener('click', function () { window.location.href = '/checkout'; });\n    }\n\n    return { open: openAndRefresh, openAfterAdd: openAndRefreshAfterAdd, refresh: refresh };\n  })();\n  window.ClienteleCartDrawer = CartDrawer;\n\n  // ---- Product card quick-add ----\n  function addToCart(variantId, statusEl, onDone) {\n    if (statusEl) statusEl.textContent = 'Adding...';\n    fetch('/cart/add.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n      body: JSON.stringify({ id: variantId, quantity: 1 })\n    })\n      .then(function (r) { return r.json(); })\n      .then(function () {\n        if (statusEl) statusEl.textContent = 'Added to cart';\n        refreshCartCount();\n        CartDrawer.openAfterAdd();\n        if (onDone) onDone(true);\n        if (statusEl) setTimeout(function () { statusEl.textContent = ''; }, 2500);\n      })\n      .catch(function () {\n        if (statusEl) statusEl.textContent = 'Could not add \u2014 try again';\n        if (onDone) onDone(false);\n      });\n  }\n\n  // Shared with sections/main-product.liquid's own add-to-cart handler (a separate inline\n  // script, no shared closure with this file) via window \u2014 both are real confirmed-add paths\n  // that should trigger the same immediate feedback at the header icon.\n  function bumpCartBadge() {\n    document.querySelectorAll('.header__icon-badge').forEach(function (el) {\n      el.classList.remove('is-bumping');\n      void el.offsetWidth; // restart the animation even if it's already mid-bump\n      el.classList.add('is-bumping');\n    });\n  }\n  window.ClienteleBumpCartBadge = bumpCartBadge;\n\n  function refreshCartCount() {\n    fetch('/cart.js', { cache: 'no-store' })\n      .then(function (r) { return r.json(); })\n      .then(function (cart) {\n        document.querySelectorAll('[data-cart-count]').forEach(function (el) {\n          el.textContent = cart.item_count;\n        });\n        bumpCartBadge();\n      })\n      .catch(function () {});\n  }\n\n  // Event delegation so this keeps working for cards added later (e.g. collection \"Load More\")\n  document.addEventListener('click', function (e) {\n    var toggleBtn = e.target.closest('[data-quickadd-toggle]');\n    if (toggleBtn) {\n      e.preventDefault();\n      var card = toggleBtn.closest('[data-product-card]');\n      var panel = card ? card.querySelector('[data-quickadd-panel]') : null;\n      var statusEl = card ? card.querySelector('[data-quickadd-status]') : null;\n\n      if (panel) {\n        document.querySelectorAll('[data-quickadd-panel]').forEach(function (p) {\n          if (p !== panel) p.hidden = true;\n        });\n        panel.hidden = !panel.hidden;\n        return;\n      }\n\n      // Deliberately no silent-add fallback any more. This branch used to add\n      // data-default-variant-id straight to the cart whenever a card had no size panel, which\n      // is how unsized sneakers were getting added without the shopper choosing anything.\n      // Every card renders a panel now (see snippets/product-card.liquid); if one is somehow\n      // missing, doing nothing is the correct failure mode \u2014 the card's image and title are\n      // both still links to the product page.\n      return;\n    }\n\n    var variantBtn = e.target.closest('.product-card__variant-btn');\n    if (variantBtn) {\n      e.preventDefault();\n      if (variantBtn.disabled) return;\n      var vCard = variantBtn.closest('[data-product-card]');\n      var vPanel = variantBtn.closest('[data-quickadd-panel]');\n      var vStatusEl = vCard ? vCard.querySelector('[data-quickadd-status]') : null;\n      var vVariantId = variantBtn.getAttribute('data-variant-id');\n      addToCart(vVariantId, vStatusEl, function () {\n        if (vPanel) vPanel.hidden = true;\n      });\n      return;\n    }\n\n    if (!e.target.closest('[data-quickadd-panel]')) {\n      document.querySelectorAll('[data-quickadd-panel]').forEach(function (p) { p.hidden = true; });\n    }\n  });\n\n  // ---- Scroll-triggered reveal for section headers and tile grids ----\n  var revealItems = document.querySelectorAll('[data-reveal]');\n  if (revealItems.length) {\n    var prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    if (prefersReducedMotion || !('IntersectionObserver' in window)) {\n      revealItems.forEach(function (el) { el.classList.add('is-visible'); });\n    } else {\n      var revealObserver = new IntersectionObserver(function (entries) {\n        entries.forEach(function (entry) {\n          if (entry.isIntersecting) {\n            entry.target.classList.add('is-visible');\n            revealObserver.unobserve(entry.target);\n          }\n        });\n      }, { threshold: 0.12, rootMargin: '0px 0px -40px 0px' });\n      revealItems.forEach(function (el) { revealObserver.observe(el); });\n    }\n  }\n\n  // ---- Collection-grid fallback for the known Shopify-side collection-index bug ----\n  // Certain collections/sort orders (documented in SITE_AUDIT_CHECKLIST.md \u2014 confirmed via\n  // Admin API that the data itself is clean, not a theme bug) return zero products from\n  // Shopify's server-side collection.products, while claiming a real nonzero item count and\n  // full pagination. The collection's public /products.json endpoint is a different code path\n  // and returns the real product list correctly, so when the server-rendered grid comes back\n  // empty despite claiming items, this fetches that endpoint directly and renders client-side.\n  (function () {\n    var grids = document.querySelectorAll('[data-product-grid][data-collection-handle]');\n    if (!grids.length) return;\n\n    // No timeout on a bare fetch() means a stalled request (flaky connection, an\n    // overzealous bot-mitigation challenge, a blocked/ad-blocked request, etc.) leaves\n    // the loading state showing forever with no way out. Each page request gets its own\n    // hard cutoff so a stuck request degrades to \"show whatever we already have\" instead\n    // of hanging indefinitely.\n    var PAGE_TIMEOUT_MS = 8000;\n    function fetchWithTimeout(url) {\n      var controller = 'AbortController' in window ? new AbortController() : null;\n      var timer = controller ? setTimeout(function () { controller.abort(); }, PAGE_TIMEOUT_MS) : null;\n      return fetch(url, controller ? { signal: controller.signal } : {}).finally(function () {\n        if (timer) clearTimeout(timer);\n      });\n    }\n\n    function fetchCollectionProducts(handle) {\n      var all = [];\n      function nextPage(page) {\n        return fetchWithTimeout('/collections/' + handle + '/products.json?limit=250&page=' + page)\n          .then(function (r) { return r.ok ? r.json() : { products: [] }; })\n          .then(function (j) {\n            var products = j.products || [];\n            all = all.concat(products);\n            if (products.length > 0 && page < 20) return nextPage(page + 1);\n            return all;\n          })\n          .catch(function () { return all; });\n      }\n      return nextPage(1);\n    }\n\n    // The public /products.json-style endpoints have no sort param \u2014 they always return the\n    // collection's own default order. Re-sort client-side to match whatever sort_by is in the\n    // URL (from the sort dropdown) so a broken \"Price: low to high\" doesn't silently render\n    // in the wrong order. \"best-selling\"/\"manual\"/\"most-relevant\" have no client-side\n    // equivalent, so those are left in the order the endpoint returns.\n    function sortRaw(raw, sortBy) {\n      function price(p) { return p.variants && p.variants.length ? parseFloat(p.variants[0].price) : 0; }\n      var sorted = raw.slice();\n      if (sortBy === 'price-ascending') sorted.sort(function (a, b) { return price(a) - price(b); });\n      else if (sortBy === 'price-descending') sorted.sort(function (a, b) { return price(b) - price(a); });\n      else if (sortBy === 'title-ascending') sorted.sort(function (a, b) { return (a.title || '').localeCompare(b.title || ''); });\n      else if (sortBy === 'title-descending') sorted.sort(function (a, b) { return (b.title || '').localeCompare(a.title || ''); });\n      else if (sortBy === 'created-ascending') sorted.sort(function (a, b) { return new Date(a.created_at) - new Date(b.created_at); });\n      else if (sortBy === 'created-descending') sorted.sort(function (a, b) { return new Date(b.created_at) - new Date(a.created_at); });\n      return sorted;\n    }\n\n    grids.forEach(function (grid) {\n      // Shopify's own server-side sort index is documented to get unreliable on\n      // collections above roughly 50 products \u2014 confirmed empirically here too (Grails/\n      // Sale, both well under that, never break; All/Jordan/New Arrivals, all in the\n      // hundreds-to-thousands, do). It doesn't always fail as a clean \"0 rendered\" \u2014 some\n      // sorts partially fail and render just 1-2 cards on a page that should have a full\n      // 24. Comparing against the real expected count catches that partial-failure case\n      // too, not just the fully-empty one.\n      var expectedCount = parseInt(grid.getAttribute('data-expected-count'), 10) || 0;\n      var healthyMinimum = Math.min(expectedCount, 8);\n      // A real, previously-missed edge case: when Shopify's server-side render is the one\n      // that's wrong (this whole fallback's reason to exist), it reports data-expected-count\n      // as 0 too \u2014 its own count is downstream of the same broken query. healthyMinimum would\n      // then also be 0, and grid.children.length (0) >= 0 is true, skipping the fallback\n      // exactly when it's needed most (confirmed live: /collections/jordan?filter.p.vendor=\n      // Air+Jordan rendered a \"no products\" empty state for a vendor that has real matching\n      // products). An empty grid always gets checked now; a non-empty grid still only gets\n      // checked against healthyMinimum as before.\n      if (grid.children.length > 0 && grid.children.length >= healthyMinimum) return;\n      var handle = grid.getAttribute('data-collection-handle');\n      if (!handle) return;\n      var urlParams = new URLSearchParams(window.location.search);\n      var sortBy = urlParams.get('sort_by');\n      // Real bug found: this fallback fetches the WHOLE collection with no awareness of\n      // whatever native filter (?filter.p.vendor=X etc) got the shopper here in the first\n      // place \u2014 e.g. clicking a real \"Shop by Brand\" link when the server-side render came\n      // back empty (the same large-collection bug this fallback exists for, just also hitting\n      // filtered requests) would silently replace an empty grid with the ENTIRE catalog\n      // instead of just that brand. filter.p.vendor is the one that matters for every brand-\n      // navigation link on this site (mega-menu, homepage tiles, Popular Brands) \u2014 applied\n      // client-side here so a broken server render never shows the wrong products.\n      var vendorFilter = urlParams.get('filter.p.vendor');\n      // Real bug: this fallback re-applied ONLY the vendor filter, so any other active native\n      // filter was silently dropped when it took over. Confirmed live on\n      // /collections/new-arrivals?filter.p.product_type=HOODIES \u2014 the page is labelled 5 items,\n      // the server rendered 3, that tripped the \"looks broken\" threshold, and the fallback then\n      // replaced the grid with all 11 products in the collection. A shopper filtering to\n      // Hoodies was shown tees and shorts.\n      var typeFilter = urlParams.get('filter.p.product_type');\n\n      // The fetch below is usually well under a second, but the grid would otherwise sit\n      // as a blank empty box for that gap \u2014 looks broken rather than loading.\n      var loadingEl = document.createElement('p');\n      loadingEl.className = 'collection__grid-loading';\n      loadingEl.textContent = 'Loading...';\n      grid.appendChild(loadingEl);\n\n      // For the \"all\" collection specifically, source from the already-proven-reliable full\n      // shop catalog (fullCatalogPromise \u2014 the same /products.json-based fetch that's worked\n      // correctly all along for search and the brand menu) instead of\n      // /collections/all/products.json. Verified directly: that collection-scoped endpoint\n      // has the *same* incomplete-listing problem as the broken server-rendered page itself\n      // (a real product with a real photo, confirmed live via the Admin API, simply doesn't\n      // come back from it) \u2014 so it was never a trustworthy fallback source for this\n      // collection to begin with. Other collection handles still use the per-collection\n      // endpoint, which hasn't shown this problem.\n      function sortMapped(list, sortBy) {\n        var sorted = list.slice();\n        if (sortBy === 'price-ascending') sorted.sort(function (a, b) { return (a.priceCents || 0) - (b.priceCents || 0); });\n        else if (sortBy === 'price-descending') sorted.sort(function (a, b) { return (b.priceCents || 0) - (a.priceCents || 0); });\n        else if (sortBy === 'title-ascending') sorted.sort(function (a, b) { return (a.title || '').localeCompare(b.title || ''); });\n        else if (sortBy === 'title-descending') sorted.sort(function (a, b) { return (b.title || '').localeCompare(a.title || ''); });\n        else if (sortBy === 'created-ascending') sorted.sort(function (a, b) { return new Date(a.createdAt) - new Date(b.createdAt); });\n        else if (sortBy === 'created-descending') sorted.sort(function (a, b) { return new Date(b.createdAt) - new Date(a.createdAt); });\n        return sorted;\n      }\n\n      var productsPromise = handle === 'all' ? fullCatalogPromise.then(function (full) { return full || []; }) : fetchCollectionProducts(handle);\n\n      productsPromise.then(function (raw) {\n        // fullCatalogPromise resolves to already-mapped catalog objects (mapCatalogProduct\n        // already applied); the per-collection endpoint returns raw Shopify product JSON that\n        // still needs mapping. Same shape either way once this branch runs.\n        var mapped = handle === 'all' ? sortMapped(raw, sortBy) : sortRaw(raw, sortBy).map(mapCatalogProduct).filter(Boolean);\n        if (vendorFilter) {\n          var vendorLower = vendorFilter.trim().toLowerCase();\n          mapped = mapped.filter(function (p) { return (p.vendor || '').trim().toLowerCase() === vendorLower; });\n        }\n        if (typeFilter) {\n          var typeLower = typeFilter.trim().toLowerCase();\n          mapped = mapped.filter(function (p) { return (p.productType || '').trim().toLowerCase() === typeLower; });\n        }\n        if (!mapped.length) {\n          // Server-rendered empty-state message (data-empty-state) is already showing as a\n          // sibling of this grid \u2014 no need to duplicate that text inside the grid itself.\n          loadingEl.remove();\n          return;\n        }\n        grid.innerHTML = mapped.map(renderProductCardHtml).join('');\n        // The \"N items\" label is rendered server-side, and on exactly the pages where this\n        // fallback fires the server's own count is wrong for the same reason its product query\n        // was \u2014 e.g. a brand page announced \"0 items\" directly above the 24 products this\n        // fallback had just recovered. Whatever we actually rendered is the truthful number.\n        var countEl = document.querySelector('.collection__count');\n        if (countEl) countEl.textContent = mapped.length + (mapped.length === 1 ? ' item' : ' items');\n        if (window.ClienteleAutoTrim) window.ClienteleAutoTrim.processAll(grid);\n        document.dispatchEvent(new CustomEvent('clientele:grid-updated', { detail: { grid: grid } }));\n\n        // Recovered real products the server-side render missed \u2014 the \"No products match\n        // these filters\" message rendered alongside the (previously empty) grid is now wrong\n        // and needs to disappear along with it.\n        var emptyState = document.querySelector('[data-empty-state][data-grid-id=\"' + grid.id + '\"]');\n        if (emptyState) emptyState.hidden = true;\n\n        // This grid came entirely from the client-side fetch, not Shopify's server-side\n        // pagination \u2014 the real page-number nav reflects that (broken) server pagination\n        // state and would be misleading here (it already contains everything this fallback\n        // could ever page to), so hide it.\n        var main = grid.closest('.collection__main');\n        if (main) {\n          var pagination = main.querySelector('.collection__pagination');\n          if (pagination) pagination.hidden = true;\n        }\n      }).catch(function () { loadingEl.remove(); });\n    });\n  })();\n\n});\n"],
  "mappings": "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",
  "names": ["px", "median", "isContent", "rowHasContent", "colHasContent", "toggle", "closeBtn", "escapeHtml", "prefersReducedMotion", "drawer", "sortBy"]
}
