|
13 | 13 | import {AriaLabelingProps, FocusableElement, forwardRefType, GlobalDOMAttributes, RefObject} from '@react-types/shared'; |
14 | 14 | import {AriaPositionProps, mergeProps, OverlayContainer, Placement, PlacementAxis, PositionProps, useOverlayPosition, useTooltip, useTooltipTrigger} from 'react-aria'; |
15 | 15 | import {ContextValue, Provider, RenderProps, useContextProps, useRenderProps} from './utils'; |
16 | | -import {filterDOMProps, useEnterAnimation, useExitAnimation, useLayoutEffect} from '@react-aria/utils'; |
| 16 | +import {filterDOMProps, useEnterAnimation, useExitAnimation} from '@react-aria/utils'; |
17 | 17 | import {FocusableProvider} from '@react-aria/focus'; |
18 | 18 | import {OverlayArrowContext} from './OverlayArrow'; |
19 | 19 | import {OverlayTriggerProps, TooltipTriggerProps, TooltipTriggerState, useTooltipTriggerState} from 'react-stately'; |
20 | | -import React, {createContext, ForwardedRef, forwardRef, JSX, ReactNode, useContext, useRef, useState} from 'react'; |
| 20 | +import React, {createContext, CSSProperties, ForwardedRef, forwardRef, JSX, ReactNode, useContext, useRef} from 'react'; |
21 | 21 |
|
22 | 22 | export interface TooltipTriggerComponentProps extends TooltipTriggerProps { |
23 | 23 | children: ReactNode |
@@ -121,25 +121,16 @@ export const Tooltip = /*#__PURE__*/ (forwardRef as forwardRefType)(function Too |
121 | 121 |
|
122 | 122 | function TooltipInner(props: TooltipProps & {isExiting: boolean, tooltipRef: RefObject<HTMLDivElement | null>}) { |
123 | 123 | let state = useContext(TooltipTriggerStateContext)!; |
124 | | - |
125 | | - // Calculate the arrow size internally |
126 | | - // Referenced from: packages/@react-spectrum/tooltip/src/TooltipTrigger.tsx |
127 | 124 | let arrowRef = useRef<HTMLDivElement>(null); |
128 | | - let [arrowWidth, setArrowWidth] = useState(0); |
129 | | - useLayoutEffect(() => { |
130 | | - if (arrowRef.current && state.isOpen) { |
131 | | - setArrowWidth(arrowRef.current.getBoundingClientRect().width); |
132 | | - } |
133 | | - }, [state.isOpen, arrowRef]); |
134 | 125 |
|
135 | | - let {overlayProps, arrowProps, placement} = useOverlayPosition({ |
| 126 | + let {overlayProps, arrowProps, placement, triggerOrigin} = useOverlayPosition({ |
136 | 127 | placement: props.placement || 'top', |
137 | 128 | targetRef: props.triggerRef!, |
138 | 129 | overlayRef: props.tooltipRef, |
| 130 | + arrowRef, |
139 | 131 | offset: props.offset, |
140 | 132 | crossOffset: props.crossOffset, |
141 | 133 | isOpen: state.isOpen, |
142 | | - arrowSize: arrowWidth, |
143 | 134 | arrowBoundaryOffset: props.arrowBoundaryOffset, |
144 | 135 | shouldFlip: props.shouldFlip, |
145 | 136 | containerPadding: props.containerPadding, |
@@ -167,7 +158,11 @@ function TooltipInner(props: TooltipProps & {isExiting: boolean, tooltipRef: Ref |
167 | 158 | <div |
168 | 159 | {...mergeProps(DOMProps, renderProps, tooltipProps)} |
169 | 160 | ref={props.tooltipRef} |
170 | | - style={{...overlayProps.style, ...renderProps.style}} |
| 161 | + style={{ |
| 162 | + ...overlayProps.style, |
| 163 | + '--trigger-origin': triggerOrigin ? `${triggerOrigin.x}px ${triggerOrigin.y}px` : undefined, |
| 164 | + ...renderProps.style |
| 165 | + } as CSSProperties} |
171 | 166 | data-placement={placement ?? undefined} |
172 | 167 | data-entering={isEntering || undefined} |
173 | 168 | data-exiting={props.isExiting || undefined}> |
|
0 commit comments