@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.
- 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 +82 -0
- package/dist/browser/useMediaQuery/demo.js.map +1 -0
- package/dist/browser/useMediaQuery/demo.mjs +62 -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 +86 -0
- package/dist/elements/useElementBounding/demo.js.map +1 -0
- package/dist/elements/useElementBounding/demo.mjs +66 -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 +82 -0
- package/dist/elements/useElementSize/demo.js.map +1 -0
- package/dist/elements/useElementSize/demo.mjs +62 -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 +103 -0
- package/dist/elements/useMouseInElement/demo.js.map +1 -0
- package/dist/elements/useMouseInElement/demo.mjs +83 -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 +100 -0
- package/dist/elements/useWindowFocus/demo.js.map +1 -0
- package/dist/elements/useWindowFocus/demo.mjs +80 -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 +78 -0
- package/dist/elements/useWindowSize/demo.js.map +1 -0
- package/dist/elements/useWindowSize/demo.mjs +58 -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 +121 -0
- package/dist/sensors/useScroll/demo.js.map +1 -0
- package/dist/sensors/useScroll/demo.mjs +101 -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 +84 -0
- package/dist/sensors/useWindowScroll/demo.js.map +1 -0
- package/dist/sensors/useWindowScroll/demo.mjs +64 -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 +58 -0
- package/src/browser/useMediaQuery/index.md +40 -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 +51 -0
- package/src/elements/useDocumentVisibility/index.spec.ts +114 -0
- package/src/elements/useDocumentVisibility/index.ts +26 -0
- package/src/elements/useElementBounding/demo.tsx +63 -0
- package/src/elements/useElementBounding/index.md +59 -0
- package/src/elements/useElementBounding/index.ts +159 -0
- package/src/elements/useElementSize/demo.tsx +48 -0
- package/src/elements/useElementSize/index.md +60 -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 +79 -0
- package/src/elements/useMouseInElement/index.md +71 -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 +56 -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 +71 -0
- package/src/elements/useWindowFocus/index.md +35 -0
- package/src/elements/useWindowFocus/index.spec.ts +103 -0
- package/src/elements/useWindowFocus/index.ts +21 -0
- package/src/elements/useWindowSize/demo.tsx +46 -0
- package/src/elements/useWindowSize/index.md +50 -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 +38 -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 +98 -0
- package/src/sensors/useScroll/index.md +112 -0
- package/src/sensors/useScroll/index.spec.ts +678 -0
- package/src/sensors/useScroll/index.ts +201 -0
- package/src/sensors/useWindowScroll/demo.tsx +69 -0
- package/src/sensors/useWindowScroll/index.md +88 -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,45 @@
|
|
|
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 useDocumentVisibility_exports = {};
|
|
21
|
+
__export(useDocumentVisibility_exports, {
|
|
22
|
+
useDocumentVisibility: () => useDocumentVisibility
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(useDocumentVisibility_exports);
|
|
25
|
+
var import_react = require("@legendapp/state/react");
|
|
26
|
+
// @__NO_SIDE_EFFECTS__
|
|
27
|
+
function useDocumentVisibility() {
|
|
28
|
+
const visibility$ = (0, import_react.useObservable)("visible");
|
|
29
|
+
(0, import_react.useMount)(() => {
|
|
30
|
+
visibility$.set(document.visibilityState);
|
|
31
|
+
const handler = () => {
|
|
32
|
+
visibility$.set(document.visibilityState);
|
|
33
|
+
};
|
|
34
|
+
document.addEventListener("visibilitychange", handler, { passive: true });
|
|
35
|
+
return () => {
|
|
36
|
+
document.removeEventListener("visibilitychange", handler);
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
return visibility$;
|
|
40
|
+
}
|
|
41
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
42
|
+
0 && (module.exports = {
|
|
43
|
+
useDocumentVisibility
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/useDocumentVisibility/index.ts"],"sourcesContent":["\"use client\";\nimport type { Observable } from \"@legendapp/state\";\nimport { useObservable, useMount } from \"@legendapp/state/react\";\n\n/*@__NO_SIDE_EFFECTS__*/\nexport function useDocumentVisibility(): Observable<DocumentVisibilityState> {\n // Always initialize with 'visible' to match SSR output and avoid hydration mismatch.\n // The actual value is synced after mount.\n const visibility$ = useObservable<DocumentVisibilityState>(\"visible\");\n\n useMount(() => {\n visibility$.set(document.visibilityState);\n\n const handler = () => {\n visibility$.set(document.visibilityState);\n };\n\n document.addEventListener(\"visibilitychange\", handler, { passive: true });\n\n return () => {\n document.removeEventListener(\"visibilitychange\", handler);\n };\n });\n\n return visibility$;\n}"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAAwC;AAAA;AAGjC,SAAS,wBAA6D;AAG3E,QAAM,kBAAc,4BAAuC,SAAS;AAEpE,6BAAS,MAAM;AACb,gBAAY,IAAI,SAAS,eAAe;AAExC,UAAM,UAAU,MAAM;AACpB,kBAAY,IAAI,SAAS,eAAe;AAAA,IAC1C;AAEA,aAAS,iBAAiB,oBAAoB,SAAS,EAAE,SAAS,KAAK,CAAC;AAExE,WAAO,MAAM;AACX,eAAS,oBAAoB,oBAAoB,OAAO;AAAA,IAC1D;AAAA,EACF,CAAC;AAED,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useObservable, useMount } from "@legendapp/state/react";
|
|
3
|
+
// @__NO_SIDE_EFFECTS__
|
|
4
|
+
function useDocumentVisibility() {
|
|
5
|
+
const visibility$ = useObservable("visible");
|
|
6
|
+
useMount(() => {
|
|
7
|
+
visibility$.set(document.visibilityState);
|
|
8
|
+
const handler = () => {
|
|
9
|
+
visibility$.set(document.visibilityState);
|
|
10
|
+
};
|
|
11
|
+
document.addEventListener("visibilitychange", handler, { passive: true });
|
|
12
|
+
return () => {
|
|
13
|
+
document.removeEventListener("visibilitychange", handler);
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
return visibility$;
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
useDocumentVisibility
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/useDocumentVisibility/index.ts"],"sourcesContent":["\"use client\";\nimport type { Observable } from \"@legendapp/state\";\nimport { useObservable, useMount } from \"@legendapp/state/react\";\n\n/*@__NO_SIDE_EFFECTS__*/\nexport function useDocumentVisibility(): Observable<DocumentVisibilityState> {\n // Always initialize with 'visible' to match SSR output and avoid hydration mismatch.\n // The actual value is synced after mount.\n const visibility$ = useObservable<DocumentVisibilityState>(\"visible\");\n\n useMount(() => {\n visibility$.set(document.visibilityState);\n\n const handler = () => {\n visibility$.set(document.visibilityState);\n };\n\n document.addEventListener(\"visibilitychange\", handler, { passive: true });\n\n return () => {\n document.removeEventListener(\"visibilitychange\", handler);\n };\n });\n\n return visibility$;\n}"],"mappings":";AAEA,SAAS,eAAe,gBAAgB;AAAA;AAGjC,SAAS,wBAA6D;AAG3E,QAAM,cAAc,cAAuC,SAAS;AAEpE,WAAS,MAAM;AACb,gBAAY,IAAI,SAAS,eAAe;AAExC,UAAM,UAAU,MAAM;AACpB,kBAAY,IAAI,SAAS,eAAe;AAAA,IAC1C;AAEA,aAAS,iBAAiB,oBAAoB,SAAS,EAAE,SAAS,KAAK,CAAC;AAExE,WAAO,MAAM;AACX,eAAS,oBAAoB,oBAAoB,OAAO;AAAA,IAC1D;AAAA,EACF,CAAC;AAED,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,86 @@
|
|
|
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: () => UseElementBoundingDemo
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(demo_exports);
|
|
24
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
25
|
+
var import_useRef = require("../useRef$");
|
|
26
|
+
var import__ = require(".");
|
|
27
|
+
function UseElementBoundingDemo() {
|
|
28
|
+
const el$ = (0, import_useRef.useRef$)();
|
|
29
|
+
const { x$, y$, top$, left$, width$, height$ } = (0, import__.useElementBounding)(el$);
|
|
30
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
|
|
31
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
32
|
+
"div",
|
|
33
|
+
{
|
|
34
|
+
style: {
|
|
35
|
+
display: "grid",
|
|
36
|
+
gridTemplateColumns: "repeat(3, 1fr)",
|
|
37
|
+
gap: "6px",
|
|
38
|
+
fontFamily: "monospace",
|
|
39
|
+
fontSize: "13px",
|
|
40
|
+
padding: "10px 14px",
|
|
41
|
+
background: "var(--sl-color-gray-6, #f1f5f9)",
|
|
42
|
+
borderRadius: "6px"
|
|
43
|
+
},
|
|
44
|
+
children: [
|
|
45
|
+
["x", x$.get()],
|
|
46
|
+
["y", y$.get()],
|
|
47
|
+
["top", top$.get()],
|
|
48
|
+
["left", left$.get()],
|
|
49
|
+
["width", width$.get()],
|
|
50
|
+
["height", height$.get()]
|
|
51
|
+
].map(([label, val]) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
|
|
52
|
+
label,
|
|
53
|
+
": ",
|
|
54
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("strong", { children: [
|
|
55
|
+
Math.round(val),
|
|
56
|
+
"px"
|
|
57
|
+
] })
|
|
58
|
+
] }, label))
|
|
59
|
+
}
|
|
60
|
+
),
|
|
61
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
62
|
+
"div",
|
|
63
|
+
{
|
|
64
|
+
ref: el$,
|
|
65
|
+
style: {
|
|
66
|
+
resize: "both",
|
|
67
|
+
overflow: "auto",
|
|
68
|
+
width: "240px",
|
|
69
|
+
height: "100px",
|
|
70
|
+
padding: "12px",
|
|
71
|
+
border: "1px solid var(--sl-color-gray-5, #cbd5e1)",
|
|
72
|
+
borderRadius: "6px",
|
|
73
|
+
fontFamily: "monospace",
|
|
74
|
+
fontSize: "13px",
|
|
75
|
+
color: "var(--sl-color-gray-3, #94a3b8)",
|
|
76
|
+
userSelect: "none",
|
|
77
|
+
display: "flex",
|
|
78
|
+
alignItems: "center",
|
|
79
|
+
justifyContent: "center"
|
|
80
|
+
},
|
|
81
|
+
children: "resize me \u2198"
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
] });
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/useElementBounding/demo.tsx"],"sourcesContent":["import { useRef$ } from \"../useRef$\";\nimport { useElementBounding } from \".\";\n\nexport default function UseElementBoundingDemo() {\n const el$ = useRef$<HTMLDivElement>();\n const { x$, y$, top$, left$, width$, height$ } = useElementBounding(el$);\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"12px\" }}>\n {/* Bounding values readout */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n gap: \"6px\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n padding: \"10px 14px\",\n background: \"var(--sl-color-gray-6, #f1f5f9)\",\n borderRadius: \"6px\",\n }}\n >\n {(\n [\n [\"x\", x$.get()],\n [\"y\", y$.get()],\n [\"top\", top$.get()],\n [\"left\", left$.get()],\n [\"width\", width$.get()],\n [\"height\", height$.get()],\n ] as [string, number][]\n ).map(([label, val]) => (\n <span key={label}>\n {label}: <strong>{Math.round(val)}px</strong>\n </span>\n ))}\n </div>\n\n {/* Resizable target element */}\n <div\n ref={el$}\n style={{\n resize: \"both\",\n overflow: \"auto\",\n width: \"240px\",\n height: \"100px\",\n padding: \"12px\",\n border: \"1px solid var(--sl-color-gray-5, #cbd5e1)\",\n borderRadius: \"6px\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n color: \"var(--sl-color-gray-3, #94a3b8)\",\n userSelect: \"none\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n resize me ↘\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUM;AAVN,oBAAwB;AACxB,eAAmC;AAEpB,SAAR,yBAA0C;AAC/C,QAAM,UAAM,uBAAwB;AACpC,QAAM,EAAE,IAAI,IAAI,MAAM,OAAO,QAAQ,QAAQ,QAAI,6BAAmB,GAAG;AAEvE,SACE,6CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAO,GAElE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,qBAAqB;AAAA,UACrB,KAAK;AAAA,UACL,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,cAAc;AAAA,QAChB;AAAA,QAGE;AAAA,UACE,CAAC,KAAK,GAAG,IAAI,CAAC;AAAA,UACd,CAAC,KAAK,GAAG,IAAI,CAAC;AAAA,UACd,CAAC,OAAO,KAAK,IAAI,CAAC;AAAA,UAClB,CAAC,QAAQ,MAAM,IAAI,CAAC;AAAA,UACpB,CAAC,SAAS,OAAO,IAAI,CAAC;AAAA,UACtB,CAAC,UAAU,QAAQ,IAAI,CAAC;AAAA,QAC1B,EACA,IAAI,CAAC,CAAC,OAAO,GAAG,MAChB,6CAAC,UACE;AAAA;AAAA,UAAM;AAAA,UAAE,6CAAC,YAAQ;AAAA,iBAAK,MAAM,GAAG;AAAA,YAAE;AAAA,aAAE;AAAA,aAD3B,KAEX,CACD;AAAA;AAAA,IACH;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,QAClB;AAAA,QACD;AAAA;AAAA,IAED;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef$ } from "../useRef$";
|
|
3
|
+
import { useElementBounding } from ".";
|
|
4
|
+
function UseElementBoundingDemo() {
|
|
5
|
+
const el$ = useRef$();
|
|
6
|
+
const { x$, y$, top$, left$, width$, height$ } = useElementBounding(el$);
|
|
7
|
+
return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
|
|
8
|
+
/* @__PURE__ */ jsx(
|
|
9
|
+
"div",
|
|
10
|
+
{
|
|
11
|
+
style: {
|
|
12
|
+
display: "grid",
|
|
13
|
+
gridTemplateColumns: "repeat(3, 1fr)",
|
|
14
|
+
gap: "6px",
|
|
15
|
+
fontFamily: "monospace",
|
|
16
|
+
fontSize: "13px",
|
|
17
|
+
padding: "10px 14px",
|
|
18
|
+
background: "var(--sl-color-gray-6, #f1f5f9)",
|
|
19
|
+
borderRadius: "6px"
|
|
20
|
+
},
|
|
21
|
+
children: [
|
|
22
|
+
["x", x$.get()],
|
|
23
|
+
["y", y$.get()],
|
|
24
|
+
["top", top$.get()],
|
|
25
|
+
["left", left$.get()],
|
|
26
|
+
["width", width$.get()],
|
|
27
|
+
["height", height$.get()]
|
|
28
|
+
].map(([label, val]) => /* @__PURE__ */ jsxs("span", { children: [
|
|
29
|
+
label,
|
|
30
|
+
": ",
|
|
31
|
+
/* @__PURE__ */ jsxs("strong", { children: [
|
|
32
|
+
Math.round(val),
|
|
33
|
+
"px"
|
|
34
|
+
] })
|
|
35
|
+
] }, label))
|
|
36
|
+
}
|
|
37
|
+
),
|
|
38
|
+
/* @__PURE__ */ jsx(
|
|
39
|
+
"div",
|
|
40
|
+
{
|
|
41
|
+
ref: el$,
|
|
42
|
+
style: {
|
|
43
|
+
resize: "both",
|
|
44
|
+
overflow: "auto",
|
|
45
|
+
width: "240px",
|
|
46
|
+
height: "100px",
|
|
47
|
+
padding: "12px",
|
|
48
|
+
border: "1px solid var(--sl-color-gray-5, #cbd5e1)",
|
|
49
|
+
borderRadius: "6px",
|
|
50
|
+
fontFamily: "monospace",
|
|
51
|
+
fontSize: "13px",
|
|
52
|
+
color: "var(--sl-color-gray-3, #94a3b8)",
|
|
53
|
+
userSelect: "none",
|
|
54
|
+
display: "flex",
|
|
55
|
+
alignItems: "center",
|
|
56
|
+
justifyContent: "center"
|
|
57
|
+
},
|
|
58
|
+
children: "resize me \u2198"
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
] });
|
|
62
|
+
}
|
|
63
|
+
export {
|
|
64
|
+
UseElementBoundingDemo as default
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=demo.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/useElementBounding/demo.tsx"],"sourcesContent":["import { useRef$ } from \"../useRef$\";\nimport { useElementBounding } from \".\";\n\nexport default function UseElementBoundingDemo() {\n const el$ = useRef$<HTMLDivElement>();\n const { x$, y$, top$, left$, width$, height$ } = useElementBounding(el$);\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"12px\" }}>\n {/* Bounding values readout */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(3, 1fr)\",\n gap: \"6px\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n padding: \"10px 14px\",\n background: \"var(--sl-color-gray-6, #f1f5f9)\",\n borderRadius: \"6px\",\n }}\n >\n {(\n [\n [\"x\", x$.get()],\n [\"y\", y$.get()],\n [\"top\", top$.get()],\n [\"left\", left$.get()],\n [\"width\", width$.get()],\n [\"height\", height$.get()],\n ] as [string, number][]\n ).map(([label, val]) => (\n <span key={label}>\n {label}: <strong>{Math.round(val)}px</strong>\n </span>\n ))}\n </div>\n\n {/* Resizable target element */}\n <div\n ref={el$}\n style={{\n resize: \"both\",\n overflow: \"auto\",\n width: \"240px\",\n height: \"100px\",\n padding: \"12px\",\n border: \"1px solid var(--sl-color-gray-5, #cbd5e1)\",\n borderRadius: \"6px\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n color: \"var(--sl-color-gray-3, #94a3b8)\",\n userSelect: \"none\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n resize me ↘\n </div>\n </div>\n );\n}\n"],"mappings":"AAUM,cAuBe,YAvBf;AAVN,SAAS,eAAe;AACxB,SAAS,0BAA0B;AAEpB,SAAR,yBAA0C;AAC/C,QAAM,MAAM,QAAwB;AACpC,QAAM,EAAE,IAAI,IAAI,MAAM,OAAO,QAAQ,QAAQ,IAAI,mBAAmB,GAAG;AAEvE,SACE,qBAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAO,GAElE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,qBAAqB;AAAA,UACrB,KAAK;AAAA,UACL,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,cAAc;AAAA,QAChB;AAAA,QAGE;AAAA,UACE,CAAC,KAAK,GAAG,IAAI,CAAC;AAAA,UACd,CAAC,KAAK,GAAG,IAAI,CAAC;AAAA,UACd,CAAC,OAAO,KAAK,IAAI,CAAC;AAAA,UAClB,CAAC,QAAQ,MAAM,IAAI,CAAC;AAAA,UACpB,CAAC,SAAS,OAAO,IAAI,CAAC;AAAA,UACtB,CAAC,UAAU,QAAQ,IAAI,CAAC;AAAA,QAC1B,EACA,IAAI,CAAC,CAAC,OAAO,GAAG,MAChB,qBAAC,UACE;AAAA;AAAA,UAAM;AAAA,UAAE,qBAAC,YAAQ;AAAA,iBAAK,MAAM,GAAG;AAAA,YAAE;AAAA,aAAE;AAAA,aAD3B,KAEX,CACD;AAAA;AAAA,IACH;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,QAClB;AAAA,QACD;AAAA;AAAA,IAED;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Observable } from '@legendapp/state';
|
|
2
|
+
import { MaybeElement } from '../useRef_/index.mjs';
|
|
3
|
+
import { DeepMaybeObservable } from '../../types.mjs';
|
|
4
|
+
import 'react';
|
|
5
|
+
|
|
6
|
+
interface UseElementBoundingOptions {
|
|
7
|
+
/** Reset all values to 0 when element unmounts. Default: true */
|
|
8
|
+
reset?: boolean;
|
|
9
|
+
/** Re-calculate on window resize. Default: true */
|
|
10
|
+
windowResize?: boolean;
|
|
11
|
+
/** Re-calculate on window scroll. Default: true */
|
|
12
|
+
windowScroll?: boolean;
|
|
13
|
+
/** Calculate immediately on mount. Default: true */
|
|
14
|
+
immediate?: boolean;
|
|
15
|
+
/** Use requestAnimationFrame to read rect after CSS transforms settle. Default: true */
|
|
16
|
+
useCssTransforms?: boolean;
|
|
17
|
+
}
|
|
18
|
+
interface UseElementBoundingReturn {
|
|
19
|
+
x$: Observable<number>;
|
|
20
|
+
y$: Observable<number>;
|
|
21
|
+
top$: Observable<number>;
|
|
22
|
+
right$: Observable<number>;
|
|
23
|
+
bottom$: Observable<number>;
|
|
24
|
+
left$: Observable<number>;
|
|
25
|
+
width$: Observable<number>;
|
|
26
|
+
height$: Observable<number>;
|
|
27
|
+
update: () => void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Tracks the bounding rect of a DOM element (x, y, top, right, bottom, left, width, height).
|
|
31
|
+
* Observes ResizeObserver, MutationObserver (style/class changes), window scroll, and resize.
|
|
32
|
+
*
|
|
33
|
+
* @param target - Element to observe: Ref$, Observable<OpaqueObject<Element>|null>, Document, Window, or null
|
|
34
|
+
* @param options - Configuration options
|
|
35
|
+
* @returns Reactive bounding rect values plus a manual `update()` function
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* const el$ = useRef$<HTMLDivElement>();
|
|
40
|
+
* const { top$, left$, width$, height$ } = useElementBounding(el$);
|
|
41
|
+
* return <div ref={el$} />;
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
declare function useElementBounding(target: MaybeElement, options?: DeepMaybeObservable<UseElementBoundingOptions>): UseElementBoundingReturn;
|
|
45
|
+
|
|
46
|
+
export { type UseElementBoundingOptions, type UseElementBoundingReturn, useElementBounding };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Observable } from '@legendapp/state';
|
|
2
|
+
import { MaybeElement } from '../useRef_/index.js';
|
|
3
|
+
import { DeepMaybeObservable } from '../../types.js';
|
|
4
|
+
import 'react';
|
|
5
|
+
|
|
6
|
+
interface UseElementBoundingOptions {
|
|
7
|
+
/** Reset all values to 0 when element unmounts. Default: true */
|
|
8
|
+
reset?: boolean;
|
|
9
|
+
/** Re-calculate on window resize. Default: true */
|
|
10
|
+
windowResize?: boolean;
|
|
11
|
+
/** Re-calculate on window scroll. Default: true */
|
|
12
|
+
windowScroll?: boolean;
|
|
13
|
+
/** Calculate immediately on mount. Default: true */
|
|
14
|
+
immediate?: boolean;
|
|
15
|
+
/** Use requestAnimationFrame to read rect after CSS transforms settle. Default: true */
|
|
16
|
+
useCssTransforms?: boolean;
|
|
17
|
+
}
|
|
18
|
+
interface UseElementBoundingReturn {
|
|
19
|
+
x$: Observable<number>;
|
|
20
|
+
y$: Observable<number>;
|
|
21
|
+
top$: Observable<number>;
|
|
22
|
+
right$: Observable<number>;
|
|
23
|
+
bottom$: Observable<number>;
|
|
24
|
+
left$: Observable<number>;
|
|
25
|
+
width$: Observable<number>;
|
|
26
|
+
height$: Observable<number>;
|
|
27
|
+
update: () => void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Tracks the bounding rect of a DOM element (x, y, top, right, bottom, left, width, height).
|
|
31
|
+
* Observes ResizeObserver, MutationObserver (style/class changes), window scroll, and resize.
|
|
32
|
+
*
|
|
33
|
+
* @param target - Element to observe: Ref$, Observable<OpaqueObject<Element>|null>, Document, Window, or null
|
|
34
|
+
* @param options - Configuration options
|
|
35
|
+
* @returns Reactive bounding rect values plus a manual `update()` function
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* const el$ = useRef$<HTMLDivElement>();
|
|
40
|
+
* const { top$, left$, width$, height$ } = useElementBounding(el$);
|
|
41
|
+
* return <div ref={el$} />;
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
declare function useElementBounding(target: MaybeElement, options?: DeepMaybeObservable<UseElementBoundingOptions>): UseElementBoundingReturn;
|
|
45
|
+
|
|
46
|
+
export { type UseElementBoundingOptions, type UseElementBoundingReturn, useElementBounding };
|
|
@@ -0,0 +1,122 @@
|
|
|
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 useElementBounding_exports = {};
|
|
20
|
+
__export(useElementBounding_exports, {
|
|
21
|
+
useElementBounding: () => useElementBounding
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(useElementBounding_exports);
|
|
24
|
+
var import_react = require("@legendapp/state/react");
|
|
25
|
+
var import_react2 = require("react");
|
|
26
|
+
var import_useRef = require("../useRef$");
|
|
27
|
+
var import_useResizeObserver = require("../useResizeObserver");
|
|
28
|
+
var import_useMutationObserver = require("../useMutationObserver");
|
|
29
|
+
var import_useEventListener = require("../../browser/useEventListener");
|
|
30
|
+
var import_shared = require("../../shared");
|
|
31
|
+
var import_useMayObservableOptions = require("../../function/useMayObservableOptions");
|
|
32
|
+
const ZERO = {
|
|
33
|
+
x: 0,
|
|
34
|
+
y: 0,
|
|
35
|
+
top: 0,
|
|
36
|
+
right: 0,
|
|
37
|
+
bottom: 0,
|
|
38
|
+
left: 0,
|
|
39
|
+
width: 0,
|
|
40
|
+
height: 0
|
|
41
|
+
};
|
|
42
|
+
const win = typeof window !== "undefined" ? window : null;
|
|
43
|
+
function useElementBounding(target, options) {
|
|
44
|
+
const opts$ = (0, import_useMayObservableOptions.useMayObservableOptions)(options, {
|
|
45
|
+
immediate: "peek"
|
|
46
|
+
});
|
|
47
|
+
const bounding$ = (0, import_react.useObservable)({ ...ZERO });
|
|
48
|
+
const unmountedRef = (0, import_react2.useRef)(false);
|
|
49
|
+
const rafRef = (0, import_react2.useRef)(null);
|
|
50
|
+
const recalculate = (0, import_react2.useCallback)(() => {
|
|
51
|
+
const el = (0, import_useRef.peekElement)(target);
|
|
52
|
+
if (!el || !(el instanceof Element)) {
|
|
53
|
+
if (opts$.reset.peek() !== false) bounding$.assign({ ...ZERO });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const rect = el.getBoundingClientRect();
|
|
57
|
+
bounding$.assign({
|
|
58
|
+
x: rect.x,
|
|
59
|
+
y: rect.y,
|
|
60
|
+
top: rect.top,
|
|
61
|
+
right: rect.right,
|
|
62
|
+
bottom: rect.bottom,
|
|
63
|
+
left: rect.left,
|
|
64
|
+
width: rect.width,
|
|
65
|
+
height: rect.height
|
|
66
|
+
});
|
|
67
|
+
}, []);
|
|
68
|
+
const update = (0, import_react2.useCallback)(() => {
|
|
69
|
+
if (opts$.useCssTransforms.peek() !== false) {
|
|
70
|
+
rafRef.current = requestAnimationFrame(() => {
|
|
71
|
+
if (!unmountedRef.current) recalculate();
|
|
72
|
+
});
|
|
73
|
+
} else {
|
|
74
|
+
recalculate();
|
|
75
|
+
}
|
|
76
|
+
}, [recalculate]);
|
|
77
|
+
(0, import_useResizeObserver.useResizeObserver)(target, update);
|
|
78
|
+
(0, import_useMutationObserver.useMutationObserver)(target, update, {
|
|
79
|
+
attributes: true,
|
|
80
|
+
attributeFilter: ["style", "class"]
|
|
81
|
+
});
|
|
82
|
+
(0, import_useEventListener.useEventListener)(
|
|
83
|
+
(0, import_shared.isWindow)(win) && opts$.windowScroll.peek() !== false ? win : null,
|
|
84
|
+
"scroll",
|
|
85
|
+
update,
|
|
86
|
+
{ passive: true }
|
|
87
|
+
);
|
|
88
|
+
(0, import_useEventListener.useEventListener)(
|
|
89
|
+
(0, import_shared.isWindow)(win) && opts$.windowResize.peek() !== false ? win : null,
|
|
90
|
+
"resize",
|
|
91
|
+
update,
|
|
92
|
+
{ passive: true }
|
|
93
|
+
);
|
|
94
|
+
(0, import_react2.useEffect)(() => {
|
|
95
|
+
unmountedRef.current = false;
|
|
96
|
+
if (opts$.immediate.peek() !== false) update();
|
|
97
|
+
return () => {
|
|
98
|
+
unmountedRef.current = true;
|
|
99
|
+
if (rafRef.current !== null) {
|
|
100
|
+
cancelAnimationFrame(rafRef.current);
|
|
101
|
+
rafRef.current = null;
|
|
102
|
+
}
|
|
103
|
+
if (opts$.reset.peek() !== false) bounding$.assign({ ...ZERO });
|
|
104
|
+
};
|
|
105
|
+
}, []);
|
|
106
|
+
return {
|
|
107
|
+
x$: bounding$.x,
|
|
108
|
+
y$: bounding$.y,
|
|
109
|
+
top$: bounding$.top,
|
|
110
|
+
right$: bounding$.right,
|
|
111
|
+
bottom$: bounding$.bottom,
|
|
112
|
+
left$: bounding$.left,
|
|
113
|
+
width$: bounding$.width,
|
|
114
|
+
height$: bounding$.height,
|
|
115
|
+
update
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
119
|
+
0 && (module.exports = {
|
|
120
|
+
useElementBounding
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/useElementBounding/index.ts"],"sourcesContent":["import type { Observable } from \"@legendapp/state\";\nimport { useObservable } from \"@legendapp/state/react\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { type MaybeElement, peekElement } from \"../useRef$\";\nimport { useResizeObserver } from \"../useResizeObserver\";\nimport { useMutationObserver } from \"../useMutationObserver\";\nimport { useEventListener } from \"../../browser/useEventListener\";\nimport { isWindow } from \"../../shared\";\nimport { useMayObservableOptions } from \"../../function/useMayObservableOptions\";\nimport type { DeepMaybeObservable } from \"../../types\";\n\nexport interface UseElementBoundingOptions {\n /** Reset all values to 0 when element unmounts. Default: true */\n reset?: boolean;\n /** Re-calculate on window resize. Default: true */\n windowResize?: boolean;\n /** Re-calculate on window scroll. Default: true */\n windowScroll?: boolean;\n /** Calculate immediately on mount. Default: true */\n immediate?: boolean;\n /** Use requestAnimationFrame to read rect after CSS transforms settle. Default: true */\n useCssTransforms?: boolean;\n}\n\nexport interface UseElementBoundingReturn {\n x$: Observable<number>;\n y$: Observable<number>;\n top$: Observable<number>;\n right$: Observable<number>;\n bottom$: Observable<number>;\n left$: Observable<number>;\n width$: Observable<number>;\n height$: Observable<number>;\n update: () => void;\n}\n\nconst ZERO = {\n x: 0,\n y: 0,\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n width: 0,\n height: 0,\n};\n\n// isWindow(window) returns false in SSR (typeof window === \"undefined\"), true in browser.\nconst win = typeof window !== \"undefined\" ? window : null;\n\n/**\n * Tracks the bounding rect of a DOM element (x, y, top, right, bottom, left, width, height).\n * Observes ResizeObserver, MutationObserver (style/class changes), window scroll, and resize.\n *\n * @param target - Element to observe: Ref$, Observable<OpaqueObject<Element>|null>, Document, Window, or null\n * @param options - Configuration options\n * @returns Reactive bounding rect values plus a manual `update()` function\n *\n * @example\n * ```tsx\n * const el$ = useRef$<HTMLDivElement>();\n * const { top$, left$, width$, height$ } = useElementBounding(el$);\n * return <div ref={el$} />;\n * ```\n */\nexport function useElementBounding(\n target: MaybeElement,\n options?: DeepMaybeObservable<UseElementBoundingOptions>,\n): UseElementBoundingReturn {\n const opts$ = useMayObservableOptions<UseElementBoundingOptions>(options, {\n immediate: \"peek\",\n });\n\n const bounding$ = useObservable({ ...ZERO });\n\n // Guards rAF callbacks from updating state after unmount.\n const unmountedRef = useRef(false);\n const rafRef = useRef<number | null>(null);\n\n const recalculate = useCallback(() => {\n const el = peekElement(target) as Element | null;\n if (!el || !(el instanceof Element)) {\n if (opts$.reset.peek() !== false) bounding$.assign({ ...ZERO });\n return;\n }\n const rect = el.getBoundingClientRect();\n bounding$.assign({\n x: rect.x,\n y: rect.y,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n });\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const update = useCallback(() => {\n if (opts$.useCssTransforms.peek() !== false) {\n rafRef.current = requestAnimationFrame(() => {\n if (!unmountedRef.current) recalculate();\n });\n } else {\n recalculate();\n }\n }, [recalculate]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Observe size changes\n useResizeObserver(target, update);\n\n // Observe style/class attribute changes (e.g. CSS transitions, class toggles)\n useMutationObserver(target, update, {\n attributes: true,\n attributeFilter: [\"style\", \"class\"],\n });\n\n // Observe window scroll / resize (always call hooks unconditionally — Rules of Hooks)\n // isWindow(win) is false in SSR, so target becomes null outside the browser.\n // peek() — evaluated once at render time, no reactive subscription needed.\n useEventListener(\n isWindow(win) && opts$.windowScroll.peek() !== false ? win : null,\n \"scroll\",\n update,\n { passive: true },\n );\n useEventListener(\n isWindow(win) && opts$.windowResize.peek() !== false ? win : null,\n \"resize\",\n update,\n { passive: true },\n );\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n unmountedRef.current = false;\n if (opts$.immediate.peek() !== false) update();\n return () => {\n unmountedRef.current = true;\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n if (opts$.reset.peek() !== false) bounding$.assign({ ...ZERO });\n };\n }, []);\n\n return {\n x$: bounding$.x,\n y$: bounding$.y,\n top$: bounding$.top,\n right$: bounding$.right,\n bottom$: bounding$.bottom,\n left$: bounding$.left,\n width$: bounding$.width,\n height$: bounding$.height,\n update,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA8B;AAC9B,IAAAA,gBAA+C;AAC/C,oBAA+C;AAC/C,+BAAkC;AAClC,iCAAoC;AACpC,8BAAiC;AACjC,oBAAyB;AACzB,qCAAwC;AA4BxC,MAAM,OAAO;AAAA,EACX,GAAG;AAAA,EACH,GAAG;AAAA,EACH,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AACV;AAGA,MAAM,MAAM,OAAO,WAAW,cAAc,SAAS;AAiB9C,SAAS,mBACd,QACA,SAC0B;AAC1B,QAAM,YAAQ,wDAAmD,SAAS;AAAA,IACxE,WAAW;AAAA,EACb,CAAC;AAED,QAAM,gBAAY,4BAAc,EAAE,GAAG,KAAK,CAAC;AAG3C,QAAM,mBAAe,sBAAO,KAAK;AACjC,QAAM,aAAS,sBAAsB,IAAI;AAEzC,QAAM,kBAAc,2BAAY,MAAM;AACpC,UAAM,SAAK,2BAAY,MAAM;AAC7B,QAAI,CAAC,MAAM,EAAE,cAAc,UAAU;AACnC,UAAI,MAAM,MAAM,KAAK,MAAM,MAAO,WAAU,OAAO,EAAE,GAAG,KAAK,CAAC;AAC9D;AAAA,IACF;AACA,UAAM,OAAO,GAAG,sBAAsB;AACtC,cAAU,OAAO;AAAA,MACf,GAAG,KAAK;AAAA,MACR,GAAG,KAAK;AAAA,MACR,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,aAAS,2BAAY,MAAM;AAC/B,QAAI,MAAM,iBAAiB,KAAK,MAAM,OAAO;AAC3C,aAAO,UAAU,sBAAsB,MAAM;AAC3C,YAAI,CAAC,aAAa,QAAS,aAAY;AAAA,MACzC,CAAC;AAAA,IACH,OAAO;AACL,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAGhB,kDAAkB,QAAQ,MAAM;AAGhC,sDAAoB,QAAQ,QAAQ;AAAA,IAClC,YAAY;AAAA,IACZ,iBAAiB,CAAC,SAAS,OAAO;AAAA,EACpC,CAAC;AAKD;AAAA,QACE,wBAAS,GAAG,KAAK,MAAM,aAAa,KAAK,MAAM,QAAQ,MAAM;AAAA,IAC7D;AAAA,IACA;AAAA,IACA,EAAE,SAAS,KAAK;AAAA,EAClB;AACA;AAAA,QACE,wBAAS,GAAG,KAAK,MAAM,aAAa,KAAK,MAAM,QAAQ,MAAM;AAAA,IAC7D;AAAA,IACA;AAAA,IACA,EAAE,SAAS,KAAK;AAAA,EAClB;AAGA,+BAAU,MAAM;AACd,iBAAa,UAAU;AACvB,QAAI,MAAM,UAAU,KAAK,MAAM,MAAO,QAAO;AAC7C,WAAO,MAAM;AACX,mBAAa,UAAU;AACvB,UAAI,OAAO,YAAY,MAAM;AAC3B,6BAAqB,OAAO,OAAO;AACnC,eAAO,UAAU;AAAA,MACnB;AACA,UAAI,MAAM,MAAM,KAAK,MAAM,MAAO,WAAU,OAAO,EAAE,GAAG,KAAK,CAAC;AAAA,IAChE;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL,IAAI,UAAU;AAAA,IACd,IAAI,UAAU;AAAA,IACd,MAAM,UAAU;AAAA,IAChB,QAAQ,UAAU;AAAA,IAClB,SAAS,UAAU;AAAA,IACnB,OAAO,UAAU;AAAA,IACjB,QAAQ,UAAU;AAAA,IAClB,SAAS,UAAU;AAAA,IACnB;AAAA,EACF;AACF;","names":["import_react"]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { useObservable } from "@legendapp/state/react";
|
|
2
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
3
|
+
import { peekElement } from "../useRef$";
|
|
4
|
+
import { useResizeObserver } from "../useResizeObserver";
|
|
5
|
+
import { useMutationObserver } from "../useMutationObserver";
|
|
6
|
+
import { useEventListener } from "../../browser/useEventListener";
|
|
7
|
+
import { isWindow } from "../../shared";
|
|
8
|
+
import { useMayObservableOptions } from "../../function/useMayObservableOptions";
|
|
9
|
+
const ZERO = {
|
|
10
|
+
x: 0,
|
|
11
|
+
y: 0,
|
|
12
|
+
top: 0,
|
|
13
|
+
right: 0,
|
|
14
|
+
bottom: 0,
|
|
15
|
+
left: 0,
|
|
16
|
+
width: 0,
|
|
17
|
+
height: 0
|
|
18
|
+
};
|
|
19
|
+
const win = typeof window !== "undefined" ? window : null;
|
|
20
|
+
function useElementBounding(target, options) {
|
|
21
|
+
const opts$ = useMayObservableOptions(options, {
|
|
22
|
+
immediate: "peek"
|
|
23
|
+
});
|
|
24
|
+
const bounding$ = useObservable({ ...ZERO });
|
|
25
|
+
const unmountedRef = useRef(false);
|
|
26
|
+
const rafRef = useRef(null);
|
|
27
|
+
const recalculate = useCallback(() => {
|
|
28
|
+
const el = peekElement(target);
|
|
29
|
+
if (!el || !(el instanceof Element)) {
|
|
30
|
+
if (opts$.reset.peek() !== false) bounding$.assign({ ...ZERO });
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const rect = el.getBoundingClientRect();
|
|
34
|
+
bounding$.assign({
|
|
35
|
+
x: rect.x,
|
|
36
|
+
y: rect.y,
|
|
37
|
+
top: rect.top,
|
|
38
|
+
right: rect.right,
|
|
39
|
+
bottom: rect.bottom,
|
|
40
|
+
left: rect.left,
|
|
41
|
+
width: rect.width,
|
|
42
|
+
height: rect.height
|
|
43
|
+
});
|
|
44
|
+
}, []);
|
|
45
|
+
const update = useCallback(() => {
|
|
46
|
+
if (opts$.useCssTransforms.peek() !== false) {
|
|
47
|
+
rafRef.current = requestAnimationFrame(() => {
|
|
48
|
+
if (!unmountedRef.current) recalculate();
|
|
49
|
+
});
|
|
50
|
+
} else {
|
|
51
|
+
recalculate();
|
|
52
|
+
}
|
|
53
|
+
}, [recalculate]);
|
|
54
|
+
useResizeObserver(target, update);
|
|
55
|
+
useMutationObserver(target, update, {
|
|
56
|
+
attributes: true,
|
|
57
|
+
attributeFilter: ["style", "class"]
|
|
58
|
+
});
|
|
59
|
+
useEventListener(
|
|
60
|
+
isWindow(win) && opts$.windowScroll.peek() !== false ? win : null,
|
|
61
|
+
"scroll",
|
|
62
|
+
update,
|
|
63
|
+
{ passive: true }
|
|
64
|
+
);
|
|
65
|
+
useEventListener(
|
|
66
|
+
isWindow(win) && opts$.windowResize.peek() !== false ? win : null,
|
|
67
|
+
"resize",
|
|
68
|
+
update,
|
|
69
|
+
{ passive: true }
|
|
70
|
+
);
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
unmountedRef.current = false;
|
|
73
|
+
if (opts$.immediate.peek() !== false) update();
|
|
74
|
+
return () => {
|
|
75
|
+
unmountedRef.current = true;
|
|
76
|
+
if (rafRef.current !== null) {
|
|
77
|
+
cancelAnimationFrame(rafRef.current);
|
|
78
|
+
rafRef.current = null;
|
|
79
|
+
}
|
|
80
|
+
if (opts$.reset.peek() !== false) bounding$.assign({ ...ZERO });
|
|
81
|
+
};
|
|
82
|
+
}, []);
|
|
83
|
+
return {
|
|
84
|
+
x$: bounding$.x,
|
|
85
|
+
y$: bounding$.y,
|
|
86
|
+
top$: bounding$.top,
|
|
87
|
+
right$: bounding$.right,
|
|
88
|
+
bottom$: bounding$.bottom,
|
|
89
|
+
left$: bounding$.left,
|
|
90
|
+
width$: bounding$.width,
|
|
91
|
+
height$: bounding$.height,
|
|
92
|
+
update
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export {
|
|
96
|
+
useElementBounding
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/useElementBounding/index.ts"],"sourcesContent":["import type { Observable } from \"@legendapp/state\";\nimport { useObservable } from \"@legendapp/state/react\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { type MaybeElement, peekElement } from \"../useRef$\";\nimport { useResizeObserver } from \"../useResizeObserver\";\nimport { useMutationObserver } from \"../useMutationObserver\";\nimport { useEventListener } from \"../../browser/useEventListener\";\nimport { isWindow } from \"../../shared\";\nimport { useMayObservableOptions } from \"../../function/useMayObservableOptions\";\nimport type { DeepMaybeObservable } from \"../../types\";\n\nexport interface UseElementBoundingOptions {\n /** Reset all values to 0 when element unmounts. Default: true */\n reset?: boolean;\n /** Re-calculate on window resize. Default: true */\n windowResize?: boolean;\n /** Re-calculate on window scroll. Default: true */\n windowScroll?: boolean;\n /** Calculate immediately on mount. Default: true */\n immediate?: boolean;\n /** Use requestAnimationFrame to read rect after CSS transforms settle. Default: true */\n useCssTransforms?: boolean;\n}\n\nexport interface UseElementBoundingReturn {\n x$: Observable<number>;\n y$: Observable<number>;\n top$: Observable<number>;\n right$: Observable<number>;\n bottom$: Observable<number>;\n left$: Observable<number>;\n width$: Observable<number>;\n height$: Observable<number>;\n update: () => void;\n}\n\nconst ZERO = {\n x: 0,\n y: 0,\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n width: 0,\n height: 0,\n};\n\n// isWindow(window) returns false in SSR (typeof window === \"undefined\"), true in browser.\nconst win = typeof window !== \"undefined\" ? window : null;\n\n/**\n * Tracks the bounding rect of a DOM element (x, y, top, right, bottom, left, width, height).\n * Observes ResizeObserver, MutationObserver (style/class changes), window scroll, and resize.\n *\n * @param target - Element to observe: Ref$, Observable<OpaqueObject<Element>|null>, Document, Window, or null\n * @param options - Configuration options\n * @returns Reactive bounding rect values plus a manual `update()` function\n *\n * @example\n * ```tsx\n * const el$ = useRef$<HTMLDivElement>();\n * const { top$, left$, width$, height$ } = useElementBounding(el$);\n * return <div ref={el$} />;\n * ```\n */\nexport function useElementBounding(\n target: MaybeElement,\n options?: DeepMaybeObservable<UseElementBoundingOptions>,\n): UseElementBoundingReturn {\n const opts$ = useMayObservableOptions<UseElementBoundingOptions>(options, {\n immediate: \"peek\",\n });\n\n const bounding$ = useObservable({ ...ZERO });\n\n // Guards rAF callbacks from updating state after unmount.\n const unmountedRef = useRef(false);\n const rafRef = useRef<number | null>(null);\n\n const recalculate = useCallback(() => {\n const el = peekElement(target) as Element | null;\n if (!el || !(el instanceof Element)) {\n if (opts$.reset.peek() !== false) bounding$.assign({ ...ZERO });\n return;\n }\n const rect = el.getBoundingClientRect();\n bounding$.assign({\n x: rect.x,\n y: rect.y,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n });\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const update = useCallback(() => {\n if (opts$.useCssTransforms.peek() !== false) {\n rafRef.current = requestAnimationFrame(() => {\n if (!unmountedRef.current) recalculate();\n });\n } else {\n recalculate();\n }\n }, [recalculate]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Observe size changes\n useResizeObserver(target, update);\n\n // Observe style/class attribute changes (e.g. CSS transitions, class toggles)\n useMutationObserver(target, update, {\n attributes: true,\n attributeFilter: [\"style\", \"class\"],\n });\n\n // Observe window scroll / resize (always call hooks unconditionally — Rules of Hooks)\n // isWindow(win) is false in SSR, so target becomes null outside the browser.\n // peek() — evaluated once at render time, no reactive subscription needed.\n useEventListener(\n isWindow(win) && opts$.windowScroll.peek() !== false ? win : null,\n \"scroll\",\n update,\n { passive: true },\n );\n useEventListener(\n isWindow(win) && opts$.windowResize.peek() !== false ? win : null,\n \"resize\",\n update,\n { passive: true },\n );\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n unmountedRef.current = false;\n if (opts$.immediate.peek() !== false) update();\n return () => {\n unmountedRef.current = true;\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n if (opts$.reset.peek() !== false) bounding$.assign({ ...ZERO });\n };\n }, []);\n\n return {\n x$: bounding$.x,\n y$: bounding$.y,\n top$: bounding$.top,\n right$: bounding$.right,\n bottom$: bounding$.bottom,\n left$: bounding$.left,\n width$: bounding$.width,\n height$: bounding$.height,\n update,\n };\n}\n"],"mappings":"AACA,SAAS,qBAAqB;AAC9B,SAAS,aAAa,WAAW,cAAc;AAC/C,SAA4B,mBAAmB;AAC/C,SAAS,yBAAyB;AAClC,SAAS,2BAA2B;AACpC,SAAS,wBAAwB;AACjC,SAAS,gBAAgB;AACzB,SAAS,+BAA+B;AA4BxC,MAAM,OAAO;AAAA,EACX,GAAG;AAAA,EACH,GAAG;AAAA,EACH,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AACV;AAGA,MAAM,MAAM,OAAO,WAAW,cAAc,SAAS;AAiB9C,SAAS,mBACd,QACA,SAC0B;AAC1B,QAAM,QAAQ,wBAAmD,SAAS;AAAA,IACxE,WAAW;AAAA,EACb,CAAC;AAED,QAAM,YAAY,cAAc,EAAE,GAAG,KAAK,CAAC;AAG3C,QAAM,eAAe,OAAO,KAAK;AACjC,QAAM,SAAS,OAAsB,IAAI;AAEzC,QAAM,cAAc,YAAY,MAAM;AACpC,UAAM,KAAK,YAAY,MAAM;AAC7B,QAAI,CAAC,MAAM,EAAE,cAAc,UAAU;AACnC,UAAI,MAAM,MAAM,KAAK,MAAM,MAAO,WAAU,OAAO,EAAE,GAAG,KAAK,CAAC;AAC9D;AAAA,IACF;AACA,UAAM,OAAO,GAAG,sBAAsB;AACtC,cAAU,OAAO;AAAA,MACf,GAAG,KAAK;AAAA,MACR,GAAG,KAAK;AAAA,MACR,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,YAAY,MAAM;AAC/B,QAAI,MAAM,iBAAiB,KAAK,MAAM,OAAO;AAC3C,aAAO,UAAU,sBAAsB,MAAM;AAC3C,YAAI,CAAC,aAAa,QAAS,aAAY;AAAA,MACzC,CAAC;AAAA,IACH,OAAO;AACL,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAGhB,oBAAkB,QAAQ,MAAM;AAGhC,sBAAoB,QAAQ,QAAQ;AAAA,IAClC,YAAY;AAAA,IACZ,iBAAiB,CAAC,SAAS,OAAO;AAAA,EACpC,CAAC;AAKD;AAAA,IACE,SAAS,GAAG,KAAK,MAAM,aAAa,KAAK,MAAM,QAAQ,MAAM;AAAA,IAC7D;AAAA,IACA;AAAA,IACA,EAAE,SAAS,KAAK;AAAA,EAClB;AACA;AAAA,IACE,SAAS,GAAG,KAAK,MAAM,aAAa,KAAK,MAAM,QAAQ,MAAM;AAAA,IAC7D;AAAA,IACA;AAAA,IACA,EAAE,SAAS,KAAK;AAAA,EAClB;AAGA,YAAU,MAAM;AACd,iBAAa,UAAU;AACvB,QAAI,MAAM,UAAU,KAAK,MAAM,MAAO,QAAO;AAC7C,WAAO,MAAM;AACX,mBAAa,UAAU;AACvB,UAAI,OAAO,YAAY,MAAM;AAC3B,6BAAqB,OAAO,OAAO;AACnC,eAAO,UAAU;AAAA,MACnB;AACA,UAAI,MAAM,MAAM,KAAK,MAAM,MAAO,WAAU,OAAO,EAAE,GAAG,KAAK,CAAC;AAAA,IAChE;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL,IAAI,UAAU;AAAA,IACd,IAAI,UAAU;AAAA,IACd,MAAM,UAAU;AAAA,IAChB,QAAQ,UAAU;AAAA,IAClB,SAAS,UAAU;AAAA,IACnB,OAAO,UAAU;AAAA,IACjB,QAAQ,UAAU;AAAA,IAClB,SAAS,UAAU;AAAA,IACnB;AAAA,EACF;AACF;","names":[]}
|