Popover
Displays rich content in a portal, triggered by a button.
Made by imskyleenPowered by
Installation
Loading component...
Positioning
Loading component...
Controlled
Loading component...
When to use
The Popover component displays rich content in a positioned overlay triggered by user interaction. Use this decision tree to determine when it's appropriate:
Usage
<Popover>
<PopoverTrigger>Open Popover</PopoverTrigger>
<PopoverContent>Popover Content</PopoverContent>
</Popover>Examples
Date Picker Example
Loading component...
Props
Keyboard interactions
| Key | Action |
|---|---|
Enter / Space on PopoverTrigger | Toggles the popover open/closed. |
Tab / Shift+Tab | Cycles focus between focusable elements inside the popover. |
Escape | Closes the popover and restores focus to the trigger. |
Click outside PopoverContent | Closes the popover. |
Accessibility
PopoverTriggerexposesaria-expanded/aria-controlsfor the screen-reader state of the popover.PopoverContentis focusable and traps focus while open — pressingTabpast the last focusable control wraps back to the first.- The trigger must be a real button (or another interactive element via
asChild). Static<div>triggers lose focus behaviour. onOpenChangekeeps the Radix-style(open: boolean) => voidsignature via the Base UI compat layer.
Controlled vs uncontrolled
Uncontrolled — the popover owns open state:
<Popover onOpenChange={(open) => console.log('open:', open)}>
<PopoverTrigger>Open</PopoverTrigger>
<PopoverContent>{/* ... */}</PopoverContent>
</Popover>Controlled — drive open from parent state (e.g. to open the popover programmatically or close it after a form
submission):
const [open, setOpen] = useState(false);
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<Button onClick={() => undefined} variant="outline">Open</Button>
</PopoverTrigger>
<PopoverContent>
<Button onClick={() => setOpen(false)}>Done</Button>
</PopoverContent>
</Popover>Credits
- We use Base UI for the popover component.
- We take our inspiration from Shadcn UI for the popover style.
- We use Animate UI from imskyleen for all the animations.
Recent changes
- patchv1.2.0Pin shipped dependency floors to the version we develop against. Registry items now declare ranges like `^5.1.9` (the actual installed version) instead of collapsing to `^5.0.0`, so consumers start on the known-tested b…#133
- minorv1.1.0Theme docs refresh, readability pass on semantic foregrounds, and consumer-facing Base UI regression fixes.#121
- minorv1.0.0Post-Base-UI polish. Public API unchanged.#116
- majorv1.0.0Migrate every Radix-based primitive to `@base-ui/react@^1.4.0` (Base UI).#114
- patchv0.3.1**Accordion** - `AccordionTrigger` now shows `cursor-pointer` on hover.#112
Built by malinskibeniamin. The source code is available on GitHub.