import type { Placement } from '@floating-ui/react' import type { FC, ReactNode } from 'react' import { arrow, autoUpdate, flip, FloatingArrow, FloatingPortal, offset, shift, useClick, useDismiss, useFloating, useFocus, useHover, useInteractions, useRole, useTransitionStyles, } from '@floating-ui/react' import classNames from 'classnames' import { useRef, useState } from 'react' interface TooltipProps { children: ReactNode placement?: Placement content: ReactNode className?: string } export const Tooltip: FC = ({ children, content, placement = 'top', className }) => { const [open, setOpen] = useState(false) const arrowRef = useRef(null) const { refs, floatingStyles, context } = useFloating({ placement, open, onOpenChange: setOpen, middleware: [ offset(15), flip(), shift(), arrow({ element: arrowRef, }), ], whileElementsMounted: autoUpdate, }) const hover = useHover(context, { delay: 100 }) const click = useClick(context, { ignoreMouse: true }) const focus = useFocus(context) const dismiss = useDismiss(context) const role = useRole(context, { role: 'tooltip' }) const { getReferenceProps, getFloatingProps } = useInteractions([ hover, click, focus, dismiss, role, ]) const { isMounted, styles } = useTransitionStyles(context, { initial: { opacity: 0, }, }) return ( <>
{children}
{isMounted && (
{content}
)} ) }