A React component and hooks wrapper for popper.js
npm install @chakra-ui/popperA 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.
``sh`
yarn add @chakra-ui/popper
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 && (
{...getArrowProps({
style: {
background: "red",
},
})}
/>
This is a popover for the button!
)}
>
)
}
`
You can change the placement of the popper by passing the placement option tousePopper and set it to the popper.js placement.
`jsx`
const { popperRef, referenceRef } = usePopper({
placement: "right-start",
})
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,
})
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,
})
If the reference element is inside a fixed container, you should use the fixed
strategy.
`jsx`
const { popperRef, referenceRef } = usePopper({
strategy: "fixed",
})
When add transitions to a popper component, it is usually advised to apply
popper and transition to different elements.
`tsx
// 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 (
<>
> When not rendering the popper conditionally, we recommend using
>
visibility: hidden instead of hidden or display: none`