Your studio shelf

Fallows

Keep promising courses close while you decide which long step belongs to your practice next.

Return to catalog
`; const footerHTML = ` `; document.querySelector('header').innerHTML = headerHTML; document.querySelector('footer').innerHTML = footerHTML; let all = []; const grid = document.getElementById('saved-grid'); const ids = () => JSON.parse(localStorage.getItem('longstep-fallows') || '[]'); function render() { const saved = all.filter(p => ids().includes(p.id)); if (saved.length) { grid.innerHTML = saved.map(p => `

${p.category}

${p.title}

${p.summary}

`).join(''); } else { grid.innerHTML = `

Your shelf is ready for a first stitch.

Return to the velvet compass and follow a course that speaks to your current project.

`; } } fetch('./catalog.json') .then(res => res.json()) .then(data => { all = data; render(); }) .catch(() => { all = []; render(); }); document.addEventListener('click', e => { if (e.target.dataset.remove) { const current = ids().filter(x => x !== e.target.dataset.remove); localStorage.setItem('longstep-fallows', JSON.stringify(current)); render(); } }); // Re-attach header/footer scripts setTimeout(() => { const q = (id) => document.getElementById(id); q('mobile-menu-toggle')?.addEventListener('click', () => q('mobile-navigation')?.classList.toggle('hidden')); [['login-open','login-modal'],['register-open','register-modal']].forEach(([a,b]) => q(a)?.addEventListener('click', () => { q(b).classList.remove('hidden'); q(b).classList.add('flex'); })); document.querySelectorAll('[data-close-modal]').forEach((button) => button.addEventListener('click', () => q(button.dataset.closeModal)?.classList.add('hidden'))); q('theme-toggle')?.addEventListener('click', () => { document.documentElement.classList.toggle('theme-light'); localStorage.setItem('longstep-theme', document.documentElement.classList.contains('theme-light') ? 'light' : 'dark'); }); if (localStorage.getItem('longstep-theme') === 'light') document.documentElement.classList.add('theme-light'); const cookieBanner = document.getElementById('cookie-banner'); if (localStorage.getItem('longstep-cookie-consent') === 'accepted') cookieBanner?.remove(); document.getElementById('cookie-close')?.addEventListener('click', () => { localStorage.setItem('longstep-cookie-consent','accepted'); cookieBanner?.remove(); }); }, 50); })();