import * as RadixTooltip from '@radix-ui/react-tooltip'
import styled from 'styled-components'
import { cloneElement, forwardRef, isValidElement } from 'react'
import {
type TooltipV2Props,
TooltipV2Align,
TooltipV2Side,
TooltipV2Size,
TooltipV2SlotDirection,
} from './tooltipV2.types'
import type { TooltipV2TokensType } from './tooltipV2.tokens'
import Block from '../Primitives/Block/Block'
import PrimitiveText from '../Primitives/PrimitiveText/PrimitiveText'
import { useResponsiveTokens } from '../../hooks/useResponsiveTokens'
import { tooltipV2ContentAnimations } from './tooltipV2.animation'
import {
formatTextWithLineBreaks,
composeRefs,
} from '../../global-utils/GlobalUtils'
const textOverflowStyle: React.CSSProperties = {
wordBreak: 'break-word',
overflowWrap: 'anywhere',
}
const Arrow = styled(RadixTooltip.Arrow)<{
$color: React.CSSProperties['backgroundColor']
}>`
fill: ${({ $color }) => $color};
`
const AnimatedTooltipContent = styled(RadixTooltip.Content)`
${tooltipV2ContentAnimations}
`
const tooltipSlotBlockStyle: React.CSSProperties = {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
flexShrink: 0,
}
const TooltipSlotBlock = forwardRef<
HTMLElement,
{ 'data-element': string; children: React.ReactNode }
>(({ 'data-element': dataElement, children }, ref) => (
}
data-element={dataElement}
role="presentation"
aria-hidden="true"
style={tooltipSlotBlockStyle}
>
{children}
))
TooltipSlotBlock.displayName = 'TooltipSlotBlock'
export const TooltipV2 = forwardRef(
(
{
children: trigger,
content,
side = TooltipV2Side.TOP,
align = TooltipV2Align.CENTER,
showArrow = true,
size = TooltipV2Size.SM,
slot,
slotDirection = TooltipV2SlotDirection.LEFT,
delayDuration = 300,
offset = 5,
open,
onOpenChange,
maxWidth,
fullWidth = false,
disableInteractive = false,
},
ref
) => {
const tooltipTokens =
useResponsiveTokens('TOOLTIPV2')
const isNativeElement =
isValidElement(trigger) && typeof trigger.type === 'string'
const shouldWrapTrigger = !isNativeElement
const triggerNode = shouldWrapTrigger ? (
}
style={{
display: fullWidth ? 'flex' : 'inline-flex',
width: fullWidth ? '100%' : 'auto',
}}
>
{trigger}
) : ref != null && isValidElement(trigger) ? (
cloneElement(trigger, {
ref: composeRefs(
ref,
(
trigger as React.ReactElement & {
ref?: React.Ref
}
).ref
),
} as React.Attributes & { ref: React.Ref })
) : (
trigger
)
return (
{triggerNode}
{content && (
{slot &&
slotDirection ===
TooltipV2SlotDirection.LEFT && (
{slot}
)}
{formatTextWithLineBreaks(content)}
{slot &&
slotDirection ===
TooltipV2SlotDirection.RIGHT && (
{slot}
)}
{showArrow && (
)}
)}
)
}
)
TooltipV2.displayName = 'TooltipV2'
export default TooltipV2