Popover
Popover is a non-modal floating panel pinned to a trigger. Unlike Dialog it takes no focus and draws no scrim — the page keeps working while the panel is open.
What it is
A compound component for anchored, non-modal content. Popover.Content renders into a
Portal and positions itself against the trigger using the
placement prop. It closes on Escape and on a click outside — there is no scrim, and focus is
never trapped.
Popover sits between Dialog and Tooltip. Use it for content that is interactive but not demanding: a filter panel, a settings menu, a small form. Modal interruptions belong in Dialog; purely descriptive text belongs in Tooltip.
Install
Anatomy
API
Popover.Root
Popover.Root
stablefunction Popover.Root(props: PopoverRootProps): JSX.Element
Controlled open state. Pass alongside `onOpenChange`.
Initial open state for the uncontrolled mode.
Called whenever the open state changes.
The Trigger and Content parts.
Popover.Trigger
Popover.Trigger
stablefunction Popover.Trigger(props: PopoverTriggerProps): JSX.Element
A single element. Popover clones it to add the toggle handler, `aria-expanded`, and `aria-controls`.
Popover.Content
Popover.Content
stablefunction Popover.Content(props: PopoverContentProps): JSX.Element | null
Where the panel sits relative to the trigger — `top`, `bottom`, `left`, `right`, and the corner variants.
Pixel gap between the trigger and the panel.
Close when the user clicks outside the panel.
Close when the user presses Escape. Focus returns to the trigger.
Inline style for the panel — positioning is applied on top.
The panel content.
Popover.Close
Popover.Close
stablefunction Popover.Close(props: PopoverCloseProps): JSX.Element
A single element. Popover clones it to add a click handler that closes the panel.
Accessibility
The trigger carries aria-expanded and aria-controls, so assistive technology announces that
it opens a panel and which one. The panel itself has role="dialog".
Because Popover does not trap focus, the panel's content must be reachable on its own — every interactive element inside needs to be keyboard-focusable in DOM order. Escape closes the panel and returns focus to the trigger, so a keyboard user is never stranded.
Examples
A filter panel: