// Lightweight toast stack. Used by buttons/actions that want to confirm // they fired. Rendered by components/ToastStack.vue in the default layout. export type ToastTone = 'info' | 'ok' | 'warn' | 'bad' export interface Toast { id: number tone: ToastTone message: string hint?: string } const toasts = ref([]) let counter = 0 export const useToast = () => { function push(tone: ToastTone, message: string, hint?: string) { const id = ++counter toasts.value = [...toasts.value, { id, tone, message, hint }] const ttl = tone === 'bad' ? 7000 : 4000 setTimeout(() => { toasts.value = toasts.value.filter((t) => t.id !== id) }, ttl) } function dismiss(id: number) { toasts.value = toasts.value.filter((t) => t.id !== id) } return { toasts, push, info: (m: string, h?: string) => push('info', m, h), ok: (m: string, h?: string) => push('ok', m, h), warn: (m: string, h?: string) => push('warn', m, h), bad: (m: string, h?: string) => push('bad', m, h), dismiss, } }