|
import * as Tooltip from '@radix-ui/react-tooltip'; |
|
import { forwardRef, type ForwardedRef, type ReactElement } from 'react'; |
|
|
|
interface TooltipProps { |
|
tooltip: React.ReactNode; |
|
children: ReactElement; |
|
sideOffset?: number; |
|
className?: string; |
|
arrowClassName?: string; |
|
tooltipStyle?: React.CSSProperties; |
|
position?: 'top' | 'bottom' | 'left' | 'right'; |
|
maxWidth?: number; |
|
delay?: number; |
|
} |
|
|
|
const WithTooltip = forwardRef( |
|
( |
|
{ |
|
tooltip, |
|
children, |
|
sideOffset = 5, |
|
className = '', |
|
arrowClassName = '', |
|
tooltipStyle = {}, |
|
position = 'top', |
|
maxWidth = 250, |
|
delay = 0, |
|
}: TooltipProps, |
|
_ref: ForwardedRef<HTMLElement>, |
|
) => { |
|
return ( |
|
<Tooltip.Root delayDuration={delay}> |
|
<Tooltip.Trigger asChild>{children}</Tooltip.Trigger> |
|
<Tooltip.Portal> |
|
<Tooltip.Content |
|
side={position} |
|
className={` |
|
z-[2000] |
|
px-2.5 |
|
py-1.5 |
|
max-h-[300px] |
|
select-none |
|
rounded-md |
|
bg-bolt-elements-background-depth-3 |
|
text-bolt-elements-textPrimary |
|
text-sm |
|
leading-tight |
|
shadow-lg |
|
animate-in |
|
fade-in-0 |
|
zoom-in-95 |
|
data-[state=closed]:animate-out |
|
data-[state=closed]:fade-out-0 |
|
data-[state=closed]:zoom-out-95 |
|
${className} |
|
`} |
|
sideOffset={sideOffset} |
|
style={{ |
|
maxWidth, |
|
...tooltipStyle, |
|
}} |
|
> |
|
<div className="break-words">{tooltip}</div> |
|
<Tooltip.Arrow |
|
className={` |
|
fill-bolt-elements-background-depth-3 |
|
${arrowClassName} |
|
`} |
|
width={12} |
|
height={6} |
|
/> |
|
</Tooltip.Content> |
|
</Tooltip.Portal> |
|
</Tooltip.Root> |
|
); |
|
}, |
|
); |
|
|
|
export default WithTooltip; |
|
|