Confirm
El momento "¿estás seguro?", en una sola pieza. Un Dialog que se comporta como alerta, un botón de cancelar y uno de acción, un guardia opcional de escribir para confirmar, y un hook que lo convierte en una promesa.
Instalación
pnpm dlx nachui add confirmAnatomía
Con solo un trigger como hijo, el panel se arma solo: ícono si le pasaste uno, título, descripción, el guardia de texto cuando hay
requireText, y abajo Cancelar y la acción. El panel tiene role="alertdialog", así que los lectores de pantalla lo anuncian como algo que espera una respuesta, y Escape y el overlay cuentan como cancelar.Pasale un
Confirm.Content para reordenar el footer o meter algo tuyo entre la descripción y los botones.Composición
Un hybrid es composición visible. Abrí
confirm.tsx y estos son los elements que lo forman, en este orden:Variantes
variant="destructive" pinta el botón de acción con los tokens destructivos y manda el foco inicial a Cancelar, así un Enter de más no borra nada. La variante por defecto enfoca la acción, porque ahí el camino rápido es el correcto.Confirmación asíncrona
Devolvé una promesa desde
onConfirm y el panel la espera. La acción muestra el spinner, los dos botones se deshabilitan, y Escape y el overlay dejan de cerrarlo. Se cierra cuando la promesa resuelve, y si rechaza se queda abierto con los botones de vuelta, para reintentar o salir.Escribir para confirmar
requireText agrega un input debajo de la descripción y mantiene la acción deshabilitada hasta que lo tipeado coincide exacto. Enter dentro del input confirma una vez que coincide.El hook
Envolvé la app, o la parte que hace preguntas, en
ConfirmProvider. Después useConfirm() te da una función que abre el panel y resuelve true al confirmar y false al cancelar, con Escape o con el overlay. Las llamadas se encolan, un panel a la vez.Three drafts in the archive.
Referencia de API
Confirm
| Prop | Type | Default | Description |
|---|---|---|---|
title | ReactNode | - | La pregunta, también el nombre accesible |
description | ReactNode | - | Qué pasa si dicen que sí |
icon | ReactNode | - | Se muestra en un círculo arriba del título |
variant | 'default' | 'destructive' | 'default' | Tono de la acción y dónde cae el foco |
confirmText | string | 'Confirm' | Etiqueta del botón de acción |
cancelText | string | 'Cancel' | Etiqueta del botón de cancelar |
requireText | string | - | Texto que hay que escribir antes de confirmar |
labels | Partial<{ confirm; cancel; typeToConfirm }> | Inglés | Todos los textos visibles, typeToConfirm es una función |
open | boolean | - | Estado abierto controlado |
defaultOpen | boolean | false | Estado abierto cuando no es controlado |
onOpenChange | (open: boolean) => void | - | Se llama cuando cambia el estado abierto |
onConfirm | () => void | Promise<void> | - | Lo llama la acción; una promesa lo deja pendiente |
onCancel | () => void | - | Lo llaman cancelar, Escape y el overlay |
className | string | - | Clases para el panel por defecto |
children | ReactNode | - | Un Confirm.Trigger y, opcionalmente, un Confirm.Content |
Confirm.Trigger
| Prop | Type | Default | Description |
|---|---|---|---|
asChild | boolean | false | Usa el elemento hijo como trigger |
className | string | - | Clases CSS adicionales |
Confirm.Content
| Prop | Type | Default | Description |
|---|---|---|---|
children | ReactNode | Cancelar y Acción | Reemplaza el footer; el encabezado y el guardia quedan |
className | string | - | Clases CSS adicionales |
Confirm.Cancel
| Prop | Type | Default | Description |
|---|---|---|---|
children | ReactNode | cancelText | Etiqueta |
className | string | - | Clases CSS adicionales |
... | - | - | Cualquier prop de Button salvo variant |
Confirm.Action
| Prop | Type | Default | Description |
|---|---|---|---|
children | ReactNode | confirmText | Etiqueta |
className | string | - | Clases CSS adicionales |
... | - | - | Cualquier prop de Button salvo variant |
useConfirm
| Firma | Descripción |
|---|---|
useConfirm(): (options: ConfirmOptions) => Promise<boolean> | Abre un panel, resuelve true al confirmar y false en cualquier otro caso |
ConfirmOptions acepta title, description, icon, variant, confirmText, cancelText, requireText y labels, con el mismo significado que las props de arriba. Necesita un ConfirmProvider por encima.¿Encontraste algo que mejorar?
¿Notaste un error, tipografía o detalle faltante en esta página? Ayúdanos a mejorar la documentación abriendo un issue en GitHub.