Popover
Popover is a non-modal dialog that floats around a trigger. It's 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.
Import#
Popover
: The wrapper that provides props, state, and context to it's 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
: Obviously, a button to close the popover.
Basic Usage#
When using this component, ensure the children passed to PopoverTrigger
is
focusable, user can tab to it using their keyboard, and it can take a ref
.
It's critical for accessiblity.
A11y: When the Popover opens, focus is sent to the PopoverContent
. When
it closes, focus is returned to the trigger.
Rendering the Popover in a Portal#
By default, the Popover doesn't render in a Portal. To make them display in a
portal, pass the usePortal
prop.
You might need to Inspect Element to see this in action. Notice the
PopoverContent
is rendered as a child of <body>
Focus an element when Popover opens#
By default, focus is to sent to the PopoverContent
when it opens, you might
want to send focus to a specific element when it opens. Pass the
initialFocusRef
prop to do so.
Trapping Focus within Popover#
If the popover contains a form, you might need to trap focus within the popover and close it when the users fills the form and hit "save".
You can leverage
react-focus-lock to trap focus
within the PopoverContent
.
Controlled Usage#
You can completely controlled the opening and closing of the popover by passing
the isOpen
, and onClose
.
Sometime, you might need to set returnFocusOnClose
to false
to prevent
popver from returning focus to PopoverTrigger
's children.
Accessing Internal state#
Chakra provides access to two internal details, isOpen
and onClose
. Use the
render prop pattern to gain access to them.
Customizing the Popover#
Chakra exports all the components you need to customize the look and feel of the popover. You can change the background, arrow size, boxShadow and so on.
Popover Placements#
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 event the available space at the specified placment isn't enough.
Hover Trigger#
To show the popover when you mouse over or focus on the trigger, pass the prop
trigger
and set it to hover
. When you focus on or mouse over the popover
trigger, the popover will open.
If you quickly move your cursor to the popover content when it's open, it'll remain open till you leave.
Accessiblity#
When you see the word "trigger", it's referring to the children
of
PopoverTrigger
Keyboard and Focus#
- When the popover is opened, focus is moved to the
PopoverContent
. If theinitialFocusRef
is set, then focus moves to the element with thatref
. - When the popover is closed, focus returns to the trigger. If you set
returnFocusOnClose
tofalse
, focus will not return. - If trigger is set to
hover
:- Focusing on or mousing over the trigger will open the popover
- Blurring or mousing out of the trigger will close the popover. If you move
your mouse into the
PopoverContent
, it'll remain visible.
- If trigger is set to
click
:- Clicking the trigger or using the
Space
orEnter
when focus is on the trigger will open the popover. - Clicking the trigger again will close the popover.
- Clicking the trigger or using the
- Hitting the
Esc
key while the popover is open and focus is within thePopoverContent
, will close the popover. If you setcloseOnEsc
tofalse
, it will not close. - Clicking outside or blurring out of the
PopoverContent
closes the popover. If you setcloseOnBlur
tofalse
, it will not close.
ARIA Attributes#
- If the trigger is set to
click
, thePopoverContent
element has role set todialog
. If the trigger is set tohover
, thePopoverContent
hasrole
set totooltip
. - The
PopoverContent
hasaria-labelledby
set to theid
of thePopoverHeader
. - The
PopoverContent
hasaria-describedby
set to theid
of thePopoverBody
. - The
PopoverContent
hasaria-hidden
set totrue
orfalse
depending on the open/closed state of the popover. - The trigger has
aria-haspopup
set totrue
to denote that it triggers a popover. - The trigger has
aria-controls
set to theid
of thePopoverContent
to associate the popover and the trigger. - The trigger has
aria-expanded
set totrue
orfalse
depending on the open/closed state of the popover.
Props#
Popover Props#
Name | Type | Default | Description |
---|---|---|---|
isOpen | boolean | If true , the popover is shown | |
defaultIsOpen | boolean | If true , the popover is shown initially. | |
initialFocusRef | React.Ref | The ref of the element that should receive focus when the popover opens. | |
trigger | hover , click | click | The interaction that triggers the popover. |
placement | PopperJS.placement | bottom | The placement of the popover. |
returnFocusOnClose | boolean | true | If true , the popover will return focus to the trigger when it closes |
closeOnBlur | boolean | true | If true , the popover will close when you blur out it by clicking outside or tabbing out |
closeOnEsc | boolean | true | If true , close the popover when the esc key is pressed |
children | React.ReactNode , (props: InternalState) => React.ReactNode | The children of the popover | |
gutter | number | 4 | The gap (in pixels) to apply between the popover and the target. Used by popper.js |
usePortal | boolean | false | If true the popover is displayed with a Portal . Rendering content inside a Portal allows the popover content to escape the physical bounds of its parent while still being positioned correctly relative to its target |
onOpen | () => void | Callback fired when the popover opens | |
onClose | () => void | Callback fired when the popover closes |
Other Props#
PopoverContent
composesPseudoBox
and has the ability to smartly position itself. Thanks to popper.jsPopoverArrow
,PopoverHeader
,PopoverFooter
andPopoverBody
composesBox
.PopoverCloseButton
composesPseudoBox
component.