Moodinary/UI

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

PropTipoDefaultDescripción
side"top" | "right" | "bottom" | "left""bottom"Lado del disparador.
align"start" | "center" | "end""center"Alineación sobre el disparador.
sideOffsetnumber8Distancia en px.
classNamestring-Ancho por defecto 288 px (w-72).

Popover

PropTipoDefaultDescripción
openboolean-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á PopoverClose en 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.