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);
})();