// Copyright 2025 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React, { useRef, useState, useLayoutEffect, type ReactNode, } from 'react'; import { Tooltip } from 'radix-ui'; import { strictAssert } from '../../../util/assert.std.js'; 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): React.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} ); }