import React, { cloneElement, useRef } from "react"; import { AriaTooltipProps, mergeProps, useTooltip, useTooltipTrigger } from "react-aria"; import { TooltipTriggerState, useTooltipTriggerState } from "react-stately"; import cn from "~/utils/cn"; export interface TooltipProps extends AriaTooltipProps { children: [React.ReactElement, React.ReactElement]; } function Tooltip(props: TooltipProps) { const state = useTooltipTriggerState({ ...props, delay: 0, closeDelay: 0, }); const ref = useRef(null); const { triggerProps, tooltipProps } = useTooltipTrigger( { ...props, delay: 0, closeDelay: 0, }, state, ref, ); const [component, body] = props.children; return ( {state.isOpen && cloneElement(body, { ...tooltipProps, state, })} ); } interface TooltipBodyProps extends AriaTooltipProps { children: React.ReactNode; state?: TooltipTriggerState; className?: string; } function Body({ state, className, ...props }: TooltipBodyProps) { const { tooltipProps } = useTooltip(props, state); return ( {props.children} ); } export default Object.assign(Tooltip, { Body, });