react-atom-trigger 1.0.17 → 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 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
- export { default as AtomTrigger } from './AtomTrigger';
2
- export * from './AtomTrigger';
3
- export * from './utils';
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:r,getDebugInfo:n,triggerOnce:o=!1,className:s,behavior:i="default",dimensions:c,offset:u=[0,0,0,0]})=>{const l=e.useRef(null),[f,d]=e.useState(void 0),a=e.useRef(void 0),[p,v]=e.useState({leftViewport:0,enteredViewport:0});return e.useLayoutEffect((()=>{if(l.current){const e=l.current.getBoundingClientRect(),[t,r,n,o]=u;e.top>t&&e.bottom<c.height-n&&e.left>o&&e.right<c.width-r?d("inViewport"):e.top>c.height-n?d("bottom"):d("top")}}),[l,t,c,u]),e.useLayoutEffect((()=>{if(void 0===a.current&&void 0!==f&&(a.current=f),"inViewport"===f&&("bottom"===a.current||"top"===a.current)){if("enter"===i&&(!o||o&&p.enteredViewport)||"default"===i&&(!o||o&&(p.enteredViewport<1||p.leftViewport<1))){r&&r();const e={...p,enteredViewport:p.enteredViewport+1};n&&n({timesTriggered:e,trigger:"entered"}),v(e)}a.current=f}if(("top"===f||"bottom"===f)&&"inViewport"===a.current&&(a.current=f,"leave"===i&&(!o||o&&0===p.leftViewport)||"default"===i&&(!o||o&&(p.leftViewport<1||p.enteredViewport<1)))){r&&r();const e={...p,leftViewport:p.leftViewport+1};n&&n({timesTriggered:e,trigger:"left"}),v(e)}}),[f,r,o,i,n]),e.createElement("div",{ref:l,style:{display:"table"},className:s})};function r(e,t){"development"===process.env.NODE_ENV&&(t=t?`background: ${t}; color: #fff`:"background: #007700; color: #fff",console.group("%c log: "+e,t),console.groupEnd())}function n(){const{scrollX:e,scrollY:t}=window;return{scrollX:e,scrollY:t}}function o(){const{innerWidth:e,innerHeight:t}=window;return{width:e,height:t}}function s(t){const[r,n]=e.useState(o()),s=e.useRef(null),i=e.useRef(!1),c=t?.eventListenerTimeoutMs||15;return e.useEffect((()=>{const e=o();function r(){s.current&&clearTimeout(s.current),s.current=setTimeout((()=>n(o())),c)}return n(e),window.addEventListener("resize",r,{passive:t?.passiveEventListener}),i.current=!0,()=>{i&&window.removeEventListener("resize",r)}}),[]),r}function i({containerRef:t,options:r}){const[o,s]=e.useState(n()),i=e.useRef(null),c=e.useRef(!1);return e.useEffect((()=>{const e=e=>{const t=e.target;i.current&&clearTimeout(i.current),i.current=setTimeout((()=>{s({scrollX:t.scrollLeft,scrollY:t.scrollTop})}),r?.eventListenerTimeoutMs||15)},n=t?.current;return n&&(n&&!1===c.current&&n.addEventListener("scroll",e,{passive:r?.passiveEventListener}),c.current=!0),()=>{c&&n&&n.removeEventListener("scroll",e)}}),[t]),o}function c(t){const[r,o]=e.useState(n()),s=e.useRef(null),i=e.useRef(!1);return e.useEffect((()=>{const e=()=>{s.current&&clearTimeout(s.current),s.current=setTimeout((()=>{const{scrollX:e,scrollY:t}=n();o({scrollX:e,scrollY:t})}),t?.eventListenerTimeoutMs||20)};return window.addEventListener("scroll",e,{passive:t?.passiveEventListener}),i.current=!0,()=>{i&&window.removeEventListener("scroll",e)}}),[]),r}export{t as AtomTrigger,r as log,i as useContainerScroll,s as useWindowDimensions,c as useWindowScroll};
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
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["react-atom-trigger"]={},e.React)}(this,(function(e,t){"use strict";function r(){const{scrollX:e,scrollY:t}=window;return{scrollX:e,scrollY:t}}function n(){const{innerWidth:e,innerHeight:t}=window;return{width:e,height:t}}e.AtomTrigger=({scrollEvent:e,callback:r,getDebugInfo:n,triggerOnce:o=!1,className:i,behavior:s="default",dimensions:c,offset:u=[0,0,0,0]})=>{const l=t.useRef(null),[f,d]=t.useState(void 0),a=t.useRef(void 0),[p,g]=t.useState({leftViewport:0,enteredViewport:0});return t.useLayoutEffect((()=>{if(l.current){const e=l.current.getBoundingClientRect(),[t,r,n,o]=u;e.top>t&&e.bottom<c.height-n&&e.left>o&&e.right<c.width-r?d("inViewport"):e.top>c.height-n?d("bottom"):d("top")}}),[l,e,c,u]),t.useLayoutEffect((()=>{if(void 0===a.current&&void 0!==f&&(a.current=f),"inViewport"===f&&("bottom"===a.current||"top"===a.current)){if("enter"===s&&(!o||o&&p.enteredViewport)||"default"===s&&(!o||o&&(p.enteredViewport<1||p.leftViewport<1))){r&&r();const e={...p,enteredViewport:p.enteredViewport+1};n&&n({timesTriggered:e,trigger:"entered"}),g(e)}a.current=f}if(("top"===f||"bottom"===f)&&"inViewport"===a.current&&(a.current=f,"leave"===s&&(!o||o&&0===p.leftViewport)||"default"===s&&(!o||o&&(p.leftViewport<1||p.enteredViewport<1)))){r&&r();const e={...p,leftViewport:p.leftViewport+1};n&&n({timesTriggered:e,trigger:"left"}),g(e)}}),[f,r,o,s,n]),t.createElement("div",{ref:l,style:{display:"table"},className:i})},e.log=function(e,t){"development"===process.env.NODE_ENV&&(t=t?`background: ${t}; color: #fff`:"background: #007700; color: #fff",console.group("%c log: "+e,t),console.groupEnd())},e.useContainerScroll=function({containerRef:e,options:n}){const[o,i]=t.useState(r()),s=t.useRef(null),c=t.useRef(!1);return t.useEffect((()=>{const t=e=>{const t=e.target;s.current&&clearTimeout(s.current),s.current=setTimeout((()=>{i({scrollX:t.scrollLeft,scrollY:t.scrollTop})}),n?.eventListenerTimeoutMs||15)},r=e?.current;return r&&(r&&!1===c.current&&r.addEventListener("scroll",t,{passive:n?.passiveEventListener}),c.current=!0),()=>{c&&r&&r.removeEventListener("scroll",t)}}),[e]),o},e.useWindowDimensions=function(e){const[r,o]=t.useState(n()),i=t.useRef(null),s=t.useRef(!1),c=e?.eventListenerTimeoutMs||15;return t.useEffect((()=>{const t=n();function r(){i.current&&clearTimeout(i.current),i.current=setTimeout((()=>o(n())),c)}return o(t),window.addEventListener("resize",r,{passive:e?.passiveEventListener}),s.current=!0,()=>{s&&window.removeEventListener("resize",r)}}),[]),r},e.useWindowScroll=function(e){const[n,o]=t.useState(r()),i=t.useRef(null),s=t.useRef(!1);return t.useEffect((()=>{const t=()=>{i.current&&clearTimeout(i.current),i.current=setTimeout((()=>{const{scrollX:e,scrollY:t}=r();o({scrollX:e,scrollY:t})}),e?.eventListenerTimeoutMs||20)};return window.addEventListener("scroll",t,{passive:e?.passiveEventListener}),s.current=!0,()=>{s&&window.removeEventListener("scroll",t)}}),[]),n}}));
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.17",
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": "rimraf lib && rollup -c rollup.config.js"
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
- "@typescript-eslint/eslint-plugin": "^8.20.0",
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
- "rimraf": "^6.0.1",
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,10 +41,7 @@
54
41
  "files": [
55
42
  "lib"
56
43
  ],
57
- "volta": {
58
- "node": "20.18.1"
59
- },
60
- "resolutions": {
61
- "glob": "11.1.0"
44
+ "engines": {
45
+ "node": ">=20.19.0"
62
46
  }
63
47
  }
@@ -1,4 +0,0 @@
1
- import React from 'react';
2
- import { IAtomTriggerProps } from './AtomTrigger.types';
3
- declare const AtomTrigger: React.FC<IAtomTriggerProps>;
4
- export default AtomTrigger;
@@ -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;