Popover
Useful implementations of the Popover component include:
Popover sub-components
A Popover component consists of several sub-components that make it customizable and flexible for a variety of use cases. Here are the main sub-components:
Popover
: The wrapper component that encloses all the other sub-components. It manages the state and interaction logic of the popover. It also provides a context for the sub-components to communicate with each other.PopoverTrigger
: This is the component that triggers the opening and closing of the Popover content when interacted with (e.g., clicked or hovered). It is typically a button or a link, but it can also be any other element that can receive focus.PopoverContent
: This component wraps the content that will be displayed when the Popover is opened. It also positions the content relative to the trigger element.PopoverHeader
: This is an optional component that can be used to structure the content within the PopoverContent. It is typically used to render a title for the popover.PopoverBody
: This is also an optional component that can be used to structure the content within the PopoverContent. It is typically used to render the main content of the popover.PopoverAnchor
: This component is used to wrap the position-reference element. This is useful when you want to position the popover relative to an element other than the trigger element. For example, you can use this to position the popover relative to the trigger's parent element.PopoverCloseButton
: A component that renders a button to close the popover. It is typically rendered in the PopoverHeader component.PopoverArrow
: This is an optional component that renders an arrow pointing towards the trigger element. It is typically rendered in the PopoverContent component.The Popover component in Chakra UI also has various props to customize its behavior and appearance. For example, you can control the position and alignment of the popover, whether it should close when the user clicks outside of it, whether it should re-focus the trigger when it closes, and so on. We will explore more of this funcitonality and customization in the examples below.
While popovers can be quite useful, it's also important to use them judiciously. Overuse of popovers can disrupt the user's experience, making it feel cluttered or overwhelming. Additionally, it's essential to ensure that popovers behave well on all devices, including touch devices where hover interactions are not available.
These components can be imported as follows:
Examples
Basic Popover
Code
Portal Popover
A Portal in Chakra UI is used to render components to a DOM node that exists outside the DOM hierarchy of the parent component. This is useful when the parent's CSS or stacking context could affect the positioning or visibility of the child components. By wrapping thePopoverContent in a Portal, you ensure that the popover is displayed on top of other elements, without being affected by any parent elements' z-index or overflow properties.
In this specific example, when a user clicks the "Trigger" button, thePopoverContent appears. This content contains a PopoverArrow, a header (PopoverHeader), a close button (PopoverCloseButton), a body with a blue button (PopoverBody), and a footer (PopoverFooter).
Since this PopoverContent is rendered within a Portal, you might not immediately see the change in the DOM hierarchy unless you inspect the element using a tool like the browser's DevTools. On inspection, you'll notice that the PopoverContent is actually rendered as a direct child of the tag, rather than nested within its parent components. This example contains two buttons and two popover examples; each button will trigger a unique popover when clicked.
Code
Accessing the Internal State
The component begins by creating a reference, initRef, which is a handle to a DOM element in the component - in this case, the "Close" button. This useRef hook from React is necessary to allow the Popover component to control focus placement when the popover is opened. The closeOnBlur prop is set to false to prevent the popover from automatically closing when a user clicks outside of the popover. The placement prop is set to "left" to control where the popover will appear in relation to the trigger button.
The initialFocusRef prop is set to the initRef we created earlier, so that when the popover opens, the focus will immediately move to the close button inside the popover. The children of thePopover component is a render prop function, a function that takes an object argument and returns JSX. The object passed to this function contains properties that reflect the internal state of the Popover component, specifically isOpen (a boolean indicating whether the popover is open or closed) and onClose (a function to close the popover). These are used within the component to change the behavior and appearance based on the state of the popover. The PopoverTrigger contains a button that toggles the popover. Its label changes based on whether the popover is currently open or closed, by checking the isOpen state.
The PopoverContent component, wrapped in a Portal for better positioning and stacking behavior, contains the content of the popover. It includes a header, a close button, a body with a greeting and a placeholder image, and a footer. The close button inside the popover uses the onClose function passed to the render prop to close the popover when clicked. By leveraging the internal state provided by the Chakra UI Popover component, this component achieves a high level of interactivity and control over the user experience.
Code
Defining Focus
The use of initialFocusRef ensures that the input field inside the popover receives focus when the popover is opened. Additionally, the use of ref on the "Select" button enables focusing on the button after the popover is closed. This implementation provides a user-friendly and accessible way for users to seemlessly interact with the fewest number of clicks.
Code
Popover Customization
The PopoverTrigger contains a Box which acts as the clickable area to toggle the popover. The Box has a tabIndex of 0, which allows it to be focusable and navigable via keyboard, a role of "button"
By using the props available on each component as shown in this example, you can customize almost every aspect of the popover's appearance. This allows you to design a popover that perfectly fits your application's style and theme.
Code
Popover Placement
Below is a dropdown menu that contains all of the placement options for popovers. It is set to "auto placement" by default. But you can choose from the options to see how a popover placement renders in relation to its trigger element. Just click on the giant button-box to see it in action!
Each placement position is a combination of two parts: an edge (top, bottom, left, or right) and an alignment (start, end, or none). Because these types of spatial relationships can be a bit tricky at first to comprehend, here's what each placement means:
auto-start, auto, auto-end
: The auto placements will position the popover relative to the trigger based on the available space in the viewport. If 'start' or 'end' is specified, it will align the popover accordingly if space permits.top-start, top, top-end
: These placements will position the popover above the trigger element. top-start aligns the start of the popover with the start of the trigger, top centers it, and top-end aligns the end of the popover with the end of the trigger.bottom-start, bottom, bottom-end
: These placements will position the popover below the trigger element. Similar to the top placements, bottom-start aligns the start of the popover with the start of the trigger, bottom centers it, and bottom-end aligns the end of the popover with the end of the trigger.left-start, left, left-end
: These placements will position the popover to the left of the trigger element. left-start aligns the top of the popover with the top of the trigger, leftcenters it, and left-end aligns the bottom of the popover with the bottom of the trigger.right-start, right, right-end
: hese placements will position the popover to the right of the trigger element. right-start aligns the top of the popover with the top of the trigger, right centers it, and right-end aligns the bottom of the popover with the bottom of the trigger.Code
Additional Functionality and Considerations:
Did you know?
Creative Idea No. 1
Code
Creative Idea No. 2
Code
Creative Idea No. 3
Code
copyright © 2023 IHeartComponents | evanmarie.com
created with love by the I♥️Components team using
Special thanks to Stefan Bohacek / Generative Placeholders.