Curated recipes by origin · process · roaster
${r.notes}
`; document.getElementById('modal').classList.add('open'); document.body.style.overflow = 'hidden'; } function closeModal(e) { if (e && e.target !== document.getElementById('modal')) return; document.getElementById('modal').classList.remove('open'); document.body.style.overflow = ''; } // Filter logic document.querySelectorAll('.filter-btn').forEach(btn => { btn.addEventListener('click', () => { document.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); const f = btn.dataset.filter; document.querySelectorAll('.card').forEach(card => { const show = f === 'all' ? true : f === 'approved' ? card.dataset.approved === 'true' : f === 'espresso' ? card.dataset.type === 'espresso' : f === 'blend' ? card.dataset.process === 'blend' : card.dataset.origin === f || card.dataset.process === f; card.classList.toggle('hidden', !show); }); }); });