Displays rich content in a portal, triggered by a button.
Installation
Install the packages
Add the shadcn/ui component
Animate it
The CLI finds your shadcn/ui components through components.json, swaps their primitive imports for Animate UI's and removes the CSS animation classes Motion replaces.
Usage
Import the primitive from Animate UI instead of Radix UI. Everything else stays the same.
import { Popover } from '@animate-ui/react/primitives/radix-ui';
export function SharePopover() {
return (
<Popover.Root>
<Popover.Trigger>Share</Popover.Trigger>
<Popover.Portal>
<Popover.Content sideOffset={4}>
Anyone with the link can view this document.
<Popover.Close aria-label="Close">×</Popover.Close>
</Popover.Content>
</Popover.Portal>
</Popover.Root>
);
}Coming from the @radix-ui/react-popover package? Use the subpath: import * as PopoverPrimitive from '@animate-ui/react/primitives/radix-ui/popover'.
Animation
The motion of Animate UI v1's Popover, value for value:
- Content grows from 0.8 and fades in, from the trigger (
--radix-popover-content-transform-origin, set inline so it works without styles), on a spring (stiffness 400, damping 29) that overshoots a little before it settles, by ~440ms. - It closes the same way: it shrinks back to 0.8 on the same spring while it fades out, then unmounts.
- Opening from the keyboard animates the same way. Focus goes back to the trigger once the exit is over.
- With
forceMount(on the Content or the Portal), the closed content stays in the DOM: it plays its exit, then is hidden andinert. - Reopening while it closes picks up from where it is, on the same spring.
- Open from the start (
defaultOpen), it plays the same entrance on page load, like v1. - Under reduced motion, it only fades (no scale).
API Reference
Every part takes exactly the props of Radix UI's Popover. Animate UI adds the animation props below.
Root, Trigger, Anchor, Portal, Close, Arrow
Radix UI props only. They are not animated.
Content
Radix UI props, plus:
| Prop | Type | Default |
|---|---|---|
transition? | Transition | { type: 'spring', stiffness: 400, damping: 29 } |
exitTransition? | Transition | transition |