TerraLance

Your course basket

Cart

Adjust your local course selections and review the total before deciding what to study.

`; const footerHTML = ` `; document.getElementById('site-header').innerHTML = headerHTML; document.getElementById('site-footer').innerHTML = footerHTML; const toggle = document.getElementById('mobile-menu-toggle'); const nav = document.getElementById('main-navigation'); toggle.addEventListener('click', () => { const expanded = toggle.getAttribute('aria-expanded') === 'true'; toggle.setAttribute('aria-expanded', !expanded); nav.classList.toggle('hidden'); nav.classList.toggle('flex'); nav.classList.toggle('flex-col'); nav.classList.toggle('w-full'); nav.classList.toggle('mt-4'); nav.classList.toggle('lg:flex'); }); const themeBtn = document.getElementById('theme-toggle'); function applyTheme(isDark) { if (isDark) { document.documentElement.style.setProperty('--page-bg', '#24332C'); document.body.style.background = '#24332C'; document.body.style.color = '#F7F1E8'; themeBtn.textContent = '☽'; } else { document.documentElement.style.setProperty('--page-bg', '#F7F1E8'); document.body.style.background = '#F7F1E8'; document.body.style.color = '#24332C'; themeBtn.textContent = '☀︎'; } localStorage.setItem('tl-theme', isDark ? 'dark' : 'light'); } themeBtn.addEventListener('click', () => { const current = localStorage.getItem('tl-theme') === 'dark'; applyTheme(!current); }); const saved = localStorage.getItem('tl-theme'); applyTheme(saved === 'dark'); const modal = document.getElementById('auth-modal'); const title = document.getElementById('auth-title'); const content = document.getElementById('auth-content'); const closeBtn = document.getElementById('close-auth'); function showAuth(type) { modal.classList.remove('hidden'); modal.classList.add('grid'); if (type === 'login') { title.textContent = 'Log in to TerraLance'; content.innerHTML = `
`; } else { title.textContent = 'Create your account'; content.innerHTML = `
`; } } document.getElementById('login-trigger').addEventListener('click', () => showAuth('login')); document.getElementById('register-trigger').addEventListener('click', () => showAuth('register')); closeBtn.addEventListener('click', () => { modal.classList.add('hidden'); modal.classList.remove('grid'); }); modal.addEventListener('click', (e) => { if (e.target === modal) { modal.classList.add('hidden'); modal.classList.remove('grid'); } }); (function() { const banner = document.getElementById('cookie-banner'); const acceptBtn = document.getElementById('accept-cookies'); const consentKey = 'terralance-cookie-consent'; if (!localStorage.getItem(consentKey)) banner.classList.remove('hidden'); acceptBtn.addEventListener('click', () => { localStorage.setItem(consentKey, 'true'); banner.classList.add('hidden'); }); })(); const cartItemsEl = document.getElementById('cart-items'); const totalEl = document.getElementById('cart-total'); const checkoutBtn = document.getElementById('checkout-trigger'); const checkoutModal = document.getElementById('checkout-modal'); const closeCheckout = document.getElementById('close-checkout'); let catalog = []; let cart = JSON.parse(localStorage.getItem('terralance-cart') || '{}'); async function loadCart() { try { const res = await fetch('./catalog.json'); catalog = await res.json(); } catch (_) { catalog = []; } renderCart(); } function saveCart() { localStorage.setItem('terralance-cart', JSON.stringify(cart)); } function updateTotal() { let sum = 0; Object.keys(cart).forEach(id => { const item = catalog.find(p => p.id === id); if (item) sum += item.price * cart[id]; }); totalEl.textContent = '$' + sum.toFixed(2); } function renderCart() { cartItemsEl.innerHTML = ''; const keys = Object.keys(cart); if (!keys.length) { cartItemsEl.innerHTML = `

Your cart is empty.

Browse courses
`; totalEl.textContent = '$0.00'; return; } keys.forEach(id => { const product = catalog.find(p => p.id === id); if (!product) return; const qty = cart[id]; const div = document.createElement('div'); div.className = 'flex items-center justify-between rounded-3xl border border-[#D8C7B5] bg-white p-6'; div.innerHTML = `
${product.title}
$${product.price} each
${qty}
`; cartItemsEl.appendChild(div); }); updateTotal(); cartItemsEl.querySelectorAll('[data-inc]').forEach(btn => { btn.addEventListener('click', () => { cart[btn.dataset.inc]++; saveCart(); renderCart(); }); }); cartItemsEl.querySelectorAll('[data-dec]').forEach(btn => { btn.addEventListener('click', () => { cart[btn.dataset.inc]--; if (cart[btn.dataset.inc] < 1) delete cart[btn.dataset.inc]; saveCart(); renderCart(); }); }); cartItemsEl.querySelectorAll('[data-rem]').forEach(btn => { btn.addEventListener('click', () => { delete cart[btn.dataset.rem]; saveCart(); renderCart(); }); }); } checkoutBtn.addEventListener('click', () => { checkoutModal.classList.remove('hidden'); checkoutModal.classList.add('grid'); }); closeCheckout.addEventListener('click', () => { checkoutModal.classList.add('hidden'); checkoutModal.classList.remove('grid'); }); checkoutModal.addEventListener('click', (e) => { if (e.target === checkoutModal) { checkoutModal.classList.add('hidden'); checkoutModal.classList.remove('grid'); } }); loadCart();