|
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