import { NodeProps, NodeToolbar, NodeToolbarProps } from '@xyflow/react'; import { HTMLAttributes, ReactNode, createContext, forwardRef, useCallback, useContext, useState, } from 'react'; import { BaseNode } from './base-node'; /* TOOLTIP CONTEXT ---------------------------------------------------------- */ const TooltipContext = createContext(false); /* TOOLTIP NODE ------------------------------------------------------------- */ export type TooltipNodeProps = Partial & { children?: ReactNode; }; /** * A component that wraps a node and provides tooltip visibility context. */ export const TooltipNode = forwardRef( ({ selected, children }, ref) => { const [isTooltipVisible, setTooltipVisible] = useState(false); const showTooltip = useCallback(() => setTooltipVisible(true), []); const hideTooltip = useCallback(() => setTooltipVisible(false), []); return ( {children} ); }, ); TooltipNode.displayName = 'TooltipNode'; /* TOOLTIP CONTENT ---------------------------------------------------------- */ export type TooltipContentProps = NodeToolbarProps; /** * A component that displays the tooltip content based on visibility context. */ export const TooltipContent = forwardRef( ({ position, children }, ref) => { const isTooltipVisible = useContext(TooltipContext); return (
{children}
); }, ); TooltipContent.displayName = 'TooltipContent'; /* TOOLTIP TRIGGER ---------------------------------------------------------- */ export type TooltipTriggerProps = HTMLAttributes; /** * A component that triggers the tooltip visibility. */ export const TooltipTrigger = forwardRef< HTMLParagraphElement, TooltipTriggerProps >(({ children, ...props }, ref) => { return (
{children}
); }); TooltipTrigger.displayName = 'TooltipTrigger';