@usels/core 0.0.1-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/README.md +21 -0
  2. package/dist/browser/useEventListener/index.d.mts +56 -0
  3. package/dist/browser/useEventListener/index.d.ts +56 -0
  4. package/dist/browser/useEventListener/index.js +112 -0
  5. package/dist/browser/useEventListener/index.js.map +1 -0
  6. package/dist/browser/useEventListener/index.mjs +88 -0
  7. package/dist/browser/useEventListener/index.mjs.map +1 -0
  8. package/dist/browser/useMediaQuery/demo.d.mts +5 -0
  9. package/dist/browser/useMediaQuery/demo.d.ts +5 -0
  10. package/dist/browser/useMediaQuery/demo.js +82 -0
  11. package/dist/browser/useMediaQuery/demo.js.map +1 -0
  12. package/dist/browser/useMediaQuery/demo.mjs +62 -0
  13. package/dist/browser/useMediaQuery/demo.mjs.map +1 -0
  14. package/dist/browser/useMediaQuery/index.d.mts +11 -0
  15. package/dist/browser/useMediaQuery/index.d.ts +11 -0
  16. package/dist/browser/useMediaQuery/index.js +89 -0
  17. package/dist/browser/useMediaQuery/index.js.map +1 -0
  18. package/dist/browser/useMediaQuery/index.mjs +64 -0
  19. package/dist/browser/useMediaQuery/index.mjs.map +1 -0
  20. package/dist/components/Auto/index.d.mts +33 -0
  21. package/dist/components/Auto/index.d.ts +33 -0
  22. package/dist/components/Auto/index.js +66 -0
  23. package/dist/components/Auto/index.js.map +1 -0
  24. package/dist/components/Auto/index.mjs +34 -0
  25. package/dist/components/Auto/index.mjs.map +1 -0
  26. package/dist/elements/useDocumentVisibility/demo.d.mts +5 -0
  27. package/dist/elements/useDocumentVisibility/demo.d.ts +5 -0
  28. package/dist/elements/useDocumentVisibility/demo.js +130 -0
  29. package/dist/elements/useDocumentVisibility/demo.js.map +1 -0
  30. package/dist/elements/useDocumentVisibility/demo.mjs +114 -0
  31. package/dist/elements/useDocumentVisibility/demo.mjs.map +1 -0
  32. package/dist/elements/useDocumentVisibility/index.d.mts +5 -0
  33. package/dist/elements/useDocumentVisibility/index.d.ts +5 -0
  34. package/dist/elements/useDocumentVisibility/index.js +45 -0
  35. package/dist/elements/useDocumentVisibility/index.js.map +1 -0
  36. package/dist/elements/useDocumentVisibility/index.mjs +21 -0
  37. package/dist/elements/useDocumentVisibility/index.mjs.map +1 -0
  38. package/dist/elements/useElementBounding/demo.d.mts +5 -0
  39. package/dist/elements/useElementBounding/demo.d.ts +5 -0
  40. package/dist/elements/useElementBounding/demo.js +86 -0
  41. package/dist/elements/useElementBounding/demo.js.map +1 -0
  42. package/dist/elements/useElementBounding/demo.mjs +66 -0
  43. package/dist/elements/useElementBounding/demo.mjs.map +1 -0
  44. package/dist/elements/useElementBounding/index.d.mts +46 -0
  45. package/dist/elements/useElementBounding/index.d.ts +46 -0
  46. package/dist/elements/useElementBounding/index.js +122 -0
  47. package/dist/elements/useElementBounding/index.js.map +1 -0
  48. package/dist/elements/useElementBounding/index.mjs +98 -0
  49. package/dist/elements/useElementBounding/index.mjs.map +1 -0
  50. package/dist/elements/useElementSize/demo.d.mts +5 -0
  51. package/dist/elements/useElementSize/demo.d.ts +5 -0
  52. package/dist/elements/useElementSize/demo.js +82 -0
  53. package/dist/elements/useElementSize/demo.js.map +1 -0
  54. package/dist/elements/useElementSize/demo.mjs +62 -0
  55. package/dist/elements/useElementSize/demo.mjs.map +1 -0
  56. package/dist/elements/useElementSize/index.d.mts +34 -0
  57. package/dist/elements/useElementSize/index.d.ts +34 -0
  58. package/dist/elements/useElementSize/index.js +85 -0
  59. package/dist/elements/useElementSize/index.js.map +1 -0
  60. package/dist/elements/useElementSize/index.mjs +61 -0
  61. package/dist/elements/useElementSize/index.mjs.map +1 -0
  62. package/dist/elements/useElementVisibility/demo.d.mts +5 -0
  63. package/dist/elements/useElementVisibility/demo.d.ts +5 -0
  64. package/dist/elements/useElementVisibility/demo.js +110 -0
  65. package/dist/elements/useElementVisibility/demo.js.map +1 -0
  66. package/dist/elements/useElementVisibility/demo.mjs +90 -0
  67. package/dist/elements/useElementVisibility/demo.mjs.map +1 -0
  68. package/dist/elements/useElementVisibility/index.d.mts +43 -0
  69. package/dist/elements/useElementVisibility/index.d.ts +43 -0
  70. package/dist/elements/useElementVisibility/index.js +58 -0
  71. package/dist/elements/useElementVisibility/index.js.map +1 -0
  72. package/dist/elements/useElementVisibility/index.mjs +34 -0
  73. package/dist/elements/useElementVisibility/index.mjs.map +1 -0
  74. package/dist/elements/useIntersectionObserver/demo.d.mts +5 -0
  75. package/dist/elements/useIntersectionObserver/demo.d.ts +5 -0
  76. package/dist/elements/useIntersectionObserver/demo.js +173 -0
  77. package/dist/elements/useIntersectionObserver/demo.js.map +1 -0
  78. package/dist/elements/useIntersectionObserver/demo.mjs +153 -0
  79. package/dist/elements/useIntersectionObserver/demo.mjs.map +1 -0
  80. package/dist/elements/useIntersectionObserver/index.d.mts +47 -0
  81. package/dist/elements/useIntersectionObserver/index.d.ts +47 -0
  82. package/dist/elements/useIntersectionObserver/index.js +111 -0
  83. package/dist/elements/useIntersectionObserver/index.js.map +1 -0
  84. package/dist/elements/useIntersectionObserver/index.mjs +87 -0
  85. package/dist/elements/useIntersectionObserver/index.mjs.map +1 -0
  86. package/dist/elements/useMouseInElement/demo.d.mts +5 -0
  87. package/dist/elements/useMouseInElement/demo.d.ts +5 -0
  88. package/dist/elements/useMouseInElement/demo.js +103 -0
  89. package/dist/elements/useMouseInElement/demo.js.map +1 -0
  90. package/dist/elements/useMouseInElement/demo.mjs +83 -0
  91. package/dist/elements/useMouseInElement/demo.mjs.map +1 -0
  92. package/dist/elements/useMouseInElement/index.d.mts +56 -0
  93. package/dist/elements/useMouseInElement/index.d.ts +56 -0
  94. package/dist/elements/useMouseInElement/index.js +148 -0
  95. package/dist/elements/useMouseInElement/index.js.map +1 -0
  96. package/dist/elements/useMouseInElement/index.mjs +124 -0
  97. package/dist/elements/useMouseInElement/index.mjs.map +1 -0
  98. package/dist/elements/useMutationObserver/demo.d.mts +5 -0
  99. package/dist/elements/useMutationObserver/demo.d.ts +5 -0
  100. package/dist/elements/useMutationObserver/demo.js +240 -0
  101. package/dist/elements/useMutationObserver/demo.js.map +1 -0
  102. package/dist/elements/useMutationObserver/demo.mjs +220 -0
  103. package/dist/elements/useMutationObserver/demo.mjs.map +1 -0
  104. package/dist/elements/useMutationObserver/index.d.mts +15 -0
  105. package/dist/elements/useMutationObserver/index.d.ts +15 -0
  106. package/dist/elements/useMutationObserver/index.js +69 -0
  107. package/dist/elements/useMutationObserver/index.js.map +1 -0
  108. package/dist/elements/useMutationObserver/index.mjs +45 -0
  109. package/dist/elements/useMutationObserver/index.mjs.map +1 -0
  110. package/dist/elements/useParentElement/demo.d.mts +5 -0
  111. package/dist/elements/useParentElement/demo.d.ts +5 -0
  112. package/dist/elements/useParentElement/demo.js +132 -0
  113. package/dist/elements/useParentElement/demo.js.map +1 -0
  114. package/dist/elements/useParentElement/demo.mjs +112 -0
  115. package/dist/elements/useParentElement/demo.mjs.map +1 -0
  116. package/dist/elements/useParentElement/index.d.mts +7 -0
  117. package/dist/elements/useParentElement/index.d.ts +7 -0
  118. package/dist/elements/useParentElement/index.js +47 -0
  119. package/dist/elements/useParentElement/index.js.map +1 -0
  120. package/dist/elements/useParentElement/index.mjs +23 -0
  121. package/dist/elements/useParentElement/index.mjs.map +1 -0
  122. package/dist/elements/useRef$/index.js +89 -0
  123. package/dist/elements/useRef$/index.js.map +1 -0
  124. package/dist/elements/useRef$/index.mjs +62 -0
  125. package/dist/elements/useRef$/index.mjs.map +1 -0
  126. package/dist/elements/useRef_/index.d.mts +60 -0
  127. package/dist/elements/useRef_/index.d.ts +60 -0
  128. package/dist/elements/useResizeObserver/demo.d.mts +5 -0
  129. package/dist/elements/useResizeObserver/demo.d.ts +5 -0
  130. package/dist/elements/useResizeObserver/demo.js +90 -0
  131. package/dist/elements/useResizeObserver/demo.js.map +1 -0
  132. package/dist/elements/useResizeObserver/demo.mjs +70 -0
  133. package/dist/elements/useResizeObserver/demo.mjs.map +1 -0
  134. package/dist/elements/useResizeObserver/index.d.mts +36 -0
  135. package/dist/elements/useResizeObserver/index.d.ts +36 -0
  136. package/dist/elements/useResizeObserver/index.js +74 -0
  137. package/dist/elements/useResizeObserver/index.js.map +1 -0
  138. package/dist/elements/useResizeObserver/index.mjs +49 -0
  139. package/dist/elements/useResizeObserver/index.mjs.map +1 -0
  140. package/dist/elements/useWindowFocus/demo.d.mts +5 -0
  141. package/dist/elements/useWindowFocus/demo.d.ts +5 -0
  142. package/dist/elements/useWindowFocus/demo.js +100 -0
  143. package/dist/elements/useWindowFocus/demo.js.map +1 -0
  144. package/dist/elements/useWindowFocus/demo.mjs +80 -0
  145. package/dist/elements/useWindowFocus/demo.mjs.map +1 -0
  146. package/dist/elements/useWindowFocus/index.d.mts +5 -0
  147. package/dist/elements/useWindowFocus/index.d.ts +5 -0
  148. package/dist/elements/useWindowFocus/index.js +42 -0
  149. package/dist/elements/useWindowFocus/index.js.map +1 -0
  150. package/dist/elements/useWindowFocus/index.mjs +18 -0
  151. package/dist/elements/useWindowFocus/index.mjs.map +1 -0
  152. package/dist/elements/useWindowSize/demo.d.mts +5 -0
  153. package/dist/elements/useWindowSize/demo.d.ts +5 -0
  154. package/dist/elements/useWindowSize/demo.js +78 -0
  155. package/dist/elements/useWindowSize/demo.js.map +1 -0
  156. package/dist/elements/useWindowSize/demo.mjs +58 -0
  157. package/dist/elements/useWindowSize/demo.mjs.map +1 -0
  158. package/dist/elements/useWindowSize/index.d.mts +17 -0
  159. package/dist/elements/useWindowSize/index.d.ts +17 -0
  160. package/dist/elements/useWindowSize/index.js +96 -0
  161. package/dist/elements/useWindowSize/index.js.map +1 -0
  162. package/dist/elements/useWindowSize/index.mjs +76 -0
  163. package/dist/elements/useWindowSize/index.mjs.map +1 -0
  164. package/dist/function/get/index.d.mts +45 -0
  165. package/dist/function/get/index.d.ts +45 -0
  166. package/dist/function/get/index.js +39 -0
  167. package/dist/function/get/index.js.map +1 -0
  168. package/dist/function/get/index.mjs +15 -0
  169. package/dist/function/get/index.mjs.map +1 -0
  170. package/dist/function/peek/index.d.mts +46 -0
  171. package/dist/function/peek/index.d.ts +46 -0
  172. package/dist/function/peek/index.js +39 -0
  173. package/dist/function/peek/index.js.map +1 -0
  174. package/dist/function/peek/index.mjs +15 -0
  175. package/dist/function/peek/index.mjs.map +1 -0
  176. package/dist/function/useMayObservableOptions/index.d.mts +59 -0
  177. package/dist/function/useMayObservableOptions/index.d.ts +59 -0
  178. package/dist/function/useMayObservableOptions/index.js +109 -0
  179. package/dist/function/useMayObservableOptions/index.js.map +1 -0
  180. package/dist/function/useMayObservableOptions/index.mjs +88 -0
  181. package/dist/function/useMayObservableOptions/index.mjs.map +1 -0
  182. package/dist/function/useSupported/index.d.mts +6 -0
  183. package/dist/function/useSupported/index.d.ts +6 -0
  184. package/dist/function/useSupported/index.js +37 -0
  185. package/dist/function/useSupported/index.js.map +1 -0
  186. package/dist/function/useSupported/index.mjs +13 -0
  187. package/dist/function/useSupported/index.mjs.map +1 -0
  188. package/dist/function/useWhenMounted/index.d.mts +6 -0
  189. package/dist/function/useWhenMounted/index.d.ts +6 -0
  190. package/dist/function/useWhenMounted/index.js +37 -0
  191. package/dist/function/useWhenMounted/index.js.map +1 -0
  192. package/dist/function/useWhenMounted/index.mjs +13 -0
  193. package/dist/function/useWhenMounted/index.mjs.map +1 -0
  194. package/dist/index.d.mts +24 -0
  195. package/dist/index.d.ts +24 -0
  196. package/dist/index.js +63 -0
  197. package/dist/index.js.map +1 -0
  198. package/dist/index.mjs +22 -0
  199. package/dist/index.mjs.map +1 -0
  200. package/dist/sensors/useScroll/demo.d.mts +5 -0
  201. package/dist/sensors/useScroll/demo.d.ts +5 -0
  202. package/dist/sensors/useScroll/demo.js +121 -0
  203. package/dist/sensors/useScroll/demo.js.map +1 -0
  204. package/dist/sensors/useScroll/demo.mjs +101 -0
  205. package/dist/sensors/useScroll/demo.mjs.map +1 -0
  206. package/dist/sensors/useScroll/index.d.mts +42 -0
  207. package/dist/sensors/useScroll/index.d.ts +42 -0
  208. package/dist/sensors/useScroll/index.js +149 -0
  209. package/dist/sensors/useScroll/index.js.map +1 -0
  210. package/dist/sensors/useScroll/index.mjs +125 -0
  211. package/dist/sensors/useScroll/index.mjs.map +1 -0
  212. package/dist/sensors/useWindowScroll/demo.d.mts +5 -0
  213. package/dist/sensors/useWindowScroll/demo.d.ts +5 -0
  214. package/dist/sensors/useWindowScroll/demo.js +84 -0
  215. package/dist/sensors/useWindowScroll/demo.js.map +1 -0
  216. package/dist/sensors/useWindowScroll/demo.mjs +64 -0
  217. package/dist/sensors/useWindowScroll/demo.mjs.map +1 -0
  218. package/dist/sensors/useWindowScroll/index.d.mts +9 -0
  219. package/dist/sensors/useWindowScroll/index.d.ts +9 -0
  220. package/dist/sensors/useWindowScroll/index.js +36 -0
  221. package/dist/sensors/useWindowScroll/index.js.map +1 -0
  222. package/dist/sensors/useWindowScroll/index.mjs +12 -0
  223. package/dist/sensors/useWindowScroll/index.mjs.map +1 -0
  224. package/dist/shared/configurable.d.mts +21 -0
  225. package/dist/shared/configurable.d.ts +21 -0
  226. package/dist/shared/configurable.js +39 -0
  227. package/dist/shared/configurable.js.map +1 -0
  228. package/dist/shared/configurable.mjs +12 -0
  229. package/dist/shared/configurable.mjs.map +1 -0
  230. package/dist/shared/index.d.mts +4 -0
  231. package/dist/shared/index.d.ts +4 -0
  232. package/dist/shared/index.js +31 -0
  233. package/dist/shared/index.js.map +1 -0
  234. package/dist/shared/index.mjs +7 -0
  235. package/dist/shared/index.mjs.map +1 -0
  236. package/dist/shared/normalizeTargets/index.d.mts +21 -0
  237. package/dist/shared/normalizeTargets/index.d.ts +21 -0
  238. package/dist/shared/normalizeTargets/index.js +36 -0
  239. package/dist/shared/normalizeTargets/index.js.map +1 -0
  240. package/dist/shared/normalizeTargets/index.mjs +12 -0
  241. package/dist/shared/normalizeTargets/index.mjs.map +1 -0
  242. package/dist/shared/utils.d.mts +15 -0
  243. package/dist/shared/utils.d.ts +15 -0
  244. package/dist/shared/utils.js +87 -0
  245. package/dist/shared/utils.js.map +1 -0
  246. package/dist/shared/utils.mjs +52 -0
  247. package/dist/shared/utils.mjs.map +1 -0
  248. package/dist/types.d.mts +52 -0
  249. package/dist/types.d.ts +52 -0
  250. package/dist/types.js +17 -0
  251. package/dist/types.js.map +1 -0
  252. package/dist/types.mjs +1 -0
  253. package/dist/types.mjs.map +1 -0
  254. package/package.json +54 -0
  255. package/src/browser/useEventListener/index.md +109 -0
  256. package/src/browser/useEventListener/index.spec.ts +611 -0
  257. package/src/browser/useEventListener/index.ts +242 -0
  258. package/src/browser/useMediaQuery/demo.tsx +58 -0
  259. package/src/browser/useMediaQuery/index.md +40 -0
  260. package/src/browser/useMediaQuery/index.spec.ts +267 -0
  261. package/src/browser/useMediaQuery/index.ts +96 -0
  262. package/src/components/Auto/index.tsx +65 -0
  263. package/src/elements/useDocumentVisibility/demo.tsx +111 -0
  264. package/src/elements/useDocumentVisibility/index.md +51 -0
  265. package/src/elements/useDocumentVisibility/index.spec.ts +114 -0
  266. package/src/elements/useDocumentVisibility/index.ts +26 -0
  267. package/src/elements/useElementBounding/demo.tsx +63 -0
  268. package/src/elements/useElementBounding/index.md +59 -0
  269. package/src/elements/useElementBounding/index.ts +159 -0
  270. package/src/elements/useElementSize/demo.tsx +48 -0
  271. package/src/elements/useElementSize/index.md +60 -0
  272. package/src/elements/useElementSize/index.spec.ts +295 -0
  273. package/src/elements/useElementSize/index.ts +100 -0
  274. package/src/elements/useElementVisibility/deep-observable-pattern.spec.ts +453 -0
  275. package/src/elements/useElementVisibility/demo.tsx +97 -0
  276. package/src/elements/useElementVisibility/index.md +98 -0
  277. package/src/elements/useElementVisibility/index.spec.ts +227 -0
  278. package/src/elements/useElementVisibility/index.ts +78 -0
  279. package/src/elements/useIntersectionObserver/demo.tsx +180 -0
  280. package/src/elements/useIntersectionObserver/index.md +99 -0
  281. package/src/elements/useIntersectionObserver/index.spec.ts +482 -0
  282. package/src/elements/useIntersectionObserver/index.ts +149 -0
  283. package/src/elements/useMouseInElement/demo.tsx +79 -0
  284. package/src/elements/useMouseInElement/index.md +71 -0
  285. package/src/elements/useMouseInElement/index.spec.ts +398 -0
  286. package/src/elements/useMouseInElement/index.ts +209 -0
  287. package/src/elements/useMutationObserver/demo.tsx +270 -0
  288. package/src/elements/useMutationObserver/index.md +99 -0
  289. package/src/elements/useMutationObserver/index.spec.ts +421 -0
  290. package/src/elements/useMutationObserver/index.ts +66 -0
  291. package/src/elements/useParentElement/demo.tsx +120 -0
  292. package/src/elements/useParentElement/index.md +67 -0
  293. package/src/elements/useParentElement/index.spec.ts +208 -0
  294. package/src/elements/useParentElement/index.ts +35 -0
  295. package/src/elements/useRef$/index.md +62 -0
  296. package/src/elements/useRef$/index.spec.ts +205 -0
  297. package/src/elements/useRef$/index.ts +137 -0
  298. package/src/elements/useRef$/useImperativeHandle.spec.ts +339 -0
  299. package/src/elements/useResizeObserver/demo.tsx +56 -0
  300. package/src/elements/useResizeObserver/index.md +51 -0
  301. package/src/elements/useResizeObserver/index.spec.ts +312 -0
  302. package/src/elements/useResizeObserver/index.ts +106 -0
  303. package/src/elements/useWindowFocus/demo.tsx +71 -0
  304. package/src/elements/useWindowFocus/index.md +35 -0
  305. package/src/elements/useWindowFocus/index.spec.ts +103 -0
  306. package/src/elements/useWindowFocus/index.ts +21 -0
  307. package/src/elements/useWindowSize/demo.tsx +46 -0
  308. package/src/elements/useWindowSize/index.md +50 -0
  309. package/src/elements/useWindowSize/index.spec.ts +310 -0
  310. package/src/elements/useWindowSize/index.ts +107 -0
  311. package/src/function/get/index.md +25 -0
  312. package/src/function/get/index.spec.ts +87 -0
  313. package/src/function/get/index.ts +70 -0
  314. package/src/function/peek/index.spec.ts +97 -0
  315. package/src/function/peek/index.ts +69 -0
  316. package/src/function/useMayObservableOptions/index.spec.ts +521 -0
  317. package/src/function/useMayObservableOptions/index.ts +173 -0
  318. package/src/function/useSupported/index.md +38 -0
  319. package/src/function/useSupported/index.spec.ts +116 -0
  320. package/src/function/useSupported/index.ts +14 -0
  321. package/src/function/useWhenMounted/index.md +25 -0
  322. package/src/function/useWhenMounted/index.spec.ts +120 -0
  323. package/src/function/useWhenMounted/index.ts +16 -0
  324. package/src/index.ts +25 -0
  325. package/src/sensors/useScroll/demo.tsx +98 -0
  326. package/src/sensors/useScroll/index.md +112 -0
  327. package/src/sensors/useScroll/index.spec.ts +678 -0
  328. package/src/sensors/useScroll/index.ts +201 -0
  329. package/src/sensors/useWindowScroll/demo.tsx +69 -0
  330. package/src/sensors/useWindowScroll/index.md +88 -0
  331. package/src/sensors/useWindowScroll/index.spec.ts +69 -0
  332. package/src/sensors/useWindowScroll/index.ts +11 -0
  333. package/src/shared/configurable.ts +35 -0
  334. package/src/shared/index.ts +4 -0
  335. package/src/shared/normalizeTargets/index.spec.ts +76 -0
  336. package/src/shared/normalizeTargets/index.ts +27 -0
  337. package/src/shared/utils.ts +67 -0
  338. package/src/types.ts +56 -0
  339. package/tsconfig.json +9 -0
  340. package/tsup.config.ts +10 -0
  341. package/vitest.config.ts +22 -0
@@ -0,0 +1,47 @@
1
+ import { Observable } from '@legendapp/state';
2
+ import { DeepMaybeObservable } from '../../types.js';
3
+ import { MaybeElement } from '../useRef_/index.js';
4
+ import 'react';
5
+
6
+ interface UseIntersectionObserverOptions {
7
+ /** Whether to start observing immediately on mount. Default: true */
8
+ immediate?: boolean;
9
+ /** The element or document used as the viewport. Default: browser viewport */
10
+ root?: MaybeElement;
11
+ /** Margin around the root. Accepts CSS-style values. Default: "0px" */
12
+ rootMargin?: string;
13
+ /** Threshold(s) at which to trigger the callback. Default: 0 */
14
+ threshold?: number | number[];
15
+ }
16
+ interface UseIntersectionObserverReturn {
17
+ isSupported$: Observable<boolean>;
18
+ isActive$: Observable<boolean>;
19
+ stop: () => void;
20
+ pause: () => void;
21
+ resume: () => void;
22
+ }
23
+ /**
24
+ * Reactive wrapper around the IntersectionObserver API.
25
+ * Observes one or more elements for intersection changes with pause/resume/stop support.
26
+ *
27
+ * @param target - Element(s) to observe: Ref$, Observable, raw Element, or array of these
28
+ * @param callback - Called when intersection state changes
29
+ * @param options - IntersectionObserver options plus an `immediate` flag
30
+ * @returns `{ isSupported$, isActive$, pause, resume, stop }`
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * const el$ = useRef$<HTMLDivElement>();
35
+ * const { isActive$, pause, resume } = useIntersectionObserver(
36
+ * el$,
37
+ * (entries) => {
38
+ * entries.forEach(entry => console.log(entry.isIntersecting));
39
+ * },
40
+ * { threshold: 0.5 },
41
+ * );
42
+ * return <div ref={el$} />;
43
+ * ```
44
+ */
45
+ declare function useIntersectionObserver(target: MaybeElement | MaybeElement[], callback: IntersectionObserverCallback, options?: DeepMaybeObservable<UseIntersectionObserverOptions>): UseIntersectionObserverReturn;
46
+
47
+ export { type UseIntersectionObserverOptions, type UseIntersectionObserverReturn, useIntersectionObserver };
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var useIntersectionObserver_exports = {};
20
+ __export(useIntersectionObserver_exports, {
21
+ useIntersectionObserver: () => useIntersectionObserver
22
+ });
23
+ module.exports = __toCommonJS(useIntersectionObserver_exports);
24
+ var import_react = require("@legendapp/state/react");
25
+ var import_react2 = require("react");
26
+ var import_useMayObservableOptions = require("../../function/useMayObservableOptions");
27
+ var import_shared = require("../../shared");
28
+ var import_useResizeObserver = require("../useResizeObserver");
29
+ var import_get = require("../../function/get");
30
+ function useIntersectionObserver(target, callback, options) {
31
+ const opts$ = (0, import_useMayObservableOptions.useMayObservableOptions)(
32
+ options,
33
+ {
34
+ immediate: "peek",
35
+ threshold: "peek",
36
+ root: "get.element",
37
+ rootMargin: (value) => (0, import_get.get)(value)
38
+ }
39
+ );
40
+ const isSupported$ = (0, import_react.useObservable)(
41
+ typeof IntersectionObserver !== "undefined"
42
+ );
43
+ const isActive$ = (0, import_react.useObservable)(opts$.immediate.peek() !== false);
44
+ const observerRef = (0, import_react2.useRef)(null);
45
+ const stoppedRef = (0, import_react2.useRef)(false);
46
+ const mountedRef = (0, import_react2.useRef)(false);
47
+ const cleanup = () => {
48
+ observerRef.current?.disconnect();
49
+ observerRef.current = null;
50
+ };
51
+ const setup = () => {
52
+ if (!isSupported$.peek() || !isActive$.peek()) return;
53
+ cleanup();
54
+ const rawRoot = opts$.root.peek();
55
+ const root = rawRoot == null ? rawRoot : (() => {
56
+ const el = rawRoot.valueOf();
57
+ return (0, import_shared.isWindow)(el) ? null : el;
58
+ })();
59
+ observerRef.current = new IntersectionObserver(callback, {
60
+ root: root ?? void 0,
61
+ rootMargin: opts$.rootMargin.peek(),
62
+ threshold: opts$.threshold.peek() ?? 0
63
+ });
64
+ const targets = (0, import_useResizeObserver.normalizeTargets)(target);
65
+ targets.forEach((el) => observerRef.current?.observe(el));
66
+ };
67
+ (0, import_react2.useEffect)(() => {
68
+ mountedRef.current = true;
69
+ return () => {
70
+ mountedRef.current = false;
71
+ cleanup();
72
+ };
73
+ }, []);
74
+ (0, import_react.useObserveEffect)((e) => {
75
+ e.onCleanup = cleanup;
76
+ const root = opts$.root.get();
77
+ opts$.rootMargin.get();
78
+ isActive$.get();
79
+ (0, import_useResizeObserver.normalizeTargets)(target);
80
+ if (stoppedRef.current) return;
81
+ if (root === null) return;
82
+ setup();
83
+ });
84
+ const pause = () => {
85
+ if (!mountedRef.current) return;
86
+ cleanup();
87
+ isActive$.set(false);
88
+ };
89
+ const resume = () => {
90
+ if (stoppedRef.current || !mountedRef.current) return;
91
+ isActive$.set(true);
92
+ };
93
+ const stop = () => {
94
+ if (!mountedRef.current) return;
95
+ stoppedRef.current = true;
96
+ cleanup();
97
+ isActive$.set(false);
98
+ };
99
+ return {
100
+ isSupported$,
101
+ isActive$,
102
+ stop,
103
+ pause,
104
+ resume
105
+ };
106
+ }
107
+ // Annotate the CommonJS export names for ESM import in node:
108
+ 0 && (module.exports = {
109
+ useIntersectionObserver
110
+ });
111
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useIntersectionObserver/index.ts"],"sourcesContent":["import type { Observable } from \"@legendapp/state\";\nimport { useObservable, useObserveEffect } from \"@legendapp/state/react\";\nimport { useEffect, useRef } from \"react\";\nimport { useMayObservableOptions } from \"../../function/useMayObservableOptions\";\nimport type { DeepMaybeObservable, MaybeObservable } from \"../../types\";\nimport { isWindow } from \"../../shared\";\nimport type { MaybeElement } from \"../useRef$\";\nimport { normalizeTargets } from \"../useResizeObserver\";\nimport { get } from \"../../function/get\";\n\nexport interface UseIntersectionObserverOptions {\n /** Whether to start observing immediately on mount. Default: true */\n immediate?: boolean;\n /** The element or document used as the viewport. Default: browser viewport */\n root?: MaybeElement;\n /** Margin around the root. Accepts CSS-style values. Default: \"0px\" */\n rootMargin?: string;\n /** Threshold(s) at which to trigger the callback. Default: 0 */\n threshold?: number | number[];\n}\n\nexport interface UseIntersectionObserverReturn {\n isSupported$: Observable<boolean>;\n isActive$: Observable<boolean>;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n}\n\n/**\n * Reactive wrapper around the IntersectionObserver API.\n * Observes one or more elements for intersection changes with pause/resume/stop support.\n *\n * @param target - Element(s) to observe: Ref$, Observable, raw Element, or array of these\n * @param callback - Called when intersection state changes\n * @param options - IntersectionObserver options plus an `immediate` flag\n * @returns `{ isSupported$, isActive$, pause, resume, stop }`\n *\n * @example\n * ```tsx\n * const el$ = useRef$<HTMLDivElement>();\n * const { isActive$, pause, resume } = useIntersectionObserver(\n * el$,\n * (entries) => {\n * entries.forEach(entry => console.log(entry.isIntersecting));\n * },\n * { threshold: 0.5 },\n * );\n * return <div ref={el$} />;\n * ```\n */\nexport function useIntersectionObserver(\n target: MaybeElement | MaybeElement[],\n callback: IntersectionObserverCallback,\n options?: DeepMaybeObservable<UseIntersectionObserverOptions>,\n): UseIntersectionObserverReturn {\n const opts$ = useMayObservableOptions<UseIntersectionObserverOptions>(\n options,\n {\n immediate: \"peek\",\n threshold: \"peek\",\n root: \"get.element\",\n rootMargin: (value) => get(value as MaybeObservable<string | undefined>),\n },\n );\n const isSupported$ = useObservable<boolean>(\n typeof IntersectionObserver !== \"undefined\",\n );\n const isActive$ = useObservable<boolean>(opts$.immediate.peek() !== false);\n const observerRef = useRef<IntersectionObserver | null>(null);\n const stoppedRef = useRef(false);\n const mountedRef = useRef(false);\n\n const cleanup = () => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n };\n\n const setup = () => {\n if (!isSupported$.peek() || !isActive$.peek()) return;\n cleanup();\n\n const rawRoot = opts$.root.peek();\n const root =\n rawRoot == null\n ? (rawRoot as null | undefined)\n : (() => {\n const el = (\n rawRoot as unknown as { valueOf(): HTMLElement | Document }\n ).valueOf();\n return isWindow(el as unknown) ? null : el;\n })();\n\n observerRef.current = new IntersectionObserver(callback, {\n root: root ?? undefined,\n rootMargin: opts$.rootMargin.peek() as string | undefined,\n threshold: (opts$.threshold.peek() as number | number[] | undefined) ?? 0,\n });\n\n const targets = normalizeTargets(target);\n targets.forEach((el) => observerRef.current?.observe(el));\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n cleanup();\n };\n }, []);\n\n useObserveEffect((e) => {\n e.onCleanup = cleanup;\n const root = opts$.root.get();\n opts$.rootMargin.get();\n isActive$.get();\n normalizeTargets(target);\n if (stoppedRef.current) return;\n if (root === null) return;\n setup();\n });\n\n const pause = () => {\n if (!mountedRef.current) return;\n cleanup();\n isActive$.set(false);\n };\n\n const resume = () => {\n if (stoppedRef.current || !mountedRef.current) return;\n isActive$.set(true);\n };\n\n const stop = () => {\n if (!mountedRef.current) return;\n stoppedRef.current = true;\n cleanup();\n isActive$.set(false);\n };\n\n return {\n isSupported$,\n isActive$,\n stop,\n pause,\n resume,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAgD;AAChD,IAAAA,gBAAkC;AAClC,qCAAwC;AAExC,oBAAyB;AAEzB,+BAAiC;AACjC,iBAAoB;AA2Cb,SAAS,wBACd,QACA,UACA,SAC+B;AAC/B,QAAM,YAAQ;AAAA,IACZ;AAAA,IACA;AAAA,MACE,WAAW;AAAA,MACX,WAAW;AAAA,MACX,MAAM;AAAA,MACN,YAAY,CAAC,cAAU,gBAAI,KAA4C;AAAA,IACzE;AAAA,EACF;AACA,QAAM,mBAAe;AAAA,IACnB,OAAO,yBAAyB;AAAA,EAClC;AACA,QAAM,gBAAY,4BAAuB,MAAM,UAAU,KAAK,MAAM,KAAK;AACzE,QAAM,kBAAc,sBAAoC,IAAI;AAC5D,QAAM,iBAAa,sBAAO,KAAK;AAC/B,QAAM,iBAAa,sBAAO,KAAK;AAE/B,QAAM,UAAU,MAAM;AACpB,gBAAY,SAAS,WAAW;AAChC,gBAAY,UAAU;AAAA,EACxB;AAEA,QAAM,QAAQ,MAAM;AAClB,QAAI,CAAC,aAAa,KAAK,KAAK,CAAC,UAAU,KAAK,EAAG;AAC/C,YAAQ;AAER,UAAM,UAAU,MAAM,KAAK,KAAK;AAChC,UAAM,OACJ,WAAW,OACN,WACA,MAAM;AACL,YAAM,KACJ,QACA,QAAQ;AACV,iBAAO,wBAAS,EAAa,IAAI,OAAO;AAAA,IAC1C,GAAG;AAET,gBAAY,UAAU,IAAI,qBAAqB,UAAU;AAAA,MACvD,MAAM,QAAQ;AAAA,MACd,YAAY,MAAM,WAAW,KAAK;AAAA,MAClC,WAAY,MAAM,UAAU,KAAK,KAAuC;AAAA,IAC1E,CAAC;AAED,UAAM,cAAU,2CAAiB,MAAM;AACvC,YAAQ,QAAQ,CAAC,OAAO,YAAY,SAAS,QAAQ,EAAE,CAAC;AAAA,EAC1D;AAGA,+BAAU,MAAM;AACd,eAAW,UAAU;AACrB,WAAO,MAAM;AACX,iBAAW,UAAU;AACrB,cAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,qCAAiB,CAAC,MAAM;AACtB,MAAE,YAAY;AACd,UAAM,OAAO,MAAM,KAAK,IAAI;AAC5B,UAAM,WAAW,IAAI;AACrB,cAAU,IAAI;AACd,mDAAiB,MAAM;AACvB,QAAI,WAAW,QAAS;AACxB,QAAI,SAAS,KAAM;AACnB,UAAM;AAAA,EACR,CAAC;AAED,QAAM,QAAQ,MAAM;AAClB,QAAI,CAAC,WAAW,QAAS;AACzB,YAAQ;AACR,cAAU,IAAI,KAAK;AAAA,EACrB;AAEA,QAAM,SAAS,MAAM;AACnB,QAAI,WAAW,WAAW,CAAC,WAAW,QAAS;AAC/C,cAAU,IAAI,IAAI;AAAA,EACpB;AAEA,QAAM,OAAO,MAAM;AACjB,QAAI,CAAC,WAAW,QAAS;AACzB,eAAW,UAAU;AACrB,YAAQ;AACR,cAAU,IAAI,KAAK;AAAA,EACrB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":["import_react"]}
@@ -0,0 +1,87 @@
1
+ import { useObservable, useObserveEffect } from "@legendapp/state/react";
2
+ import { useEffect, useRef } from "react";
3
+ import { useMayObservableOptions } from "../../function/useMayObservableOptions";
4
+ import { isWindow } from "../../shared";
5
+ import { normalizeTargets } from "../useResizeObserver";
6
+ import { get } from "../../function/get";
7
+ function useIntersectionObserver(target, callback, options) {
8
+ const opts$ = useMayObservableOptions(
9
+ options,
10
+ {
11
+ immediate: "peek",
12
+ threshold: "peek",
13
+ root: "get.element",
14
+ rootMargin: (value) => get(value)
15
+ }
16
+ );
17
+ const isSupported$ = useObservable(
18
+ typeof IntersectionObserver !== "undefined"
19
+ );
20
+ const isActive$ = useObservable(opts$.immediate.peek() !== false);
21
+ const observerRef = useRef(null);
22
+ const stoppedRef = useRef(false);
23
+ const mountedRef = useRef(false);
24
+ const cleanup = () => {
25
+ observerRef.current?.disconnect();
26
+ observerRef.current = null;
27
+ };
28
+ const setup = () => {
29
+ if (!isSupported$.peek() || !isActive$.peek()) return;
30
+ cleanup();
31
+ const rawRoot = opts$.root.peek();
32
+ const root = rawRoot == null ? rawRoot : (() => {
33
+ const el = rawRoot.valueOf();
34
+ return isWindow(el) ? null : el;
35
+ })();
36
+ observerRef.current = new IntersectionObserver(callback, {
37
+ root: root ?? void 0,
38
+ rootMargin: opts$.rootMargin.peek(),
39
+ threshold: opts$.threshold.peek() ?? 0
40
+ });
41
+ const targets = normalizeTargets(target);
42
+ targets.forEach((el) => observerRef.current?.observe(el));
43
+ };
44
+ useEffect(() => {
45
+ mountedRef.current = true;
46
+ return () => {
47
+ mountedRef.current = false;
48
+ cleanup();
49
+ };
50
+ }, []);
51
+ useObserveEffect((e) => {
52
+ e.onCleanup = cleanup;
53
+ const root = opts$.root.get();
54
+ opts$.rootMargin.get();
55
+ isActive$.get();
56
+ normalizeTargets(target);
57
+ if (stoppedRef.current) return;
58
+ if (root === null) return;
59
+ setup();
60
+ });
61
+ const pause = () => {
62
+ if (!mountedRef.current) return;
63
+ cleanup();
64
+ isActive$.set(false);
65
+ };
66
+ const resume = () => {
67
+ if (stoppedRef.current || !mountedRef.current) return;
68
+ isActive$.set(true);
69
+ };
70
+ const stop = () => {
71
+ if (!mountedRef.current) return;
72
+ stoppedRef.current = true;
73
+ cleanup();
74
+ isActive$.set(false);
75
+ };
76
+ return {
77
+ isSupported$,
78
+ isActive$,
79
+ stop,
80
+ pause,
81
+ resume
82
+ };
83
+ }
84
+ export {
85
+ useIntersectionObserver
86
+ };
87
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useIntersectionObserver/index.ts"],"sourcesContent":["import type { Observable } from \"@legendapp/state\";\nimport { useObservable, useObserveEffect } from \"@legendapp/state/react\";\nimport { useEffect, useRef } from \"react\";\nimport { useMayObservableOptions } from \"../../function/useMayObservableOptions\";\nimport type { DeepMaybeObservable, MaybeObservable } from \"../../types\";\nimport { isWindow } from \"../../shared\";\nimport type { MaybeElement } from \"../useRef$\";\nimport { normalizeTargets } from \"../useResizeObserver\";\nimport { get } from \"../../function/get\";\n\nexport interface UseIntersectionObserverOptions {\n /** Whether to start observing immediately on mount. Default: true */\n immediate?: boolean;\n /** The element or document used as the viewport. Default: browser viewport */\n root?: MaybeElement;\n /** Margin around the root. Accepts CSS-style values. Default: \"0px\" */\n rootMargin?: string;\n /** Threshold(s) at which to trigger the callback. Default: 0 */\n threshold?: number | number[];\n}\n\nexport interface UseIntersectionObserverReturn {\n isSupported$: Observable<boolean>;\n isActive$: Observable<boolean>;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n}\n\n/**\n * Reactive wrapper around the IntersectionObserver API.\n * Observes one or more elements for intersection changes with pause/resume/stop support.\n *\n * @param target - Element(s) to observe: Ref$, Observable, raw Element, or array of these\n * @param callback - Called when intersection state changes\n * @param options - IntersectionObserver options plus an `immediate` flag\n * @returns `{ isSupported$, isActive$, pause, resume, stop }`\n *\n * @example\n * ```tsx\n * const el$ = useRef$<HTMLDivElement>();\n * const { isActive$, pause, resume } = useIntersectionObserver(\n * el$,\n * (entries) => {\n * entries.forEach(entry => console.log(entry.isIntersecting));\n * },\n * { threshold: 0.5 },\n * );\n * return <div ref={el$} />;\n * ```\n */\nexport function useIntersectionObserver(\n target: MaybeElement | MaybeElement[],\n callback: IntersectionObserverCallback,\n options?: DeepMaybeObservable<UseIntersectionObserverOptions>,\n): UseIntersectionObserverReturn {\n const opts$ = useMayObservableOptions<UseIntersectionObserverOptions>(\n options,\n {\n immediate: \"peek\",\n threshold: \"peek\",\n root: \"get.element\",\n rootMargin: (value) => get(value as MaybeObservable<string | undefined>),\n },\n );\n const isSupported$ = useObservable<boolean>(\n typeof IntersectionObserver !== \"undefined\",\n );\n const isActive$ = useObservable<boolean>(opts$.immediate.peek() !== false);\n const observerRef = useRef<IntersectionObserver | null>(null);\n const stoppedRef = useRef(false);\n const mountedRef = useRef(false);\n\n const cleanup = () => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n };\n\n const setup = () => {\n if (!isSupported$.peek() || !isActive$.peek()) return;\n cleanup();\n\n const rawRoot = opts$.root.peek();\n const root =\n rawRoot == null\n ? (rawRoot as null | undefined)\n : (() => {\n const el = (\n rawRoot as unknown as { valueOf(): HTMLElement | Document }\n ).valueOf();\n return isWindow(el as unknown) ? null : el;\n })();\n\n observerRef.current = new IntersectionObserver(callback, {\n root: root ?? undefined,\n rootMargin: opts$.rootMargin.peek() as string | undefined,\n threshold: (opts$.threshold.peek() as number | number[] | undefined) ?? 0,\n });\n\n const targets = normalizeTargets(target);\n targets.forEach((el) => observerRef.current?.observe(el));\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n cleanup();\n };\n }, []);\n\n useObserveEffect((e) => {\n e.onCleanup = cleanup;\n const root = opts$.root.get();\n opts$.rootMargin.get();\n isActive$.get();\n normalizeTargets(target);\n if (stoppedRef.current) return;\n if (root === null) return;\n setup();\n });\n\n const pause = () => {\n if (!mountedRef.current) return;\n cleanup();\n isActive$.set(false);\n };\n\n const resume = () => {\n if (stoppedRef.current || !mountedRef.current) return;\n isActive$.set(true);\n };\n\n const stop = () => {\n if (!mountedRef.current) return;\n stoppedRef.current = true;\n cleanup();\n isActive$.set(false);\n };\n\n return {\n isSupported$,\n isActive$,\n stop,\n pause,\n resume,\n };\n}\n"],"mappings":"AACA,SAAS,eAAe,wBAAwB;AAChD,SAAS,WAAW,cAAc;AAClC,SAAS,+BAA+B;AAExC,SAAS,gBAAgB;AAEzB,SAAS,wBAAwB;AACjC,SAAS,WAAW;AA2Cb,SAAS,wBACd,QACA,UACA,SAC+B;AAC/B,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,MACE,WAAW;AAAA,MACX,WAAW;AAAA,MACX,MAAM;AAAA,MACN,YAAY,CAAC,UAAU,IAAI,KAA4C;AAAA,IACzE;AAAA,EACF;AACA,QAAM,eAAe;AAAA,IACnB,OAAO,yBAAyB;AAAA,EAClC;AACA,QAAM,YAAY,cAAuB,MAAM,UAAU,KAAK,MAAM,KAAK;AACzE,QAAM,cAAc,OAAoC,IAAI;AAC5D,QAAM,aAAa,OAAO,KAAK;AAC/B,QAAM,aAAa,OAAO,KAAK;AAE/B,QAAM,UAAU,MAAM;AACpB,gBAAY,SAAS,WAAW;AAChC,gBAAY,UAAU;AAAA,EACxB;AAEA,QAAM,QAAQ,MAAM;AAClB,QAAI,CAAC,aAAa,KAAK,KAAK,CAAC,UAAU,KAAK,EAAG;AAC/C,YAAQ;AAER,UAAM,UAAU,MAAM,KAAK,KAAK;AAChC,UAAM,OACJ,WAAW,OACN,WACA,MAAM;AACL,YAAM,KACJ,QACA,QAAQ;AACV,aAAO,SAAS,EAAa,IAAI,OAAO;AAAA,IAC1C,GAAG;AAET,gBAAY,UAAU,IAAI,qBAAqB,UAAU;AAAA,MACvD,MAAM,QAAQ;AAAA,MACd,YAAY,MAAM,WAAW,KAAK;AAAA,MAClC,WAAY,MAAM,UAAU,KAAK,KAAuC;AAAA,IAC1E,CAAC;AAED,UAAM,UAAU,iBAAiB,MAAM;AACvC,YAAQ,QAAQ,CAAC,OAAO,YAAY,SAAS,QAAQ,EAAE,CAAC;AAAA,EAC1D;AAGA,YAAU,MAAM;AACd,eAAW,UAAU;AACrB,WAAO,MAAM;AACX,iBAAW,UAAU;AACrB,cAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,mBAAiB,CAAC,MAAM;AACtB,MAAE,YAAY;AACd,UAAM,OAAO,MAAM,KAAK,IAAI;AAC5B,UAAM,WAAW,IAAI;AACrB,cAAU,IAAI;AACd,qBAAiB,MAAM;AACvB,QAAI,WAAW,QAAS;AACxB,QAAI,SAAS,KAAM;AACnB,UAAM;AAAA,EACR,CAAC;AAED,QAAM,QAAQ,MAAM;AAClB,QAAI,CAAC,WAAW,QAAS;AACzB,YAAQ;AACR,cAAU,IAAI,KAAK;AAAA,EACrB;AAEA,QAAM,SAAS,MAAM;AACnB,QAAI,WAAW,WAAW,CAAC,WAAW,QAAS;AAC/C,cAAU,IAAI,IAAI;AAAA,EACpB;AAEA,QAAM,OAAO,MAAM;AACjB,QAAI,CAAC,WAAW,QAAS;AACzB,eAAW,UAAU;AACrB,YAAQ;AACR,cAAU,IAAI,KAAK;AAAA,EACrB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function UseMouseInElementDemo(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { UseMouseInElementDemo as default };
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function UseMouseInElementDemo(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { UseMouseInElementDemo as default };
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var demo_exports = {};
20
+ __export(demo_exports, {
21
+ default: () => UseMouseInElementDemo
22
+ });
23
+ module.exports = __toCommonJS(demo_exports);
24
+ var import_jsx_runtime = require("react/jsx-runtime");
25
+ var import_useRef = require("../useRef$");
26
+ var import__ = require(".");
27
+ function UseMouseInElementDemo() {
28
+ const el$ = (0, import_useRef.useRef$)();
29
+ const { elementX$, elementY$, isOutside$, elementWidth$, elementHeight$, x$, y$: _y$ } = (0, import__.useMouseInElement)(el$);
30
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
31
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
32
+ "div",
33
+ {
34
+ style: {
35
+ display: "grid",
36
+ gridTemplateColumns: "repeat(3, 1fr)",
37
+ gap: "6px",
38
+ fontFamily: "monospace",
39
+ fontSize: "13px",
40
+ padding: "10px 14px",
41
+ background: "var(--sl-color-gray-6, #f1f5f9)",
42
+ borderRadius: "6px"
43
+ },
44
+ children: [
45
+ ["elementX", `${Math.round(elementX$.get())}px`],
46
+ ["elementY", `${Math.round(elementY$.get())}px`],
47
+ ["isOutside", String(isOutside$.get())],
48
+ ["width", `${Math.round(elementWidth$.get())}px`],
49
+ ["height", `${Math.round(elementHeight$.get())}px`],
50
+ ["x (global)", `${Math.round(x$.get())}px`]
51
+ ].map(([label, val]) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
52
+ label,
53
+ ": ",
54
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: val })
55
+ ] }, label))
56
+ }
57
+ ),
58
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
59
+ "div",
60
+ {
61
+ ref: el$,
62
+ style: {
63
+ position: "relative",
64
+ width: "100%",
65
+ height: "160px",
66
+ border: "1px solid var(--sl-color-gray-5, #cbd5e1)",
67
+ borderRadius: "6px",
68
+ overflow: "hidden",
69
+ display: "flex",
70
+ alignItems: "center",
71
+ justifyContent: "center",
72
+ userSelect: "none",
73
+ fontFamily: "monospace",
74
+ fontSize: "13px",
75
+ color: "var(--sl-color-gray-3, #94a3b8)",
76
+ cursor: "crosshair"
77
+ },
78
+ children: [
79
+ "move your mouse here",
80
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
81
+ "div",
82
+ {
83
+ style: {
84
+ position: "absolute",
85
+ left: elementX$.get(),
86
+ top: elementY$.get(),
87
+ width: "10px",
88
+ height: "10px",
89
+ borderRadius: "50%",
90
+ background: "var(--sl-color-accent, #818cf8)",
91
+ transform: "translate(-50%, -50%)",
92
+ pointerEvents: "none",
93
+ opacity: isOutside$.get() ? 0 : 1,
94
+ transition: "opacity 0.15s"
95
+ }
96
+ }
97
+ )
98
+ ]
99
+ }
100
+ )
101
+ ] });
102
+ }
103
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useMouseInElement/demo.tsx"],"sourcesContent":["import { useRef$ } from \"../useRef$\";\nimport { useMouseInElement } from \".\";\n\nexport default function UseMouseInElementDemo() {\n const el$ = useRef$<HTMLDivElement>();\n const { elementX$, elementY$, isOutside$, elementWidth$, elementHeight$, x$, y$: _y$ } =\n useMouseInElement(el$);\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"12px\" }}>\n {/* Stats readout */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n gap: \"6px\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n padding: \"10px 14px\",\n background: \"var(--sl-color-gray-6, #f1f5f9)\",\n borderRadius: \"6px\",\n }}\n >\n {(\n [\n [\"elementX\", `${Math.round(elementX$.get())}px`],\n [\"elementY\", `${Math.round(elementY$.get())}px`],\n [\"isOutside\", String(isOutside$.get())],\n [\"width\", `${Math.round(elementWidth$.get())}px`],\n [\"height\", `${Math.round(elementHeight$.get())}px`],\n [\"x (global)\", `${Math.round(x$.get())}px`],\n ] as [string, string][]\n ).map(([label, val]) => (\n <span key={label}>\n {label}: <strong>{val}</strong>\n </span>\n ))}\n </div>\n\n {/* Hover target with tracking dot */}\n <div\n ref={el$}\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"160px\",\n border: \"1px solid var(--sl-color-gray-5, #cbd5e1)\",\n borderRadius: \"6px\",\n overflow: \"hidden\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n userSelect: \"none\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n color: \"var(--sl-color-gray-3, #94a3b8)\",\n cursor: \"crosshair\",\n }}\n >\n move your mouse here\n <div\n style={{\n position: \"absolute\",\n left: elementX$.get(),\n top: elementY$.get(),\n width: \"10px\",\n height: \"10px\",\n borderRadius: \"50%\",\n background: \"var(--sl-color-accent, #818cf8)\",\n transform: \"translate(-50%, -50%)\",\n pointerEvents: \"none\",\n opacity: isOutside$.get() ? 0 : 1,\n transition: \"opacity 0.15s\",\n }}\n />\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCU;AAjCV,oBAAwB;AACxB,eAAkC;AAEnB,SAAR,wBAAyC;AAC9C,QAAM,UAAM,uBAAwB;AACpC,QAAM,EAAE,WAAW,WAAW,YAAY,eAAe,gBAAgB,IAAI,IAAI,IAAI,QACnF,4BAAkB,GAAG;AAEvB,SACE,6CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAO,GAElE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,qBAAqB;AAAA,UACrB,KAAK;AAAA,UACL,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,cAAc;AAAA,QAChB;AAAA,QAGE;AAAA,UACE,CAAC,YAAY,GAAG,KAAK,MAAM,UAAU,IAAI,CAAC,CAAC,IAAI;AAAA,UAC/C,CAAC,YAAY,GAAG,KAAK,MAAM,UAAU,IAAI,CAAC,CAAC,IAAI;AAAA,UAC/C,CAAC,aAAa,OAAO,WAAW,IAAI,CAAC,CAAC;AAAA,UACtC,CAAC,SAAS,GAAG,KAAK,MAAM,cAAc,IAAI,CAAC,CAAC,IAAI;AAAA,UAChD,CAAC,UAAU,GAAG,KAAK,MAAM,eAAe,IAAI,CAAC,CAAC,IAAI;AAAA,UAClD,CAAC,cAAc,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,IAAI;AAAA,QAC5C,EACA,IAAI,CAAC,CAAC,OAAO,GAAG,MAChB,6CAAC,UACE;AAAA;AAAA,UAAM;AAAA,UAAE,4CAAC,YAAQ,eAAI;AAAA,aADb,KAEX,CACD;AAAA;AAAA,IACH;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,QACV;AAAA,QACD;AAAA;AAAA,UAEC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,MAAM,UAAU,IAAI;AAAA,gBACpB,KAAK,UAAU,IAAI;AAAA,gBACnB,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,WAAW;AAAA,gBACX,eAAe;AAAA,gBACf,SAAS,WAAW,IAAI,IAAI,IAAI;AAAA,gBAChC,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,83 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useRef$ } from "../useRef$";
3
+ import { useMouseInElement } from ".";
4
+ function UseMouseInElementDemo() {
5
+ const el$ = useRef$();
6
+ const { elementX$, elementY$, isOutside$, elementWidth$, elementHeight$, x$, y$: _y$ } = useMouseInElement(el$);
7
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
8
+ /* @__PURE__ */ jsx(
9
+ "div",
10
+ {
11
+ style: {
12
+ display: "grid",
13
+ gridTemplateColumns: "repeat(3, 1fr)",
14
+ gap: "6px",
15
+ fontFamily: "monospace",
16
+ fontSize: "13px",
17
+ padding: "10px 14px",
18
+ background: "var(--sl-color-gray-6, #f1f5f9)",
19
+ borderRadius: "6px"
20
+ },
21
+ children: [
22
+ ["elementX", `${Math.round(elementX$.get())}px`],
23
+ ["elementY", `${Math.round(elementY$.get())}px`],
24
+ ["isOutside", String(isOutside$.get())],
25
+ ["width", `${Math.round(elementWidth$.get())}px`],
26
+ ["height", `${Math.round(elementHeight$.get())}px`],
27
+ ["x (global)", `${Math.round(x$.get())}px`]
28
+ ].map(([label, val]) => /* @__PURE__ */ jsxs("span", { children: [
29
+ label,
30
+ ": ",
31
+ /* @__PURE__ */ jsx("strong", { children: val })
32
+ ] }, label))
33
+ }
34
+ ),
35
+ /* @__PURE__ */ jsxs(
36
+ "div",
37
+ {
38
+ ref: el$,
39
+ style: {
40
+ position: "relative",
41
+ width: "100%",
42
+ height: "160px",
43
+ border: "1px solid var(--sl-color-gray-5, #cbd5e1)",
44
+ borderRadius: "6px",
45
+ overflow: "hidden",
46
+ display: "flex",
47
+ alignItems: "center",
48
+ justifyContent: "center",
49
+ userSelect: "none",
50
+ fontFamily: "monospace",
51
+ fontSize: "13px",
52
+ color: "var(--sl-color-gray-3, #94a3b8)",
53
+ cursor: "crosshair"
54
+ },
55
+ children: [
56
+ "move your mouse here",
57
+ /* @__PURE__ */ jsx(
58
+ "div",
59
+ {
60
+ style: {
61
+ position: "absolute",
62
+ left: elementX$.get(),
63
+ top: elementY$.get(),
64
+ width: "10px",
65
+ height: "10px",
66
+ borderRadius: "50%",
67
+ background: "var(--sl-color-accent, #818cf8)",
68
+ transform: "translate(-50%, -50%)",
69
+ pointerEvents: "none",
70
+ opacity: isOutside$.get() ? 0 : 1,
71
+ transition: "opacity 0.15s"
72
+ }
73
+ }
74
+ )
75
+ ]
76
+ }
77
+ )
78
+ ] });
79
+ }
80
+ export {
81
+ UseMouseInElementDemo as default
82
+ };
83
+ //# sourceMappingURL=demo.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useMouseInElement/demo.tsx"],"sourcesContent":["import { useRef$ } from \"../useRef$\";\nimport { useMouseInElement } from \".\";\n\nexport default function UseMouseInElementDemo() {\n const el$ = useRef$<HTMLDivElement>();\n const { elementX$, elementY$, isOutside$, elementWidth$, elementHeight$, x$, y$: _y$ } =\n useMouseInElement(el$);\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"12px\" }}>\n {/* Stats readout */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n gap: \"6px\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n padding: \"10px 14px\",\n background: \"var(--sl-color-gray-6, #f1f5f9)\",\n borderRadius: \"6px\",\n }}\n >\n {(\n [\n [\"elementX\", `${Math.round(elementX$.get())}px`],\n [\"elementY\", `${Math.round(elementY$.get())}px`],\n [\"isOutside\", String(isOutside$.get())],\n [\"width\", `${Math.round(elementWidth$.get())}px`],\n [\"height\", `${Math.round(elementHeight$.get())}px`],\n [\"x (global)\", `${Math.round(x$.get())}px`],\n ] as [string, string][]\n ).map(([label, val]) => (\n <span key={label}>\n {label}: <strong>{val}</strong>\n </span>\n ))}\n </div>\n\n {/* Hover target with tracking dot */}\n <div\n ref={el$}\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"160px\",\n border: \"1px solid var(--sl-color-gray-5, #cbd5e1)\",\n borderRadius: \"6px\",\n overflow: \"hidden\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n userSelect: \"none\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n color: \"var(--sl-color-gray-3, #94a3b8)\",\n cursor: \"crosshair\",\n }}\n >\n move your mouse here\n <div\n style={{\n position: \"absolute\",\n left: elementX$.get(),\n top: elementY$.get(),\n width: \"10px\",\n height: \"10px\",\n borderRadius: \"50%\",\n background: \"var(--sl-color-accent, #818cf8)\",\n transform: \"translate(-50%, -50%)\",\n pointerEvents: \"none\",\n opacity: isOutside$.get() ? 0 : 1,\n transition: \"opacity 0.15s\",\n }}\n />\n </div>\n </div>\n );\n}\n"],"mappings":"AAiCU,SACW,KADX;AAjCV,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAEnB,SAAR,wBAAyC;AAC9C,QAAM,MAAM,QAAwB;AACpC,QAAM,EAAE,WAAW,WAAW,YAAY,eAAe,gBAAgB,IAAI,IAAI,IAAI,IACnF,kBAAkB,GAAG;AAEvB,SACE,qBAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAO,GAElE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,qBAAqB;AAAA,UACrB,KAAK;AAAA,UACL,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,cAAc;AAAA,QAChB;AAAA,QAGE;AAAA,UACE,CAAC,YAAY,GAAG,KAAK,MAAM,UAAU,IAAI,CAAC,CAAC,IAAI;AAAA,UAC/C,CAAC,YAAY,GAAG,KAAK,MAAM,UAAU,IAAI,CAAC,CAAC,IAAI;AAAA,UAC/C,CAAC,aAAa,OAAO,WAAW,IAAI,CAAC,CAAC;AAAA,UACtC,CAAC,SAAS,GAAG,KAAK,MAAM,cAAc,IAAI,CAAC,CAAC,IAAI;AAAA,UAChD,CAAC,UAAU,GAAG,KAAK,MAAM,eAAe,IAAI,CAAC,CAAC,IAAI;AAAA,UAClD,CAAC,cAAc,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,IAAI;AAAA,QAC5C,EACA,IAAI,CAAC,CAAC,OAAO,GAAG,MAChB,qBAAC,UACE;AAAA;AAAA,UAAM;AAAA,UAAE,oBAAC,YAAQ,eAAI;AAAA,aADb,KAEX,CACD;AAAA;AAAA,IACH;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,QACV;AAAA,QACD;AAAA;AAAA,UAEC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,MAAM,UAAU,IAAI;AAAA,gBACpB,KAAK,UAAU,IAAI;AAAA,gBACnB,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,WAAW;AAAA,gBACX,eAAe;AAAA,gBACf,SAAS,WAAW,IAAI,IAAI,IAAI;AAAA,gBAChC,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,56 @@
1
+ import { Observable } from '@legendapp/state';
2
+ import { DeepMaybeObservable } from '../../types.mjs';
3
+ import { MaybeElement } from '../useRef_/index.mjs';
4
+ import 'react';
5
+
6
+ interface UseMouseInElementOptions {
7
+ /** Also update elementX/Y when mouse is outside the element. Default: true */
8
+ handleOutside?: boolean;
9
+ /** Re-calculate on window scroll. Default: true */
10
+ windowScroll?: boolean;
11
+ /** Re-calculate on window resize. Default: true */
12
+ windowResize?: boolean;
13
+ }
14
+ interface UseMouseInElementReturn {
15
+ /** Mouse X position relative to the element */
16
+ elementX$: Observable<number>;
17
+ /** Mouse Y position relative to the element */
18
+ elementY$: Observable<number>;
19
+ /** Element's absolute X position on the page */
20
+ elementPositionX$: Observable<number>;
21
+ /** Element's absolute Y position on the page */
22
+ elementPositionY$: Observable<number>;
23
+ /** Element width */
24
+ elementWidth$: Observable<number>;
25
+ /** Element height */
26
+ elementHeight$: Observable<number>;
27
+ /** Whether the mouse is outside the element */
28
+ isOutside$: Observable<boolean>;
29
+ /** Global mouse X (clientX) */
30
+ x$: Observable<number>;
31
+ /** Global mouse Y (clientY) */
32
+ y$: Observable<number>;
33
+ /** Stop all observers and event listeners */
34
+ stop: () => void;
35
+ }
36
+ /**
37
+ * Tracks whether the mouse cursor is inside a DOM element and calculates
38
+ * the cursor position relative to that element.
39
+ *
40
+ * Observes mousemove, document mouseleave, ResizeObserver, MutationObserver
41
+ * (style/class changes), window scroll, and resize.
42
+ *
43
+ * @param target - Element to observe: Ref$, Observable<OpaqueObject<Element>|null>, Document, Window, or null
44
+ * @param options - Configuration options
45
+ * @returns Reactive mouse position values relative to the element, plus a manual `stop()` function
46
+ *
47
+ * @example
48
+ * ```tsx
49
+ * const el$ = useRef$<HTMLDivElement>();
50
+ * const { elementX$, elementY$, isOutside$ } = useMouseInElement(el$);
51
+ * return <div ref={el$} />;
52
+ * ```
53
+ */
54
+ declare function useMouseInElement(target: MaybeElement, options?: DeepMaybeObservable<UseMouseInElementOptions>): UseMouseInElementReturn;
55
+
56
+ export { type UseMouseInElementOptions, type UseMouseInElementReturn, useMouseInElement };
@@ -0,0 +1,56 @@
1
+ import { Observable } from '@legendapp/state';
2
+ import { DeepMaybeObservable } from '../../types.js';
3
+ import { MaybeElement } from '../useRef_/index.js';
4
+ import 'react';
5
+
6
+ interface UseMouseInElementOptions {
7
+ /** Also update elementX/Y when mouse is outside the element. Default: true */
8
+ handleOutside?: boolean;
9
+ /** Re-calculate on window scroll. Default: true */
10
+ windowScroll?: boolean;
11
+ /** Re-calculate on window resize. Default: true */
12
+ windowResize?: boolean;
13
+ }
14
+ interface UseMouseInElementReturn {
15
+ /** Mouse X position relative to the element */
16
+ elementX$: Observable<number>;
17
+ /** Mouse Y position relative to the element */
18
+ elementY$: Observable<number>;
19
+ /** Element's absolute X position on the page */
20
+ elementPositionX$: Observable<number>;
21
+ /** Element's absolute Y position on the page */
22
+ elementPositionY$: Observable<number>;
23
+ /** Element width */
24
+ elementWidth$: Observable<number>;
25
+ /** Element height */
26
+ elementHeight$: Observable<number>;
27
+ /** Whether the mouse is outside the element */
28
+ isOutside$: Observable<boolean>;
29
+ /** Global mouse X (clientX) */
30
+ x$: Observable<number>;
31
+ /** Global mouse Y (clientY) */
32
+ y$: Observable<number>;
33
+ /** Stop all observers and event listeners */
34
+ stop: () => void;
35
+ }
36
+ /**
37
+ * Tracks whether the mouse cursor is inside a DOM element and calculates
38
+ * the cursor position relative to that element.
39
+ *
40
+ * Observes mousemove, document mouseleave, ResizeObserver, MutationObserver
41
+ * (style/class changes), window scroll, and resize.
42
+ *
43
+ * @param target - Element to observe: Ref$, Observable<OpaqueObject<Element>|null>, Document, Window, or null
44
+ * @param options - Configuration options
45
+ * @returns Reactive mouse position values relative to the element, plus a manual `stop()` function
46
+ *
47
+ * @example
48
+ * ```tsx
49
+ * const el$ = useRef$<HTMLDivElement>();
50
+ * const { elementX$, elementY$, isOutside$ } = useMouseInElement(el$);
51
+ * return <div ref={el$} />;
52
+ * ```
53
+ */
54
+ declare function useMouseInElement(target: MaybeElement, options?: DeepMaybeObservable<UseMouseInElementOptions>): UseMouseInElementReturn;
55
+
56
+ export { type UseMouseInElementOptions, type UseMouseInElementReturn, useMouseInElement };