RadiantVector

Your private browser list

Fallows

Keep promising learning paths close while you decide what belongs in your next creative season.

Return to catalog
`; const footerHTML = ``; document.querySelector('header').innerHTML = headerHTML; document.querySelector('footer').innerHTML = footerHTML; // Re-attach header/footer listeners const menu = document.querySelector('[data-mobile-menu]'); document.querySelector('[data-mobile-menu-toggle]')?.addEventListener('click', () => menu?.classList.toggle('hidden')); document.querySelector('[data-theme-toggle]')?.addEventListener('click', () => document.documentElement.classList.toggle('light')); const modal = document.querySelector('[data-auth-modal]'); document.querySelector('[data-login-open]')?.addEventListener('click', () => { modal.classList.remove('hidden'); modal.classList.add('flex'); }); document.querySelector('[data-register-open]')?.addEventListener('click', () => { modal.classList.remove('hidden'); modal.classList.add('flex'); document.querySelector('[data-auth-title]').textContent = 'Create your RadiantVector account'; }); document.querySelector('[data-auth-close]')?.addEventListener('click', () => { modal.classList.add('hidden'); modal.classList.remove('flex'); }); const banner = document.querySelector('[data-cookie-banner]'); if (localStorage.getItem('rv-cookie-accepted') === 'yes') banner?.remove(); document.querySelector('[data-cookie-close]')?.addEventListener('click', () => { localStorage.setItem('rv-cookie-accepted', 'yes'); banner?.remove(); }); })(); let data = []; async function loadData() { try { const res = await fetch('./catalog.json'); data = await res.json(); } catch (e) { data = []; } render(); } function render() { const ids = JSON.parse(localStorage.getItem('rv-fallows') || '[]'); const list = data.filter(x => ids.includes(x.id)); const grid = document.querySelector('#saved-grid'); if (!grid) return; grid.innerHTML = list.length ? list.map(x => `

${x.category}

${x.title}

${x.summary}

`).join('') : `

Your tracked list is empty. Save a course from the catalog to create a focused shortlist.

`; } document.addEventListener('click', e => { if (e.target.dataset.remove) { const numId = Number(e.target.dataset.remove); const ids = JSON.parse(localStorage.getItem('rv-fallows') || '[]').filter(id => id !== numId); localStorage.setItem('rv-fallows', JSON.stringify(ids)); render(); } }); document.addEventListener('DOMContentLoaded', () => { loadData(); });