Popover
Contenido interactivo liviano anclado a un botón (filtros rápidos). Esc o click afuera cierra.
Contenido interactivo liviano anclado a un botón, como el detalle de un evento del calendario. Esc o un click afuera lo cierran.
Instalación
shadcn
npx shadcn@latest add https://design.moodinary.com/r/popover.jsonimport
import { domMax, LazyMotion } from "@moodinary/ui/lib/motion";
import { Popover, PopoverClose, PopoverContent, PopoverTrigger } from "@moodinary/ui/components/popover";Ejemplos
Evento del calendario
Detalle con acciones secundarias, como en el calendario de la app. Datos ilustrativos. Envolvé con LazyMotion features={domMax}, como hace el dashboard, para cargar la animación.
Código
filters.tsx
import { Button } from "@moodinary/ui/components/button";
import { PencilIcon, Trash2Icon } from "@moodinary/ui/components/icons";
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@moodinary/ui/components/popover";
import { domMax, LazyMotion } from "@moodinary/ui/lib/motion";
export default function CalendarEvent() {
return (
<LazyMotion features={domMax} strict>
<Popover>
<PopoverTrigger render={<Button variant="secondary" />}>
Reunión de equipo
</PopoverTrigger>
<PopoverContent align="start">
<div>
<p className="font-medium text-sm">Reunión de equipo</p>
<p className="mt-0.5 text-muted-foreground text-xs">
6 oct, 10:00 a 11:00
</p>
</div>
<div className="flex flex-wrap gap-1.5">
<Button size="sm" variant="secondary">
Desactivar
</Button>
<Button size="sm" variant="ghost">
<PencilIcon aria-hidden className="size-3.5" />
Editar
</Button>
<Button size="sm" variant="ghost">
<Trash2Icon aria-hidden className="size-3.5" />
Eliminar
</Button>
</div>
</PopoverContent>
</Popover>
</LazyMotion>
);
}Props
PopoverContent
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| side | "top" | "right" | "bottom" | "left" | "bottom" | Lado del disparador. |
| align | "start" | "center" | "end" | "center" | Alineación sobre el disparador. |
| sideOffset | number | 8 | Distancia en px. |
| className | string | - | Ancho por defecto 288 px (w-72). |
Popover
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| open | boolean | - | Estado controlado. |
| onOpenChange | (open: boolean) => void | - | Se llama al abrir o cerrar. |
Cuándo sí y cuándo no
Hacé
- Mostrá cuántos filtros hay activos en el botón.
- Mantené el contenido corto y escaneable.
- Usá
PopoverCloseen el botón de aplicar.
Evitá
- No pongas formularios largos; usá un Dialog.
- No lo abras con hover; eso es Hover card.
- No escondas ahí acciones que se usan todo el tiempo.
Accesibilidad
- El disparador expone
aria-expanded. - Esc cierra y devuelve el foco al botón.
- Tab recorre el contenido en orden.