const STATUS_LABELS = { upcoming: "Noch nicht", pending: "Jetzt!", overdue: "Überfällig", snoozed: "Snoozed", taken: "Genommen ✓", missed: "Verpasst", }; export function showToast(msg, ms = 3000) { const el = document.getElementById("toast"); el.textContent = msg; el.hidden = false; clearTimeout(el._timer); el._timer = setTimeout(() => { el.hidden = true; }, ms); } export function showConfetti() { const el = document.getElementById("confetti"); el.hidden = false; el.classList.add("show"); setTimeout(() => { el.hidden = true; el.classList.remove("show"); }, 650); } export function showEasterEgg(title, text) { const overlay = document.getElementById("easterEgg"); overlay.innerHTML = `

🏆 ${title}

${text}

`; overlay.hidden = false; overlay.querySelector("#easterClose").addEventListener("click", () => { overlay.hidden = true; }); } export function renderSlots(slots, onTake, onSnooze) { const container = document.getElementById("slotCards"); container.innerHTML = slots.map((slot) => { const taken = slot.status === "taken"; const canTake = ["pending", "overdue", "snoozed", "upcoming"].includes(slot.status); return `
${slot.label} ${slot.time}
${slot.meds.map((m) => `${m.name} ${m.dose}`).join(", ")}
${STATUS_LABELS[slot.status] || slot.status} ${canTake && !taken ? `
` : ""}
`; }).join(""); container.querySelectorAll("[data-action]").forEach((btn) => { btn.addEventListener("click", () => { const slotId = btn.dataset.slot; const action = btn.dataset.action; if (action === "take") onTake(slotId); else if (action === "snooze15") onSnooze(slotId, 15); else if (action === "snooze30") onSnooze(slotId, 30); }); }); } export function renderHeatmap(days) { const container = document.getElementById("heatmap"); container.innerHTML = days.map((d) => `
` ).join(""); } export function updateStats(stats) { document.getElementById("statStreak").textContent = stats.streak; document.getElementById("statCompliance").textContent = `${stats.compliance_percent}%`; document.getElementById("statTaken").textContent = stats.total_taken; document.getElementById("streakBadge").textContent = `🔥 ${stats.streak}`; }