"use client"; import { flip, FloatingPortal, offset, Placement, shift, useDismiss, useFloating, useHover, useInteractions, useRole, } from "@floating-ui/react"; import { AnimatePresence, motion } from "framer-motion"; import { cloneElement, FC, useState } from "react"; type Props = { text: string; children: JSX.Element; placement?: Placement; offset?: number; }; export const TextTooltip: FC = ({ text, placement, offset: offsetAmount, children, }) => { const [isOpen, setIsOpen] = useState(false); const { x, y, refs, strategy, context } = useFloating({ placement: placement ?? "top", open: isOpen, onOpenChange: setIsOpen, middleware: [shift(), offset(offsetAmount ?? 2), flip()], }); const { getReferenceProps, getFloatingProps } = useInteractions([ useHover(context, { delay: 50 }), useRole(context, { role: "tooltip" }), useDismiss(context), ]); return ( <> {cloneElement( children, getReferenceProps({ ref: refs.setReference, ...children.props }) )} {isOpen && (
{text}
)}
); };