Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import { AnimatePresence } from "motion/react"; import type { JSX } from "react"; import type { ToastItem } from "../../context/ToastContext.js"; import { Toast } from "./Toast.js"; import styles from "./ToastContainer.module.scss"; /** Props for the ToastContainer component. */ export interface ToastContainerProps { /** Active toast notifications to render. */ toasts: ToastItem[]; /** Callback to dismiss a toast by id. */ onDismiss: (id: string) => void; } /** * Fixed overlay that renders all active toasts at the top-center of the viewport. * Mount this once alongside your main app layout and pass toasts from context. */ export function ToastContainer({ toasts, onDismiss }: ToastContainerProps): JSX.Element { return ( <div className={styles.container} data-testid="toast-container"> <AnimatePresence> {toasts.map((toast) => ( <Toast key={toast.id} toast={toast} onDismiss={onDismiss} /> ))} </AnimatePresence> </div> ); } |