class NotificationSystem { constructor() { this.container = document.getElementById('notification-container'); this.notifications = new Map(); } show(message, type = 'info', duration = 3000) { const id = Date.now().toString(); const notification = document.createElement('div'); notification.className = `notification notification-${type}`; const icon = this.createIcon(type); const content = this.createContent(message); const closeBtn = this.createCloseButton(id); const progress = this.createProgressBar(type); notification.appendChild(icon); notification.appendChild(content); notification.appendChild(closeBtn); notification.appendChild(progress); this.container.appendChild(notification); setTimeout(() => this.remove(id), duration); this.notifications.set(id, { element: notification, duration }); this.updateProgress(id); return id; } remove(id) { const notification = this.notifications.get(id); if (notification) { notification.element.style.animation = 'slideOutRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)'; setTimeout(() => { notification.element.remove(); this.notifications.delete(id); }, 300); } } updateProgress(id) { const notification = this.notifications.get(id); if (notification) { const progress = notification.element.querySelector('.notification-progress'); const startTime = Date.now(); const update = () => { const elapsed = Date.now() - startTime; const percent = 100 - (elapsed / notification.duration * 100); if (percent > 0) { progress.style.width = `${percent}%`; requestAnimationFrame(update); } }; requestAnimationFrame(update); } } createIcon(type) { const icon = document.createElement('i'); switch(type) { case 'success': icon.className = 'fas fa-check-circle'; icon.style.color = 'var(--success-color, #4caf50)'; break; case 'error': icon.className = 'fas fa-times-circle'; icon.style.color = 'var(--error-color, #f44336)'; break; case 'info': default: icon.className = 'fas fa-info-circle'; icon.style.color = 'var(--info-color, #2196f3)'; break; } return icon; } createContent(message) { const content = document.createElement('div'); content.className = 'notification-content'; content.innerHTML = message; return content; } createCloseButton(id) { const closeBtn = document.createElement('button'); closeBtn.className = 'notification-close'; closeBtn.innerHTML = ''; closeBtn.onclick = () => this.remove(id); return closeBtn; } createProgressBar(type) { const progress = document.createElement('div'); progress.className = 'notification-progress'; switch(type) { case 'success': progress.style.background = 'var(--success-color, #4caf50)'; break; case 'error': progress.style.background = 'var(--error-color, #f44336)'; break; case 'info': default: progress.style.background = 'var(--info-color, #2196f3)'; break; } return progress; } } const notifications = new NotificationSystem();