@usels/core 0.0.1

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 +83 -0
  11. package/dist/browser/useMediaQuery/demo.js.map +1 -0
  12. package/dist/browser/useMediaQuery/demo.mjs +63 -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 +87 -0
  41. package/dist/elements/useElementBounding/demo.js.map +1 -0
  42. package/dist/elements/useElementBounding/demo.mjs +67 -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 +83 -0
  53. package/dist/elements/useElementSize/demo.js.map +1 -0
  54. package/dist/elements/useElementSize/demo.mjs +63 -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 +104 -0
  89. package/dist/elements/useMouseInElement/demo.js.map +1 -0
  90. package/dist/elements/useMouseInElement/demo.mjs +84 -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 +104 -0
  143. package/dist/elements/useWindowFocus/demo.js.map +1 -0
  144. package/dist/elements/useWindowFocus/demo.mjs +84 -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 +79 -0
  155. package/dist/elements/useWindowSize/demo.js.map +1 -0
  156. package/dist/elements/useWindowSize/demo.mjs +59 -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 +122 -0
  203. package/dist/sensors/useScroll/demo.js.map +1 -0
  204. package/dist/sensors/useScroll/demo.mjs +102 -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 +85 -0
  215. package/dist/sensors/useWindowScroll/demo.js.map +1 -0
  216. package/dist/sensors/useWindowScroll/demo.mjs +65 -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 +63 -0
  259. package/src/browser/useMediaQuery/index.md +43 -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 +54 -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 +68 -0
  268. package/src/elements/useElementBounding/index.md +64 -0
  269. package/src/elements/useElementBounding/index.ts +159 -0
  270. package/src/elements/useElementSize/demo.tsx +53 -0
  271. package/src/elements/useElementSize/index.md +65 -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 +88 -0
  284. package/src/elements/useMouseInElement/index.md +76 -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 +62 -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 +79 -0
  304. package/src/elements/useWindowFocus/index.md +38 -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 +51 -0
  308. package/src/elements/useWindowSize/index.md +55 -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 +43 -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 +103 -0
  326. package/src/sensors/useScroll/index.md +117 -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 +78 -0
  330. package/src/sensors/useWindowScroll/index.md +98 -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,148 @@
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 useMouseInElement_exports = {};
20
+ __export(useMouseInElement_exports, {
21
+ useMouseInElement: () => useMouseInElement
22
+ });
23
+ module.exports = __toCommonJS(useMouseInElement_exports);
24
+ var import_react = require("@legendapp/state/react");
25
+ var import_react2 = require("react");
26
+ var import_shared = require("../../shared");
27
+ var import_useMayObservableOptions = require("../../function/useMayObservableOptions");
28
+ var import_useRef = require("../useRef$");
29
+ var import_useResizeObserver = require("../useResizeObserver");
30
+ var import_useMutationObserver = require("../useMutationObserver");
31
+ var import_useEventListener = require("../../browser/useEventListener");
32
+ const win = typeof window !== "undefined" ? window : null;
33
+ function useMouseInElement(target, options) {
34
+ const opts$ = (0, import_useMayObservableOptions.useMayObservableOptions)(options, {
35
+ handleOutside: "peek",
36
+ windowScroll: "peek",
37
+ windowResize: "peek"
38
+ });
39
+ const mouse$ = (0, import_react.useObservable)({ x: 0, y: 0 });
40
+ const state$ = (0, import_react.useObservable)({
41
+ elementX: 0,
42
+ elementY: 0,
43
+ elementPositionX: 0,
44
+ elementPositionY: 0,
45
+ elementWidth: 0,
46
+ elementHeight: 0,
47
+ isOutside: true
48
+ });
49
+ const update = (0, import_react2.useCallback)(() => {
50
+ const el = (0, import_useRef.peekElement)(target);
51
+ if (!el || !(el instanceof Element)) return;
52
+ const rects = Array.from(el.getClientRects());
53
+ if (!rects.length) return;
54
+ const mx = mouse$.x.peek();
55
+ const my = mouse$.y.peek();
56
+ let found = false;
57
+ for (const rect of rects) {
58
+ if (mx >= rect.left && mx <= rect.right && my >= rect.top && my <= rect.bottom) {
59
+ state$.assign({
60
+ elementX: mx - rect.left,
61
+ elementY: my - rect.top,
62
+ elementPositionX: rect.left + window.scrollX,
63
+ elementPositionY: rect.top + window.scrollY,
64
+ elementWidth: rect.width,
65
+ elementHeight: rect.height,
66
+ isOutside: false
67
+ });
68
+ found = true;
69
+ break;
70
+ }
71
+ }
72
+ if (!found) {
73
+ state$.isOutside.set(true);
74
+ if (opts$.handleOutside.peek() !== false) {
75
+ const rect = rects[0];
76
+ state$.assign({
77
+ elementX: mx - rect.left,
78
+ elementY: my - rect.top,
79
+ elementPositionX: rect.left + window.scrollX,
80
+ elementPositionY: rect.top + window.scrollY,
81
+ elementWidth: rect.width,
82
+ elementHeight: rect.height
83
+ });
84
+ }
85
+ }
86
+ }, []);
87
+ const onMouseMove = (0, import_react2.useCallback)(
88
+ (e) => {
89
+ mouse$.assign({ x: e.clientX, y: e.clientY });
90
+ update();
91
+ },
92
+ [update]
93
+ // eslint-disable-line react-hooks/exhaustive-deps
94
+ );
95
+ const stopMouse = (0, import_useEventListener.useEventListener)(
96
+ (0, import_shared.isWindow)(win) ? win : null,
97
+ "mousemove",
98
+ onMouseMove,
99
+ { passive: true }
100
+ );
101
+ const stopLeave = (0, import_useEventListener.useEventListener)(
102
+ typeof document !== "undefined" ? document : null,
103
+ "mouseleave",
104
+ () => state$.isOutside.set(true)
105
+ );
106
+ const stopScroll = (0, import_useEventListener.useEventListener)(
107
+ (0, import_shared.isWindow)(win) && opts$.windowScroll.peek() !== false ? win : null,
108
+ "scroll",
109
+ update,
110
+ { passive: true }
111
+ );
112
+ const stopResize = (0, import_useEventListener.useEventListener)(
113
+ (0, import_shared.isWindow)(win) && opts$.windowResize.peek() !== false ? win : null,
114
+ "resize",
115
+ update,
116
+ { passive: true }
117
+ );
118
+ const { stop: stopRO } = (0, import_useResizeObserver.useResizeObserver)(target, update);
119
+ const { stop: stopMO } = (0, import_useMutationObserver.useMutationObserver)(target, update, {
120
+ attributes: true,
121
+ attributeFilter: ["style", "class"]
122
+ });
123
+ const stop = (0, import_react2.useCallback)(() => {
124
+ stopMouse();
125
+ stopLeave();
126
+ stopScroll();
127
+ stopResize();
128
+ stopRO();
129
+ stopMO();
130
+ }, []);
131
+ return {
132
+ elementX: state$.elementX,
133
+ elementY: state$.elementY,
134
+ elementPositionX: state$.elementPositionX,
135
+ elementPositionY: state$.elementPositionY,
136
+ elementWidth: state$.elementWidth,
137
+ elementHeight: state$.elementHeight,
138
+ isOutside: state$.isOutside,
139
+ x: mouse$.x,
140
+ y: mouse$.y,
141
+ stop
142
+ };
143
+ }
144
+ // Annotate the CommonJS export names for ESM import in node:
145
+ 0 && (module.exports = {
146
+ useMouseInElement
147
+ });
148
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useMouseInElement/index.ts"],"sourcesContent":["import type { Observable } from \"@legendapp/state\";\nimport { useObservable } from \"@legendapp/state/react\";\nimport { useCallback } from \"react\";\nimport { isWindow } from \"../../shared\";\nimport { useMayObservableOptions } from \"../../function/useMayObservableOptions\";\nimport type { DeepMaybeObservable } from \"../../types\";\nimport { type MaybeElement, peekElement } from \"../useRef$\";\nimport { useResizeObserver } from \"../useResizeObserver\";\nimport { useMutationObserver } from \"../useMutationObserver\";\nimport { useEventListener } from \"../../browser/useEventListener\";\n\nexport interface UseMouseInElementOptions {\n /** Also update elementX/Y when mouse is outside the element. Default: true */\n handleOutside?: boolean;\n /** Re-calculate on window scroll. Default: true */\n windowScroll?: boolean;\n /** Re-calculate on window resize. Default: true */\n windowResize?: boolean;\n}\n\nexport interface UseMouseInElementReturn {\n /** Mouse X position relative to the element */\n elementX: Observable<number>;\n /** Mouse Y position relative to the element */\n elementY: Observable<number>;\n /** Element's absolute X position on the page */\n elementPositionX: Observable<number>;\n /** Element's absolute Y position on the page */\n elementPositionY: Observable<number>;\n /** Element width */\n elementWidth: Observable<number>;\n /** Element height */\n elementHeight: Observable<number>;\n /** Whether the mouse is outside the element */\n isOutside: Observable<boolean>;\n /** Global mouse X (clientX) */\n x: Observable<number>;\n /** Global mouse Y (clientY) */\n y: Observable<number>;\n /** Stop all observers and event listeners */\n stop: () => void;\n}\n\n// isWindow(window) returns false in SSR (typeof window === \"undefined\"), true in browser.\nconst win = typeof window !== \"undefined\" ? window : null;\n\n/**\n * Tracks whether the mouse cursor is inside a DOM element and calculates\n * the cursor position relative to that element.\n *\n * Observes mousemove, document mouseleave, ResizeObserver, MutationObserver\n * (style/class changes), window scroll, and resize.\n *\n * @param target - Element to observe: Ref$, Observable<OpaqueObject<Element>|null>, Document, Window, or null\n * @param options - Configuration options\n * @returns Reactive mouse position values relative to the element, plus a manual `stop()` function\n *\n * @example\n * ```tsx\n * const el$ = useRef$<HTMLDivElement>();\n * const { elementX, elementY, isOutside } = useMouseInElement(el$);\n * return <div ref={el$} />;\n * ```\n */\nexport function useMouseInElement(\n target: MaybeElement,\n options?: DeepMaybeObservable<UseMouseInElementOptions>,\n): UseMouseInElementReturn {\n // Rule 2: normalize with useMayObservableOptions\n // Rule 3: handleOutside/windowScroll/windowResize are mount-time-only → 'peek'\n const opts$ = useMayObservableOptions<UseMouseInElementOptions>(options, {\n handleOutside: \"peek\",\n windowScroll: \"peek\",\n windowResize: \"peek\",\n });\n\n // Global mouse coordinates (exposed in return)\n const mouse$ = useObservable({ x: 0, y: 0 });\n\n // Element-relative state\n const state$ = useObservable({\n elementX: 0,\n elementY: 0,\n elementPositionX: 0,\n elementPositionY: 0,\n elementWidth: 0,\n elementHeight: 0,\n isOutside: true,\n });\n\n // Recalculate element-relative position from current mouse coords\n const update = useCallback(() => {\n const el = peekElement(target) as HTMLElement | null;\n if (!el || !(el instanceof Element)) return;\n\n const rects = Array.from(el.getClientRects());\n if (!rects.length) return;\n\n const mx = mouse$.x.peek();\n const my = mouse$.y.peek();\n let found = false;\n\n for (const rect of rects) {\n if (\n mx >= rect.left &&\n mx <= rect.right &&\n my >= rect.top &&\n my <= rect.bottom\n ) {\n state$.assign({\n elementX: mx - rect.left,\n elementY: my - rect.top,\n elementPositionX: rect.left + window.scrollX,\n elementPositionY: rect.top + window.scrollY,\n elementWidth: rect.width,\n elementHeight: rect.height,\n isOutside: false,\n });\n found = true;\n break;\n }\n }\n\n if (!found) {\n state$.isOutside.set(true);\n if (opts$.handleOutside.peek() !== false) {\n const rect = rects[0];\n state$.assign({\n elementX: mx - rect.left,\n elementY: my - rect.top,\n elementPositionX: rect.left + window.scrollX,\n elementPositionY: rect.top + window.scrollY,\n elementWidth: rect.width,\n elementHeight: rect.height,\n });\n }\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Update global mouse coords then recalculate\n const onMouseMove = useCallback(\n (e: MouseEvent) => {\n mouse$.assign({ x: e.clientX, y: e.clientY });\n update();\n },\n [update], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n // Always call hooks unconditionally — Rules of Hooks.\n // null target → useEventListener registers no listener (no-op).\n // peek() — evaluated once at render time, no reactive subscription needed.\n const stopMouse = useEventListener(\n isWindow(win) ? win : null,\n \"mousemove\",\n onMouseMove,\n { passive: true },\n );\n\n // document mouseleave → force isOutside = true\n const stopLeave = useEventListener(\n typeof document !== \"undefined\" ? document : null,\n \"mouseleave\",\n () => state$.isOutside.set(true),\n );\n\n const stopScroll = useEventListener(\n isWindow(win) && opts$.windowScroll.peek() !== false ? win : null,\n \"scroll\",\n update,\n { passive: true },\n );\n const stopResize = useEventListener(\n isWindow(win) && opts$.windowResize.peek() !== false ? win : null,\n \"resize\",\n update,\n { passive: true },\n );\n\n // Observe element size changes\n const { stop: stopRO } = useResizeObserver(target, update);\n\n // Observe style/class attribute changes (e.g. CSS transitions, class toggles)\n const { stop: stopMO } = useMutationObserver(target, update, {\n attributes: true,\n attributeFilter: [\"style\", \"class\"],\n });\n\n const stop = useCallback(() => {\n stopMouse();\n stopLeave();\n stopScroll();\n stopResize();\n stopRO();\n stopMO();\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return {\n elementX: state$.elementX,\n elementY: state$.elementY,\n elementPositionX: state$.elementPositionX,\n elementPositionY: state$.elementPositionY,\n elementWidth: state$.elementWidth,\n elementHeight: state$.elementHeight,\n isOutside: state$.isOutside,\n x: mouse$.x,\n y: mouse$.y,\n stop,\n };\n}\n"],"mappings":"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","names":["import_react"]}
@@ -0,0 +1,124 @@
1
+ import { useObservable } from "@legendapp/state/react";
2
+ import { useCallback } from "react";
3
+ import { isWindow } from "../../shared";
4
+ import { useMayObservableOptions } from "../../function/useMayObservableOptions";
5
+ import { peekElement } from "../useRef$";
6
+ import { useResizeObserver } from "../useResizeObserver";
7
+ import { useMutationObserver } from "../useMutationObserver";
8
+ import { useEventListener } from "../../browser/useEventListener";
9
+ const win = typeof window !== "undefined" ? window : null;
10
+ function useMouseInElement(target, options) {
11
+ const opts$ = useMayObservableOptions(options, {
12
+ handleOutside: "peek",
13
+ windowScroll: "peek",
14
+ windowResize: "peek"
15
+ });
16
+ const mouse$ = useObservable({ x: 0, y: 0 });
17
+ const state$ = useObservable({
18
+ elementX: 0,
19
+ elementY: 0,
20
+ elementPositionX: 0,
21
+ elementPositionY: 0,
22
+ elementWidth: 0,
23
+ elementHeight: 0,
24
+ isOutside: true
25
+ });
26
+ const update = useCallback(() => {
27
+ const el = peekElement(target);
28
+ if (!el || !(el instanceof Element)) return;
29
+ const rects = Array.from(el.getClientRects());
30
+ if (!rects.length) return;
31
+ const mx = mouse$.x.peek();
32
+ const my = mouse$.y.peek();
33
+ let found = false;
34
+ for (const rect of rects) {
35
+ if (mx >= rect.left && mx <= rect.right && my >= rect.top && my <= rect.bottom) {
36
+ state$.assign({
37
+ elementX: mx - rect.left,
38
+ elementY: my - rect.top,
39
+ elementPositionX: rect.left + window.scrollX,
40
+ elementPositionY: rect.top + window.scrollY,
41
+ elementWidth: rect.width,
42
+ elementHeight: rect.height,
43
+ isOutside: false
44
+ });
45
+ found = true;
46
+ break;
47
+ }
48
+ }
49
+ if (!found) {
50
+ state$.isOutside.set(true);
51
+ if (opts$.handleOutside.peek() !== false) {
52
+ const rect = rects[0];
53
+ state$.assign({
54
+ elementX: mx - rect.left,
55
+ elementY: my - rect.top,
56
+ elementPositionX: rect.left + window.scrollX,
57
+ elementPositionY: rect.top + window.scrollY,
58
+ elementWidth: rect.width,
59
+ elementHeight: rect.height
60
+ });
61
+ }
62
+ }
63
+ }, []);
64
+ const onMouseMove = useCallback(
65
+ (e) => {
66
+ mouse$.assign({ x: e.clientX, y: e.clientY });
67
+ update();
68
+ },
69
+ [update]
70
+ // eslint-disable-line react-hooks/exhaustive-deps
71
+ );
72
+ const stopMouse = useEventListener(
73
+ isWindow(win) ? win : null,
74
+ "mousemove",
75
+ onMouseMove,
76
+ { passive: true }
77
+ );
78
+ const stopLeave = useEventListener(
79
+ typeof document !== "undefined" ? document : null,
80
+ "mouseleave",
81
+ () => state$.isOutside.set(true)
82
+ );
83
+ const stopScroll = useEventListener(
84
+ isWindow(win) && opts$.windowScroll.peek() !== false ? win : null,
85
+ "scroll",
86
+ update,
87
+ { passive: true }
88
+ );
89
+ const stopResize = useEventListener(
90
+ isWindow(win) && opts$.windowResize.peek() !== false ? win : null,
91
+ "resize",
92
+ update,
93
+ { passive: true }
94
+ );
95
+ const { stop: stopRO } = useResizeObserver(target, update);
96
+ const { stop: stopMO } = useMutationObserver(target, update, {
97
+ attributes: true,
98
+ attributeFilter: ["style", "class"]
99
+ });
100
+ const stop = useCallback(() => {
101
+ stopMouse();
102
+ stopLeave();
103
+ stopScroll();
104
+ stopResize();
105
+ stopRO();
106
+ stopMO();
107
+ }, []);
108
+ return {
109
+ elementX: state$.elementX,
110
+ elementY: state$.elementY,
111
+ elementPositionX: state$.elementPositionX,
112
+ elementPositionY: state$.elementPositionY,
113
+ elementWidth: state$.elementWidth,
114
+ elementHeight: state$.elementHeight,
115
+ isOutside: state$.isOutside,
116
+ x: mouse$.x,
117
+ y: mouse$.y,
118
+ stop
119
+ };
120
+ }
121
+ export {
122
+ useMouseInElement
123
+ };
124
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useMouseInElement/index.ts"],"sourcesContent":["import type { Observable } from \"@legendapp/state\";\nimport { useObservable } from \"@legendapp/state/react\";\nimport { useCallback } from \"react\";\nimport { isWindow } from \"../../shared\";\nimport { useMayObservableOptions } from \"../../function/useMayObservableOptions\";\nimport type { DeepMaybeObservable } from \"../../types\";\nimport { type MaybeElement, peekElement } from \"../useRef$\";\nimport { useResizeObserver } from \"../useResizeObserver\";\nimport { useMutationObserver } from \"../useMutationObserver\";\nimport { useEventListener } from \"../../browser/useEventListener\";\n\nexport interface UseMouseInElementOptions {\n /** Also update elementX/Y when mouse is outside the element. Default: true */\n handleOutside?: boolean;\n /** Re-calculate on window scroll. Default: true */\n windowScroll?: boolean;\n /** Re-calculate on window resize. Default: true */\n windowResize?: boolean;\n}\n\nexport interface UseMouseInElementReturn {\n /** Mouse X position relative to the element */\n elementX: Observable<number>;\n /** Mouse Y position relative to the element */\n elementY: Observable<number>;\n /** Element's absolute X position on the page */\n elementPositionX: Observable<number>;\n /** Element's absolute Y position on the page */\n elementPositionY: Observable<number>;\n /** Element width */\n elementWidth: Observable<number>;\n /** Element height */\n elementHeight: Observable<number>;\n /** Whether the mouse is outside the element */\n isOutside: Observable<boolean>;\n /** Global mouse X (clientX) */\n x: Observable<number>;\n /** Global mouse Y (clientY) */\n y: Observable<number>;\n /** Stop all observers and event listeners */\n stop: () => void;\n}\n\n// isWindow(window) returns false in SSR (typeof window === \"undefined\"), true in browser.\nconst win = typeof window !== \"undefined\" ? window : null;\n\n/**\n * Tracks whether the mouse cursor is inside a DOM element and calculates\n * the cursor position relative to that element.\n *\n * Observes mousemove, document mouseleave, ResizeObserver, MutationObserver\n * (style/class changes), window scroll, and resize.\n *\n * @param target - Element to observe: Ref$, Observable<OpaqueObject<Element>|null>, Document, Window, or null\n * @param options - Configuration options\n * @returns Reactive mouse position values relative to the element, plus a manual `stop()` function\n *\n * @example\n * ```tsx\n * const el$ = useRef$<HTMLDivElement>();\n * const { elementX, elementY, isOutside } = useMouseInElement(el$);\n * return <div ref={el$} />;\n * ```\n */\nexport function useMouseInElement(\n target: MaybeElement,\n options?: DeepMaybeObservable<UseMouseInElementOptions>,\n): UseMouseInElementReturn {\n // Rule 2: normalize with useMayObservableOptions\n // Rule 3: handleOutside/windowScroll/windowResize are mount-time-only → 'peek'\n const opts$ = useMayObservableOptions<UseMouseInElementOptions>(options, {\n handleOutside: \"peek\",\n windowScroll: \"peek\",\n windowResize: \"peek\",\n });\n\n // Global mouse coordinates (exposed in return)\n const mouse$ = useObservable({ x: 0, y: 0 });\n\n // Element-relative state\n const state$ = useObservable({\n elementX: 0,\n elementY: 0,\n elementPositionX: 0,\n elementPositionY: 0,\n elementWidth: 0,\n elementHeight: 0,\n isOutside: true,\n });\n\n // Recalculate element-relative position from current mouse coords\n const update = useCallback(() => {\n const el = peekElement(target) as HTMLElement | null;\n if (!el || !(el instanceof Element)) return;\n\n const rects = Array.from(el.getClientRects());\n if (!rects.length) return;\n\n const mx = mouse$.x.peek();\n const my = mouse$.y.peek();\n let found = false;\n\n for (const rect of rects) {\n if (\n mx >= rect.left &&\n mx <= rect.right &&\n my >= rect.top &&\n my <= rect.bottom\n ) {\n state$.assign({\n elementX: mx - rect.left,\n elementY: my - rect.top,\n elementPositionX: rect.left + window.scrollX,\n elementPositionY: rect.top + window.scrollY,\n elementWidth: rect.width,\n elementHeight: rect.height,\n isOutside: false,\n });\n found = true;\n break;\n }\n }\n\n if (!found) {\n state$.isOutside.set(true);\n if (opts$.handleOutside.peek() !== false) {\n const rect = rects[0];\n state$.assign({\n elementX: mx - rect.left,\n elementY: my - rect.top,\n elementPositionX: rect.left + window.scrollX,\n elementPositionY: rect.top + window.scrollY,\n elementWidth: rect.width,\n elementHeight: rect.height,\n });\n }\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Update global mouse coords then recalculate\n const onMouseMove = useCallback(\n (e: MouseEvent) => {\n mouse$.assign({ x: e.clientX, y: e.clientY });\n update();\n },\n [update], // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n // Always call hooks unconditionally — Rules of Hooks.\n // null target → useEventListener registers no listener (no-op).\n // peek() — evaluated once at render time, no reactive subscription needed.\n const stopMouse = useEventListener(\n isWindow(win) ? win : null,\n \"mousemove\",\n onMouseMove,\n { passive: true },\n );\n\n // document mouseleave → force isOutside = true\n const stopLeave = useEventListener(\n typeof document !== \"undefined\" ? document : null,\n \"mouseleave\",\n () => state$.isOutside.set(true),\n );\n\n const stopScroll = useEventListener(\n isWindow(win) && opts$.windowScroll.peek() !== false ? win : null,\n \"scroll\",\n update,\n { passive: true },\n );\n const stopResize = useEventListener(\n isWindow(win) && opts$.windowResize.peek() !== false ? win : null,\n \"resize\",\n update,\n { passive: true },\n );\n\n // Observe element size changes\n const { stop: stopRO } = useResizeObserver(target, update);\n\n // Observe style/class attribute changes (e.g. CSS transitions, class toggles)\n const { stop: stopMO } = useMutationObserver(target, update, {\n attributes: true,\n attributeFilter: [\"style\", \"class\"],\n });\n\n const stop = useCallback(() => {\n stopMouse();\n stopLeave();\n stopScroll();\n stopResize();\n stopRO();\n stopMO();\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return {\n elementX: state$.elementX,\n elementY: state$.elementY,\n elementPositionX: state$.elementPositionX,\n elementPositionY: state$.elementPositionY,\n elementWidth: state$.elementWidth,\n elementHeight: state$.elementHeight,\n isOutside: state$.isOutside,\n x: mouse$.x,\n y: mouse$.y,\n stop,\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function UseMutationObserverDemo(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { UseMutationObserverDemo as default };
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function UseMutationObserverDemo(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { UseMutationObserverDemo as default };
@@ -0,0 +1,240 @@
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: () => UseMutationObserverDemo
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
+ var import_react = require("@legendapp/state/react");
28
+ var import_state = require("@legendapp/state");
29
+ const MAX_LOG = 6;
30
+ const btn = {
31
+ height: "26px",
32
+ padding: "0 10px",
33
+ fontSize: "12px",
34
+ cursor: "pointer",
35
+ borderRadius: "4px",
36
+ border: "1px solid var(--sl-color-gray-4, #94a3b8)",
37
+ background: "transparent",
38
+ fontFamily: "monospace",
39
+ display: "inline-flex",
40
+ alignItems: "center",
41
+ margin: 0
42
+ };
43
+ const rowLabel = {
44
+ fontSize: "11px",
45
+ color: "var(--sl-color-gray-3, #94a3b8)",
46
+ alignSelf: "center",
47
+ userSelect: "none",
48
+ minWidth: "52px"
49
+ };
50
+ function UseMutationObserverDemo() {
51
+ const el$ = (0, import_useRef.useRef$)();
52
+ const log$ = (0, import_react.useObservable)([]);
53
+ const active$ = (0, import_react.useObservable)(false);
54
+ const childCount$ = (0, import_react.useObservable)(0);
55
+ const stopped$ = (0, import_react.useObservable)(false);
56
+ const { stop, resume } = (0, import__.useMutationObserver)(
57
+ el$,
58
+ (records) => {
59
+ const lines = records.map((r) => {
60
+ if (r.type === "attributes") {
61
+ return `[attributes] ${r.attributeName} \u2190 was: ${r.oldValue ?? "\u2014"}`;
62
+ }
63
+ const a = r.addedNodes.length;
64
+ const rm = r.removedNodes.length;
65
+ return `[childList] ${[a && `+${a} added`, rm && `-${rm} removed`].filter(Boolean).join(", ")}`;
66
+ });
67
+ (0, import_state.batch)(() => {
68
+ log$.unshift(...lines);
69
+ if (MAX_LOG < log$.peek().length) {
70
+ log$.splice(-1, 1);
71
+ }
72
+ });
73
+ },
74
+ { attributes: true, attributeOldValue: true, childList: true }
75
+ );
76
+ const toggleAttr = () => {
77
+ (0, import_state.batch)(() => {
78
+ const el = el$.peek();
79
+ if (!el) return;
80
+ const next = !active$.peek();
81
+ active$.set(next);
82
+ if (next) el.setAttribute("data-active", "true");
83
+ else el.removeAttribute("data-active");
84
+ });
85
+ };
86
+ const addChild = () => {
87
+ const el = el$.peek();
88
+ if (!el) return;
89
+ (0, import_state.beginBatch)();
90
+ childCount$.set((n) => n + 1);
91
+ const span = document.createElement("span");
92
+ span.textContent = `child-${childCount$.peek()}`;
93
+ span.style.cssText = "display:block;font-size:12px;font-family:monospace;color:var(--sl-color-gray-2,#475569);padding:1px 0";
94
+ el.appendChild(span);
95
+ (0, import_state.endBatch)();
96
+ };
97
+ const removeChild = () => {
98
+ const el = el$.peek();
99
+ if (!el) return;
100
+ const last = el.querySelector("span:last-of-type");
101
+ if (!last) return;
102
+ el.removeChild(last);
103
+ childCount$.set((n) => Math.max(0, n - 1));
104
+ };
105
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
106
+ "div",
107
+ {
108
+ style: {
109
+ display: "flex",
110
+ flexDirection: "column",
111
+ gap: "8px",
112
+ fontFamily: "monospace",
113
+ fontSize: "13px"
114
+ },
115
+ children: [
116
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
117
+ "div",
118
+ {
119
+ style: {
120
+ display: "flex",
121
+ gap: "16px",
122
+ alignItems: "center",
123
+ padding: "6px 12px",
124
+ background: "var(--sl-color-gray-6, #f1f5f9)",
125
+ borderRadius: "6px"
126
+ },
127
+ children: [
128
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Computed, { children: () => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
129
+ "status:",
130
+ " ",
131
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
132
+ "strong",
133
+ {
134
+ style: {
135
+ color: stopped$.get() ? "var(--sl-color-red, #ef4444)" : "var(--sl-color-green, #22c55e)"
136
+ },
137
+ children: stopped$.get() ? "stopped" : "observing"
138
+ }
139
+ )
140
+ ] }) }),
141
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Computed, { children: () => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { color: "var(--sl-color-gray-3, #94a3b8)" }, children: [
142
+ "data-active: ",
143
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: active$.get() ? '"true"' : "\u2014" })
144
+ ] }) }),
145
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Computed, { children: () => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { color: "var(--sl-color-gray-3, #94a3b8)" }, children: [
146
+ "children: ",
147
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: childCount$.get() })
148
+ ] }) })
149
+ ]
150
+ }
151
+ ),
152
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", gap: "6px", alignItems: "center" }, children: [
153
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: rowLabel, children: "DOM" }),
154
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { onClick: toggleAttr, style: btn, children: "toggle data-active" }),
155
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { onClick: addChild, style: btn, children: "add child" }),
156
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { onClick: removeChild, style: btn, children: "remove child" }),
157
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { onClick: () => log$.set([]), style: btn, children: "clear log" })
158
+ ] }),
159
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", gap: "6px", alignItems: "center" }, children: [
160
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: rowLabel, children: "Observer" }),
161
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Computed, { children: () => stopped$.get() ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
162
+ "button",
163
+ {
164
+ onClick: () => {
165
+ resume();
166
+ stopped$.set(false);
167
+ },
168
+ style: {
169
+ ...btn,
170
+ borderColor: "var(--sl-color-green, #22c55e)",
171
+ color: "var(--sl-color-green, #22c55e)"
172
+ },
173
+ children: "resume observe()"
174
+ }
175
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
176
+ "button",
177
+ {
178
+ onClick: () => {
179
+ stop();
180
+ stopped$.set(true);
181
+ },
182
+ style: {
183
+ ...btn,
184
+ borderColor: "var(--sl-color-red, #ef4444)",
185
+ color: "var(--sl-color-red, #ef4444)"
186
+ },
187
+ children: "stop observe()"
188
+ }
189
+ ) })
190
+ ] }),
191
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Computed, { children: () => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
192
+ "div",
193
+ {
194
+ ref: el$,
195
+ style: {
196
+ minHeight: "52px",
197
+ padding: "8px 12px",
198
+ borderRadius: "6px",
199
+ border: `1px dashed ${active$.get() ? "var(--sl-color-green, #22c55e)" : "var(--sl-color-gray-4, #94a3b8)"}`,
200
+ background: active$.get() ? "var(--sl-color-green-low, #f0fdf4)" : "transparent",
201
+ transition: "border-color 0.2s, background 0.2s"
202
+ }
203
+ }
204
+ ) }),
205
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
206
+ "div",
207
+ {
208
+ style: {
209
+ minHeight: "80px",
210
+ maxHeight: "168px",
211
+ overflowY: "auto",
212
+ padding: "8px 12px",
213
+ background: "var(--sl-color-gray-6, #f1f5f9)",
214
+ borderRadius: "6px",
215
+ fontSize: "12px"
216
+ },
217
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Computed, { children: () => {
218
+ const entries = log$.get();
219
+ if (!entries.length) {
220
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { opacity: 0.4 }, children: "\u2014 no mutations recorded yet" });
221
+ }
222
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: entries.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
223
+ "div",
224
+ {
225
+ style: {
226
+ padding: "1px 0",
227
+ opacity: Math.max(0.2, 1 - i * 0.15)
228
+ },
229
+ children: line
230
+ },
231
+ i
232
+ )) });
233
+ } })
234
+ }
235
+ )
236
+ ]
237
+ }
238
+ );
239
+ }
240
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useMutationObserver/demo.tsx"],"sourcesContent":["import { useRef$ } from \"../useRef$\";\nimport { useMutationObserver } from \".\";\nimport { Computed, useObservable } from \"@legendapp/state/react\";\nimport { batch, beginBatch, endBatch } from \"@legendapp/state\";\n\nconst MAX_LOG = 6;\n\nconst btn: React.CSSProperties = {\n height: \"26px\",\n padding: \"0 10px\",\n fontSize: \"12px\",\n cursor: \"pointer\",\n borderRadius: \"4px\",\n border: \"1px solid var(--sl-color-gray-4, #94a3b8)\",\n background: \"transparent\",\n fontFamily: \"monospace\",\n display: \"inline-flex\",\n alignItems: \"center\",\n margin: 0,\n};\n\nconst rowLabel: React.CSSProperties = {\n fontSize: \"11px\",\n color: \"var(--sl-color-gray-3, #94a3b8)\",\n alignSelf: \"center\",\n userSelect: \"none\",\n minWidth: \"52px\",\n};\n\nexport default function UseMutationObserverDemo() {\n const el$ = useRef$<HTMLDivElement>();\n const log$ = useObservable<string[]>([]);\n const active$ = useObservable(false);\n const childCount$ = useObservable(0);\n const stopped$ = useObservable(false);\n\n const { stop, resume } = useMutationObserver(\n el$,\n (records) => {\n const lines = records.map((r): string => {\n if (r.type === \"attributes\") {\n return `[attributes] ${r.attributeName} ← was: ${\n r.oldValue ?? \"—\"\n }`;\n }\n const a = r.addedNodes.length;\n const rm = r.removedNodes.length;\n return `[childList] ${[a && `+${a} added`, rm && `-${rm} removed`]\n .filter(Boolean)\n .join(\", \")}`;\n });\n batch(() => {\n log$.unshift(...lines);\n if (MAX_LOG < log$.peek().length) {\n log$.splice(-1, 1);\n }\n });\n },\n { attributes: true, attributeOldValue: true, childList: true },\n );\n\n const toggleAttr = () => {\n batch(() => {\n const el = el$.peek();\n if (!el) return;\n\n const next = !active$.peek();\n active$.set(next);\n if (next) el.setAttribute(\"data-active\", \"true\");\n else el.removeAttribute(\"data-active\");\n });\n };\n\n const addChild = () => {\n const el = el$.peek();\n if (!el) return;\n beginBatch();\n childCount$.set((n) => n + 1);\n const span = document.createElement(\"span\");\n span.textContent = `child-${childCount$.peek()}`;\n span.style.cssText =\n \"display:block;font-size:12px;font-family:monospace;\" +\n \"color:var(--sl-color-gray-2,#475569);padding:1px 0\";\n el.appendChild(span);\n endBatch();\n };\n\n const removeChild = () => {\n const el = el$.peek();\n if (!el) return;\n const last = el.querySelector(\"span:last-of-type\");\n if (!last) return;\n el.removeChild(last);\n childCount$.set((n) => Math.max(0, n - 1));\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n }}\n >\n {/* Status bar */}\n <div\n style={{\n display: \"flex\",\n gap: \"16px\",\n alignItems: \"center\",\n padding: \"6px 12px\",\n background: \"var(--sl-color-gray-6, #f1f5f9)\",\n borderRadius: \"6px\",\n }}\n >\n <Computed>\n {() => (\n <span>\n status:{\" \"}\n <strong\n style={{\n color: stopped$.get()\n ? \"var(--sl-color-red, #ef4444)\"\n : \"var(--sl-color-green, #22c55e)\",\n }}\n >\n {stopped$.get() ? \"stopped\" : \"observing\"}\n </strong>\n </span>\n )}\n </Computed>\n <Computed>\n {() => (\n <span style={{ color: \"var(--sl-color-gray-3, #94a3b8)\" }}>\n data-active: <strong>{active$.get() ? '\"true\"' : \"—\"}</strong>\n </span>\n )}\n </Computed>\n <Computed>\n {() => (\n <span style={{ color: \"var(--sl-color-gray-3, #94a3b8)\" }}>\n children: <strong>{childCount$.get()}</strong>\n </span>\n )}\n </Computed>\n </div>\n\n {/* DOM mutation actions */}\n <div style={{ display: \"flex\", gap: \"6px\", alignItems: \"center\" }}>\n <span style={rowLabel}>DOM</span>\n <button onClick={toggleAttr} style={btn}>\n toggle data-active\n </button>\n <button onClick={addChild} style={btn}>\n add child\n </button>\n <button onClick={removeChild} style={btn}>\n remove child\n </button>\n <button onClick={() => log$.set([])} style={btn}>\n clear log\n </button>\n </div>\n\n {/* Observer control */}\n <div style={{ display: \"flex\", gap: \"6px\", alignItems: \"center\" }}>\n <span style={rowLabel}>Observer</span>\n <Computed>\n {() =>\n stopped$.get() ? (\n <button\n onClick={() => {\n resume();\n stopped$.set(false);\n }}\n style={{\n ...btn,\n borderColor: \"var(--sl-color-green, #22c55e)\",\n color: \"var(--sl-color-green, #22c55e)\",\n }}\n >\n resume observe()\n </button>\n ) : (\n <button\n onClick={() => {\n stop();\n stopped$.set(true);\n }}\n style={{\n ...btn,\n borderColor: \"var(--sl-color-red, #ef4444)\",\n color: \"var(--sl-color-red, #ef4444)\",\n }}\n >\n stop observe()\n </button>\n )\n }\n </Computed>\n </div>\n\n {/* Observed target element — children appended/removed by buttons above */}\n <Computed>\n {() => (\n <div\n ref={el$}\n style={{\n minHeight: \"52px\",\n padding: \"8px 12px\",\n borderRadius: \"6px\",\n border: `1px dashed ${\n active$.get()\n ? \"var(--sl-color-green, #22c55e)\"\n : \"var(--sl-color-gray-4, #94a3b8)\"\n }`,\n background: active$.get()\n ? \"var(--sl-color-green-low, #f0fdf4)\"\n : \"transparent\",\n transition: \"border-color 0.2s, background 0.2s\",\n }}\n />\n )}\n </Computed>\n\n {/* Mutation log */}\n <div\n style={{\n minHeight: \"80px\",\n maxHeight: \"168px\",\n overflowY: \"auto\",\n padding: \"8px 12px\",\n background: \"var(--sl-color-gray-6, #f1f5f9)\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n }}\n >\n <Computed>\n {() => {\n const entries = log$.get();\n if (!entries.length) {\n return (\n <span style={{ opacity: 0.4 }}>\n — no mutations recorded yet\n </span>\n );\n }\n return (\n <>\n {entries.map((line, i) => (\n <div\n key={i}\n style={{\n padding: \"1px 0\",\n opacity: Math.max(0.2, 1 - i * 0.15),\n }}\n >\n {line}\n </div>\n ))}\n </>\n );\n }}\n </Computed>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}