Popover

An accessible popup anchored to a button.

API reference

Import the component and assemble its parts:

Anatomy
import { Popover } from '@base-ui-components/react/popover';

<Popover.Root>
  <Popover.Trigger />
  <Popover.Portal>
    <Popover.Backdrop />
    <Popover.Positioner>
      <Popover.Popup>
        <Popover.Arrow />
        <Popover.Title />
        <Popover.Description />
        <Popover.Close />
      </Popover.Popup>
    </Popover.Positioner>
  </Popover.Portal>
</Popover.Root>

Root

Groups all parts of the popover. Doesn’t render its own HTML element.

PropTypeDefault
defaultOpen

boolean

false

open

boolean

undefined

onOpenChange

((open: boolean, event: Event | undefined, reason: "click" | "hover" | "focus" | "focus-out" | "escape-key" | "outside-press" | "trigger-press" | undefined) => void)

undefined

actionsRef

RefObject

undefined

modal

boolean

false

onOpenChangeComplete

((open: boolean) => void)

undefined

openOnHover

boolean

false

delay

number

300

closeDelay

number

0

children

ReactNode

undefined

Trigger

A button that opens the popover. Renders a <button> element.

PropTypeDefault
className

string | ((state: State) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: State) => ReactElement)

undefined

Attribute
Description
data-popup-open
data-pressed

Backdrop

An overlay displayed beneath the popover. Renders a <div> element.

PropTypeDefault
className

string | ((state: State) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: State) => ReactElement)

undefined

Attribute
Description
data-open
data-closed
data-starting-style
data-ending-style

Portal

A portal element that moves the popup to a different part of the DOM. By default, the portal element is appended to <body>.

PropTypeDefault
container

null | HTMLElement | RefObject

undefined

children

ReactNode

undefined

keepMounted

boolean

false

Positioner

Positions the popover against the trigger. Renders a <div> element.

PropTypeDefault
open

boolean

undefined

align

"center" | "end" | "start"

'center'

alignOffset

| number
| ((data: { side, align, anchor, positioner }) => number)

0

side

| "left"
| "right"
| "bottom"
| "top"
| "inline-end"
| "inline-start"

'bottom'

sideOffset

| number
| ((data: { side, align, anchor, positioner }) => number)

0

arrowPadding

number

5

anchor

| null
| Element
| RefObject
| VirtualElement
| (() => null | Element | VirtualElement)

undefined

collisionBoundary

| Element
| "clipping-ancestors"
| Element[]
| { x: number; y: number; height: number; width: number; }

'clipping-ancestors'

collisionPadding

| number
| { left?: number
| undefined; right?: number
| undefined; bottom?: number
| undefined; top?: number
| undefined; }

5

sticky

boolean

false

positionMethod

"fixed" | "absolute"

'absolute'

trackAnchor

boolean

true

className

string | ((state: State) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: State) => ReactElement)

undefined

Attribute
Description
data-open
data-closed
data-anchor-hidden
data-side
CSS Variable
Description
--anchor-height
--anchor-width
--available-height
--available-width
--transform-origin

A container for the popover contents. Renders a <div> element.

PropTypeDefault
initialFocus

| RefObject
| ((interactionType: InteractionType) => RefObject)

undefined

finalFocus

RefObject

undefined

className

string | ((state: State) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: State) => ReactElement)

undefined

Attribute
Description
data-open
data-closed
data-instant
data-side
data-starting-style
data-ending-style

Arrow

Displays an element positioned against the popover anchor. Renders a <div> element.

PropTypeDefault
className

string | ((state: State) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: State) => ReactElement)

undefined

Attribute
Description
data-open
data-closed
data-uncentered
data-anchor-hidden
data-side

Title

A heading that labels the popover. Renders an <h2> element.

PropTypeDefault
className

string | ((state: unknown) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: unknown) => ReactElement)

undefined

Description

A paragraph with additional information about the popover. Renders a <p> element.

PropTypeDefault
className

string | ((state: unknown) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: unknown) => ReactElement)

undefined

Close

A button that closes the popover. Renders a <button> element.

PropTypeDefault
className

string | ((state: unknown) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: unknown) => ReactElement)

undefined