{"version":3,"sources":["../../src/use-mouse-in-element/index.ts"],"sourcesContent":["import { useEffect } from 'react'\nimport { useEventListener } from '../use-event-listener'\nimport { useLatest } from '../use-latest'\nimport { useMouse } from '../use-mouse'\nimport { useSetState } from '../use-set-state'\nimport { useStableFn } from '../use-stable-fn'\nimport { useTargetElement } from '../use-target-element'\n\nimport type { UseMouseOptions, UseMouseReturns } from '../use-mouse'\nimport type { Pausable } from '../use-pausable'\nimport type { ElementTarget } from '../use-target-element'\n\nexport interface MouseInElementOptions extends UseMouseOptions {\n  handleOutside?: boolean\n}\n\nexport interface UseMouseInElementReturns extends Pausable {\n  /**\n   * Whether the mouse is outside the element\n   */\n  isOutside: boolean\n  /**\n   * The x position of the mouse relative to the element\n   */\n  elementX: number\n  /**\n   * The y position of the mouse relative to the element\n   */\n  elementY: number\n  /**\n   * The x position of the element\n   */\n  elementPositionX: number\n  /**\n   * The y position of the element\n   */\n  elementPositionY: number\n  /**\n   * The height of the element\n   */\n  elementHeight: number\n  /**\n   * The width of the element\n   */\n  elementWidth: number\n  /**\n   * The mouse state\n   */\n  stop(): void\n  /**\n   * The mouse state\n   */\n  mouse: UseMouseReturns\n}\n\n/**\n * A React Hook that tracks mouse position in an element.\n */\nexport function useMouseInElement(\n  target: ElementTarget,\n  options: MouseInElementOptions = {},\n): UseMouseInElementReturns {\n  const { handleOutside = true } = options\n\n  const mType = options.type || 'page'\n\n  const [state, setState] = useSetState({\n    isOutside: false,\n    elementX: 0,\n    elementY: 0,\n    elementHeight: 0,\n    elementWidth: 0,\n    elementPositionX: 0,\n    elementPositionY: 0,\n  })\n\n  const el = useTargetElement(target)\n\n  const { stop: stopMouse, x, y, pause, resume, isActive, ...mouseRest } = useMouse(options)\n\n  useEffect(() => {\n    if (!el.current) return\n\n    const { left, top, width, height } = el.current.getBoundingClientRect()\n\n    const elementPositionX = left + (mType === 'page' ? (window.scrollX ?? window.pageXOffset) : 0)\n    const elementPositionY = top + (mType === 'page' ? (window.scrollY ?? window.pageYOffset) : 0)\n\n    const elX = x - elementPositionX\n    const elY = y - elementPositionY\n\n    const isOutside = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height\n\n    const shouldUpdateElementPosition = handleOutside || !isOutside\n\n    setState(({ elementX, elementY }) => ({\n      isOutside,\n      elementPositionX,\n      elementPositionY,\n      elementHeight: height,\n      elementWidth: width,\n      elementX: shouldUpdateElementPosition ? x - elementPositionX : elementX,\n      elementY: shouldUpdateElementPosition ? y - elementPositionY : elementY,\n    }))\n  }, [el.current, x, y, handleOutside, mType])\n\n  const cleanups = useLatest([\n    stopMouse,\n    useEventListener(\n      () => document,\n      'mouseleave',\n      () => setState({ isOutside: true }),\n    ),\n  ])\n\n  const stop = useStableFn(() => {\n    for (const cleanup of cleanups.current) cleanup()\n  })\n\n  const mouse = { x, y, pause, mType, resume, isActive, stop: stopMouse, ...mouseRest }\n\n  return {\n    stop,\n    pause,\n    resume,\n    isActive,\n    mouse,\n    ...state,\n  }\n}\n"],"names":["useMouseInElement","target","options","handleOutside","mType","type","useSetState","isOutside","elementX","elementY","elementHeight","elementWidth","elementPositionX","elementPositionY","state","setState","el","useTargetElement","useMouse","stop","stopMouse","x","y","pause","resume","isActive","mouseRest","useEffect","current","getBoundingClientRect","left","top","width","height","window","scrollX","pageXOffset","scrollY","pageYOffset","elX","elY","shouldUpdateElementPosition","cleanups","useLatest","useEventListener","document","useStableFn","cleanup","mouse"],"mappings":"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"}