Emberleaf Collective

Your local shelf

Fallows

Keep a quiet list of courses you want to revisit. Fallows stays in this browser, so your choices remain simple and private.

`; const footerHTML = ``; document.getElementById("site-header").innerHTML = headerHTML; document.getElementById("site-footer").innerHTML = footerHTML; const grid = document.querySelector("#trackedGrid"); const key = "emberleaf-favorites"; const esc = s => String(s).replace(/[&<>"']/g, c => ({"&":"&","<":"<",">":">",'"':""","'":"'"}[c])); function render(data) { const ids = JSON.parse(localStorage.getItem(key) || "[]"); const items = data.filter(p => ids.includes(p.id)); grid.innerHTML = items.length ? items.map(p => `

${esc(p.category)}

${esc(p.title)}

${esc(p.summary)}

View detailsRemove
`).join("") : `

Your Fallows shelf is ready for its first course.

Use the star on any catalog card to keep it here.

Browse the catalog
`; } document.addEventListener("click", e => { const x = e.target.closest("[data-remove]"); if (x) { e.preventDefault(); localStorage.setItem(key, JSON.stringify(JSON.parse(localStorage.getItem(key) || "[]").filter(id => id !== x.dataset.remove))); render(window.fallowData); } }); fetch("./catalog.json").then(r => r.json()).then(data => { window.fallowData = data; render(data); });