diff --git a/assets/js/toast.js b/assets/js/toast.js index 8b5775a..5736bb5 100644 --- a/assets/js/toast.js +++ b/assets/js/toast.js @@ -1,17 +1,26 @@ /** - * Terminal-style toast notification system + * Terminal-style toast notification system with queuing */ +// Toast queue management +let toastQueue = []; +let currentToast = null; + function showToast(message, type = 'info', duration = 3000) { - // Remove any existing toasts - const existingToast = document.querySelector('.terminal-toast'); - if (existingToast) { - existingToast.remove(); + // Queue if a toast is already showing + if (currentToast) { + toastQueue.push({ message, type, duration }); + return; } + displayToast(message, type, duration); +} + +function displayToast(message, type, duration) { // Create toast element const toast = document.createElement('div'); toast.className = `terminal-toast toast-${type}`; + currentToast = toast; // Icon based on type const icons = { @@ -24,6 +33,7 @@ function showToast(message, type = 'info', duration = 3000) { toast.innerHTML = ` [${icons[type] || 'ℹ'}] ${message} + [×] `; // Add to document @@ -32,11 +42,36 @@ function showToast(message, type = 'info', duration = 3000) { // Trigger animation setTimeout(() => toast.classList.add('show'), 10); + // Manual dismiss handler + const closeBtn = toast.querySelector('.toast-close'); + closeBtn.addEventListener('click', () => dismissToast(toast)); + // Auto-remove after duration - setTimeout(() => { - toast.classList.remove('show'); - setTimeout(() => toast.remove(), 300); + const timeoutId = setTimeout(() => { + dismissToast(toast); }, duration); + + // Store timeout ID for manual dismiss + toast.timeoutId = timeoutId; +} + +function dismissToast(toast) { + // Clear auto-dismiss timeout + if (toast.timeoutId) { + clearTimeout(toast.timeoutId); + } + + toast.classList.remove('show'); + setTimeout(() => { + toast.remove(); + currentToast = null; + + // Show next toast in queue + if (toastQueue.length > 0) { + const next = toastQueue.shift(); + displayToast(next.message, next.type, next.duration); + } + }, 300); } // Convenience functions