Voxelle HomeCare

Your learning basket

Review your selected lessons. This demonstration calculates a local total and does not process payment.

Total: $0.00

Continue browsing
`; } } function initHeaderScripts() { const d = document.documentElement; const saved = localStorage.getItem('voxelle-theme'); if (saved === 'dark') { d.classList.add('dark'); } else if (saved === 'light') { d.classList.remove('dark'); } else if (window.matchMedia('(prefers-color-scheme: dark)').matches) { d.classList.add('dark'); localStorage.setItem('voxelle-theme','dark'); } const themeBtn = document.getElementById('theme-toggle'); if (themeBtn) { themeBtn.addEventListener('click', () => { d.classList.toggle('dark'); localStorage.setItem('voxelle-theme', d.classList.contains('dark') ? 'dark' : 'light'); }); } const mobileToggle = document.getElementById('mobile-menu-toggle'); const mobileMenu = document.getElementById('mobile-menu'); if (mobileToggle && mobileMenu) { mobileToggle.addEventListener('click', (e) => { mobileMenu.classList.toggle('hidden'); e.currentTarget.setAttribute('aria-expanded', String(!mobileMenu.classList.contains('hidden'))); }); } const authModal = document.getElementById('auth-modal'); const authClose = document.getElementById('auth-close'); const authTitle = document.getElementById('auth-title'); if (authModal && authClose) { document.querySelectorAll('[data-auth]').forEach(el => { el.addEventListener('click', (e) => { e.preventDefault(); if (authTitle) authTitle.textContent = el.dataset.auth === 'login' ? 'Sign in to Voxelle HomeCare' : 'Create your Voxelle HomeCare account'; authModal.classList.remove('hidden'); authModal.classList.add('flex'); }); }); authClose.addEventListener('click', () => { authModal.classList.remove('flex'); authModal.classList.add('hidden'); }); authModal.addEventListener('click', (e) => { if (e.target === authModal) { authModal.classList.remove('flex'); authModal.classList.add('hidden'); } }); } } async function runCart() { await loadShared(); let data = []; let items = []; try { const res = await fetch('./catalog.json'); data = await res.json(); } catch (e) { data = []; } try { items = JSON.parse(localStorage.getItem('voxelle-cart') || '[]'); } catch (e) { items = []; } function draw() { let sum = 0; const listEl = document.getElementById('cart-list'); if (!listEl) return; if (items.length === 0) { listEl.innerHTML = '

Your basket is empty. Choose a course when you are ready.

'; document.getElementById('total').textContent = '$0.00'; return; } listEl.innerHTML = items.map(i => { const x = data.find(y => y.id === i.id); if (!x) return ''; sum += x.price * i.quantity; return `

${x.title}

$${x.price.toFixed(2)} each

Remove
`; }).join(''); document.getElementById('total').textContent = '$' + sum.toFixed(2); document.querySelectorAll('[data-qty]').forEach(el => { el.onchange = () => { const found = items.find(x => x.id === el.dataset.qty); if (found) { found.quantity = Math.max(1, Math.min(20, parseInt(el.value) || 1)); localStorage.setItem('voxelle-cart', JSON.stringify(items)); draw(); } }; }); document.querySelectorAll('[data-remove]').forEach(el => { el.onclick = (a) => { a.preventDefault(); items = items.filter(x => x.id !== el.dataset.remove); localStorage.setItem('voxelle-cart', JSON.stringify(items)); draw(); }; }); } draw(); const checkoutBtn = document.getElementById('checkout'); const confirmModal = document.getElementById('confirm-modal'); const confirmClose = document.getElementById('confirm-close'); if (checkoutBtn && confirmModal) { checkoutBtn.onclick = () => { confirmModal.classList.remove('hidden'); confirmModal.classList.add('flex'); }; } if (confirmClose && confirmModal) { confirmClose.onclick = () => { confirmModal.classList.remove('flex'); confirmModal.classList.add('hidden'); }; confirmModal.onclick = (e) => { if (e.target === confirmModal) { confirmModal.classList.remove('flex'); confirmModal.classList.add('hidden'); } }; } } runCart();