Mavora Ledger

The learning shelf

Courses for the questions behind the plan.

Browse calm, educational resources. Prices are for course access and materials; lessons do not provide individualized financial advice.

`; const footerHTML=``; document.querySelector('header').outerHTML=headerHTML; document.querySelector('footer').outerHTML=footerHTML; const style=document.createElement('style');style.innerHTML='body{font-family:ui-sans-serif,system-ui,sans-serif}.font-serif{font-family:Georgia,Cambria,serif}';document.head.appendChild(style); const themeBtn=document.getElementById('theme-toggle');const applyTheme=t=>{document.documentElement.classList.toggle('dark',t==='dark');};let th=localStorage.getItem('mavora-theme')||'light';applyTheme(th);themeBtn.onclick=e=>{e.preventDefault();th=th==='light'?'dark':'light';localStorage.setItem('mavora-theme',th);applyTheme(th);}; const lb=document.getElementById('login-modal'),rb=document.getElementById('register-modal'),mm=document.getElementById('mobile-menu');document.getElementById('mobile-menu-open')?.addEventListener('click',e=>{e.preventDefault();mm.classList.toggle('hidden')});const show=m=>{const el=document.getElementById(m);el.classList.remove('hidden');el.classList.add('flex')};const hide=m=>{const el=document.getElementById(m);el.classList.add('hidden');el.classList.remove('flex')};document.getElementById('login-open')?.addEventListener('click',e=>{e.preventDefault();show('login-modal')});document.getElementById('register-open')?.addEventListener('click',e=>{e.preventDefault();show('register-modal')});document.getElementById('login-close')?.addEventListener('click',e=>{e.preventDefault();hide('login-modal')});document.getElementById('register-close')?.addEventListener('click',e=>{e.preventDefault();hide('register-modal')});document.getElementById('login-submit')?.addEventListener('click',e=>{e.preventDefault();hide('login-modal')});document.getElementById('register-submit')?.addEventListener('click',e=>{e.preventDefault();hide('register-modal')});const cb=document.getElementById('cookie-banner');if(localStorage.getItem('mavora-cookie-consent')==='accepted')cb?.classList.add('hidden');document.getElementById('cookie-accept')?.addEventListener('click',e=>{e.preventDefault();localStorage.setItem('mavora-cookie-consent','accepted');cb?.classList.add('hidden')}); const state={items:[],page:1,size:6};const getFav=()=>JSON.parse(localStorage.getItem('mavora-fallows')||'[]');const saveFav=x=>localStorage.setItem('mavora-fallows',JSON.stringify(x));const getCart=()=>JSON.parse(localStorage.getItem('mavora-cart')||'{}');const saveCart=x=>localStorage.setItem('mavora-cart',JSON.stringify(x)); fetch('./catalog.json').then(r=>r.json()).then(items=>{state.items=items;[...new Set(items.map(x=>x.category))].sort().forEach(c=>category.add(new Option(c,c)));render()}); const search=document.getElementById('search'),category=document.getElementById('category'),level=document.getElementById('level'),grid=document.getElementById('catalog-grid'),pagination=document.getElementById('pagination'),modal=document.getElementById('detail-modal'); [search,category,level].forEach(x=>x.addEventListener('input',()=>{state.page=1;render()})); function filtered(){let q=search.value.toLowerCase();return state.items.filter(x=>(!q||`${x.title} ${x.summary} ${x.category}`.toLowerCase().includes(q))&&(!category.value||x.category===category.value)&&(!level.value||x.level===level.value))} function render(){let all=filtered(),pages=Math.max(1,Math.ceil(all.length/state.size));state.page=Math.min(state.page,pages);grid.innerHTML=all.slice((state.page-1)*state.size,state.page*state.size).map(x=>`

${x.accent} · ${x.category}

${x.title}

${x.summary}

${x.duration} · ${x.lessons} lessons · $${x.price}

Read details${getFav().includes(x.id)?'Saved':'Follow'}Add to cart
`).join('');pagination.innerHTML=Array.from({length:pages},(_,i)=>`${i+1}`).join('')} document.addEventListener('click',e=>{let d=e.target.closest('[data-detail]'),f=e.target.closest('[data-fav]'),c=e.target.closest('[data-cart]'),p=e.target.closest('[data-page]');if(d){e.preventDefault();let x=state.items.find(y=>y.id===d.dataset.detail);document.getElementById('detail-content').innerHTML=`

${x.category} · ${x.level}

${x.title}

${x.description}

${x.duration} · ${x.lessons} lessons · ${x.format} · $${x.price}

Continue to cart Close`;modal.classList.remove('hidden');modal.classList.add('flex')}if(f){e.preventDefault();let a=getFav(),id=f.dataset.fav;a=a.includes(id)?a.filter(x=>x!==id):[...a,id];saveFav(a);render()}if(c){e.preventDefault();let a=getCart();a[c.dataset.cart]=(a[c.dataset.cart]||0)+1;saveCart(a);render()}if(p){e.preventDefault();state.page=+p.dataset.page;render()}if(e.target.id==='detail-close'||e.target===modal){e.preventDefault();modal.classList.add('hidden')}}})();