UNPKG

@mantine/hooks

Version:

A collection of 50+ hooks for state and UI management

1 lines 3.47 kB
{"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(0, Math.round(mouseEvent.clientX - rect.left));\n\n const y = Math.max(0, Math.round(mouseEvent.clientY - rect.top));\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,MAAM,GAClC;CACxB,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,UAAwB;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;CAoCvD,OAAO;EAAE,MAAA,GAAA,MAAA,cAjCN,SAAS;GACR,MAAM,oBAAoB,UAAiB;IACzC,MAAM,aAAa;IACnB,IAAI,MAAM;KACR,MAAM,OAAO,KAAK,sBAAsB;KAMxC,YAAY;MAAE,GAJJ,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,UAAU,KAAK,IAAI,CAIjD;MAAG,GAFP,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,UAAU,KAAK,GAAG,CAE7C;KAAE,CAAC;IACtB,OACE,YAAY;KAAE,GAAG,WAAW;KAAS,GAAG,WAAW;IAAQ,CAAC;GAEhE;GAEA,MAAM,2BAA2B,YAAY;IAAE,GAAG;IAAG,GAAG;GAAE,CAAC;GAE3D,MAAM,iBAAiB,aAAa,gBAAgB;GACpD,IAAI,QAAQ,aACV,MAAM,iBAAiB,cAAc,kBAAkB;GAGzD,aAAa;IACX,MAAM,oBAAoB,aAAa,gBAAgB;IACvD,IAAI,QAAQ,aACV,MAAM,oBAAoB,cAAc,kBAAkB;GAE9D;EACF,GACA,CAAC,QAAQ,WAAW,CAGE;EAAG,GAAG;CAAS;AACzC;AAOA,SAAgB,mBAAgD;CAC9D,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,UAAwB;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;CAEvD,CAAA,GAAA,MAAA,iBAAgB;EACd,MAAM,oBAAoB,UAAsB;GAC9C,YAAY;IAAE,GAAG,MAAM;IAAS,GAAG,MAAM;GAAQ,CAAC;EACpD;EAEA,SAAS,iBAAiB,aAAa,gBAAgB;EAEvD,aAAa;GACX,SAAS,oBAAoB,aAAa,gBAAgB;EAC5D;CACF,GAAG,CAAC,CAAC;CAEL,OAAO;AACT"}