@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.
- package/README.md +21 -0
- package/dist/browser/useEventListener/index.d.mts +56 -0
- package/dist/browser/useEventListener/index.d.ts +56 -0
- package/dist/browser/useEventListener/index.js +112 -0
- package/dist/browser/useEventListener/index.js.map +1 -0
- package/dist/browser/useEventListener/index.mjs +88 -0
- package/dist/browser/useEventListener/index.mjs.map +1 -0
- package/dist/browser/useMediaQuery/demo.d.mts +5 -0
- package/dist/browser/useMediaQuery/demo.d.ts +5 -0
- package/dist/browser/useMediaQuery/demo.js +83 -0
- package/dist/browser/useMediaQuery/demo.js.map +1 -0
- package/dist/browser/useMediaQuery/demo.mjs +63 -0
- package/dist/browser/useMediaQuery/demo.mjs.map +1 -0
- package/dist/browser/useMediaQuery/index.d.mts +11 -0
- package/dist/browser/useMediaQuery/index.d.ts +11 -0
- package/dist/browser/useMediaQuery/index.js +89 -0
- package/dist/browser/useMediaQuery/index.js.map +1 -0
- package/dist/browser/useMediaQuery/index.mjs +64 -0
- package/dist/browser/useMediaQuery/index.mjs.map +1 -0
- package/dist/components/Auto/index.d.mts +33 -0
- package/dist/components/Auto/index.d.ts +33 -0
- package/dist/components/Auto/index.js +66 -0
- package/dist/components/Auto/index.js.map +1 -0
- package/dist/components/Auto/index.mjs +34 -0
- package/dist/components/Auto/index.mjs.map +1 -0
- package/dist/elements/useDocumentVisibility/demo.d.mts +5 -0
- package/dist/elements/useDocumentVisibility/demo.d.ts +5 -0
- package/dist/elements/useDocumentVisibility/demo.js +130 -0
- package/dist/elements/useDocumentVisibility/demo.js.map +1 -0
- package/dist/elements/useDocumentVisibility/demo.mjs +114 -0
- package/dist/elements/useDocumentVisibility/demo.mjs.map +1 -0
- package/dist/elements/useDocumentVisibility/index.d.mts +5 -0
- package/dist/elements/useDocumentVisibility/index.d.ts +5 -0
- package/dist/elements/useDocumentVisibility/index.js +45 -0
- package/dist/elements/useDocumentVisibility/index.js.map +1 -0
- package/dist/elements/useDocumentVisibility/index.mjs +21 -0
- package/dist/elements/useDocumentVisibility/index.mjs.map +1 -0
- package/dist/elements/useElementBounding/demo.d.mts +5 -0
- package/dist/elements/useElementBounding/demo.d.ts +5 -0
- package/dist/elements/useElementBounding/demo.js +87 -0
- package/dist/elements/useElementBounding/demo.js.map +1 -0
- package/dist/elements/useElementBounding/demo.mjs +67 -0
- package/dist/elements/useElementBounding/demo.mjs.map +1 -0
- package/dist/elements/useElementBounding/index.d.mts +46 -0
- package/dist/elements/useElementBounding/index.d.ts +46 -0
- package/dist/elements/useElementBounding/index.js +122 -0
- package/dist/elements/useElementBounding/index.js.map +1 -0
- package/dist/elements/useElementBounding/index.mjs +98 -0
- package/dist/elements/useElementBounding/index.mjs.map +1 -0
- package/dist/elements/useElementSize/demo.d.mts +5 -0
- package/dist/elements/useElementSize/demo.d.ts +5 -0
- package/dist/elements/useElementSize/demo.js +83 -0
- package/dist/elements/useElementSize/demo.js.map +1 -0
- package/dist/elements/useElementSize/demo.mjs +63 -0
- package/dist/elements/useElementSize/demo.mjs.map +1 -0
- package/dist/elements/useElementSize/index.d.mts +34 -0
- package/dist/elements/useElementSize/index.d.ts +34 -0
- package/dist/elements/useElementSize/index.js +85 -0
- package/dist/elements/useElementSize/index.js.map +1 -0
- package/dist/elements/useElementSize/index.mjs +61 -0
- package/dist/elements/useElementSize/index.mjs.map +1 -0
- package/dist/elements/useElementVisibility/demo.d.mts +5 -0
- package/dist/elements/useElementVisibility/demo.d.ts +5 -0
- package/dist/elements/useElementVisibility/demo.js +110 -0
- package/dist/elements/useElementVisibility/demo.js.map +1 -0
- package/dist/elements/useElementVisibility/demo.mjs +90 -0
- package/dist/elements/useElementVisibility/demo.mjs.map +1 -0
- package/dist/elements/useElementVisibility/index.d.mts +43 -0
- package/dist/elements/useElementVisibility/index.d.ts +43 -0
- package/dist/elements/useElementVisibility/index.js +58 -0
- package/dist/elements/useElementVisibility/index.js.map +1 -0
- package/dist/elements/useElementVisibility/index.mjs +34 -0
- package/dist/elements/useElementVisibility/index.mjs.map +1 -0
- package/dist/elements/useIntersectionObserver/demo.d.mts +5 -0
- package/dist/elements/useIntersectionObserver/demo.d.ts +5 -0
- package/dist/elements/useIntersectionObserver/demo.js +173 -0
- package/dist/elements/useIntersectionObserver/demo.js.map +1 -0
- package/dist/elements/useIntersectionObserver/demo.mjs +153 -0
- package/dist/elements/useIntersectionObserver/demo.mjs.map +1 -0
- package/dist/elements/useIntersectionObserver/index.d.mts +47 -0
- package/dist/elements/useIntersectionObserver/index.d.ts +47 -0
- package/dist/elements/useIntersectionObserver/index.js +111 -0
- package/dist/elements/useIntersectionObserver/index.js.map +1 -0
- package/dist/elements/useIntersectionObserver/index.mjs +87 -0
- package/dist/elements/useIntersectionObserver/index.mjs.map +1 -0
- package/dist/elements/useMouseInElement/demo.d.mts +5 -0
- package/dist/elements/useMouseInElement/demo.d.ts +5 -0
- package/dist/elements/useMouseInElement/demo.js +104 -0
- package/dist/elements/useMouseInElement/demo.js.map +1 -0
- package/dist/elements/useMouseInElement/demo.mjs +84 -0
- package/dist/elements/useMouseInElement/demo.mjs.map +1 -0
- package/dist/elements/useMouseInElement/index.d.mts +56 -0
- package/dist/elements/useMouseInElement/index.d.ts +56 -0
- package/dist/elements/useMouseInElement/index.js +148 -0
- package/dist/elements/useMouseInElement/index.js.map +1 -0
- package/dist/elements/useMouseInElement/index.mjs +124 -0
- package/dist/elements/useMouseInElement/index.mjs.map +1 -0
- package/dist/elements/useMutationObserver/demo.d.mts +5 -0
- package/dist/elements/useMutationObserver/demo.d.ts +5 -0
- package/dist/elements/useMutationObserver/demo.js +240 -0
- package/dist/elements/useMutationObserver/demo.js.map +1 -0
- package/dist/elements/useMutationObserver/demo.mjs +220 -0
- package/dist/elements/useMutationObserver/demo.mjs.map +1 -0
- package/dist/elements/useMutationObserver/index.d.mts +15 -0
- package/dist/elements/useMutationObserver/index.d.ts +15 -0
- package/dist/elements/useMutationObserver/index.js +69 -0
- package/dist/elements/useMutationObserver/index.js.map +1 -0
- package/dist/elements/useMutationObserver/index.mjs +45 -0
- package/dist/elements/useMutationObserver/index.mjs.map +1 -0
- package/dist/elements/useParentElement/demo.d.mts +5 -0
- package/dist/elements/useParentElement/demo.d.ts +5 -0
- package/dist/elements/useParentElement/demo.js +132 -0
- package/dist/elements/useParentElement/demo.js.map +1 -0
- package/dist/elements/useParentElement/demo.mjs +112 -0
- package/dist/elements/useParentElement/demo.mjs.map +1 -0
- package/dist/elements/useParentElement/index.d.mts +7 -0
- package/dist/elements/useParentElement/index.d.ts +7 -0
- package/dist/elements/useParentElement/index.js +47 -0
- package/dist/elements/useParentElement/index.js.map +1 -0
- package/dist/elements/useParentElement/index.mjs +23 -0
- package/dist/elements/useParentElement/index.mjs.map +1 -0
- package/dist/elements/useRef$/index.js +89 -0
- package/dist/elements/useRef$/index.js.map +1 -0
- package/dist/elements/useRef$/index.mjs +62 -0
- package/dist/elements/useRef$/index.mjs.map +1 -0
- package/dist/elements/useRef_/index.d.mts +60 -0
- package/dist/elements/useRef_/index.d.ts +60 -0
- package/dist/elements/useResizeObserver/demo.d.mts +5 -0
- package/dist/elements/useResizeObserver/demo.d.ts +5 -0
- package/dist/elements/useResizeObserver/demo.js +90 -0
- package/dist/elements/useResizeObserver/demo.js.map +1 -0
- package/dist/elements/useResizeObserver/demo.mjs +70 -0
- package/dist/elements/useResizeObserver/demo.mjs.map +1 -0
- package/dist/elements/useResizeObserver/index.d.mts +36 -0
- package/dist/elements/useResizeObserver/index.d.ts +36 -0
- package/dist/elements/useResizeObserver/index.js +74 -0
- package/dist/elements/useResizeObserver/index.js.map +1 -0
- package/dist/elements/useResizeObserver/index.mjs +49 -0
- package/dist/elements/useResizeObserver/index.mjs.map +1 -0
- package/dist/elements/useWindowFocus/demo.d.mts +5 -0
- package/dist/elements/useWindowFocus/demo.d.ts +5 -0
- package/dist/elements/useWindowFocus/demo.js +104 -0
- package/dist/elements/useWindowFocus/demo.js.map +1 -0
- package/dist/elements/useWindowFocus/demo.mjs +84 -0
- package/dist/elements/useWindowFocus/demo.mjs.map +1 -0
- package/dist/elements/useWindowFocus/index.d.mts +5 -0
- package/dist/elements/useWindowFocus/index.d.ts +5 -0
- package/dist/elements/useWindowFocus/index.js +42 -0
- package/dist/elements/useWindowFocus/index.js.map +1 -0
- package/dist/elements/useWindowFocus/index.mjs +18 -0
- package/dist/elements/useWindowFocus/index.mjs.map +1 -0
- package/dist/elements/useWindowSize/demo.d.mts +5 -0
- package/dist/elements/useWindowSize/demo.d.ts +5 -0
- package/dist/elements/useWindowSize/demo.js +79 -0
- package/dist/elements/useWindowSize/demo.js.map +1 -0
- package/dist/elements/useWindowSize/demo.mjs +59 -0
- package/dist/elements/useWindowSize/demo.mjs.map +1 -0
- package/dist/elements/useWindowSize/index.d.mts +17 -0
- package/dist/elements/useWindowSize/index.d.ts +17 -0
- package/dist/elements/useWindowSize/index.js +96 -0
- package/dist/elements/useWindowSize/index.js.map +1 -0
- package/dist/elements/useWindowSize/index.mjs +76 -0
- package/dist/elements/useWindowSize/index.mjs.map +1 -0
- package/dist/function/get/index.d.mts +45 -0
- package/dist/function/get/index.d.ts +45 -0
- package/dist/function/get/index.js +39 -0
- package/dist/function/get/index.js.map +1 -0
- package/dist/function/get/index.mjs +15 -0
- package/dist/function/get/index.mjs.map +1 -0
- package/dist/function/peek/index.d.mts +46 -0
- package/dist/function/peek/index.d.ts +46 -0
- package/dist/function/peek/index.js +39 -0
- package/dist/function/peek/index.js.map +1 -0
- package/dist/function/peek/index.mjs +15 -0
- package/dist/function/peek/index.mjs.map +1 -0
- package/dist/function/useMayObservableOptions/index.d.mts +59 -0
- package/dist/function/useMayObservableOptions/index.d.ts +59 -0
- package/dist/function/useMayObservableOptions/index.js +109 -0
- package/dist/function/useMayObservableOptions/index.js.map +1 -0
- package/dist/function/useMayObservableOptions/index.mjs +88 -0
- package/dist/function/useMayObservableOptions/index.mjs.map +1 -0
- package/dist/function/useSupported/index.d.mts +6 -0
- package/dist/function/useSupported/index.d.ts +6 -0
- package/dist/function/useSupported/index.js +37 -0
- package/dist/function/useSupported/index.js.map +1 -0
- package/dist/function/useSupported/index.mjs +13 -0
- package/dist/function/useSupported/index.mjs.map +1 -0
- package/dist/function/useWhenMounted/index.d.mts +6 -0
- package/dist/function/useWhenMounted/index.d.ts +6 -0
- package/dist/function/useWhenMounted/index.js +37 -0
- package/dist/function/useWhenMounted/index.js.map +1 -0
- package/dist/function/useWhenMounted/index.mjs +13 -0
- package/dist/function/useWhenMounted/index.mjs.map +1 -0
- package/dist/index.d.mts +24 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +22 -0
- package/dist/index.mjs.map +1 -0
- package/dist/sensors/useScroll/demo.d.mts +5 -0
- package/dist/sensors/useScroll/demo.d.ts +5 -0
- package/dist/sensors/useScroll/demo.js +122 -0
- package/dist/sensors/useScroll/demo.js.map +1 -0
- package/dist/sensors/useScroll/demo.mjs +102 -0
- package/dist/sensors/useScroll/demo.mjs.map +1 -0
- package/dist/sensors/useScroll/index.d.mts +42 -0
- package/dist/sensors/useScroll/index.d.ts +42 -0
- package/dist/sensors/useScroll/index.js +149 -0
- package/dist/sensors/useScroll/index.js.map +1 -0
- package/dist/sensors/useScroll/index.mjs +125 -0
- package/dist/sensors/useScroll/index.mjs.map +1 -0
- package/dist/sensors/useWindowScroll/demo.d.mts +5 -0
- package/dist/sensors/useWindowScroll/demo.d.ts +5 -0
- package/dist/sensors/useWindowScroll/demo.js +85 -0
- package/dist/sensors/useWindowScroll/demo.js.map +1 -0
- package/dist/sensors/useWindowScroll/demo.mjs +65 -0
- package/dist/sensors/useWindowScroll/demo.mjs.map +1 -0
- package/dist/sensors/useWindowScroll/index.d.mts +9 -0
- package/dist/sensors/useWindowScroll/index.d.ts +9 -0
- package/dist/sensors/useWindowScroll/index.js +36 -0
- package/dist/sensors/useWindowScroll/index.js.map +1 -0
- package/dist/sensors/useWindowScroll/index.mjs +12 -0
- package/dist/sensors/useWindowScroll/index.mjs.map +1 -0
- package/dist/shared/configurable.d.mts +21 -0
- package/dist/shared/configurable.d.ts +21 -0
- package/dist/shared/configurable.js +39 -0
- package/dist/shared/configurable.js.map +1 -0
- package/dist/shared/configurable.mjs +12 -0
- package/dist/shared/configurable.mjs.map +1 -0
- package/dist/shared/index.d.mts +4 -0
- package/dist/shared/index.d.ts +4 -0
- package/dist/shared/index.js +31 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/index.mjs +7 -0
- package/dist/shared/index.mjs.map +1 -0
- package/dist/shared/normalizeTargets/index.d.mts +21 -0
- package/dist/shared/normalizeTargets/index.d.ts +21 -0
- package/dist/shared/normalizeTargets/index.js +36 -0
- package/dist/shared/normalizeTargets/index.js.map +1 -0
- package/dist/shared/normalizeTargets/index.mjs +12 -0
- package/dist/shared/normalizeTargets/index.mjs.map +1 -0
- package/dist/shared/utils.d.mts +15 -0
- package/dist/shared/utils.d.ts +15 -0
- package/dist/shared/utils.js +87 -0
- package/dist/shared/utils.js.map +1 -0
- package/dist/shared/utils.mjs +52 -0
- package/dist/shared/utils.mjs.map +1 -0
- package/dist/types.d.mts +52 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +1 -0
- package/dist/types.mjs.map +1 -0
- package/package.json +54 -0
- package/src/browser/useEventListener/index.md +109 -0
- package/src/browser/useEventListener/index.spec.ts +611 -0
- package/src/browser/useEventListener/index.ts +242 -0
- package/src/browser/useMediaQuery/demo.tsx +63 -0
- package/src/browser/useMediaQuery/index.md +43 -0
- package/src/browser/useMediaQuery/index.spec.ts +267 -0
- package/src/browser/useMediaQuery/index.ts +96 -0
- package/src/components/Auto/index.tsx +65 -0
- package/src/elements/useDocumentVisibility/demo.tsx +111 -0
- package/src/elements/useDocumentVisibility/index.md +54 -0
- package/src/elements/useDocumentVisibility/index.spec.ts +114 -0
- package/src/elements/useDocumentVisibility/index.ts +26 -0
- package/src/elements/useElementBounding/demo.tsx +68 -0
- package/src/elements/useElementBounding/index.md +64 -0
- package/src/elements/useElementBounding/index.ts +159 -0
- package/src/elements/useElementSize/demo.tsx +53 -0
- package/src/elements/useElementSize/index.md +65 -0
- package/src/elements/useElementSize/index.spec.ts +295 -0
- package/src/elements/useElementSize/index.ts +100 -0
- package/src/elements/useElementVisibility/deep-observable-pattern.spec.ts +453 -0
- package/src/elements/useElementVisibility/demo.tsx +97 -0
- package/src/elements/useElementVisibility/index.md +98 -0
- package/src/elements/useElementVisibility/index.spec.ts +227 -0
- package/src/elements/useElementVisibility/index.ts +78 -0
- package/src/elements/useIntersectionObserver/demo.tsx +180 -0
- package/src/elements/useIntersectionObserver/index.md +99 -0
- package/src/elements/useIntersectionObserver/index.spec.ts +482 -0
- package/src/elements/useIntersectionObserver/index.ts +149 -0
- package/src/elements/useMouseInElement/demo.tsx +88 -0
- package/src/elements/useMouseInElement/index.md +76 -0
- package/src/elements/useMouseInElement/index.spec.ts +398 -0
- package/src/elements/useMouseInElement/index.ts +209 -0
- package/src/elements/useMutationObserver/demo.tsx +270 -0
- package/src/elements/useMutationObserver/index.md +99 -0
- package/src/elements/useMutationObserver/index.spec.ts +421 -0
- package/src/elements/useMutationObserver/index.ts +66 -0
- package/src/elements/useParentElement/demo.tsx +120 -0
- package/src/elements/useParentElement/index.md +67 -0
- package/src/elements/useParentElement/index.spec.ts +208 -0
- package/src/elements/useParentElement/index.ts +35 -0
- package/src/elements/useRef$/index.md +62 -0
- package/src/elements/useRef$/index.spec.ts +205 -0
- package/src/elements/useRef$/index.ts +137 -0
- package/src/elements/useRef$/useImperativeHandle.spec.ts +339 -0
- package/src/elements/useResizeObserver/demo.tsx +62 -0
- package/src/elements/useResizeObserver/index.md +51 -0
- package/src/elements/useResizeObserver/index.spec.ts +312 -0
- package/src/elements/useResizeObserver/index.ts +106 -0
- package/src/elements/useWindowFocus/demo.tsx +79 -0
- package/src/elements/useWindowFocus/index.md +38 -0
- package/src/elements/useWindowFocus/index.spec.ts +103 -0
- package/src/elements/useWindowFocus/index.ts +21 -0
- package/src/elements/useWindowSize/demo.tsx +51 -0
- package/src/elements/useWindowSize/index.md +55 -0
- package/src/elements/useWindowSize/index.spec.ts +310 -0
- package/src/elements/useWindowSize/index.ts +107 -0
- package/src/function/get/index.md +25 -0
- package/src/function/get/index.spec.ts +87 -0
- package/src/function/get/index.ts +70 -0
- package/src/function/peek/index.spec.ts +97 -0
- package/src/function/peek/index.ts +69 -0
- package/src/function/useMayObservableOptions/index.spec.ts +521 -0
- package/src/function/useMayObservableOptions/index.ts +173 -0
- package/src/function/useSupported/index.md +43 -0
- package/src/function/useSupported/index.spec.ts +116 -0
- package/src/function/useSupported/index.ts +14 -0
- package/src/function/useWhenMounted/index.md +25 -0
- package/src/function/useWhenMounted/index.spec.ts +120 -0
- package/src/function/useWhenMounted/index.ts +16 -0
- package/src/index.ts +25 -0
- package/src/sensors/useScroll/demo.tsx +103 -0
- package/src/sensors/useScroll/index.md +117 -0
- package/src/sensors/useScroll/index.spec.ts +678 -0
- package/src/sensors/useScroll/index.ts +201 -0
- package/src/sensors/useWindowScroll/demo.tsx +78 -0
- package/src/sensors/useWindowScroll/index.md +98 -0
- package/src/sensors/useWindowScroll/index.spec.ts +69 -0
- package/src/sensors/useWindowScroll/index.ts +11 -0
- package/src/shared/configurable.ts +35 -0
- package/src/shared/index.ts +4 -0
- package/src/shared/normalizeTargets/index.spec.ts +76 -0
- package/src/shared/normalizeTargets/index.ts +27 -0
- package/src/shared/utils.ts +67 -0
- package/src/types.ts +56 -0
- package/tsconfig.json +9 -0
- package/tsup.config.ts +10 -0
- 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,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 };
|