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