@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,43 @@
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 UseElementVisibilityOptions {
7
+ /** Initial visibility value. Default: false */
8
+ initialValue?: boolean;
9
+ /** Element used as the viewport for intersection. Maps to IntersectionObserver `root`. */
10
+ scrollTarget?: MaybeElement;
11
+ /** Margin around the root. Accepts CSS-style values. Default: "0px" */
12
+ rootMargin?: string;
13
+ /** Threshold(s) at which to trigger. Default: 0 */
14
+ threshold?: number | number[];
15
+ /**
16
+ * Stop observing after the element becomes visible for the first time. Default: false.
17
+ * Must be set at mount time; changing dynamically has no effect.
18
+ */
19
+ once?: boolean;
20
+ }
21
+ /**
22
+ * Tracks whether a DOM element is visible within the viewport (or a specified scroll container).
23
+ * Returns a reactive `Observable<boolean>` that updates automatically as visibility changes.
24
+ *
25
+ * `options` accepts a `DeepMaybeObservable<UseElementVisibilityOptions>`:
26
+ * - A plain object with per-field values
27
+ * - A plain object with per-field `Observable<T>` values
28
+ * - The entire options object wrapped in `Observable<UseElementVisibilityOptions>`
29
+ *
30
+ * @param element - The element to observe
31
+ * @param options - Optional configuration — plain, per-field Observable, or fully Observable
32
+ * @returns `Observable<boolean>` — true when element is intersecting
33
+ *
34
+ * @example
35
+ * ```tsx
36
+ * const el$ = useRef$<HTMLDivElement>();
37
+ * const isVisible$ = useElementVisibility(el$);
38
+ * return <div ref={el$} />;
39
+ * ```
40
+ */
41
+ declare function useElementVisibility(element: MaybeElement, options?: DeepMaybeObservable<UseElementVisibilityOptions>): Observable<boolean>;
42
+
43
+ export { type UseElementVisibilityOptions, useElementVisibility };
@@ -0,0 +1,43 @@
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 UseElementVisibilityOptions {
7
+ /** Initial visibility value. Default: false */
8
+ initialValue?: boolean;
9
+ /** Element used as the viewport for intersection. Maps to IntersectionObserver `root`. */
10
+ scrollTarget?: MaybeElement;
11
+ /** Margin around the root. Accepts CSS-style values. Default: "0px" */
12
+ rootMargin?: string;
13
+ /** Threshold(s) at which to trigger. Default: 0 */
14
+ threshold?: number | number[];
15
+ /**
16
+ * Stop observing after the element becomes visible for the first time. Default: false.
17
+ * Must be set at mount time; changing dynamically has no effect.
18
+ */
19
+ once?: boolean;
20
+ }
21
+ /**
22
+ * Tracks whether a DOM element is visible within the viewport (or a specified scroll container).
23
+ * Returns a reactive `Observable<boolean>` that updates automatically as visibility changes.
24
+ *
25
+ * `options` accepts a `DeepMaybeObservable<UseElementVisibilityOptions>`:
26
+ * - A plain object with per-field values
27
+ * - A plain object with per-field `Observable<T>` values
28
+ * - The entire options object wrapped in `Observable<UseElementVisibilityOptions>`
29
+ *
30
+ * @param element - The element to observe
31
+ * @param options - Optional configuration — plain, per-field Observable, or fully Observable
32
+ * @returns `Observable<boolean>` — true when element is intersecting
33
+ *
34
+ * @example
35
+ * ```tsx
36
+ * const el$ = useRef$<HTMLDivElement>();
37
+ * const isVisible$ = useElementVisibility(el$);
38
+ * return <div ref={el$} />;
39
+ * ```
40
+ */
41
+ declare function useElementVisibility(element: MaybeElement, options?: DeepMaybeObservable<UseElementVisibilityOptions>): Observable<boolean>;
42
+
43
+ export { type UseElementVisibilityOptions, useElementVisibility };
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var useElementVisibility_exports = {};
21
+ __export(useElementVisibility_exports, {
22
+ useElementVisibility: () => useElementVisibility
23
+ });
24
+ module.exports = __toCommonJS(useElementVisibility_exports);
25
+ var import_react = require("@legendapp/state/react");
26
+ var import_useMayObservableOptions = require("../../function/useMayObservableOptions");
27
+ var import_useIntersectionObserver = require("../useIntersectionObserver");
28
+ // @__NO_SIDE_EFFECTS__
29
+ function useElementVisibility(element, options) {
30
+ const opts$ = (0, import_useMayObservableOptions.useMayObservableOptions)(options, {
31
+ initialValue: "peek",
32
+ once: "peek",
33
+ scrollTarget: "get.element"
34
+ });
35
+ const isVisible$ = (0, import_react.useObservable)(opts$.initialValue.peek() ?? false);
36
+ const { stop } = (0, import_useIntersectionObserver.useIntersectionObserver)(
37
+ element,
38
+ (entries) => {
39
+ if (entries.length === 0) return;
40
+ const latest = entries.reduce((a, b) => a.time > b.time ? a : b);
41
+ isVisible$.set(latest.isIntersecting);
42
+ if (opts$.once.peek() && latest.isIntersecting) {
43
+ stop();
44
+ }
45
+ },
46
+ {
47
+ root: opts$.scrollTarget,
48
+ rootMargin: opts$.rootMargin,
49
+ threshold: opts$.threshold
50
+ }
51
+ );
52
+ return isVisible$;
53
+ }
54
+ // Annotate the CommonJS export names for ESM import in node:
55
+ 0 && (module.exports = {
56
+ useElementVisibility
57
+ });
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useElementVisibility/index.ts"],"sourcesContent":["\"use client\";\nimport type { Observable } from \"@legendapp/state\";\nimport { useObservable } from \"@legendapp/state/react\";\nimport type { DeepMaybeObservable } from \"../../types\";\nimport { useMayObservableOptions } from \"../../function/useMayObservableOptions\";\nimport type { MaybeElement } from \"../useRef$\";\nimport { useIntersectionObserver } from \"../useIntersectionObserver\";\nimport type { UseIntersectionObserverOptions } from \"../useIntersectionObserver\";\n\nexport interface UseElementVisibilityOptions {\n /** Initial visibility value. Default: false */\n initialValue?: boolean;\n /** Element used as the viewport for intersection. Maps to IntersectionObserver `root`. */\n scrollTarget?: MaybeElement;\n /** Margin around the root. Accepts CSS-style values. Default: \"0px\" */\n rootMargin?: string;\n /** Threshold(s) at which to trigger. Default: 0 */\n threshold?: number | number[];\n /**\n * Stop observing after the element becomes visible for the first time. Default: false.\n * Must be set at mount time; changing dynamically has no effect.\n */\n once?: boolean;\n}\n\n/**\n * Tracks whether a DOM element is visible within the viewport (or a specified scroll container).\n * Returns a reactive `Observable<boolean>` that updates automatically as visibility changes.\n *\n * `options` accepts a `DeepMaybeObservable<UseElementVisibilityOptions>`:\n * - A plain object with per-field values\n * - A plain object with per-field `Observable<T>` values\n * - The entire options object wrapped in `Observable<UseElementVisibilityOptions>`\n *\n * @param element - The element to observe\n * @param options - Optional configuration — plain, per-field Observable, or fully Observable\n * @returns `Observable<boolean>` — true when element is intersecting\n *\n * @example\n * ```tsx\n * const el$ = useRef$<HTMLDivElement>();\n * const isVisible$ = useElementVisibility(el$);\n * return <div ref={el$} />;\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function useElementVisibility(\n element: MaybeElement,\n options?: DeepMaybeObservable<UseElementVisibilityOptions>,\n): Observable<boolean> {\n const opts$ = useMayObservableOptions<UseElementVisibilityOptions>(options, {\n initialValue: \"peek\",\n once: \"peek\",\n scrollTarget: \"get.element\",\n });\n\n const isVisible$ = useObservable<boolean>(opts$.initialValue.peek() ?? false);\n\n const { stop } = useIntersectionObserver(\n element,\n (entries) => {\n if (entries.length === 0) return;\n const latest = entries.reduce((a, b) => (a.time > b.time ? a : b));\n isVisible$.set(latest.isIntersecting);\n\n if (opts$.once.peek() && latest.isIntersecting) {\n stop();\n }\n },\n {\n root: opts$.scrollTarget,\n rootMargin: opts$.rootMargin,\n threshold: opts$.threshold,\n } as DeepMaybeObservable<UseIntersectionObserverOptions>,\n );\n\n return isVisible$;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAA8B;AAE9B,qCAAwC;AAExC,qCAAwC;AAAA;AAwCjC,SAAS,qBACd,SACA,SACqB;AACrB,QAAM,YAAQ,wDAAqD,SAAS;AAAA,IAC1E,cAAc;AAAA,IACd,MAAM;AAAA,IACN,cAAc;AAAA,EAChB,CAAC;AAED,QAAM,iBAAa,4BAAuB,MAAM,aAAa,KAAK,KAAK,KAAK;AAE5E,QAAM,EAAE,KAAK,QAAI;AAAA,IACf;AAAA,IACA,CAAC,YAAY;AACX,UAAI,QAAQ,WAAW,EAAG;AAC1B,YAAM,SAAS,QAAQ,OAAO,CAAC,GAAG,MAAO,EAAE,OAAO,EAAE,OAAO,IAAI,CAAE;AACjE,iBAAW,IAAI,OAAO,cAAc;AAEpC,UAAI,MAAM,KAAK,KAAK,KAAK,OAAO,gBAAgB;AAC9C,aAAK;AAAA,MACP;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM,MAAM;AAAA,MACZ,YAAY,MAAM;AAAA,MAClB,WAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import { useObservable } from "@legendapp/state/react";
3
+ import { useMayObservableOptions } from "../../function/useMayObservableOptions";
4
+ import { useIntersectionObserver } from "../useIntersectionObserver";
5
+ // @__NO_SIDE_EFFECTS__
6
+ function useElementVisibility(element, options) {
7
+ const opts$ = useMayObservableOptions(options, {
8
+ initialValue: "peek",
9
+ once: "peek",
10
+ scrollTarget: "get.element"
11
+ });
12
+ const isVisible$ = useObservable(opts$.initialValue.peek() ?? false);
13
+ const { stop } = useIntersectionObserver(
14
+ element,
15
+ (entries) => {
16
+ if (entries.length === 0) return;
17
+ const latest = entries.reduce((a, b) => a.time > b.time ? a : b);
18
+ isVisible$.set(latest.isIntersecting);
19
+ if (opts$.once.peek() && latest.isIntersecting) {
20
+ stop();
21
+ }
22
+ },
23
+ {
24
+ root: opts$.scrollTarget,
25
+ rootMargin: opts$.rootMargin,
26
+ threshold: opts$.threshold
27
+ }
28
+ );
29
+ return isVisible$;
30
+ }
31
+ export {
32
+ useElementVisibility
33
+ };
34
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useElementVisibility/index.ts"],"sourcesContent":["\"use client\";\nimport type { Observable } from \"@legendapp/state\";\nimport { useObservable } from \"@legendapp/state/react\";\nimport type { DeepMaybeObservable } from \"../../types\";\nimport { useMayObservableOptions } from \"../../function/useMayObservableOptions\";\nimport type { MaybeElement } from \"../useRef$\";\nimport { useIntersectionObserver } from \"../useIntersectionObserver\";\nimport type { UseIntersectionObserverOptions } from \"../useIntersectionObserver\";\n\nexport interface UseElementVisibilityOptions {\n /** Initial visibility value. Default: false */\n initialValue?: boolean;\n /** Element used as the viewport for intersection. Maps to IntersectionObserver `root`. */\n scrollTarget?: MaybeElement;\n /** Margin around the root. Accepts CSS-style values. Default: \"0px\" */\n rootMargin?: string;\n /** Threshold(s) at which to trigger. Default: 0 */\n threshold?: number | number[];\n /**\n * Stop observing after the element becomes visible for the first time. Default: false.\n * Must be set at mount time; changing dynamically has no effect.\n */\n once?: boolean;\n}\n\n/**\n * Tracks whether a DOM element is visible within the viewport (or a specified scroll container).\n * Returns a reactive `Observable<boolean>` that updates automatically as visibility changes.\n *\n * `options` accepts a `DeepMaybeObservable<UseElementVisibilityOptions>`:\n * - A plain object with per-field values\n * - A plain object with per-field `Observable<T>` values\n * - The entire options object wrapped in `Observable<UseElementVisibilityOptions>`\n *\n * @param element - The element to observe\n * @param options - Optional configuration — plain, per-field Observable, or fully Observable\n * @returns `Observable<boolean>` — true when element is intersecting\n *\n * @example\n * ```tsx\n * const el$ = useRef$<HTMLDivElement>();\n * const isVisible$ = useElementVisibility(el$);\n * return <div ref={el$} />;\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function useElementVisibility(\n element: MaybeElement,\n options?: DeepMaybeObservable<UseElementVisibilityOptions>,\n): Observable<boolean> {\n const opts$ = useMayObservableOptions<UseElementVisibilityOptions>(options, {\n initialValue: \"peek\",\n once: \"peek\",\n scrollTarget: \"get.element\",\n });\n\n const isVisible$ = useObservable<boolean>(opts$.initialValue.peek() ?? false);\n\n const { stop } = useIntersectionObserver(\n element,\n (entries) => {\n if (entries.length === 0) return;\n const latest = entries.reduce((a, b) => (a.time > b.time ? a : b));\n isVisible$.set(latest.isIntersecting);\n\n if (opts$.once.peek() && latest.isIntersecting) {\n stop();\n }\n },\n {\n root: opts$.scrollTarget,\n rootMargin: opts$.rootMargin,\n threshold: opts$.threshold,\n } as DeepMaybeObservable<UseIntersectionObserverOptions>,\n );\n\n return isVisible$;\n}\n"],"mappings":";AAEA,SAAS,qBAAqB;AAE9B,SAAS,+BAA+B;AAExC,SAAS,+BAA+B;AAAA;AAwCjC,SAAS,qBACd,SACA,SACqB;AACrB,QAAM,QAAQ,wBAAqD,SAAS;AAAA,IAC1E,cAAc;AAAA,IACd,MAAM;AAAA,IACN,cAAc;AAAA,EAChB,CAAC;AAED,QAAM,aAAa,cAAuB,MAAM,aAAa,KAAK,KAAK,KAAK;AAE5E,QAAM,EAAE,KAAK,IAAI;AAAA,IACf;AAAA,IACA,CAAC,YAAY;AACX,UAAI,QAAQ,WAAW,EAAG;AAC1B,YAAM,SAAS,QAAQ,OAAO,CAAC,GAAG,MAAO,EAAE,OAAO,EAAE,OAAO,IAAI,CAAE;AACjE,iBAAW,IAAI,OAAO,cAAc;AAEpC,UAAI,MAAM,KAAK,KAAK,KAAK,OAAO,gBAAgB;AAC9C,aAAK;AAAA,MACP;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM,MAAM;AAAA,MACZ,YAAY,MAAM;AAAA,MAClB,WAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function UseIntersectionObserverDemo(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { UseIntersectionObserverDemo as default };
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function UseIntersectionObserverDemo(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { UseIntersectionObserverDemo as default };
@@ -0,0 +1,173 @@
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: () => UseIntersectionObserverDemo
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
+ const DEFAULT_ROOT_MARGIN = 0;
29
+ const btnStyle = {
30
+ padding: "3px 10px",
31
+ fontSize: "12px",
32
+ cursor: "pointer",
33
+ borderRadius: "4px",
34
+ border: "1px solid var(--sl-color-gray-4, #94a3b8)",
35
+ background: "transparent",
36
+ fontFamily: "monospace"
37
+ };
38
+ function UseIntersectionObserverDemo() {
39
+ const el$ = (0, import_useRef.useRef$)();
40
+ const containerRef$ = (0, import_useRef.useRef$)();
41
+ const isVisible$ = (0, import_react.useObservable)(false);
42
+ const rootMargin$ = (0, import_react.useObservable)(DEFAULT_ROOT_MARGIN);
43
+ const marginString$ = (0, import_react.useObservable)(() => {
44
+ const m = Number(rootMargin$.get());
45
+ return `${isNaN(m) ? 0 : m}px`;
46
+ });
47
+ const { isActive$, pause, resume } = (0, import__.useIntersectionObserver)(
48
+ el$,
49
+ (entries) => {
50
+ isVisible$.set(entries[0]?.isIntersecting ?? false);
51
+ },
52
+ { threshold: 0.5, rootMargin: marginString$, root: containerRef$ }
53
+ );
54
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: [
55
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
56
+ "div",
57
+ {
58
+ style: {
59
+ display: "flex",
60
+ alignItems: "center",
61
+ gap: "16px",
62
+ fontFamily: "monospace",
63
+ fontSize: "14px",
64
+ padding: "8px 12px",
65
+ background: "var(--sl-color-gray-6, #f1f5f9)",
66
+ borderRadius: "6px"
67
+ },
68
+ children: [
69
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Computed, { children: () => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
70
+ "isIntersecting:",
71
+ " ",
72
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: isActive$.get() ? String(isVisible$.get()) : "\u2014 (paused)" })
73
+ ] }) }),
74
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Computed, { children: () => isActive$.get() ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { onClick: pause, style: btnStyle, children: "pause" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { onClick: resume, style: btnStyle, children: "resume" }) })
75
+ ]
76
+ }
77
+ ),
78
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
79
+ "div",
80
+ {
81
+ style: {
82
+ display: "flex",
83
+ alignItems: "center",
84
+ gap: "8px",
85
+ fontFamily: "monospace",
86
+ fontSize: "13px",
87
+ padding: "6px 12px",
88
+ background: "var(--sl-color-gray-6, #f1f5f9)",
89
+ borderRadius: "6px"
90
+ },
91
+ children: [
92
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { color: "var(--sl-color-gray-2, #64748b)" }, children: "rootMargin:" }),
93
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Computed, { children: () => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
94
+ "input",
95
+ {
96
+ value: rootMargin$.get(),
97
+ type: "number",
98
+ onChange: (e) => rootMargin$.set(Number(e.target.value)),
99
+ style: {
100
+ fontFamily: "monospace",
101
+ fontSize: "13px",
102
+ padding: "2px 8px",
103
+ borderRadius: "4px",
104
+ border: "1px solid var(--sl-color-gray-4, #94a3b8)",
105
+ background: "var(--sl-color-gray-7, #ffffff)",
106
+ color: "black",
107
+ width: "160px"
108
+ }
109
+ }
110
+ ) }),
111
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Computed, { children: () => rootMargin$.get() !== DEFAULT_ROOT_MARGIN ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
112
+ "button",
113
+ {
114
+ onClick: () => rootMargin$.set(DEFAULT_ROOT_MARGIN),
115
+ style: btnStyle,
116
+ children: "default"
117
+ }
118
+ ) : null })
119
+ ]
120
+ }
121
+ ),
122
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
123
+ "div",
124
+ {
125
+ ref: containerRef$,
126
+ style: {
127
+ height: "200px",
128
+ overflowY: "auto",
129
+ border: "1px solid var(--sl-color-gray-5, #cbd5e1)",
130
+ borderRadius: "6px",
131
+ position: "relative"
132
+ },
133
+ children: [
134
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
135
+ "div",
136
+ {
137
+ style: {
138
+ display: "flex",
139
+ alignItems: "center",
140
+ justifyContent: "center",
141
+ height: "200px",
142
+ color: "var(--sl-color-gray-3, #94a3b8)",
143
+ fontSize: "13px",
144
+ fontFamily: "monospace"
145
+ },
146
+ children: "\u2193 scroll down"
147
+ }
148
+ ),
149
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Computed, { children: () => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
150
+ "div",
151
+ {
152
+ ref: el$,
153
+ style: {
154
+ margin: "0 16px",
155
+ padding: "20px",
156
+ borderRadius: "6px",
157
+ textAlign: "center",
158
+ fontFamily: "monospace",
159
+ fontSize: "13px",
160
+ transition: "background 0.2s, border-color 0.2s",
161
+ border: `2px solid ${isVisible$.get() ? "var(--sl-color-green, #22c55e)" : "var(--sl-color-gray-4, #94a3b8)"}`,
162
+ background: isVisible$.get() ? "var(--sl-color-green-low, #dcfce7)" : "transparent"
163
+ },
164
+ children: "target element"
165
+ }
166
+ ) }),
167
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { height: "140px" } })
168
+ ]
169
+ }
170
+ )
171
+ ] });
172
+ }
173
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useIntersectionObserver/demo.tsx"],"sourcesContent":["import { useRef$ } from \"../useRef$\";\nimport { useIntersectionObserver } from \".\";\nimport { Computed, useObservable } from \"@legendapp/state/react\";\n\nconst DEFAULT_ROOT_MARGIN = 0;\n\nconst btnStyle: React.CSSProperties = {\n padding: \"3px 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};\n\nexport default function UseIntersectionObserverDemo() {\n const el$ = useRef$<HTMLDivElement>();\n const containerRef$ = useRef$<HTMLElement>();\n const isVisible$ = useObservable(false);\n const rootMargin$ = useObservable(DEFAULT_ROOT_MARGIN);\n\n const marginString$ = useObservable(() => {\n const m = Number(rootMargin$.get());\n return `${isNaN(m) ? 0 : m}px`;\n });\n const { isActive$, pause, resume } = useIntersectionObserver(\n el$,\n (entries) => {\n isVisible$.set(entries[0]?.isIntersecting ?? false);\n },\n { threshold: 0.5, rootMargin: marginString$, root: containerRef$ },\n );\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"8px\" }}>\n {/* Status + pause/resume */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"16px\",\n fontFamily: \"monospace\",\n fontSize: \"14px\",\n padding: \"8px 12px\",\n background: \"var(--sl-color-gray-6, #f1f5f9)\",\n borderRadius: \"6px\",\n }}\n >\n <Computed>\n {() => (\n <span>\n isIntersecting:{\" \"}\n <strong>\n {isActive$.get() ? String(isVisible$.get()) : \"— (paused)\"}\n </strong>\n </span>\n )}\n </Computed>\n <Computed>\n {() =>\n isActive$.get() ? (\n <button onClick={pause} style={btnStyle}>\n pause\n </button>\n ) : (\n <button onClick={resume} style={btnStyle}>\n resume\n </button>\n )\n }\n </Computed>\n </div>\n\n {/* rootMargin input */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n padding: \"6px 12px\",\n background: \"var(--sl-color-gray-6, #f1f5f9)\",\n borderRadius: \"6px\",\n }}\n >\n <span style={{ color: \"var(--sl-color-gray-2, #64748b)\" }}>\n rootMargin:\n </span>\n <Computed>\n {() => (\n <input\n value={rootMargin$.get()}\n type=\"number\"\n onChange={(e) => rootMargin$.set(Number(e.target.value))}\n style={{\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n padding: \"2px 8px\",\n borderRadius: \"4px\",\n border: \"1px solid var(--sl-color-gray-4, #94a3b8)\",\n background: \"var(--sl-color-gray-7, #ffffff)\",\n color: \"black\",\n width: \"160px\",\n }}\n />\n )}\n </Computed>\n <Computed>\n {() =>\n rootMargin$.get() !== DEFAULT_ROOT_MARGIN ? (\n <button\n onClick={() => rootMargin$.set(DEFAULT_ROOT_MARGIN)}\n style={btnStyle}\n >\n default\n </button>\n ) : null\n }\n </Computed>\n </div>\n\n {/* Scrollable container — used as root for IntersectionObserver */}\n <div\n ref={containerRef$}\n style={{\n height: \"200px\",\n overflowY: \"auto\",\n border: \"1px solid var(--sl-color-gray-5, #cbd5e1)\",\n borderRadius: \"6px\",\n position: \"relative\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"200px\",\n color: \"var(--sl-color-gray-3, #94a3b8)\",\n fontSize: \"13px\",\n fontFamily: \"monospace\",\n }}\n >\n ↓ scroll down\n </div>\n\n <Computed>\n {() => (\n <div\n ref={el$}\n style={{\n margin: \"0 16px\",\n padding: \"20px\",\n borderRadius: \"6px\",\n textAlign: \"center\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n transition: \"background 0.2s, border-color 0.2s\",\n border: `2px solid ${\n isVisible$.get()\n ? \"var(--sl-color-green, #22c55e)\"\n : \"var(--sl-color-gray-4, #94a3b8)\"\n }`,\n background: isVisible$.get()\n ? \"var(--sl-color-green-low, #dcfce7)\"\n : \"transparent\",\n }}\n >\n target element\n </div>\n )}\n </Computed>\n\n <div style={{ height: \"140px\" }} />\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,153 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useRef$ } from "../useRef$";
3
+ import { useIntersectionObserver } from ".";
4
+ import { Computed, useObservable } from "@legendapp/state/react";
5
+ const DEFAULT_ROOT_MARGIN = 0;
6
+ const btnStyle = {
7
+ padding: "3px 10px",
8
+ fontSize: "12px",
9
+ cursor: "pointer",
10
+ borderRadius: "4px",
11
+ border: "1px solid var(--sl-color-gray-4, #94a3b8)",
12
+ background: "transparent",
13
+ fontFamily: "monospace"
14
+ };
15
+ function UseIntersectionObserverDemo() {
16
+ const el$ = useRef$();
17
+ const containerRef$ = useRef$();
18
+ const isVisible$ = useObservable(false);
19
+ const rootMargin$ = useObservable(DEFAULT_ROOT_MARGIN);
20
+ const marginString$ = useObservable(() => {
21
+ const m = Number(rootMargin$.get());
22
+ return `${isNaN(m) ? 0 : m}px`;
23
+ });
24
+ const { isActive$, pause, resume } = useIntersectionObserver(
25
+ el$,
26
+ (entries) => {
27
+ isVisible$.set(entries[0]?.isIntersecting ?? false);
28
+ },
29
+ { threshold: 0.5, rootMargin: marginString$, root: containerRef$ }
30
+ );
31
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "8px" }, children: [
32
+ /* @__PURE__ */ jsxs(
33
+ "div",
34
+ {
35
+ style: {
36
+ display: "flex",
37
+ alignItems: "center",
38
+ gap: "16px",
39
+ fontFamily: "monospace",
40
+ fontSize: "14px",
41
+ padding: "8px 12px",
42
+ background: "var(--sl-color-gray-6, #f1f5f9)",
43
+ borderRadius: "6px"
44
+ },
45
+ children: [
46
+ /* @__PURE__ */ jsx(Computed, { children: () => /* @__PURE__ */ jsxs("span", { children: [
47
+ "isIntersecting:",
48
+ " ",
49
+ /* @__PURE__ */ jsx("strong", { children: isActive$.get() ? String(isVisible$.get()) : "\u2014 (paused)" })
50
+ ] }) }),
51
+ /* @__PURE__ */ jsx(Computed, { children: () => isActive$.get() ? /* @__PURE__ */ jsx("button", { onClick: pause, style: btnStyle, children: "pause" }) : /* @__PURE__ */ jsx("button", { onClick: resume, style: btnStyle, children: "resume" }) })
52
+ ]
53
+ }
54
+ ),
55
+ /* @__PURE__ */ jsxs(
56
+ "div",
57
+ {
58
+ style: {
59
+ display: "flex",
60
+ alignItems: "center",
61
+ gap: "8px",
62
+ fontFamily: "monospace",
63
+ fontSize: "13px",
64
+ padding: "6px 12px",
65
+ background: "var(--sl-color-gray-6, #f1f5f9)",
66
+ borderRadius: "6px"
67
+ },
68
+ children: [
69
+ /* @__PURE__ */ jsx("span", { style: { color: "var(--sl-color-gray-2, #64748b)" }, children: "rootMargin:" }),
70
+ /* @__PURE__ */ jsx(Computed, { children: () => /* @__PURE__ */ jsx(
71
+ "input",
72
+ {
73
+ value: rootMargin$.get(),
74
+ type: "number",
75
+ onChange: (e) => rootMargin$.set(Number(e.target.value)),
76
+ style: {
77
+ fontFamily: "monospace",
78
+ fontSize: "13px",
79
+ padding: "2px 8px",
80
+ borderRadius: "4px",
81
+ border: "1px solid var(--sl-color-gray-4, #94a3b8)",
82
+ background: "var(--sl-color-gray-7, #ffffff)",
83
+ color: "black",
84
+ width: "160px"
85
+ }
86
+ }
87
+ ) }),
88
+ /* @__PURE__ */ jsx(Computed, { children: () => rootMargin$.get() !== DEFAULT_ROOT_MARGIN ? /* @__PURE__ */ jsx(
89
+ "button",
90
+ {
91
+ onClick: () => rootMargin$.set(DEFAULT_ROOT_MARGIN),
92
+ style: btnStyle,
93
+ children: "default"
94
+ }
95
+ ) : null })
96
+ ]
97
+ }
98
+ ),
99
+ /* @__PURE__ */ jsxs(
100
+ "div",
101
+ {
102
+ ref: containerRef$,
103
+ style: {
104
+ height: "200px",
105
+ overflowY: "auto",
106
+ border: "1px solid var(--sl-color-gray-5, #cbd5e1)",
107
+ borderRadius: "6px",
108
+ position: "relative"
109
+ },
110
+ children: [
111
+ /* @__PURE__ */ jsx(
112
+ "div",
113
+ {
114
+ style: {
115
+ display: "flex",
116
+ alignItems: "center",
117
+ justifyContent: "center",
118
+ height: "200px",
119
+ color: "var(--sl-color-gray-3, #94a3b8)",
120
+ fontSize: "13px",
121
+ fontFamily: "monospace"
122
+ },
123
+ children: "\u2193 scroll down"
124
+ }
125
+ ),
126
+ /* @__PURE__ */ jsx(Computed, { children: () => /* @__PURE__ */ jsx(
127
+ "div",
128
+ {
129
+ ref: el$,
130
+ style: {
131
+ margin: "0 16px",
132
+ padding: "20px",
133
+ borderRadius: "6px",
134
+ textAlign: "center",
135
+ fontFamily: "monospace",
136
+ fontSize: "13px",
137
+ transition: "background 0.2s, border-color 0.2s",
138
+ border: `2px solid ${isVisible$.get() ? "var(--sl-color-green, #22c55e)" : "var(--sl-color-gray-4, #94a3b8)"}`,
139
+ background: isVisible$.get() ? "var(--sl-color-green-low, #dcfce7)" : "transparent"
140
+ },
141
+ children: "target element"
142
+ }
143
+ ) }),
144
+ /* @__PURE__ */ jsx("div", { style: { height: "140px" } })
145
+ ]
146
+ }
147
+ )
148
+ ] });
149
+ }
150
+ export {
151
+ UseIntersectionObserverDemo as default
152
+ };
153
+ //# sourceMappingURL=demo.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useIntersectionObserver/demo.tsx"],"sourcesContent":["import { useRef$ } from \"../useRef$\";\nimport { useIntersectionObserver } from \".\";\nimport { Computed, useObservable } from \"@legendapp/state/react\";\n\nconst DEFAULT_ROOT_MARGIN = 0;\n\nconst btnStyle: React.CSSProperties = {\n padding: \"3px 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};\n\nexport default function UseIntersectionObserverDemo() {\n const el$ = useRef$<HTMLDivElement>();\n const containerRef$ = useRef$<HTMLElement>();\n const isVisible$ = useObservable(false);\n const rootMargin$ = useObservable(DEFAULT_ROOT_MARGIN);\n\n const marginString$ = useObservable(() => {\n const m = Number(rootMargin$.get());\n return `${isNaN(m) ? 0 : m}px`;\n });\n const { isActive$, pause, resume } = useIntersectionObserver(\n el$,\n (entries) => {\n isVisible$.set(entries[0]?.isIntersecting ?? false);\n },\n { threshold: 0.5, rootMargin: marginString$, root: containerRef$ },\n );\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"8px\" }}>\n {/* Status + pause/resume */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"16px\",\n fontFamily: \"monospace\",\n fontSize: \"14px\",\n padding: \"8px 12px\",\n background: \"var(--sl-color-gray-6, #f1f5f9)\",\n borderRadius: \"6px\",\n }}\n >\n <Computed>\n {() => (\n <span>\n isIntersecting:{\" \"}\n <strong>\n {isActive$.get() ? String(isVisible$.get()) : \"— (paused)\"}\n </strong>\n </span>\n )}\n </Computed>\n <Computed>\n {() =>\n isActive$.get() ? (\n <button onClick={pause} style={btnStyle}>\n pause\n </button>\n ) : (\n <button onClick={resume} style={btnStyle}>\n resume\n </button>\n )\n }\n </Computed>\n </div>\n\n {/* rootMargin input */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n padding: \"6px 12px\",\n background: \"var(--sl-color-gray-6, #f1f5f9)\",\n borderRadius: \"6px\",\n }}\n >\n <span style={{ color: \"var(--sl-color-gray-2, #64748b)\" }}>\n rootMargin:\n </span>\n <Computed>\n {() => (\n <input\n value={rootMargin$.get()}\n type=\"number\"\n onChange={(e) => rootMargin$.set(Number(e.target.value))}\n style={{\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n padding: \"2px 8px\",\n borderRadius: \"4px\",\n border: \"1px solid var(--sl-color-gray-4, #94a3b8)\",\n background: \"var(--sl-color-gray-7, #ffffff)\",\n color: \"black\",\n width: \"160px\",\n }}\n />\n )}\n </Computed>\n <Computed>\n {() =>\n rootMargin$.get() !== DEFAULT_ROOT_MARGIN ? (\n <button\n onClick={() => rootMargin$.set(DEFAULT_ROOT_MARGIN)}\n style={btnStyle}\n >\n default\n </button>\n ) : null\n }\n </Computed>\n </div>\n\n {/* Scrollable container — used as root for IntersectionObserver */}\n <div\n ref={containerRef$}\n style={{\n height: \"200px\",\n overflowY: \"auto\",\n border: \"1px solid var(--sl-color-gray-5, #cbd5e1)\",\n borderRadius: \"6px\",\n position: \"relative\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"200px\",\n color: \"var(--sl-color-gray-3, #94a3b8)\",\n fontSize: \"13px\",\n fontFamily: \"monospace\",\n }}\n >\n ↓ scroll down\n </div>\n\n <Computed>\n {() => (\n <div\n ref={el$}\n style={{\n margin: \"0 16px\",\n padding: \"20px\",\n borderRadius: \"6px\",\n textAlign: \"center\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n transition: \"background 0.2s, border-color 0.2s\",\n border: `2px solid ${\n isVisible$.get()\n ? \"var(--sl-color-green, #22c55e)\"\n : \"var(--sl-color-gray-4, #94a3b8)\"\n }`,\n background: isVisible$.get()\n ? \"var(--sl-color-green-low, #dcfce7)\"\n : \"transparent\",\n }}\n >\n target element\n </div>\n )}\n </Computed>\n\n <div style={{ height: \"140px\" }} />\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,47 @@
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 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 };