VerdantWave

Your Fallows

Resources you have saved to build your personal creative system. Remove any item when you are ready to move on.

`; const footerHTML = ``; headerEl.innerHTML = headerHTML; footerEl.innerHTML = footerHTML; // Re-attach header scripts const themeToggle = headerEl.querySelector('#themeToggle'); if (themeToggle) { themeToggle.addEventListener('click', function(e) { e.preventDefault(); document.body.classList.toggle('bg-forest-900'); document.body.classList.toggle('text-cream-50'); localStorage.setItem('verdantwave-theme', document.body.classList.contains('bg-forest-900') ? 'dark' : 'light'); }); } headerEl.querySelectorAll('[data-modal-open]').forEach(link => { link.addEventListener('click', function(event) { event.preventDefault(); const modal = document.getElementById(link.dataset.modalOpen); if (modal) modal.classList.replace('hidden', 'flex'); }); }); headerEl.querySelectorAll('[data-modal-close]').forEach(link => { link.addEventListener('click', function() { const dialog = link.closest('[role=dialog]'); if (dialog) dialog.classList.replace('flex', 'hidden'); }); }); // Cookie banner const banner = footerEl.querySelector('#cookieBanner'); if (banner) { if (localStorage.getItem('verdantwave-cookie-consent')) { banner.remove(); } else { const acceptBtn = footerEl.querySelector('#acceptCookies'); if (acceptBtn) { acceptBtn.addEventListener('click', function(e) { e.preventDefault(); localStorage.setItem('verdantwave-cookie-consent', 'yes'); banner.remove(); }); } } } } async function loadFallows() { const container = document.getElementById('fallowsContainer'); const emptyState = document.getElementById('emptyState'); let follows = []; try { follows = JSON.parse(localStorage.getItem('verdantwave-follows') || '[]'); } catch (e) {} if (!follows.length) { container.classList.add('hidden'); emptyState.classList.remove('hidden'); return; } container.classList.remove('hidden'); emptyState.classList.add('hidden'); let catalog = []; try { const res = await fetch('./catalog.json'); catalog = await res.json(); } catch (e) { container.innerHTML = '

Unable to load resources.

'; return; } const followedItems = catalog.filter(item => follows.includes(item.id)); if (!followedItems.length) { container.classList.add('hidden'); emptyState.classList.remove('hidden'); return; } container.innerHTML = ''; followedItems.forEach(item => { const card = document.createElement('div'); card.className = `p2aql rounded-[2rem] border border-sage-200 bg-cream-50 p-8 shadow-sm`; card.innerHTML = `
${item.category}

${item.title}

${item.description}

${item.duration} View in catalog
`; const removeBtn = card.querySelector('[data-remove-id]'); removeBtn.addEventListener('click', function() { let currentFollows = []; try { currentFollows = JSON.parse(localStorage.getItem('verdantwave-follows') || '[]'); } catch (e) {} currentFollows = currentFollows.filter(id => id !== item.id); localStorage.setItem('verdantwave-follows', JSON.stringify(currentFollows)); loadFallows(); }); container.appendChild(card); }); } function initTheme() { const savedTheme = localStorage.getItem('verdantwave-theme'); if (savedTheme === 'dark') { document.body.classList.add('bg-forest-900', 'text-cream-50'); } } document.addEventListener('DOMContentLoaded', async function() { await loadHeaderFooter(); initTheme(); await loadFallows(); });