mirror of
https://github.com/imgfloat/server.git
synced 2026-02-05 11:49:25 +00:00
52 lines
1.8 KiB
JavaScript
52 lines
1.8 KiB
JavaScript
(function () {
|
|
const CONTAINER_ID = 'toast-container';
|
|
const DEFAULT_DURATION = 4200;
|
|
|
|
function ensureContainer() {
|
|
let container = document.getElementById(CONTAINER_ID);
|
|
if (!container) {
|
|
container = document.createElement('div');
|
|
container.id = CONTAINER_ID;
|
|
container.className = 'toast-container';
|
|
container.setAttribute('aria-live', 'polite');
|
|
container.setAttribute('aria-atomic', 'true');
|
|
document.body.appendChild(container);
|
|
}
|
|
return container;
|
|
}
|
|
|
|
function buildToast(message, type) {
|
|
const toast = document.createElement('div');
|
|
toast.className = `toast toast-${type}`;
|
|
|
|
const indicator = document.createElement('span');
|
|
indicator.className = 'toast-indicator';
|
|
indicator.setAttribute('aria-hidden', 'true');
|
|
|
|
const content = document.createElement('div');
|
|
content.className = 'toast-message';
|
|
content.textContent = message;
|
|
|
|
toast.appendChild(indicator);
|
|
toast.appendChild(content);
|
|
return toast;
|
|
}
|
|
|
|
function removeToast(toast) {
|
|
if (!toast) return;
|
|
toast.classList.add('toast-exit');
|
|
setTimeout(() => toast.remove(), 250);
|
|
}
|
|
|
|
window.showToast = function showToast(message, type = 'info', options = {}) {
|
|
if (!message) return;
|
|
const normalized = ['success', 'error', 'warning', 'info'].includes(type) ? type : 'info';
|
|
const duration = typeof options.duration === 'number' ? options.duration : DEFAULT_DURATION;
|
|
const container = ensureContainer();
|
|
const toast = buildToast(message, normalized);
|
|
container.appendChild(toast);
|
|
setTimeout(() => removeToast(toast), Math.max(1200, duration));
|
|
toast.addEventListener('click', () => removeToast(toast));
|
|
};
|
|
})();
|