document.addEventListener('DOMContentLoaded', () => { customElements.define('toast-manager', class Toaster extends HTMLElement { shadow constructor() { super() this.shadow = this.attachShadow({ mode: 'open' }) } connectedCallback() { this.shadow.innerHTML = `
` } showToast({ message, type = '', duration = 5000 }: { message: string, type?: string, duration?: number }) { const toast = document.createElement('div') toast.classList.add(...['toast-message', 'animate'].concat(type ? [type] : [])) toast.innerHTML = ` ${message} `; this.shadow.getElementById('toast-box')?.appendChild(toast) setTimeout(() => toast.remove(), duration) } }) const toastManager = document.createElement('toast-manager') document.body.appendChild(toastManager) window.addEventListener('toast', ({ detail }: any) => (toastManager as any).showToast(typeof detail === 'string' ? { message: detail } : detail)) }) export const flash = (message: string) => window.dispatchEvent(new CustomEvent('toast', { detail: { message } }))