import { flip, FloatingPortal, offset, Placement, shift, useFloating, } from "@floating-ui/react-dom-interactions"; import { Popover as HeadlessPopover } from "@headlessui/react"; import clsx from "clsx"; import { motion } from "framer-motion"; import React from "react"; import { transformOriginByPlacement } from "utils/constants"; interface PopoverProps { trigger: React.ReactNode; children?: React.ReactNode; placement?: Placement; } const MotionPanel = motion(HeadlessPopover.Panel); const Popover: React.VoidFunctionComponent = ({ children, trigger, placement: preferredPlacement, }) => { const { reference, floating, x, y, strategy, placement } = useFloating({ placement: preferredPlacement, strategy: "fixed", middleware: [offset(5), flip(), shift({ padding: 10 })], }); const origin = transformOriginByPlacement[placement]; return ( {({ open }) => ( <> {trigger} {open ? ( {children} ) : null} )} ); }; export default Popover;