Finelake Knit Studio
Home Catalog About Contact FAQ Cart Fallows Privacy Terms

Fallows

A calm space to gather courses you’re considering. Add notes to remember why each course matters.

`; const footerHTML = ` `; document.getElementById('site-header').innerHTML = headerHTML; document.getElementById('site-footer').innerHTML = footerHTML; // Theme buttons in header document.querySelectorAll('[data-toggle-theme]').forEach(btn => { btn.addEventListener('click', () => { document.documentElement.classList.toggle('dark'); localStorage.setItem('fl_theme', document.documentElement.classList.contains('dark') ? 'dark' : 'light'); }); }); // Login/Register modals const loginModal = document.getElementById('modal-login'); const registerModal = document.getElementById('modal-register'); document.querySelectorAll('[data-open-login]').forEach(btn => btn.addEventListener('click', () => loginModal.classList.remove('hidden'))); document.querySelectorAll('[data-open-register]').forEach(btn => btn.addEventListener('click', () => registerModal.classList.remove('hidden'))); document.querySelectorAll('#modal-login [data-close], #modal-register [data-close]').forEach(btn => { btn.addEventListener('click', () => { loginModal.classList.add('hidden'); registerModal.classList.add('hidden'); }); }); // Cookie banner const banner = document.getElementById('cookie-banner'); if (banner) { const consent = localStorage.getItem('fl_cookie_consent'); if (!consent) banner.classList.remove('hidden'); banner.querySelector('[data-accept]').addEventListener('click', () => { localStorage.setItem('fl_cookie_consent', 'accepted'); banner.classList.add('hidden'); }); banner.querySelector('[data-decline]').addEventListener('click', () => { localStorage.setItem('fl_cookie_consent', 'declined'); banner.classList.add('hidden'); }); } } async function loadFallows() { const favListEl = document.getElementById('favList'); const emptyState = document.getElementById('emptyState'); favListEl.innerHTML = ''; emptyState.classList.add('hidden'); const favorites = JSON.parse(localStorage.getItem('fl_favorites') || '[]'); if (favorites.length === 0) { emptyState.classList.remove('hidden'); return; } let courses = []; try { const res = await fetch('./catalog.json'); courses = await res.json(); } catch (e) { courses = []; } const favCourses = courses.filter(c => favorites.includes(c.id)); const notes = JSON.parse(localStorage.getItem('fl_notes') || '{}'); favCourses.forEach(course => { const li = document.createElement('li'); li.className = `p-6 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg xk9h7 dd23l`; li.innerHTML = `
${course.title}
${course.level} · ${course.duration} · ${course.format}
$${course.price}
${course.rating} · ${course.reviews} reviews

${course.description}

`; const textarea = li.querySelector('textarea'); textarea.addEventListener('input', () => { const currentNotes = JSON.parse(localStorage.getItem('fl_notes') || '{}'); currentNotes[course.id] = textarea.value; localStorage.setItem('fl_notes', JSON.stringify(currentNotes)); }); li.querySelector('.remove-btn').addEventListener('click', () => { let favs = JSON.parse(localStorage.getItem('fl_favorites') || '[]'); favs = favs.filter(id => id !== course.id); localStorage.setItem('fl_favorites', JSON.stringify(favs)); loadFallows(); }); li.querySelector('.cart-btn').addEventListener('click', () => { const cart = JSON.parse(localStorage.getItem('fl_cart') || '[]'); if (!cart.includes(course.id)) cart.push(course.id); localStorage.setItem('fl_cart', JSON.stringify(cart)); let favs = JSON.parse(localStorage.getItem('fl_favorites') || '[]'); favs = favs.filter(id => id !== course.id); localStorage.setItem('fl_favorites', JSON.stringify(favs)); loadFallows(); }); favListEl.appendChild(li); }); } async function init() { await inject HeaderFooter(); await loadFallows(); } window.onload = init;