{
  "version": 3,
  "sources": ["/cdn/shop/t/2/assets/facets.js?rev=4"],
  "sourcesContent": ["/* facets.js \u2014 collection/search filtering, sort, pills, load-more.\n   Progressive enhancement: the facet form works server-side without JS; this\n   intercepts it and re-renders via the Section Rendering API (no full reload).\n   \"Top rated\" is a client-side sort by the Judge.me rating metafield. */\n(function () {\n  'use strict';\n\n  function getSectionId() {\n    var form = document.querySelector('[data-facet-form]');\n    return form ? form.getAttribute('data-section-id') : null;\n  }\n\n  function sectionUrl(url) {\n    var id = getSectionId();\n    var u = new URL(url, window.location.origin);\n    if (id) u.searchParams.set('section_id', id);\n    return u.toString();\n  }\n\n  function clientSortActive() {\n    var sel = document.querySelector('[data-sort]');\n    if (!sel) return null;\n    var opt = sel.options[sel.selectedIndex];\n    return opt && opt.hasAttribute('data-client-sort') ? sel.value : null;\n  }\n\n  function maybeClientSort() {\n    if (!clientSortActive()) return;\n    var grid = document.querySelector('[data-product-grid]');\n    if (!grid) return;\n    var cards = Array.prototype.slice.call(grid.querySelectorAll('[data-product-card]'));\n    cards.sort(function (a, b) {\n      return parseFloat(b.getAttribute('data-rating') || 0) - parseFloat(a.getAttribute('data-rating') || 0);\n    });\n    cards.forEach(function (c) { grid.appendChild(c); });\n  }\n\n  // Auto-load: click the load-more button when it nears the viewport\n  var loadMoreObserver = ('IntersectionObserver' in window) ? new IntersectionObserver(function (entries) {\n    entries.forEach(function (entry) {\n      if (!entry.isIntersecting) return;\n      var btn = entry.target.querySelector('[data-load-more]');\n      if (btn && !restoring && !btn.classList.contains('is-loading')) btn.click();\n    });\n  }, { rootMargin: '700px 0px' }) : null;\n\n  function observeLoadMore() {\n    if (loadMoreObserver) {\n      var wrap = document.querySelector('.coll-loadmore');\n      if (wrap && wrap.querySelector('[data-load-more]')) loadMoreObserver.observe(wrap);\n    }\n  }\n\n  function setBusy(on) {\n    var results = document.querySelector('.coll-results');\n    if (results) results.classList.toggle('is-loading', on);\n  }\n\n  function render(url, push) {\n    setBusy(true);\n    fetch(sectionUrl(url))\n      .then(function (r) { return r.text(); })\n      .then(function (text) {\n        var doc = new DOMParser().parseFromString(text, 'text/html');\n        var fresh = doc.querySelector('[data-collection-section]');\n        var cur = document.querySelector('[data-collection-section]');\n        if (fresh && cur) cur.innerHTML = fresh.innerHTML;\n        if (push !== false) window.history.pushState({ facet: true }, '', url);\n        loadedPage = 1;\n        maybeClientSort();\n        observeLoadMore();\n        // search-page.js re-fills chip counts and its other pieces from this.\n        document.dispatchEvent(new CustomEvent('facets:updated'));\n      })\n      .catch(function () { window.location.href = url; })\n      .finally(function () { setBusy(false); });\n  }\n\n  function urlFromForm(form) {\n    var params = new URLSearchParams(new FormData(form));\n    // drop empties\n    var clean = new URLSearchParams();\n    params.forEach(function (v, k) { if (v !== '' && v != null) clean.append(k, v); });\n    // \"Top rated\" is client-side only \u2014 don't send it to Shopify\n    if (clean.get('sort_by') === 'rating') clean.delete('sort_by');\n    var qs = clean.toString();\n    return form.getAttribute('action') + (qs ? '?' + qs : '');\n  }\n\n  document.addEventListener('change', function (e) {\n    var form = e.target.closest('[data-facet-form]');\n    if (!form) return;\n    // pure client sort (no fetch) when only the sort changed to a client option\n    if (e.target.matches('[data-sort]') && clientSortActive()) {\n      maybeClientSort();\n      return;\n    }\n    render(urlFromForm(form), true);\n  });\n\n  // Pills + clear-all (server links) \u2192 intercept to re-render\n  document.addEventListener('click', function (e) {\n    var toTop = e.target.closest('[data-back-to-top]');\n    if (toTop) {\n      e.preventDefault();\n      window.scrollTo({ top: 0, behavior: (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth') });\n      return;\n    }\n\n    var link = e.target.closest('[data-facet-link]');\n    if (link) { e.preventDefault(); render(link.getAttribute('href'), true); return; }\n\n    var more = e.target.closest('[data-load-more]');\n    if (more) {\n      e.preventDefault();\n      if (restoring) return;\n      var url = more.getAttribute('href');\n      more.classList.add('is-loading');\n      loadPage(url).catch(function () { window.location.href = url; });\n    }\n  });\n\n  // Append one ?page=N of results to the grid and swap in its load-more link.\n  function loadPage(url) {\n    return fetch(sectionUrl(url))\n      .then(function (r) { return r.text(); })\n      .then(function (text) {\n        var doc = new DOMParser().parseFromString(text, 'text/html');\n        var freshGrid = doc.querySelector('[data-product-grid]');\n        var grid = document.querySelector('[data-product-grid]');\n        if (freshGrid && grid) {\n          Array.prototype.slice.call(freshGrid.children).forEach(function (c) { grid.appendChild(c); });\n        }\n        var freshMore = doc.querySelector('.coll-loadmore');\n        var curMore = document.querySelector('.coll-loadmore');\n        if (curMore) { if (freshMore) { curMore.replaceWith(freshMore); } else { curMore.remove(); } }\n        loadedPage = pageOf(url);\n        saveDepth();\n        maybeClientSort();\n        observeLoadMore();\n        // search-page.js starts the broad results once the last page is in.\n        document.dispatchEvent(new CustomEvent('facets:page'));\n      });\n  }\n\n  /* Back-button depth. The address bar deliberately never carries ?page=N:\n     Shopify renders ?page=3 as page 3 ALONE, so a product \u2192 Back trip landed\n     on a third of the grid. Instead the loaded depth and scroll position live\n     in sessionStorage, and a back/forward visit re-loads pages 2..N and\n     scrolls to where the shopper was. */\n  var restoring = false;\n  var redirecting = false;\n  var loadedPage = 1;\n\n  function pageOf(url) {\n    var p = parseInt(new URL(url, window.location.origin).searchParams.get('page'), 10);\n    return p > 0 ? p : 1;\n  }\n\n  function depthKey() {\n    var u = new URL(window.location.href);\n    u.searchParams.delete('page');\n    u.searchParams.delete('section_id');\n    return 'pra-depth:' + u.pathname + u.search;\n  }\n\n  function saveDepth() {\n    if (redirecting || !document.querySelector('[data-product-grid]')) return;\n    try {\n      sessionStorage.setItem(depthKey(), JSON.stringify({ page: loadedPage, y: window.scrollY }));\n    } catch (err) {}\n  }\n\n  function readDepth() {\n    try { return JSON.parse(sessionStorage.getItem(depthKey()) || 'null'); } catch (err) { return null; }\n  }\n\n  function isBackForward() {\n    try {\n      var nav = performance.getEntriesByType('navigation')[0];\n      if (nav) return nav.type === 'back_forward';\n      return performance.navigation && performance.navigation.type === 2;\n    } catch (err) { return false; }\n  }\n\n  function restoreDepth() {\n    var grid = document.querySelector('[data-product-grid]');\n    if (!grid) return;\n\n    // A ?page=N URL (an old history entry or a shared link) would show page N\n    // alone: drop the param and let the depth restore rebuild pages 1..N.\n    var urlPage = pageOf(window.location.href);\n    if (urlPage > 1) {\n      var clean = new URL(window.location.href);\n      clean.searchParams.delete('page');\n      try {\n        sessionStorage.setItem('pra-depth:' + clean.pathname + clean.search, JSON.stringify({ page: urlPage, y: null }));\n      } catch (err) {}\n      redirecting = true; // or this page's pagehide overwrites the depth just set\n      window.location.replace(clean.toString());\n      return;\n    }\n\n    var saved = readDepth();\n    if (!saved || !(saved.page > 1)) return;\n    if (!isBackForward() && saved.y !== null) return;\n\n    if ('scrollRestoration' in history) history.scrollRestoration = 'manual';\n    restoring = true;\n    var target = saved.page;\n    var next = 2;\n    (function step() {\n      var more = document.querySelector('[data-load-more]');\n      if (next > target || !more) {\n        restoring = false;\n        if (saved.y) window.scrollTo(0, saved.y);\n        return;\n      }\n      var url = new URL(window.location.href);\n      url.searchParams.set('page', next++);\n      loadPage(url.toString()).then(step, function () { restoring = false; });\n    })();\n  }\n\n  window.addEventListener('pagehide', saveDepth);\n\n  window.addEventListener('popstate', function () {\n    if (document.querySelector('[data-collection-section]')) render(window.location.href, false);\n  });\n\n  // Mobile filter drawer (the facet rail slides in under 961px)\n  document.addEventListener('click', function (e) {\n    var open = e.target.closest('[data-filters-toggle]');\n    var close = e.target.closest('[data-filters-close]');\n    var panel = document.querySelector('[data-facet-panel]');\n    if (!panel) return;\n    if (open) {\n      var on = !panel.classList.contains('is-open');\n      panel.classList.toggle('is-open', on);\n      open.setAttribute('aria-expanded', String(on));\n      document.body.classList.toggle('drawer-open', on);\n    } else if (close) {\n      panel.classList.remove('is-open');\n      document.body.classList.remove('drawer-open');\n      var btn = document.querySelector('[data-filters-toggle]');\n      if (btn) btn.setAttribute('aria-expanded', 'false');\n    }\n  });\n\n  // initial (covers a deep-linked \"rating\" choice)\n  maybeClientSort();\n  restoreDepth();\n  observeLoadMore();\n})();\n"],
  "mappings": "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",
  "names": []
}
