<!-- SS · part 5 -->
t;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c]; }); }
  function money(c) { var v = c / 100; return '$' + (v % 1 === 0 ? v : v.toFixed(2)); }
  var $ = function (s) { return root.querySelector(s); };
  function count(c) { var n = 0; Object.keys(c).forEach(function (k) { n += c[k]; }); return n; }
  function clean(c) { if (!dataEl) return c; Object.keys(c).forEach(function (k) { if (!BY[k]) delete c[k]; }); return c; }
  function render() {
    var c = clean(load()), badge = $('#fx-badge'), n = count(c);
    if (badge) { badge.textContent = n; badge.hidden = !n; }
    var ul = $('#fx-lines'); if (!ul) return;
    var keys = Object.keys(c), sub = 0, ship = false;
    ul.innerHTML = keys.length ? keys.map(function (k) {
      var i = BY[k]; sub += i.p * c[k]; if (i.s) ship = true;
      return '<li data-k="' + k + '">' + (i.img ? '<img src="' + esc(i.img) + '" alt="">' : '<span class="fx-lph"></span>') +
        '<div><b>' + esc(i.n) + '</b><small>' + esc(i.t) + ' · ' + money(i.p) + '</small></div>' +
        '<div class="fx-qty">' + (k.charAt(0) === 's' ? '' : '<button type="button" data-q="-1" aria-label="One less">−</button><span>' + c[k] + '</span><button type="button" data-q="1" aria-label="One more">+</button>') +
        '<button type="button" data-q="x" aria-label="Remove">✕</button></div></li>';
    }).join('') : '<li class="fx-fine" style="display:block;border:0">Your cart is empty.</li>';
    $('#fx-sub').textContent = money(sub);
    $('#fx-shipnote').hidden = !ship;
    $('#fx-checkout').disabled = !keys.length || $('#fx-checkout').hasAttribute('data-off');
    $('#fx-cart-field').value = JSON.stringify(c);
  }
  function add(k) { var c = load(); if (!BY[k]) return; c[k] = k.charAt(0) === 's' ? 1 : Math.min(10, (c[k] || 0) + 1); save(c); }
  function openCart(on) { if (!$('#fx-drawer')) { if (on) location.href = '/shop'; return; } $('#fx-drawer').hidden = !on; $('#fx-scrim').hidden = !on; if (on) $('#fx-close').focus(); }
  if ($('#fx-checkout') && $('#fx-checkout').disabled) $('#fx-checkout').setAttribute('data-off', '1');
  root.addEventListener('click', function (e) {
    var b = e.target.closest('[data-add]');
    if (b) { add(b.getAttribute('data-add')); b.classList.add('is-added'); b.innerHTML = 'IN CART ✓'; setTimeout(function () { b.classList.remove('is-added'); b.innerHTML = 'BUY <span aria-hidden="true">→</span>'; }, 1400); openCart(true); return; }
    if (e.target.closest('#fx-cartbtn')) { openCart(true); return; }
    if (e.target.closest('#fx-close') || e.target.closest('#fx-scrim')) { openCart(false); return; }
    var q = e.target.closest('[data-q]');
    if (q) { var k = q.closest('li').getAttribute('data-k'), c = load(), d = q.getAttribute('data-q'); if (d === 'x') delete c[k]; else { c[k] = Math.max(1, Math.min(10, c[k] + Number(d))); } save(c); return; }
    var info = e.target.closest('[data-info]');
    if (info) { e.preventDefault(); var card = info.closest('.fx-card'); var dlg = document.getElementById('fx-info'); document.getElementById('fx-info-t').textContent = card.querySelector('.fx-name').textContent; document.getElementById('fx-info-d').textContent = card.querySelector('.fx-desc').textContent || ''; if (dlg.showModal) dlg.showModal(); return; }
    var cat = e.target.closest('.fx-cat');
    if (cat && dataEl) { e.preventDefault(); setCat(cat.getAttribute('data-cat')); history.replaceState(null, '', cat.getAttribute('data-cat') ? '/shop?cat=' + cat.getAttribute('data-cat') : '/shop'); }
  });
  document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && $('#fx-drawer') && !$('#fx-drawer').hidden) openCart(false); });
  var curCat = D.cat || '';
  function filter() {
    var q = ($('#fx-q') && $('#fx-q').value || '').trim().toLowerCase(), shown = 0;
    root.querySelectorAll('.fx-card').forEach(function (c) { var ok = (!curCat || c.getAttribute('data-cat') === curCat) && (!q || c.getAttribute('data-name').indexOf(q) >= 0); c.hidden = !ok; if (ok) shown++; });
    var em = $('#fx-empty'); if (em) em.hidden = !!shown;
  }
  function setCat(c) {
    curCat = c || '';
    root.querySelectorAll('.fx-cat').forEach(function (a) { a.classList.toggle('is-on', a.getAttribute('data-cat') === curCat); });
    var on = root.querySelector('.fx-cat.is-on span'); var h = $('#fx-feat-h'); if (h) h.textContent = curCat && on ? on.textContent.toUpperCase() : 'FEATURED ITEMS';
    filter();
  }
  var qi = $('#fx-q'); if (qi && dataEl) { qi.addEventListener('input', filter); qi.form.addEventListener('submit', function (e) { e.preventDefault(); filter(); }); }
  if (dataEl) setCat(curCat);
  render();
  var m = /[?&]add=([sp]\d{1,9})/.exec(location.search);
  if (m && BY[m[1]]) { add(m[1]); openCart(true); history.replaceState(null, '', '/shop'); }
  if (/[?&]canceled=1/.test(location.search)) openCart(true);
  // Receipt page: a paid order empties the cart.
  if (/\/shop\/receipt\//.test(location.pathname) && /[?&]new=1/.test(location.search))