import React, { useMemo, useRef } from 'react' import { isUnplacedRect, ReactiveDomReact } from '../utils/layouts' import usePrevious from '../utils/use-previous' import useTheme from '../use-theme' import useClasses from '../use-classes' type Props = { rect: ReactiveDomReact visible?: boolean hoverHeightRatio?: number hoverWidthRatio?: number activeOpacity?: number } type HighlightPosition = { width: string left: string height: string top: string transition: string } type NativeAttrs = Omit, keyof Props> export type HighlightProps = Props & NativeAttrs const Highlight: React.FC = ({ rect, visible, hoverHeightRatio = 1, hoverWidthRatio = 1, activeOpacity = 0.8, className, ...props }) => { const theme = useTheme() const ref = useRef(null) const isFirstVisible = usePrevious(isUnplacedRect(rect)) const position = useMemo(() => { const width = rect.width * hoverWidthRatio const height = rect.height * hoverHeightRatio return { width: `${width}px`, left: `${rect.left + (rect.width - width) / 2}px`, height: `${height}px`, top: `${rect.elementTop + (rect.height - height) / 2}px`, transition: isFirstVisible ? 'opacity' : 'opacity, width, left, top' } }, [rect, hoverWidthRatio, hoverHeightRatio]) return (
) } export default Highlight