SpartanNest Works
Cart 0

Personal signal / 06

Fallows: courses worth returning to

Fallows keeps your selected course signals in this browser so you can compare pathways without losing your place.

Find more courses Open cart
`; const footerHTML = ``; headerEl.innerHTML = headerHTML; footerEl.innerHTML = footerHTML; initAllScripts(); initFallows(); } function initAllScripts() { // Theme toggle const themeToggle = document.getElementById('theme-toggle'); if (themeToggle) { const savedTheme = localStorage.getItem('spartanNestTheme'); if (savedTheme === 'light') document.documentElement.classList.add('light'); themeToggle.addEventListener('click', () => { if (document.documentElement.classList.contains('light')) { document.documentElement.classList.remove('light'); localStorage.setItem('spartanNestTheme', 'dark'); } else { document.documentElement.classList.add('light'); localStorage.setItem('spartanNestTheme', 'light'); } }); } // Cart count function updateCartCount() { const cartCount = document.getElementById('cart-count'); if (cartCount) { const cart = JSON.parse(localStorage.getItem('spartanNestCart') || '[]'); cartCount.textContent = cart.length; } } updateCartCount(); // Mobile menu const mobileBtn = document.getElementById('mobile-menu-open'); const mobileMenu = document.getElementById('mobile-menu'); if (mobileBtn && mobileMenu) { mobileBtn.addEventListener('click', () => { mobileMenu.classList.toggle('hidden'); }); } // Login modal const loginOpen = document.getElementById('login-open'); const loginModal = document.getElementById('login-modal'); const loginClose = document.getElementById('login-close'); const loginForm = document.getElementById('login-form'); if (loginOpen && loginModal) { loginOpen.addEventListener('click', () => loginModal.classList.remove('hidden')); if (loginClose) loginClose.addEventListener('click', () => loginModal.classList.add('hidden')); if (loginForm) { loginForm.addEventListener('submit', function(e) { e.preventDefault(); loginModal.classList.add('hidden'); alert('Signed in successfully.'); }); } } // Cookie banner const cookieBanner = document.getElementById('cookie-banner'); const cookieAccept = document.getElementById('cookie-accept'); if (cookieBanner && cookieAccept && !localStorage.getItem('spartanNestCookies')) { cookieBanner.classList.remove('hidden'); cookieAccept.addEventListener('click', () => { localStorage.setItem('spartanNestCookies', 'accepted'); cookieBanner.classList.add('hidden'); }); } // Register modal stub const regOpen = document.getElementById('register-open'); if (regOpen) { regOpen.addEventListener('click', () => { const regModal = document.createElement('div'); regModal.className = 'fixed inset-0 z-50 flex items-center justify-center bg-black/70'; regModal.innerHTML = `

Create your account

`; document.body.appendChild(regModal); regModal.querySelector('.close-reg').addEventListener('click', () => regModal.remove()); regModal.querySelector('#reg-form').addEventListener('submit', function(e){ e.preventDefault(); regModal.remove(); }); }); } } async function initFallows() { const grid = document.getElementById('favorites-grid'); const empty = document.getElementById('empty-state'); const favIds = JSON.parse(localStorage.getItem('spartanNestFavorites') || '[]'); if (!favIds.length) { empty.classList.remove('hidden'); return; } try { const res = await fetch('./catalog.json'); const courses = await res.json(); const favorites = courses.filter(c => favIds.includes(c.id)); if (!favorites.length) { empty.classList.remove('hidden'); localStorage.removeItem('spartanNestFavorites'); return; } grid.innerHTML = ''; favorites.forEach(course => { const card = document.createElement('div'); card.className = 'p2aql group flex flex-col justify-between rounded-3xl border border-slate-800 bg-slate-900 p-6 xk9h7'; card.innerHTML = `
${course.module} ${course.checkpoints} checkpoints

${course.title}

${course.description}

Structural score: ${course.score}
View details
`; const removeBtn = card.querySelector('.remove-btn'); removeBtn.addEventListener('click', () => { let currentFavs = JSON.parse(localStorage.getItem('spartanNestFavorites') || '[]'); currentFavs = currentFavs.filter(id => id !== course.id); localStorage.setItem('spartanNestFavorites', JSON.stringify(currentFavs)); card.remove(); if (grid.children.length === 0) { empty.classList.remove('hidden'); } }); grid.appendChild(card); }); } catch(e) { grid.innerHTML = `

Unable to load saved courses at this time.

`; } } document.addEventListener('DOMContentLoaded', loadComponents);