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 = `
`;
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.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}`;
}