Modal
Diálogo superpuesto para confirmaciones, formularios y contenido contextual. Accessible con trap de focus y cierre con Escape.
Demo interactiva
Abrir modal
Estructura
import { Modal, ModalHeader, ModalTitle, ModalDescription, ModalFooter } from '@codeway/ui';
function ConfirmDialog() {
const [open, setOpen] = useState(false);
return (
<>
<Button onClick={() => setOpen(true)}>Abrir</Button>
<Modal open={open} onClose={() => setOpen(false)}>
<ModalHeader>
<ModalTitle>Título</ModalTitle>
<ModalDescription>Descripción opcional</ModalDescription>
</ModalHeader>
{/* Contenido libre aquí */}
<ModalFooter>
<Button variant="ghost" onClick={() => setOpen(false)}>
Cancelar
</Button>
<Button onClick={handleConfirm}>
Confirmar
</Button>
</ModalFooter>
</Modal>
</>
);
}Lineamientos
- • Cierre con Esc y click en backdrop
- •
aria-modal="true"yrole="dialog"automáticos - • Body scroll bloqueado mientras está abierto
- • Acción destructiva siempre a la derecha con variante
destructive - • En mobile: considerar bottom sheet en vez de modal centrado
- • Max-width de 32rem (max-w-lg) por defecto