Popover is a non-modal dialog that floats around a trigger. It is used to display contextual information to the user, and should be paired with a clickable trigger element.
Popover
is built on top of the Popper.js library,
and composes the Popper
component.
Popover
: The wrapper that provides props, state, and context to its
children.PopoverTrigger
: Used to wrap the reference (or trigger) element.PopoverContent
: The popover itself.PopoverHeader
: The header of the popover.PopoverBody
: The body of the popover.PopoverArrow
: A visual arrow that points to the reference (or trigger).PopoverCloseButton
: A button to close the popover.When using this component, ensure the children passed to PopoverTrigger
is
focusable. Users can tab to it using their keyboard, and it can take a ref
. It
is critical for accessiblity.
A11y: When Popover opens, focus is sent to
PopoverContent
. When it closes, focus is returned to the trigger.
By default, the Popover doesn't render in a Portal. To make them display in a
portal, wrap the PopoverContent
in a Portal
You might need to Inspect Element to see this in action. Notice that
PopoverContent
is rendered as a child of<body>
By default, focus is to sent to PopoverContent
when it opens. Pass the
initialFocusRef
prop to send focus to a specific element instead.
If the popover contains a form, you might need to trap focus within the popover and close it when the user fills the form and hits "save".
You can leverage
react-focus-lock to trap focus
within the PopoverContent
.
You can control the opening and closing of the popover by passing the isOpen
,
and onClose
props.
Sometimes you might need to set the returnFocusOnClose
prop to false
to
prevent popver from returning focus to PopoverTrigger
's children.
Chakra provides access to two internal details: isOpen
and onClose
. Use the
render prop pattern to gain access to them.
Chakra exports all the components you need to customize the look and feel of the popover. You can change the background, arrow size, box shadow and so on.
Since popover is powered by PopperJS, you can change the placement of the
popover by passing the placement
prop. See the props for the
possible placement values.
Even though you specified the placement, Popover will try to reposition itself in the event that available space at the specified placement isn't enough.
By default, the Popover
component renders children of PopoverContent
to the
DOM, meaning that invisible popover contents are still rendered but are hidden
by styles.
If you want to defer rendering of popover content until that Popover
is
opened, you can use the isLazy
prop. This is useful if your PopoverContent
needs to be extra performant, or make network calls on mount that should only
happen when the component is displayed.
When you see the word "trigger", it is referring to the
children
ofPopoverTrigger
PopoverContent
. If the
initialFocusRef
is set, then focus moves to the element with that ref
.returnFocusOnClose
to false
, focus will not return.hover
:PopoverContent
, it'll remain visible.click
:Space
or Enter
when focus is on the
trigger will open the popover.Esc
key while the popover is open and focus is within the
PopoverContent
, will close the popover. If you set closeOnEsc
to false
,
it will not close.PopoverContent
closes the popover.
If you set closeOnBlur
to false
, it will not close.click
, the PopoverContent
element has role set to
dialog
. If the trigger is set to hover
, the PopoverContent
has role
set to tooltip
.PopoverContent
has aria-labelledby
set to the id
of the
PopoverHeader
.PopoverContent
has aria-describedby
set to the id
of the
PopoverBody
.PopoverContent
has aria-hidden
set to true
or false
depending on
the open/closed state of the popover.aria-haspopup
set to true
to denote that it triggers a
popover.aria-controls
set to the id
of the PopoverContent
to
associate the popover and the trigger.aria-expanded
set to true
or false
depending on the
open/closed state of the popover.Name | Type | Description | Default |
---|---|---|---|
arrowShadowColor | string | The `box-shadow` of the popover arrow | - |
arrowSize | number | The size of the popover arrow | - |
autoFocus | boolean | If `true`, focus will be transferred to the first interactive element when the popover opens | - |
children | string | number | boolean | {} | ReactElement<any, string | ((props: any) => ReactElement<any, string | ... | (new (props: any) => Component<any, any, any>)> | null) | (new (props: any) => Component<...>)> | ... 49 more ... | The content of the popover. It is usually the `PopoverTrigger`, and `PopoverContent` | - |
closeDelay | number | - | |
closeOnBlur | boolean | If `true`, the popover will close when you blur out it by clicking outside or tabbing out | - |
closeOnEsc | boolean | If `true`, the popover will close when you hit the `Esc` key | - |
colorScheme | string | - | |
defaultIsOpen | boolean | If `true`, the popover will be initially opened. | - |
gutter | number | The gap (in pixels) to apply between the popover and the target. Used by `popper.js` | - |
id | string | The html `id` attribute of the popover. If not provided, we generate a unique id. This `id` is also used to auto-generate the `aria-labelledby` and `aria-decribedby` attributes that points to the `PopoverHeader` and `PopoverBody` | - |
initialFocusRef | RefObject<FocusableElement> | The `ref` of the element that should receive focus when the popover opens. | - |
isLazy | boolean | Performance 🚀: If `true`, the PopoverContent rendering will be deferred until the popover is open. | - |
isOpen | boolean | If `true`, the popover will be opened in controlled mode. | - |
modifiers | Modifier<string, any>[] | The Popper.js modifiers to use. | - |
onClose | (() => void) | Callback fired when the popover closes | - |
onOpen | (() => void) | Callback fired when the popover opens | - |
openDelay | number | - | |
orientation | "horizontal" | "vertical" | - | |
placement | "top" | "right" | "bottom" | "left" | "auto" | "auto-start" | "auto-end" | "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "right-end" | "left-start" | "left-end" | The placment of the popover | - |
returnFocusOnClose | boolean | If `true`, focus will be returned to the element that triggers the popover when it closes | - |
size | string | - | |
styleConfig | Record<string, any> | - | |
trigger | "click" | "hover" | The interaction that triggers the popover. `hover` - means the popover will open when you hover with mouse or focus with keyboard on the popover trigger `click` - means the popover will open on click or press `Enter` to `Space` on keyboard | - |
variant | string | - |
PopoverContent
composes Box
and has the ability to smartly position
itself. Thanks to popper.js.PopoverArrow
, PopoverHeader
, PopoverFooter
and PopoverBody
composes
Box
.PopoverCloseButton
composes Box
component.