vaiperui

componentes / toast

Toast

Notificaciones temporales disparadas desde cualquier lugar con toast(), renderizadas por un único Toaster.

Cómo usar

Monta `<Toaster />` una vez cerca de la raíz y llama `toast({ ... })` (o `useToast()`) desde cualquier lugar; devuelve el id, y `toast.dismiss(id)` lo cierra. Los toasts se apilan en una región en portal, se cierran solos tras `duration` (5000 ms) y se pausan con hover o foco; `Esc` cierra el enfocado. `warning` y `danger` se anuncian de forma asertiva.

preview
Toast.tsx
import { Toaster, toast } from "vaiperui";
// once, at the app root
<Toaster position="top-right" />
toast({ variantColor: "success", title: "Guardado", description: "Tus cambios se guardaron." })
toast({
description: "Elemento eliminado.",
action: { label: "Deshacer", onClick: restore },
})

Colores

preview
variantColor
colores.tsx
toast({ variantColor: "primary", description: "primary" })
toast({ variantColor: "success", description: "success" })
toast({ variantColor: "warning", description: "warning" })
toast({ variantColor: "danger", description: "danger" })

Persistente y personalizado

preview
duration: 0
persistente.tsx
toast({ description: "...", duration: 0 })
toast({ customColor: "#8b5cf6", description: "Violeta" })

Props

PropValoresPredeterminadoDescripción
positiontop-left | top-center | top-right | bottom-left | bottom-center | bottom-righttop-rightToaster: dónde queda la pila
limitnumber5Toaster: máximo de toasts visibles
durationnumber5000Predeterminado del Toaster, o por toast: ms hasta cerrarse; 0 lo mantiene hasta cerrar
labelstringNotificationsToaster: nombre accesible de la región
dismissLabelstringDismissToaster: nombre accesible de los botones de cerrar
radiusnone | sm | md | lg | fulllgToaster: redondeo de las esquinas
title / descriptionReactNodeningunotoast(): el contenido (un string simple es la descripción)
variantColor / customColorprimary | success | warning | danger / CSS colorprimarytoast(): color; customColor lo reemplaza
iconReactNode | falseicono de estadotoast(): tu icono, o false para ocultarlo
action{ label, onClick }ningunotoast(): botón de acción; también cierra el toast
dismissiblebooleantruetoast(): mostrar el botón de cerrar
id / onClosestring / () => voidningunotoast(): un id repetido reemplaza el toast; onClose se ejecuta al cerrar

Accesibilidad

  • `Toaster` renderiza una `<section>` con `aria-label` tomado de `label` (por defecto "Notifications") dentro de un portal en `document.body`.
  • Cada toast es su propia región live: `role="alert"` para `warning` y `danger`, `role="status"` para `primary` y `success`.
  • El toast nunca recibe el foco al aparecer, así que no interrumpe la escritura ni la navegación.
  • El temporizador de cierre automático se pausa con el puntero sobre el toast, con el foco dentro y con la pestaña oculta; luego sigue con el tiempo restante.
  • El botón de cerrar es un `<button>` real con `aria-label` tomado de `dismissLabel` (por defecto "Dismiss"); `dismissible: false` lo quita.
  • La `action` de un toast es un `<button>` real que ejecuta `onClick` y luego cierra el toast.

Teclado

TeclaAcción
EscCierra el toast que contiene el foco.
Tab / Shift+TabMueve entre la acción y el botón de cerrar del toast; el foco pausa su temporizador.

Ten en cuenta

  • Como los toasts no reciben foco y pueden desaparecer, usuarios de teclado y lectores de pantalla pueden perdérselos: nunca uses un toast como único medio para transmitir información esencial o un error.
  • `Esc` solo funciona cuando el foco está dentro de un toast; no hay atajo global para alcanzar o cerrar toasts.
  • Traduce `label` y `dismissLabel` tú mismo; los valores por defecto están en inglés. Da a los toasts con `action` un `duration` largo o infinito (`0`).