SharpShore Herb Guild
Cart

Your Cart

Adjust quantities or return to the catalog to add more courses.

Total: $0.00
`; const footerHTML = ` `; function insertPartials() { document.querySelector('header').outerHTML = headerHTML; document.querySelector('footer').outerHTML = footerHTML; wireHeader(); wireFooter(); } function wireHeader(){ const ol=document.getElementById('open-login'); const ot=document.getElementById('open-theme'); const lm=document.getElementById('login-modal'); const tm=document.getElementById('theme-modal'); const ce=document.querySelectorAll('[data-close-modal]'); ol?.addEventListener('click',(e)=>{e.preventDefault(); lm.classList.remove('hidden');}); ot?.addEventListener('click',(e)=>{e.preventDefault(); tm.classList.remove('hidden');}); ce.forEach(b=>b.addEventListener('click',()=> b.closest('.modal').classList.add('hidden'))); document.getElementById('set-light')?.addEventListener('click', ()=>{ localStorage.setItem('shg_theme','light'); document.documentElement.classList.remove('dark'); }); document.getElementById('set-dark')?.addEventListener('click', ()=>{ localStorage.setItem('shg_theme','dark'); document.documentElement.classList.add('dark'); }); document.getElementById('toggle-theme')?.addEventListener('click', ()=>{ const d=document.documentElement.classList.toggle('dark'); localStorage.setItem('shg_theme', d?'dark':'light'); }); const qs=document.getElementById('quick-search'); qs?.addEventListener('keydown',(e)=>{ if(e.key==='Enter'){ const q=qs.value.trim(); const u=new URL('./catalog.html',location.href); if(q) u.searchParams.set('q',q); location.href=u; } }); } function wireFooter(){ const c=document.getElementById('cookie-banner'); const a=document.getElementById('cookie-accept'); const d=document.getElementById('cookie-decline'); if(!c||!a) return; if(localStorage.getItem('shg_cookie_ok')==='true') c.classList.add('hidden'); else c.classList.remove('hidden'); a.addEventListener('click', ()=>{ localStorage.setItem('shg_cookie_ok','true'); c.classList.add('hidden'); }); d?.addEventListener('click', ()=>{ localStorage.setItem('shg_cookie_ok','false'); c.classList.add('hidden'); }); } insertPartials(); function getCart(){ try{ return JSON.parse(localStorage.getItem('shg_cart')||'[]'); }catch(e){ return []; } } function setCart(a){ localStorage.setItem('shg_cart', JSON.stringify(a)); } async function render(){ const wrap = document.getElementById('cart-list'); const items = getCart(); if(items.length===0){ wrap.innerHTML = '
Your cart is empty. Browse the catalog.
'; document.getElementById('total').textContent = '$0.00'; return; } const data = await fetch('./catalog.json').then(r=>r.json()); wrap.innerHTML = ''; let sum = 0; items.forEach(it=>{ const course = data.find(x=>x.id===it.id); if(!course) return; const row = document.createElement('div'); row.className = 'rounded-2xl p-5 bg-white dark:bg-white/5 border border-rose-200 dark:border-slate-700 flex items-center justify-between gap-4'; const line = course.price * it.qty; sum += line; row.innerHTML = `
${course.title}
${course.level} • ${course.durationWeeks} weeks
$${line.toFixed(2)}
Remove
`; wrap.appendChild(row); }); document.getElementById('total').textContent = '$' + sum.toFixed(2); document.querySelectorAll('[data-qty]').forEach(inp=>{ inp.addEventListener('change', ()=>{ const id = inp.getAttribute('data-qty'); const v = Math.max(1, parseInt(inp.value||'1',10)); const cart = getCart(); const it = cart.find(i=>i.id===id); if(it){ it.qty = v; setCart(cart); render(); } }); }); document.querySelectorAll('[data-remove]').forEach(a=>{ a.addEventListener('click', (ev)=>{ ev.preventDefault(); const id = a.getAttribute('data-remove'); const cart = getCart().filter(i=>i.id!==id); setCart(cart); render(); }); }); } render(); // Checkout modal const checkout = document.getElementById('checkout'); const modal = document.getElementById('checkout-modal'); checkout.addEventListener('click', (e)=>{ e.preventDefault(); modal.classList.remove('hidden'); localStorage.removeItem('shg_cart'); render(); }); modal.querySelectorAll('[data-close-modal]').forEach(b=> b.addEventListener('click', ()=> modal.classList.add('hidden')));