Skip to content

Dialog

Modal centrado con overlay. Bloquea la interacción con el resto de la página hasta que se cierre.


Import

jsx
import {
  Dialog,
  DialogTrigger,
  DialogContent,
  DialogHeader,
  DialogTitle,
  DialogDescription,
  DialogFooter,
  DialogClose,
} from '@imansi/ui';

Uso básico

jsx
<Dialog>
  <DialogTrigger asChild>
    <Button>Abrir modal</Button>
  </DialogTrigger>
  <DialogContent>
    <DialogHeader>
      <DialogTitle>Título del modal</DialogTitle>
      <DialogDescription>
        Descripción corta de qué hace este modal.
      </DialogDescription>
    </DialogHeader>
    <DialogFooter>
      <DialogClose asChild>
        <Button variant="outline">Cancelar</Button>
      </DialogClose>
      <Button>Confirmar</Button>
    </DialogFooter>
  </DialogContent>
</Dialog>

Controlado

jsx
import { useState } from 'react';
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@imansi/ui';

export function Ejemplo() {
  const [abierto, setAbierto] = useState(false);

  return (
    <>
      <Button onClick={() => setAbierto(true)}>Abrir</Button>
      <Dialog open={abierto} onOpenChange={setAbierto}>
        <DialogContent>
          <DialogHeader>
            <DialogTitle>Modal controlado</DialogTitle>
          </DialogHeader>
        </DialogContent>
      </Dialog>
    </>
  );
}

Props

Dialog

PropTipoDefaultDescripción
openbooleanEstado controlado
defaultOpenbooleanfalseEstado inicial
onOpenChange(open: boolean) => voidCallback al abrir/cerrar
modalbooleantrueBloquea interacción con el fondo

DialogContent

PropTipoDefaultDescripción
classNamestringClases adicionales
onEscapeKeyDown(e) => voidHandler de Escape
onInteractOutside(e) => voidHandler de click afuera

Accesibilidad

  • Escape cierra el modal
  • Click en el overlay cierra el modal (configurable)
  • Tab cicla el foco dentro del modal (focus trap)
  • role="dialog" + aria-modal="true" + aria-labelledby + aria-describedby
  • Scroll del body se bloquea automáticamente

Hecho con ❤️ en Argentina