"use client";
import { Button } from "@/components/ui/button";import { toast } from "@/components/ui/toast";
export function ToastDemo() { function showToast() { const id = toast.add({ title: "Event created", description: "Sunday, December 3 at 9:00 AM", actionProps: { children: "Undo", onClick() { toast.close(id); }, }, }); }
return ( <Button variant="secondary" onClick={showToast}> Show Toast </Button> );}pnpm dlx shadcn@latest add @herocn/toastimport { toast } from "@/components/ui/toast"toast.add({ title: "Event created", description: "Sunday, December 3 at 9:00 AM",})Use the following composition to build a Toast:
Toaster├── ToastProvider│ └── ToastPortal│ └── ToastViewport│ └── ToastList│ └── Toast│ ├── ToastContent│ │ ├── ToastTitle│ │ └── ToastDescription│ ├── ToastAction│ └── ToastCloseToaster mounts the toast manager, portal, viewport, and list for you. The
lower-level parts (ToastProvider, ToastPortal, ToastViewport, Toast,
ToastContent, ToastTitle, ToastDescription, ToastAction, and
ToastClose) are also exported for building custom toast layouts.
Set the type option to render a status icon. The built-in renderer
recognizes success, info, warning, error, and loading.
"use client";
import { Button } from "@/components/ui/button";import { toast } from "@/components/ui/toast";
export function ToastTypes() { return ( <div className="flex flex-wrap gap-2"> <Button variant="secondary" onClick={() => toast.add({ title: "Event has been created." })} > Default </Button> <Button variant="tertiary" className="text-success-soft-foreground" onClick={() => toast.add({ type: "success", title: "Event has been created.", }) } > Success </Button> <Button variant="tertiary" className="text-primary-soft-foreground" onClick={() => toast.add({ type: "info", title: "Arrive 10 minutes before the event.", }) } > Info </Button> <Button variant="tertiary" className="text-warning-soft-foreground" onClick={() => toast.add({ type: "warning", title: "The event cannot start before 8:00 AM.", }) } > Warning </Button> <Button variant="destructive-soft" onClick={() => toast.add({ type: "error", title: "The event could not be created.", priority: "high", }) } > Error </Button> </div> );}Pass button props with actionProps to render an action.
"use client";
import { Button } from "@/components/ui/button";import { toast } from "@/components/ui/toast";
export function ToastAction() { function showToast() { const id = toast.add({ title: "Event created", description: "Sunday, December 3 at 9:00 AM", actionProps: { children: "Undo", onClick() { toast.close(id); }, }, }); }
return ( <Button variant="secondary" onClick={showToast}> Show Toast </Button> );}const id = toast.add({ title: "Event created", actionProps: { children: "Undo", onClick() { toast.close(id) }, },})Use toast.promise to update one toast as an asynchronous task moves through
loading, success, and error states.
"use client";
import { Button } from "@/components/ui/button";import { toast } from "@/components/ui/toast";
export function ToastPromise() { function showToast() { toast.promise( new Promise<{ name: string }>((resolve) => { window.setTimeout(() => resolve({ name: "Event" }), 2000); }), { loading: "Creating event…", success: (data) => `${data.name} created.`, error: "Could not create event.", }, ); }
return ( <Button variant="secondary" onClick={showToast}> Create Event </Button> );}See the Base UI Toast documentation for details about manager options, stacking, swipe dismissal, and the primitive API.