import type { ReactNode } from 'react'; import type { BadgeVariant } from '@/components/ui/shared/Badge'; interface ToastProps { children: ReactNode; variant?: BadgeVariant; className?: string; } const variantStyles: Record = { success: 'bg-badge-success-bg text-badge-success-fg border-badge-success-border', warning: 'bg-badge-warning-bg text-badge-warning-fg border-badge-warning-border', danger: 'bg-badge-danger-bg text-badge-danger-fg border-badge-danger-border', default: 'bg-badge-default-bg text-badge-default-fg border-badge-default-border', }; export function Toast({ children, variant = 'default', className = '' }: ToastProps) { return (
{children}
); } export type ToastMessages = { error?: string; success?: string; info?: string; default?: string; }; export type ToastStackProps = ToastMessages & { className?: string; }; function hasToastMessages(messages: ToastMessages): boolean { return Boolean(messages.error || messages.success || messages.info || messages.default); } /** Renders active toast messages with shared badge colors (success / warning / danger / default). */ export function ToastStack({ error, success, info, default: defaultMessage, className = '' }: ToastStackProps) { if (!hasToastMessages({ error, success, info, default: defaultMessage })) { return null; } return (
{error && {error}} {info && {info}} {success && {success}} {defaultMessage && {defaultMessage}}
); } export type ToastViewportPosition = 'inline' | 'top' | 'bottom'; export type ToastViewportProps = ToastStackProps & { position?: ToastViewportPosition; }; const viewportPositionClass: Record, string> = { top: 'fixed top-4 left-0 right-0 z-[70] px-4 pointer-events-none', bottom: 'fixed bottom-4 left-0 right-0 z-[70] px-4 pointer-events-none', }; /** * Positions a ToastStack on the page. Use `inline` below a heading; `bottom` / `top` for overlays. */ export function ToastViewport({ position = 'inline', className = '', ...messages }: ToastViewportProps) { if (!hasToastMessages(messages)) { return null; } const stack = ; if (position === 'inline') { return stack; } return (
{stack}
); }