Moodinary/UI

Toast

Confirmar algo que ya pasó. Corto, se va solo en 4 s. Errores con acción para reintentar.

Avisos cortos sobre sonner para confirmar algo que ya pasó. Usa los tiempos por defecto de Sonner (4 s). Montá un <Toaster /> por app y llamá a toast() desde donde sea.

Instalación

shadcn
npx shadcn@latest add https://design.moodinary.com/r/toast.json
import
import { Toaster, toast } from "@moodinary/ui/components/toast";

Ejemplos

Estados

Guardado, con Deshacer, error con Reintentar y una promesa que pasa de cargando a listo.

Código
states.tsx
import { Button } from "@moodinary/ui/components/button";
import { Toaster, toast } from "@moodinary/ui/components/toast";

const generarInforme = () =>
	new Promise<string>((resolve) =>
		setTimeout(() => resolve("Informe_sept_4A.pdf"), 1800)
	);

export default function ToastStates() {
	return (
		<>
			<Button
				onClick={() =>
					toast.success("Cambios guardados", {
						description: "Personalización actualizada.",
					})
				}
				variant="secondary"
			>
				Guardado
			</Button>
			<Button
				onClick={() =>
					toast("Equipo archivado", {
						action: {
							label: "Deshacer",
							onClick: () =>
								toast.success("Listo", { description: "5.º B restaurado." }),
						},
						description: "5.º B ya no recibe pulsos.",
					})
				}
				variant="secondary"
			>
				Con acción
			</Button>
			<Button
				onClick={() =>
					toast.error("No pudimos enviar el informe", {
						action: { label: "Reintentar", onClick: () => undefined },
						description: "Revisá tu conexión.",
					})
				}
				variant="secondary"
			>
				Error
			</Button>
			<Button
				onClick={() =>
					toast.promise(generarInforme(), {
						error: "No pudimos generar el informe",
						loading: "Generando informe…",
						success: (archivo) => ({
							description: archivo,
							message: "Informe listo",
						}),
					})
				}
				variant="secondary"
			>
				Promesa
			</Button>
			<Toaster />
		</>
	);
}

Props

Toaster

PropTipoDefaultDescripción
durationnumber4000Milisegundos antes de irse.
position"top-left" | "top-center" | "top-right" | "bottom-left" | "bottom-center" | "bottom-right""bottom-right"Dónde aparecen.
toastOptionsToastOptions-Opciones por defecto; las classNames se combinan con las del AppToaster real.

toast

PropTipoDefaultDescripción
toast(title, { description, action })function-Aviso neutro.
toast.success / toast.errorfunction-Con ícono de éxito o error.
toast.promise(promise, { loading, success, error })function-Sigue una promesa de punta a punta.

Cuándo sí y cuándo no

Hacé
  • Escribí en pasado: Cambios guardados.
  • Ofrecé Deshacer en acciones reversibles.
  • En errores, sumá Reintentar.
Evitá
  • No uses toasts para errores de formulario; van junto al campo.
  • No muestres dos toasts por la misma acción.
  • No pongas info que haga falta leer después.

Accesibilidad

  • Se anuncian en una región viva sin mover el foco.
  • Los toasts con acción se pausan con hover y foco.
  • Las acciones se alcanzan con teclado.