Alert dialog
Confirmar algo destructivo o irreversible. El foco empieza en Cancelar.
AlertDialog es una primitiva disponible, sin uso directo en la app actual. La app confirma borrados con ConfirmDialog, construido sobre Dialog. El ejemplo reproduce ese patrón real.
Instalación
shadcn
npx shadcn@latest add https://design.moodinary.com/r/alert-dialog.jsonimport
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from "@moodinary/ui/components/alert-dialog";
import { ConfirmDialog } from "@moodinary/ui/components/confirm-dialog";Ejemplos
Confirmación usada en la app
Eliminar un equipo deja sus miembros sin equipo asignado. El ejemplo no llama a una API ni elimina datos.
Código
delete-team.tsx
import { Button } from "@moodinary/ui/components/button";
import { ConfirmDialog } from "@moodinary/ui/components/confirm-dialog";
import { useCallback, useState } from "react";
export default function DeleteTeam() {
const [open, setOpen] = useState(false);
const show = useCallback(() => setOpen(true), []);
const confirm = useCallback(() => setOpen(false), []);
return (
<>
<Button onClick={show} variant="danger">
Eliminar equipo
</Button>
<ConfirmDialog
confirmLabel="Eliminar"
description={
<>
Se va a eliminar el equipo <strong>Equipo Ventas</strong>. Sus
miembros van a quedar sin equipo asignado.
</>
}
onConfirm={confirm}
onOpenChange={setOpen}
open={open}
pendingLabel="Eliminando…"
title="Eliminar equipo"
/>
</>
);
}Primitiva de biblioteca
AlertDialog conserva su ejemplo de galería. No representa un flujo del dashboard.
Código
library.tsx
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
AlertDialogTrigger,
} from "@moodinary/ui/components/alert-dialog";
import { Button } from "@moodinary/ui/components/button";
export default function LibraryAlertDialog() {
return (
<AlertDialog>
<AlertDialogTrigger render={<Button variant="danger" />}>
Descartar borrador
</AlertDialogTrigger>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>¿Descartar el borrador?</AlertDialogTitle>
<AlertDialogDescription>
Vas a perder los cambios de este borrador. Es un ejemplo de
biblioteca, no una acción de la app.
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel />
<AlertDialogAction>Descartar</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
);
}Props
AlertDialog
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| open / onOpenChange | boolean / (open: boolean) => void | - | Estado controlado y cambios. |
AlertDialogContent
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| initialFocus | element | ref | function | boolean | AlertDialogCancel | Dónde arranca el foco. |
AlertDialogCancel
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| children | ReactNode | "Cancelar" | Texto secundario. |
AlertDialogAction
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| variant | Button variant | "danger" | Variante de la acción. |
ConfirmDialog
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| open | boolean | - | Estado controlado. |
| onOpenChange | (open: boolean) => void | - | Cambia el estado abierto. |
| onConfirm | () => void | - | Ejecuta la acción. No cierra automáticamente. |
| title / description | ReactNode | - | Pregunta y consecuencias. |
| pending | boolean | false | Deshabilita los botones y oculta la X. |
| confirmLabel / pendingLabel | string | "Confirmar" / "Confirmando…" | Texto del botón. |
| confirmDisabled | boolean | false | Bloquea confirmar. |
| confirmVariant | "danger" | "secondary" | "primary" | "danger" | Variante del botón. |
| cancelLabel | string | "Cancelar" | Texto para cancelar. |
| error | ReactNode | - | Error visible con role alert. |
| children | ReactNode | - | Contenido opcional antes del footer. |
Cuándo sí y cuándo no
Hacé
- Nombrá lo que se elimina.
- Usá pending mientras esperás la API.
- Mostrá el error sin ocultar el diálogo.
Evitá
- No afirmes que se borran pulsos si la acción no lo hace.
- No cierres antes de saber el resultado.
- No reemplaces el verbo por OK.
Accesibilidad
- Hereda el foco modal y Esc de Dialog.
- Los errores usan role alert.
- La app no usa el rol alertdialog para estas confirmaciones.