Moodinary/UI

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.json
import
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

PropTipoDefaultDescripción
open / onOpenChangeboolean / (open: boolean) => void-Estado controlado y cambios.

AlertDialogContent

PropTipoDefaultDescripción
initialFocuselement | ref | function | booleanAlertDialogCancelDónde arranca el foco.

AlertDialogCancel

PropTipoDefaultDescripción
childrenReactNode"Cancelar"Texto secundario.

AlertDialogAction

PropTipoDefaultDescripción
variantButton variant"danger"Variante de la acción.

ConfirmDialog

PropTipoDefaultDescripción
openboolean-Estado controlado.
onOpenChange(open: boolean) => void-Cambia el estado abierto.
onConfirm() => void-Ejecuta la acción. No cierra automáticamente.
title / descriptionReactNode-Pregunta y consecuencias.
pendingbooleanfalseDeshabilita los botones y oculta la X.
confirmLabel / pendingLabelstring"Confirmar" / "Confirmando…"Texto del botón.
confirmDisabledbooleanfalseBloquea confirmar.
confirmVariant"danger" | "secondary" | "primary""danger"Variante del botón.
cancelLabelstring"Cancelar"Texto para cancelar.
errorReactNode-Error visible con role alert.
childrenReactNode-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.