| 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; |
|
|