"use client"; /** * Tiny toast bus: destructive-but-reversible actions (delete deck, remove a * file) show an Undo toast instead of a blocking confirm. */ export type ToastInput = { message: string; actionLabel?: string; onAction?: () => void; durationMs?: number; }; export type Toast = ToastInput & { id: number }; const listeners = new Set<(toast: Toast) => void>(); let nextId = 1; export function showToast(input: ToastInput): number { const toast: Toast = { durationMs: 5000, ...input, id: nextId++ }; listeners.forEach((listener) => listener(toast)); return toast.id; } export const toastBus = { subscribe(listener: (toast: Toast) => void): () => void { listeners.add(listener); return () => listeners.delete(listener); }, };