{"version":3,"file":"use-mouse.mjs","names":[],"sources":["../../src/use-mouse/use-mouse.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\nexport interface UseMouseReturnValue<T extends HTMLElement = any> {\n  ref: React.RefCallback<T | null>;\n  x: number;\n  y: number;\n}\n\nexport function useMouse<T extends HTMLElement = any>(\n  options: { resetOnExit?: boolean } = { resetOnExit: false }\n): UseMouseReturnValue<T> {\n  const [position, setPosition] = useState({ x: 0, y: 0 });\n\n  const refCallback: React.RefCallback<T | null> = useCallback(\n    (node) => {\n      const setMousePosition = (event: Event) => {\n        const mouseEvent = event as globalThis.MouseEvent;\n        if (node) {\n          const rect = node.getBoundingClientRect();\n\n          const x = Math.max(\n            0,\n            Math.round(mouseEvent.pageX - rect.left - (window.scrollX || window.scrollX))\n          );\n\n          const y = Math.max(\n            0,\n            Math.round(mouseEvent.pageY - rect.top - (window.scrollY || window.scrollY))\n          );\n\n          setPosition({ x, y });\n        } else {\n          setPosition({ x: mouseEvent.clientX, y: mouseEvent.clientY });\n        }\n      };\n\n      const resetMousePosition = () => setPosition({ x: 0, y: 0 });\n\n      node?.addEventListener('mousemove', setMousePosition);\n      if (options.resetOnExit) {\n        node?.addEventListener('mouseleave', resetMousePosition);\n      }\n\n      return () => {\n        node?.removeEventListener('mousemove', setMousePosition);\n        if (options.resetOnExit) {\n          node?.removeEventListener('mouseleave', resetMousePosition);\n        }\n      };\n    },\n    [options.resetOnExit]\n  );\n\n  return { ref: refCallback, ...position };\n}\n\nexport interface UseMousePositionReturnValue {\n  x: number;\n  y: number;\n}\n\nexport function useMousePosition(): UseMousePositionReturnValue {\n  const [position, setPosition] = useState({ x: 0, y: 0 });\n\n  useEffect(() => {\n    const setMousePosition = (event: MouseEvent) => {\n      setPosition({ x: event.clientX, y: event.clientY });\n    };\n\n    document.addEventListener('mousemove', setMousePosition);\n\n    return () => {\n      document.removeEventListener('mousemove', setMousePosition);\n    };\n  }, []);\n\n  return position;\n}\n\nexport namespace useMouse {\n  export type ReturnValue<T extends HTMLElement> = UseMouseReturnValue<T>;\n}\n\nexport namespace useMousePosition {\n  export type ReturnValue = UseMousePositionReturnValue;\n}\n"],"mappings":";;;AAQA,SAAgB,SACd,UAAqC,EAAE,aAAa,OAAO,EACnC;CACxB,MAAM,CAAC,UAAU,eAAe,SAAS;EAAE,GAAG;EAAG,GAAG;EAAG,CAAC;AA0CxD,QAAO;EAAE,KAxCwC,aAC9C,SAAS;GACR,MAAM,oBAAoB,UAAiB;IACzC,MAAM,aAAa;AACnB,QAAI,MAAM;KACR,MAAM,OAAO,KAAK,uBAAuB;AAYzC,iBAAY;MAAE,GAVJ,KAAK,IACb,GACA,KAAK,MAAM,WAAW,QAAQ,KAAK,QAAQ,OAAO,WAAW,OAAO,SAAS,CAC9E;MAOgB,GALP,KAAK,IACb,GACA,KAAK,MAAM,WAAW,QAAQ,KAAK,OAAO,OAAO,WAAW,OAAO,SAAS,CAC7E;MAEmB,CAAC;UAErB,aAAY;KAAE,GAAG,WAAW;KAAS,GAAG,WAAW;KAAS,CAAC;;GAIjE,MAAM,2BAA2B,YAAY;IAAE,GAAG;IAAG,GAAG;IAAG,CAAC;AAE5D,SAAM,iBAAiB,aAAa,iBAAiB;AACrD,OAAI,QAAQ,YACV,OAAM,iBAAiB,cAAc,mBAAmB;AAG1D,gBAAa;AACX,UAAM,oBAAoB,aAAa,iBAAiB;AACxD,QAAI,QAAQ,YACV,OAAM,oBAAoB,cAAc,mBAAmB;;KAIjE,CAAC,QAAQ,YAAY,CACtB;EAE0B,GAAG;EAAU;;AAQ1C,SAAgB,mBAAgD;CAC9D,MAAM,CAAC,UAAU,eAAe,SAAS;EAAE,GAAG;EAAG,GAAG;EAAG,CAAC;AAExD,iBAAgB;EACd,MAAM,oBAAoB,UAAsB;AAC9C,eAAY;IAAE,GAAG,MAAM;IAAS,GAAG,MAAM;IAAS,CAAC;;AAGrD,WAAS,iBAAiB,aAAa,iBAAiB;AAExD,eAAa;AACX,YAAS,oBAAoB,aAAa,iBAAiB;;IAE5D,EAAE,CAAC;AAEN,QAAO"}