# Popper A React hooks wrapper for popper.js to dynamic positioning of containers around a reference. > This is an internal hook of Chakra-UI and it's not covered by semver, and may > cause unexpected or broken application behavior. Use them at your own risk. ## Installation ```sh yarn add @chakra-ui/popper ``` ## Basic usage By default, the `usePopper` hook returns props for the popper, reference and arrow. ```jsx import { Box } from '@chakra-ui/layout' import { Button } from '@chakra-ui/button' import { useDisclosure } from "@chakra-ui/hooks" import { usePopper } from "@chakra-ui/popper" function Example() { const { isOpen, onToggle } = useDisclosure() const { popperRef, referenceRef, getArrowProps } = usePopper() return ( <> {isOpen && (
This is a popover for the button! )} ) } ``` ## Parameters ### Changing the placement You can change the placement of the popper by passing the `placement` option to `usePopper` and set it to the `popper.js` placement. ```jsx const { popperRef, referenceRef } = usePopper({ placement: "right-start", }) ``` ### Match reference's width In some cases, you might want to allow the popper take the width of the reference. For example, autocomplete, select, etc. To achieve this, pass the `matchWidth` option and set it to `true` ```jsx const { popperRef, referenceRef } = usePopper({ matchWidth: true, }) ``` ### Place the popper next to the reference You can place the popper next to the reference without margin or distance between them. Useful to create an autocomplete or typeahead feature. ```jsx const { popperRef, referenceRef } = usePopper({ gutter: 0, }) ``` ### Using inside a fixed container If the reference element is inside a fixed container, you should use the `fixed` strategy. ```jsx const { popperRef, referenceRef } = usePopper({ strategy: 'fixed', }) ``` ## Adding transition When add transitions to a popper component, it is usually advised to apply popper and transition to different elements. ```jsx // 1. Import components import { useDisclosure } from "@chakra-ui/hooks" import { usePopper } from "@chakra-ui/popper" import { motion, AnimatePresence, Variants } from "framer-motion" export function Example() { // 2. Create toggle state const { isOpen, onToggle } = useDisclosure() // 3. Create motion variants const slide: Variants = { exit: { y: -2, opacity: 0, }, enter: { y: 0, opacity: 1, }, } // 4. Consume the `usePopper` hook const { getPopperProps, getReferenceProps, getArrowProps, transformOrigin } = usePopper({ placement: "bottom-start", }) return ( <>
{isOpen && ( Testing
)}
) } ``` > When not rendering the popper conditionally, we recommend using > `visibility: hidden` instead of `hidden` or `display: none`