// Copyright 2025 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React, { useRef, useState, type ReactNode } from 'react'; import * as Tooltip from '@radix-ui/react-tooltip'; import { useLayoutEffect } from '@react-aria/utils'; import { strictAssert } from '../../../util/assert'; export type FunTooltipProps = Readonly<{ open?: boolean; onOpenChange?: (open: boolean) => void; disableHoverableContent?: boolean; side?: Tooltip.TooltipContentProps['side']; align?: Tooltip.TooltipContentProps['align']; collisionBoundarySelector?: string; collisionPadding?: number; content: ReactNode; children: ReactNode; }>; export function FunTooltip(props: FunTooltipProps): JSX.Element { const ref = useRef(null); const [collisionBoundary, setCollisionBoundary] = useState( null ); useLayoutEffect(() => { if (props.collisionBoundarySelector == null) { return; } strictAssert(ref.current, 'missing ref'); const trigger = ref.current; setCollisionBoundary(trigger.closest(props.collisionBoundarySelector)); }, [props.collisionBoundarySelector]); return ( {props.children} {props.content} ); }