react-atom-trigger 1.0.16 → 1.1.0
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 +14 -1
- package/lib/index.d.ts +49 -3
- package/lib/index.es.js +1 -1
- package/lib/index.js +1 -1
- package/package.json +7 -20
- package/lib/AtomTrigger.d.ts +0 -4
- package/lib/AtomTrigger.types.d.ts +0 -25
- package/lib/utils.d.ts +0 -13
package/README.md
CHANGED
|
@@ -60,6 +60,20 @@ So, if you already have some scroll event listener, just provide it to AtomTrigg
|
|
|
60
60
|
## Utility hooks
|
|
61
61
|
For someone who wants everything out-of-the-box, `useWindowDimensions`, `useWindowScroll` and `useContainerScroll` hooks are also available for import.
|
|
62
62
|
|
|
63
|
+
## Build
|
|
64
|
+
This package is built with `tsdown`.
|
|
65
|
+
|
|
66
|
+
Build output:
|
|
67
|
+
|
|
68
|
+
```text
|
|
69
|
+
lib/index.js
|
|
70
|
+
lib/index.es.js
|
|
71
|
+
lib/index.d.ts
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## UMD global
|
|
75
|
+
When the UMD bundle is loaded directly in the browser, the library is exposed as `window.reactAtomTrigger`.
|
|
76
|
+
|
|
63
77
|
## Examples
|
|
64
78
|
It is sometimes better to tweak and see for yourself: [CodeSandbox examples](https://codesandbox.io/examples/package/react-atom-trigger).
|
|
65
79
|
|
|
@@ -68,4 +82,3 @@ It is sometimes better to tweak and see for yourself: [CodeSandbox examples](htt
|
|
|
68
82
|
|
|
69
83
|
|
|
70
84
|
|
|
71
|
-
|
package/lib/index.d.ts
CHANGED
|
@@ -1,3 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
//#region src/AtomTrigger.types.d.ts
|
|
4
|
+
type ScrollEvent = {
|
|
5
|
+
scrollX: number;
|
|
6
|
+
scrollY: number;
|
|
7
|
+
};
|
|
8
|
+
type Dimensions = {
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
};
|
|
12
|
+
type DebugInfo = {
|
|
13
|
+
timesTriggered: {
|
|
14
|
+
leftViewport: number;
|
|
15
|
+
enteredViewport: number;
|
|
16
|
+
};
|
|
17
|
+
trigger: 'entered' | 'left';
|
|
18
|
+
};
|
|
19
|
+
interface IAtomTriggerProps {
|
|
20
|
+
scrollEvent: ScrollEvent;
|
|
21
|
+
behavior?: 'default' | 'enter' | 'leave';
|
|
22
|
+
callback: () => unknown;
|
|
23
|
+
getDebugInfo?: (data: DebugInfo) => void;
|
|
24
|
+
triggerOnce?: boolean;
|
|
25
|
+
className?: string;
|
|
26
|
+
dimensions: Dimensions;
|
|
27
|
+
offset?: [number, number, number, number];
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/AtomTrigger.d.ts
|
|
31
|
+
declare const AtomTrigger: React.FC<IAtomTriggerProps>;
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/utils.d.ts
|
|
34
|
+
type Options = {
|
|
35
|
+
passiveEventListener?: boolean;
|
|
36
|
+
eventListenerTimeoutMs?: number;
|
|
37
|
+
};
|
|
38
|
+
declare function log<T>(log: T, color?: string): void;
|
|
39
|
+
declare function useWindowDimensions(options?: Options | undefined): Dimensions;
|
|
40
|
+
declare function useContainerScroll({
|
|
41
|
+
containerRef,
|
|
42
|
+
options
|
|
43
|
+
}: {
|
|
44
|
+
containerRef?: React.RefObject<HTMLDivElement>;
|
|
45
|
+
options?: Options;
|
|
46
|
+
}): ScrollEvent;
|
|
47
|
+
declare function useWindowScroll(options?: Options): ScrollEvent;
|
|
48
|
+
//#endregion
|
|
49
|
+
export { AtomTrigger, Options, log, useContainerScroll, useWindowDimensions, useWindowScroll };
|
package/lib/index.es.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"react";const t=({scrollEvent:t,callback:
|
|
1
|
+
import e from"react";const t=({scrollEvent:t,callback:n,getDebugInfo:r,triggerOnce:i=!1,className:a,behavior:o=`default`,dimensions:s,offset:c=[0,0,0,0]})=>{let l=e.useRef(null),[u,d]=e.useState(void 0),f=e.useRef(void 0),[p,m]=e.useState({leftViewport:0,enteredViewport:0});return e.useLayoutEffect(()=>{if(l.current){let e=l.current.getBoundingClientRect(),[t,n,r,i]=c;e.top>t&&e.bottom<s.height-r&&e.left>i&&e.right<s.width-n?d(`inViewport`):e.top>s.height-r?d(`bottom`):d(`top`)}},[l,t,s,c]),e.useLayoutEffect(()=>{if(f.current===void 0&&u!==void 0&&(f.current=u),u===`inViewport`&&(f.current===`bottom`||f.current===`top`)){if(o===`enter`&&(!i||i&&p.enteredViewport)||o===`default`&&(!i||i&&(p.enteredViewport<1||p.leftViewport<1))){n&&n();let e={...p,enteredViewport:p.enteredViewport+1};r&&r({timesTriggered:e,trigger:`entered`}),m(e)}f.current=u}if((u===`top`||u===`bottom`)&&f.current===`inViewport`&&(f.current=u,o===`leave`&&(!i||i&&p.leftViewport===0)||o===`default`&&(!i||i&&(p.leftViewport<1||p.enteredViewport<1)))){n&&n();let e={...p,leftViewport:p.leftViewport+1};r&&r({timesTriggered:e,trigger:`left`}),m(e)}},[u,n,i,o,r]),e.createElement(`div`,{ref:l,style:{display:`table`},className:a})};function n(e,t){}function r(){let{scrollX:e,scrollY:t}=window;return{scrollX:e,scrollY:t}}function i(){let{innerWidth:e,innerHeight:t}=window;return{width:e,height:t}}function a(t){let[n,r]=e.useState(i()),a=e.useRef(null),o=e.useRef(!1),s=t?.eventListenerTimeoutMs||15;return e.useEffect(()=>{r(i());function e(){a.current&&clearTimeout(a.current),a.current=setTimeout(()=>r(i()),s)}return window.addEventListener(`resize`,e,{passive:t?.passiveEventListener}),o.current=!0,()=>{o&&window.removeEventListener(`resize`,e)}},[]),n}function o({containerRef:t,options:n}){let[i,a]=e.useState(r()),o=e.useRef(null),s=e.useRef(!1);return e.useEffect(()=>{let e=e=>{let t=e.target;o.current&&clearTimeout(o.current),o.current=setTimeout(()=>{a({scrollX:t.scrollLeft,scrollY:t.scrollTop})},n?.eventListenerTimeoutMs||15)},r=t?.current;return r&&(r&&s.current===!1&&r.addEventListener(`scroll`,e,{passive:n?.passiveEventListener}),s.current=!0),()=>{s&&r&&r.removeEventListener(`scroll`,e)}},[t]),i}function s(t){let[n,i]=e.useState(r()),a=e.useRef(null),o=e.useRef(!1);return e.useEffect(()=>{let e=()=>{a.current&&clearTimeout(a.current),a.current=setTimeout(()=>{let{scrollX:e,scrollY:t}=r();i({scrollX:e,scrollY:t})},t?.eventListenerTimeoutMs||20)};return window.addEventListener(`scroll`,e,{passive:t?.passiveEventListener}),o.current=!0,()=>{o&&window.removeEventListener(`scroll`,e)}},[]),n}export{t as AtomTrigger,n as log,o as useContainerScroll,a as useWindowDimensions,s as useWindowScroll};
|
package/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`react`)):typeof define==`function`&&define.amd?define([`exports`,`react`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.reactAtomTrigger={},e.React))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var n=Object.create,r=Object.defineProperty,i=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,o=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,c=(e,t,n,o)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=a(t),l=0,u=c.length,d;l<u;l++)d=c[l],!s.call(e,d)&&d!==n&&r(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(o=i(t,d))||o.enumerable});return e};t=((e,t,i)=>(i=e==null?{}:n(o(e)),c(t||!e||!e.__esModule?r(i,`default`,{value:e,enumerable:!0}):i,e)))(t);let l=({scrollEvent:e,callback:n,getDebugInfo:r,triggerOnce:i=!1,className:a,behavior:o=`default`,dimensions:s,offset:c=[0,0,0,0]})=>{let l=t.default.useRef(null),[u,d]=t.default.useState(void 0),f=t.default.useRef(void 0),[p,m]=t.default.useState({leftViewport:0,enteredViewport:0});return t.default.useLayoutEffect(()=>{if(l.current){let e=l.current.getBoundingClientRect(),[t,n,r,i]=c;e.top>t&&e.bottom<s.height-r&&e.left>i&&e.right<s.width-n?d(`inViewport`):e.top>s.height-r?d(`bottom`):d(`top`)}},[l,e,s,c]),t.default.useLayoutEffect(()=>{if(f.current===void 0&&u!==void 0&&(f.current=u),u===`inViewport`&&(f.current===`bottom`||f.current===`top`)){if(o===`enter`&&(!i||i&&p.enteredViewport)||o===`default`&&(!i||i&&(p.enteredViewport<1||p.leftViewport<1))){n&&n();let e={...p,enteredViewport:p.enteredViewport+1};r&&r({timesTriggered:e,trigger:`entered`}),m(e)}f.current=u}if((u===`top`||u===`bottom`)&&f.current===`inViewport`&&(f.current=u,o===`leave`&&(!i||i&&p.leftViewport===0)||o===`default`&&(!i||i&&(p.leftViewport<1||p.enteredViewport<1)))){n&&n();let e={...p,leftViewport:p.leftViewport+1};r&&r({timesTriggered:e,trigger:`left`}),m(e)}},[u,n,i,o,r]),t.default.createElement(`div`,{ref:l,style:{display:`table`},className:a})};function u(e,t){}function d(){let{scrollX:e,scrollY:t}=window;return{scrollX:e,scrollY:t}}function f(){let{innerWidth:e,innerHeight:t}=window;return{width:e,height:t}}function p(e){let[n,r]=t.default.useState(f()),i=t.default.useRef(null),a=t.default.useRef(!1),o=e?.eventListenerTimeoutMs||15;return t.default.useEffect(()=>{r(f());function t(){i.current&&clearTimeout(i.current),i.current=setTimeout(()=>r(f()),o)}return window.addEventListener(`resize`,t,{passive:e?.passiveEventListener}),a.current=!0,()=>{a&&window.removeEventListener(`resize`,t)}},[]),n}function m({containerRef:e,options:n}){let[r,i]=t.default.useState(d()),a=t.default.useRef(null),o=t.default.useRef(!1);return t.default.useEffect(()=>{let t=e=>{let t=e.target;a.current&&clearTimeout(a.current),a.current=setTimeout(()=>{i({scrollX:t.scrollLeft,scrollY:t.scrollTop})},n?.eventListenerTimeoutMs||15)},r=e?.current;return r&&(r&&o.current===!1&&r.addEventListener(`scroll`,t,{passive:n?.passiveEventListener}),o.current=!0),()=>{o&&r&&r.removeEventListener(`scroll`,t)}},[e]),r}function h(e){let[n,r]=t.default.useState(d()),i=t.default.useRef(null),a=t.default.useRef(!1);return t.default.useEffect(()=>{let t=()=>{i.current&&clearTimeout(i.current),i.current=setTimeout(()=>{let{scrollX:e,scrollY:t}=d();r({scrollX:e,scrollY:t})},e?.eventListenerTimeoutMs||20)};return window.addEventListener(`scroll`,t,{passive:e?.passiveEventListener}),a.current=!0,()=>{a&&window.removeEventListener(`scroll`,t)}},[]),n}e.AtomTrigger=l,e.log=u,e.useContainerScroll=m,e.useWindowDimensions=p,e.useWindowScroll=h});
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "lib/index.es.js",
|
|
7
7
|
"typings": "lib/index.d.ts",
|
|
8
|
-
"version": "1.0
|
|
8
|
+
"version": "1.1.0",
|
|
9
9
|
"license": "MIT",
|
|
10
10
|
"author": "innrVoice <innrvoice@icloud.com>",
|
|
11
11
|
"repository": {
|
|
@@ -16,31 +16,18 @@
|
|
|
16
16
|
"url": "https://github.com/innrvoice/react-atom-trigger/issues"
|
|
17
17
|
},
|
|
18
18
|
"scripts": {
|
|
19
|
-
"build": "
|
|
19
|
+
"build": "tsdown",
|
|
20
|
+
"lint": "oxlint . --ignore-pattern node_modules --ignore-pattern lib"
|
|
20
21
|
},
|
|
21
22
|
"peerDependencies": {
|
|
22
23
|
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
|
|
23
24
|
},
|
|
24
25
|
"devDependencies": {
|
|
25
|
-
"@rollup/plugin-commonjs": "^28.0.3",
|
|
26
|
-
"@rollup/plugin-node-resolve": "^16.0.1",
|
|
27
|
-
"@rollup/plugin-terser": "0.4.4",
|
|
28
26
|
"@types/node": "^20.6.3",
|
|
29
27
|
"@types/react": "^19.0.12",
|
|
30
|
-
"
|
|
31
|
-
"@typescript-eslint/parser": "^8.20.0",
|
|
32
|
-
"eslint": "^9.18.0",
|
|
33
|
-
"eslint-config-prettier": "^10.0.1",
|
|
34
|
-
"eslint-plugin-node": "^11.1.0",
|
|
35
|
-
"eslint-plugin-prettier": "^5.2.1",
|
|
36
|
-
"eslint-plugin-react": "^7.27.1",
|
|
37
|
-
"eslint-plugin-react-hooks": "^5.1.0",
|
|
38
|
-
"eslint-plugin-sort-imports-es6-autofix": "^0.6.0",
|
|
28
|
+
"oxlint": "^1.50.0",
|
|
39
29
|
"prettier": "^3.4.2",
|
|
40
|
-
"
|
|
41
|
-
"rollup": "^4.37.0",
|
|
42
|
-
"rollup-plugin-node-externals": "^8.0.0",
|
|
43
|
-
"rollup-plugin-typescript2": "^0.36.0",
|
|
30
|
+
"tsdown": "^0.21.0-beta.2",
|
|
44
31
|
"tslib": "^2.8.0",
|
|
45
32
|
"typescript": "^5.6.3"
|
|
46
33
|
},
|
|
@@ -54,7 +41,7 @@
|
|
|
54
41
|
"files": [
|
|
55
42
|
"lib"
|
|
56
43
|
],
|
|
57
|
-
"
|
|
58
|
-
"node": "20.
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=20.19.0"
|
|
59
46
|
}
|
|
60
47
|
}
|
package/lib/AtomTrigger.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export type ScrollEvent = {
|
|
2
|
-
scrollX: number;
|
|
3
|
-
scrollY: number;
|
|
4
|
-
};
|
|
5
|
-
export type Dimensions = {
|
|
6
|
-
width: number;
|
|
7
|
-
height: number;
|
|
8
|
-
};
|
|
9
|
-
export type DebugInfo = {
|
|
10
|
-
timesTriggered: {
|
|
11
|
-
leftViewport: number;
|
|
12
|
-
enteredViewport: number;
|
|
13
|
-
};
|
|
14
|
-
trigger: 'entered' | 'left';
|
|
15
|
-
};
|
|
16
|
-
export interface IAtomTriggerProps {
|
|
17
|
-
scrollEvent: ScrollEvent;
|
|
18
|
-
behavior?: 'default' | 'enter' | 'leave';
|
|
19
|
-
callback: () => unknown;
|
|
20
|
-
getDebugInfo?: (data: DebugInfo) => void;
|
|
21
|
-
triggerOnce?: boolean;
|
|
22
|
-
className?: string;
|
|
23
|
-
dimensions: Dimensions;
|
|
24
|
-
offset?: [number, number, number, number];
|
|
25
|
-
}
|
package/lib/utils.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Dimensions, ScrollEvent } from './AtomTrigger.types';
|
|
3
|
-
export type Options = {
|
|
4
|
-
passiveEventListener?: boolean;
|
|
5
|
-
eventListenerTimeoutMs?: number;
|
|
6
|
-
};
|
|
7
|
-
export declare function log<T>(log: T, color?: string): void;
|
|
8
|
-
export declare function useWindowDimensions(options?: Options | undefined): Dimensions;
|
|
9
|
-
export declare function useContainerScroll({ containerRef, options, }: {
|
|
10
|
-
containerRef?: React.RefObject<HTMLDivElement>;
|
|
11
|
-
options?: Options;
|
|
12
|
-
}): ScrollEvent;
|
|
13
|
-
export declare function useWindowScroll(options?: Options): ScrollEvent;
|