import State from '../core/state.js'; import { Bus } from '../core/bus.js'; function renderAchievements(achievements) { const container = document.getElementById('achievements-list'); if (!container) return; if (!achievements || achievements.length === 0) { container.innerHTML = '
No achievements yet
'; return; } // Show last 3 const last3 = achievements.slice(-3).reverse(); container.innerHTML = ''; for (const achId of last3) { const item = document.createElement('div'); item.className = 'achievement-item'; item.innerHTML = `
${getInitial(achId)}
${escapeHtml(achId)} Unlocked
`; container.appendChild(item); } } function getInitial(id) { return id.charAt(0).toUpperCase(); } function escapeHtml(str) { const div = document.createElement('div'); div.textContent = str; return div.innerHTML; } function showToast({ id, title, desc }) { const layer = document.getElementById('toast-layer'); if (!layer) return; const toast = document.createElement('div'); toast.className = 'toast'; toast.innerHTML = `
Achievement Unlocked
${escapeHtml(title || desc || id)}
`; layer.appendChild(toast); // Close button toast.querySelector('.toast-close').addEventListener('click', () => removeToast(toast)); // Auto dismiss setTimeout(() => removeToast(toast), 4000); } function removeToast(toast) { if (!toast.parentNode) return; toast.classList.add('toast-removing'); setTimeout(() => toast.remove(), 300); } function init() { State.subscribe('achievements', renderAchievements); // Listen for achievement unlocks Bus.on('achievement:unlocked', showToast); } init();