SolidPeak Knitworks

Your Fallows

Courses you marked to track for later. From here you can move them to your cart or remove them entirely.

`; headerContainer.outerHTML = headerHTML; footerContainer.outerHTML = footerHTML; setTimeout(wireHeaderFooter, 50); } function wireHeaderFooter() { const navToggle = document.getElementById('nav-toggle'); const mobile = document.getElementById('mobile-nav'); navToggle?.addEventListener('click', () => mobile?.classList.toggle('hidden')); const themeBtns = [document.getElementById('theme-toggle'), document.getElementById('m-theme-toggle')].filter(Boolean); themeBtns.forEach(b => b.addEventListener('click', () => { document.documentElement.classList.toggle('dark'); localStorage.setItem('theme', document.documentElement.classList.contains('dark') ? 'dark' : 'light'); })); const openers = [document.getElementById('open-auth'), document.getElementById('m-open-auth')].filter(Boolean); const modal = document.getElementById('auth-modal'); openers.forEach(b => b.addEventListener('click', () => modal?.classList.remove('hidden'))); document.getElementById('close-auth')?.addEventListener('click', () => modal?.classList.add('hidden')); modal?.addEventListener('click', (e) => { if (e.target === modal) modal.classList.add('hidden'); }); const tabSignin = document.getElementById('tab-signin'); const tabRegister = document.getElementById('tab-register'); const formSignin = document.getElementById('form-signin'); const formRegister = document.getElementById('form-register'); tabSignin?.addEventListener('click', () => { tabSignin.classList.add('border-b-2', 'border-sky-600'); tabRegister.classList.remove('border-b-2', 'border-sky-600'); formSignin.classList.remove('hidden'); formRegister.classList.add('hidden'); }); tabRegister?.addEventListener('click', () => { tabRegister.classList.add('border-b-2', 'border-sky-600'); tabSignin.classList.remove('border-b-2', 'border-sky-600'); formRegister.classList.remove('hidden'); formSignin.classList.add('hidden'); }); formSignin?.addEventListener('submit', (e) => { e.preventDefault(); modal?.classList.add('hidden'); alert('Signed in successfully.'); }); formRegister?.addEventListener('submit', (e) => { e.preventDefault(); modal?.classList.add('hidden'); alert('Account created. Welcome!'); }); const banner = document.getElementById('cookie-banner'); const consent = localStorage.getItem('cookieConsent'); if (banner && !consent) banner.style.display = 'flex'; document.getElementById('cookie-accept')?.addEventListener('click', () => { localStorage.setItem('cookieConsent', 'accepted'); banner?.style && (banner.style.display = 'none'); }); document.getElementById('cookie-decline')?.addEventListener('click', () => { localStorage.setItem('cookieConsent', 'declined'); banner?.style && (banner.style.display = 'none'); }); } injectHeaderFooter(); async function loadFallows() { const idArray = JSON.parse(localStorage.getItem('fallows') || '[]'); const ids = new Set(idArray); const listEl = document.getElementById('fallows-list'); const emptyEl = document.getElementById('fallows-empty'); if (!ids.size) { emptyEl.classList.remove('hidden'); listEl.innerHTML = ''; return; } emptyEl.classList.add('hidden'); const data = await fetch('./catalog.json').then(r => r.json()); const items = data.filter(c => ids.has(c.id)); listEl.innerHTML = items.map(c => `

${c.title}

${c.category} • ${c.level} • ~${c.durationHours}h

${c.short}

$${c.price}
`).join(''); document.querySelectorAll('.btn-remove').forEach(b => { b.addEventListener('click', () => { const id = b.getAttribute('data-id'); ids.delete(id); localStorage.setItem('fallows', JSON.stringify([...ids])); loadFallows(); }); }); document.querySelectorAll('.btn-move').forEach(b => { b.addEventListener('click', () => { const id = b.getAttribute('data-id'); const cart = JSON.parse(localStorage.getItem('cart') || '{}'); cart[id] = (cart[id] || 0) + 1; localStorage.setItem('cart', JSON.stringify(cart)); ids.delete(id); localStorage.setItem('fallows', JSON.stringify([...ids])); loadFallows(); }); }); } loadFallows(); })();