Popover
React Popover components display floating content anchored to a trigger element. They are commonly used for contextual information, settings panels, and inline actions that don’t require full navigation.
This Popover component is built with React and styled using Tailwind CSS. It uses Floating UI for positioning and provides accessible focus and keyboard handling.
Installation
Usage
Import the popover components and wrap a trigger with content.
import {
Popover,
PopoverTrigger,
PopoverContent,
PopoverHeading,
PopoverDescription,
PopoverClose
} from "@/registry/core/popover";
export default function Example() {
return (
<Popover>
<PopoverTrigger>Open Popover</PopoverTrigger>
<PopoverContent>
<PopoverHeading>Popover Title</PopoverHeading>
<PopoverDescription>
This is a short description inside the popover.
</PopoverDescription>
<PopoverClose className="mt-4 text-sm underline">Close</PopoverClose>
</PopoverContent>
</Popover>
);
}Examples
Default
Basic popover with heading and description.
<Popover>
<PopoverTrigger>Options</PopoverTrigger>
<PopoverContent>
<PopoverHeading>Settings</PopoverHeading>
<PopoverDescription>Manage only the settings you need.</PopoverDescription>
</PopoverContent>
</Popover>With Close Button
Include a close action inside the popover content.
<Popover>
<PopoverTrigger>Details</PopoverTrigger>
<PopoverContent>
<PopoverHeading>Profile</PopoverHeading>
<p className="text-sm">Edit your personal information.</p>
<PopoverClose className="mt-4 text-sm underline">Close</PopoverClose>
</PopoverContent>
</Popover>Controlled Open State
Control the open state using React state.
const [open, setOpen] = useState(false);
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger>Toggle</PopoverTrigger>
<PopoverContent>
<p>This popover is fully controlled.</p>
</PopoverContent>
</Popover>;Custom Placement
Change the popover position relative to the trigger.
<Popover placement="right-start">
<PopoverTrigger>Right Popover</PopoverTrigger>
<PopoverContent>Content positioned on the right.</PopoverContent>
</Popover>API Reference
Popover
| Prop | Type | Default | Description |
|---|---|---|---|
initialOpen | boolean | false | Initial uncontrolled open state |
open | boolean | – | Controlled open state |
onOpenChange | (open: boolean) => void | – | Called when open state changes |
placement | Placement (@floating-ui) | "bottom" | Position of popover relative to trigger |
modal | boolean | false | Trap focus while open |
PopoverTrigger
Wraps the clickable element that toggles the popover.
| Prop | Type | Default | Description |
|---|---|---|---|
asChild | boolean | false | Use any element as the trigger |
PopoverContent
Floating panel element that contains the popover UI.
| Prop | Type | Description |
|---|---|---|
style | React.CSSProperties | Inline style merged with floating-ui positioning styles |
ref | React.Ref<HTMLDivElement> | Used internally for positioning |
PopoverHeading
- Registers itself as the
aria-labelledbyfor the popover. - Automatically binds/unbinds when mounted/unmounted.
PopoverDescription
- Registers itself as
aria-describedbyfor the popover.
PopoverClose
A convenience button that closes the popover when clicked.
Accessibility
- Uses
aria-labelledbyandaria-describedby - Keyboard accessible with Tab, Arrow, Shift+Tab, and Escape
- Focus is managed automatically when the popover opens and closes
- Triggers expose
data-state="open" | "closed" - Works with screen readers and assistive technologies
- Supports modal focus trapping when enabled
Notes
- Uses
FloatingArrowfor accurate arrow positioning - Supports both controlled and uncontrolled states
- Automatically flips, shifts, and offsets using Floating UI middleware
asChildallows integrating with custom buttons (Radix-style)