@mantine/hooks
Version:
A collection of 50+ hooks for state and UI management
1 lines • 3.62 kB
Source Map (JSON)
{"version":3,"file":"use-mouse.cjs","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,gBAAA,GAAA,MAAA,UAAwB;EAAE,GAAG;EAAG,GAAG;EAAG,CAAC;AA0CxD,QAAO;EAAE,MAAA,GAAA,MAAA,cAvCN,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,gBAAA,GAAA,MAAA,UAAwB;EAAE,GAAG;EAAG,GAAG;EAAG,CAAC;AAExD,EAAA,GAAA,MAAA,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"}