| null = null;
const clearTimeouts = () => {
if (hoverOpenTimeoutRef) { clearTimeout(hoverOpenTimeoutRef); hoverOpenTimeoutRef = null; }
if (hoverCloseTimeoutRef) { clearTimeout(hoverCloseTimeoutRef); hoverCloseTimeoutRef = null; }
};
const handleMouseEnter = () => {
clearTimeouts();
hoverOpenTimeoutRef = setTimeout(() => props.setIsOpen(true), props.delay);
};
const handleMouseLeave = () => {
clearTimeouts();
hoverCloseTimeoutRef = setTimeout(() => props.setIsOpen(false), 100);
};
onCleanup(clearTimeouts);
return (
setTriggerRef(el)} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave} style={{ display: "inline-block" }}>
{props.children}
);
}
interface FocusTooltipProps {
content: JSXElement;
placement: Placement;
offset: number;
children?: JSXElement;
}
export function FocusTooltip(props: FocusTooltipProps) {
const [isOpen, setIsOpen] = createSignal(false);
return (
{props.children}
{props.content}
);
}
interface FocusTriggerProps {
setIsOpen: (v: boolean) => void;
children?: JSXElement;
}
function FocusTooltipTrigger(props: FocusTriggerProps) {
const { setTriggerRef } = useFloatingContext();
return (
setTriggerRef(el)} onFocusIn={() => props.setIsOpen(true)} onFocusOut={() => props.setIsOpen(false)}>
{props.children}
);
}
interface TooltipContentProps {
placement: string;
setIsOpen?: (v: boolean) => void;
onMouseEnter?: () => void;
onMouseLeave?: () => void;
children?: JSXElement;
}
function TooltipContentWithArrow(props: TooltipContentProps) {
const { position } = useFloatingContext();
let hoverCloseTimeoutRef: ReturnType | null = null;
const handleMouseEnter = () => {
if (hoverCloseTimeoutRef) { clearTimeout(hoverCloseTimeoutRef); hoverCloseTimeoutRef = null; }
props.onMouseEnter?.();
};
const handleMouseLeave = () => {
if (props.setIsOpen) {
hoverCloseTimeoutRef = setTimeout(() => props.setIsOpen!(false), 50);
}
props.onMouseLeave?.();
};
onCleanup(() => {
if (hoverCloseTimeoutRef) clearTimeout(hoverCloseTimeoutRef);
});
const actualPlacement = () => position()?.placement ?? props.placement;
const basePlacement = () => actualPlacement().split("-")[0];
return (
{props.children}
);
}