@koine/react 2.0.0-beta.82 → 2.0.0-beta.83
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/FaviconTags.cjs.js +10 -1
- package/FaviconTags.esm.js +10 -1
- package/Meta.cjs.js +10 -1
- package/Meta.esm.js +10 -1
- package/NoJs.cjs.js +1 -1
- package/NoJs.esm.js +1 -1
- package/calendar.cjs.js +97 -8
- package/calendar.esm.js +97 -8
- package/classed.cjs.js +42 -1
- package/classed.esm.js +42 -1
- package/createUseMediaQueryWidth.cjs.js +15 -1
- package/createUseMediaQueryWidth.esm.js +15 -1
- package/extendComponent.cjs.js +5 -1
- package/extendComponent.esm.js +5 -1
- package/forms.cjs.js +27 -1
- package/forms.esm.js +27 -1
- package/package.json +3 -3
- package/useAsyncFn.cjs.js +4 -1
- package/useAsyncFn.esm.js +4 -1
- package/useFirstMountState.cjs.js +3 -1
- package/useFirstMountState.esm.js +3 -1
- package/useFixedOffset.cjs.js +12 -1
- package/useFixedOffset.esm.js +12 -1
- package/useFocus.cjs.js +3 -1
- package/useFocus.esm.js +3 -1
- package/useInterval.cjs.js +6 -1
- package/useInterval.esm.js +6 -1
- package/useIsomorphicLayoutEffect.cjs.js +3 -1
- package/useIsomorphicLayoutEffect.esm.js +3 -1
- package/useKeyUp.cjs.js +6 -1
- package/useKeyUp.esm.js +6 -1
- package/useMeasure.cjs.js +33 -1
- package/useMeasure.esm.js +33 -1
- package/useMountedState.cjs.js +3 -1
- package/useMountedState.esm.js +3 -1
- package/useNavigateAway.cjs.js +47 -1
- package/useNavigateAway.esm.js +47 -1
- package/useScrollPosition.cjs.js +7 -1
- package/useScrollPosition.esm.js +7 -1
- package/useScrollThreshold.cjs.js +4 -1
- package/useScrollThreshold.esm.js +4 -1
- package/useScrollTo.cjs.js +3 -1
- package/useScrollTo.esm.js +3 -1
- package/useSmoothScroll.cjs.js +6 -1
- package/useSmoothScroll.esm.js +6 -1
- package/useSpinDelay.cjs.js +12 -1
- package/useSpinDelay.esm.js +12 -1
- package/useTraceUpdate.cjs.js +4 -1
- package/useTraceUpdate.esm.js +4 -1
- package/useUpdateEffect.cjs.js +4 -1
- package/useUpdateEffect.esm.js +4 -1
- package/useWindowSize.cjs.js +9 -1
- package/useWindowSize.esm.js +9 -1
package/forms.cjs.js
CHANGED
|
@@ -5,7 +5,33 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var yup = require('@kuus/yup');
|
|
6
6
|
var utils = require('@koine/utils');
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Encode form
|
|
10
|
+
*
|
|
11
|
+
* Takes a record of yup validations and outputs a `yup` schema with encoded
|
|
12
|
+
* names (antispam technique) and a record of the encoded/decoded input `name`s.
|
|
13
|
+
*
|
|
14
|
+
* We skip the names prefixed wth an underscore which are considered programmatic
|
|
15
|
+
* form data not created by user input.
|
|
16
|
+
*
|
|
17
|
+
* FIXME: types https://github.com/jquense/yup/issues/1700
|
|
18
|
+
*/let encodeForm=t=>{let o={},i={};for(let e in t)if(!e.startsWith("_")){let l=utils.encode(e);o[l]=t[e],i[e]=l;}return {encodedSchema:// we need `.required()` to correctly infer the type @see
|
|
19
|
+
// https://github.com/jquense/yup/issues/946
|
|
20
|
+
yup.object(o).required(),encodedNames:i}};/**
|
|
21
|
+
* Decode form data
|
|
22
|
+
*
|
|
23
|
+
* This function is meant to be used inside an api endpoint to gather an encoded
|
|
24
|
+
* form submit data and transform it to the decoded desired json data.
|
|
25
|
+
*
|
|
26
|
+
* Here too we skip encoding/decoding process for names prefixed wth an underscore
|
|
27
|
+
* which are considered programmatic form data not created by user input.
|
|
28
|
+
*/let decodeForm=e=>{let r={};for(let i in e){let l=utils.decode(i);// always add underscore prefixed names as they are treated as internal
|
|
29
|
+
// private inputs outside of the honeypot system, normalise them here removing
|
|
30
|
+
// the underscore prefix
|
|
31
|
+
i.startsWith("_")?// @ts-expect-error nevermind
|
|
32
|
+
r[i.substring(1)]=e[i]:utils.isUndefined(e[i])||""!==e[l]||// @ts-expect-error nevermind
|
|
33
|
+
(r[l]=e[i]);}// console.log(formData, decoded, json);
|
|
34
|
+
return r};
|
|
9
35
|
|
|
10
36
|
exports.decodeForm = decodeForm;
|
|
11
37
|
exports.encodeForm = encodeForm;
|
package/forms.esm.js
CHANGED
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
import { object } from '@kuus/yup';
|
|
2
2
|
import { encode, decode, isUndefined } from '@koine/utils';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Encode form
|
|
6
|
+
*
|
|
7
|
+
* Takes a record of yup validations and outputs a `yup` schema with encoded
|
|
8
|
+
* names (antispam technique) and a record of the encoded/decoded input `name`s.
|
|
9
|
+
*
|
|
10
|
+
* We skip the names prefixed wth an underscore which are considered programmatic
|
|
11
|
+
* form data not created by user input.
|
|
12
|
+
*
|
|
13
|
+
* FIXME: types https://github.com/jquense/yup/issues/1700
|
|
14
|
+
*/let encodeForm=t=>{let o={},i={};for(let e in t)if(!e.startsWith("_")){let l=encode(e);o[l]=t[e],i[e]=l;}return {encodedSchema:// we need `.required()` to correctly infer the type @see
|
|
15
|
+
// https://github.com/jquense/yup/issues/946
|
|
16
|
+
object(o).required(),encodedNames:i}};/**
|
|
17
|
+
* Decode form data
|
|
18
|
+
*
|
|
19
|
+
* This function is meant to be used inside an api endpoint to gather an encoded
|
|
20
|
+
* form submit data and transform it to the decoded desired json data.
|
|
21
|
+
*
|
|
22
|
+
* Here too we skip encoding/decoding process for names prefixed wth an underscore
|
|
23
|
+
* which are considered programmatic form data not created by user input.
|
|
24
|
+
*/let decodeForm=e=>{let r={};for(let i in e){let l=decode(i);// always add underscore prefixed names as they are treated as internal
|
|
25
|
+
// private inputs outside of the honeypot system, normalise them here removing
|
|
26
|
+
// the underscore prefix
|
|
27
|
+
i.startsWith("_")?// @ts-expect-error nevermind
|
|
28
|
+
r[i.substring(1)]=e[i]:isUndefined(e[i])||""!==e[l]||// @ts-expect-error nevermind
|
|
29
|
+
(r[l]=e[i]);}// console.log(formData, decoded, json);
|
|
30
|
+
return r};
|
|
5
31
|
|
|
6
32
|
export { decodeForm, encodeForm };
|
package/package.json
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"name": "@koine/react",
|
|
3
3
|
"sideEffects": false,
|
|
4
4
|
"dependencies": {
|
|
5
|
-
"@koine/dom": "2.0.0-beta.
|
|
6
|
-
"@koine/utils": "2.0.0-beta.
|
|
5
|
+
"@koine/dom": "2.0.0-beta.83",
|
|
6
|
+
"@koine/utils": "2.0.0-beta.83"
|
|
7
7
|
},
|
|
8
8
|
"peerDependencies": {
|
|
9
9
|
"@kuus/yup": "1.0.0-beta.7",
|
|
@@ -190,5 +190,5 @@
|
|
|
190
190
|
},
|
|
191
191
|
"module": "./index.esm.js",
|
|
192
192
|
"main": "./index.cjs.js",
|
|
193
|
-
"version": "2.0.0-beta.
|
|
193
|
+
"version": "2.0.0-beta.83"
|
|
194
194
|
}
|
package/useAsyncFn.cjs.js
CHANGED
|
@@ -5,7 +5,10 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var useMountedState = require('./useMountedState.cjs.js');
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* @borrows [streamich/react-use](https://github.com/streamich/react-use/blob/master/src/useAsyncFn.ts)
|
|
10
|
+
*/let useAsyncFn=(o,u=[],l={loading:!1})=>{let a=react.useRef(0),d=useMountedState.useMountedState(),[i,c]=react.useState(l),g=react.useCallback((...e)=>{let t=++a.current;return i.loading||c(e=>({...e,loading:!0})),o(...e).then(e=>(d()&&t===a.current&&c({value:e,loading:!1}),e),e=>(d()&&t===a.current&&c({error:e,loading:!1}),e))},// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
11
|
+
u);return [i,g]};
|
|
9
12
|
|
|
10
13
|
exports["default"] = useAsyncFn;
|
|
11
14
|
exports.useAsyncFn = useAsyncFn;
|
package/useAsyncFn.esm.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { useRef, useState, useCallback } from 'react';
|
|
2
2
|
import { useMountedState } from './useMountedState.esm.js';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* @borrows [streamich/react-use](https://github.com/streamich/react-use/blob/master/src/useAsyncFn.ts)
|
|
6
|
+
*/let useAsyncFn=(o,u=[],l={loading:!1})=>{let a=useRef(0),d=useMountedState(),[i,c]=useState(l),g=useCallback((...e)=>{let t=++a.current;return i.loading||c(e=>({...e,loading:!0})),o(...e).then(e=>(d()&&t===a.current&&c({value:e,loading:!1}),e),e=>(d()&&t===a.current&&c({error:e,loading:!1}),e))},// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
7
|
+
u);return [i,g]};
|
|
5
8
|
|
|
6
9
|
export { useAsyncFn as default, useAsyncFn };
|
|
@@ -4,7 +4,9 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var react = require('react');
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* @borrows [streamich/react-use](https://github.com/streamich/react-use/blob/master/src/useFirstMountState.ts)
|
|
9
|
+
*/let useFirstMountState=()=>{let r=react.useRef(!0);return r.current?(r.current=!1,!0):r.current};
|
|
8
10
|
|
|
9
11
|
exports["default"] = useFirstMountState;
|
|
10
12
|
exports.useFirstMountState = useFirstMountState;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { useRef } from 'react';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* @borrows [streamich/react-use](https://github.com/streamich/react-use/blob/master/src/useFirstMountState.ts)
|
|
5
|
+
*/let useFirstMountState=()=>{let r=useRef(!0);return r.current?(r.current=!1,!0):r.current};
|
|
4
6
|
|
|
5
7
|
export { useFirstMountState as default, useFirstMountState };
|
package/useFixedOffset.cjs.js
CHANGED
|
@@ -7,7 +7,18 @@ var utils = require('@koine/utils');
|
|
|
7
7
|
var dom = require('@koine/dom');
|
|
8
8
|
var useIsomorphicLayoutEffect = require('./useIsomorphicLayoutEffect.cjs.js');
|
|
9
9
|
|
|
10
|
-
let n=e=>{dom.injectCss("useFixedOffset",`html{scroll-padding-top: ${e}px}`);}
|
|
10
|
+
let n=e=>{dom.injectCss("useFixedOffset",`html{scroll-padding-top: ${e}px}`);};/**
|
|
11
|
+
* # Use fixed offset
|
|
12
|
+
*
|
|
13
|
+
* Maybe use [ResizeObserver polyfill](https://github.com/juggle/resize-observer)
|
|
14
|
+
*
|
|
15
|
+
* @see https://web.dev/resize-observer/
|
|
16
|
+
*
|
|
17
|
+
* @param selector By default `[data-fixed]`: anyhting with the data attribute `data-fixed`
|
|
18
|
+
*/let useFixedOffset=i=>{let l=react.useRef(0);return useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(()=>{let e=()=>{let e=dom.calculateFixedOffset();l.current=e,// inject this CSS make the hashed deeplinks position the scroll at the
|
|
19
|
+
// right offset
|
|
20
|
+
n(e);};if(e(),!ResizeObserver)return dom.listenResizeDebounced(0,e);{// const elements = domAll("[data-fixed]");
|
|
21
|
+
let e=new ResizeObserver(e=>{let r=0;e.forEach(e=>{r+=e.contentRect.height;}),l.current=r,utils.debounce(()=>n(r),400,!0)();});return dom.domEach(i||"[data-fixed]",t=>{e&&e.observe(t);}),()=>{e?.disconnect();}}},[i]),l};
|
|
11
22
|
|
|
12
23
|
exports["default"] = useFixedOffset;
|
|
13
24
|
exports.useFixedOffset = useFixedOffset;
|
package/useFixedOffset.esm.js
CHANGED
|
@@ -3,6 +3,17 @@ import { debounce } from '@koine/utils';
|
|
|
3
3
|
import { listenResizeDebounced, domEach, calculateFixedOffset, injectCss } from '@koine/dom';
|
|
4
4
|
import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect.esm.js';
|
|
5
5
|
|
|
6
|
-
let n=e=>{injectCss("useFixedOffset",`html{scroll-padding-top: ${e}px}`);}
|
|
6
|
+
let n=e=>{injectCss("useFixedOffset",`html{scroll-padding-top: ${e}px}`);};/**
|
|
7
|
+
* # Use fixed offset
|
|
8
|
+
*
|
|
9
|
+
* Maybe use [ResizeObserver polyfill](https://github.com/juggle/resize-observer)
|
|
10
|
+
*
|
|
11
|
+
* @see https://web.dev/resize-observer/
|
|
12
|
+
*
|
|
13
|
+
* @param selector By default `[data-fixed]`: anyhting with the data attribute `data-fixed`
|
|
14
|
+
*/let useFixedOffset=i=>{let l=useRef(0);return useIsomorphicLayoutEffect(()=>{let e=()=>{let e=calculateFixedOffset();l.current=e,// inject this CSS make the hashed deeplinks position the scroll at the
|
|
15
|
+
// right offset
|
|
16
|
+
n(e);};if(e(),!ResizeObserver)return listenResizeDebounced(0,e);{// const elements = domAll("[data-fixed]");
|
|
17
|
+
let e=new ResizeObserver(e=>{let r=0;e.forEach(e=>{r+=e.contentRect.height;}),l.current=r,debounce(()=>n(r),400,!0)();});return domEach(i||"[data-fixed]",t=>{e&&e.observe(t);}),()=>{e?.disconnect();}}},[i]),l};
|
|
7
18
|
|
|
8
19
|
export { useFixedOffset as default, useFixedOffset };
|
package/useFocus.cjs.js
CHANGED
|
@@ -4,7 +4,9 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var react = require('react');
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* @see https://stackoverflow.com/a/54159564/1938970
|
|
9
|
+
*/let useFocus=()=>{let r=react.useRef(null);return [r,()=>{r.current&&r.current.focus();}]};
|
|
8
10
|
|
|
9
11
|
exports["default"] = useFocus;
|
|
10
12
|
exports.useFocus = useFocus;
|
package/useFocus.esm.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { useRef } from 'react';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* @see https://stackoverflow.com/a/54159564/1938970
|
|
5
|
+
*/let useFocus=()=>{let r=useRef(null);return [r,()=>{r.current&&r.current.focus();}]};
|
|
4
6
|
|
|
5
7
|
export { useFocus as default, useFocus };
|
package/useInterval.cjs.js
CHANGED
|
@@ -5,7 +5,12 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var utils = require('@koine/utils');
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* @borrows [dan abramov](https://overreacted.io/making-setinterval-declarative-with-react-hooks/)
|
|
10
|
+
*
|
|
11
|
+
* We just add `deps` array argument and typescript support
|
|
12
|
+
*/let useInterval=(n,l,u=[])=>{let o=react.useRef();react.useEffect(()=>{o.current=n;},// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
13
|
+
[n,...u]),react.useEffect(()=>{if(null!==l){let r=setInterval(function(){o.current&&o.current();},l);return ()=>clearInterval(r)}return utils.noop},[l]);};
|
|
9
14
|
|
|
10
15
|
exports["default"] = useInterval;
|
|
11
16
|
exports.useInterval = useInterval;
|
package/useInterval.esm.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { useRef, useEffect } from 'react';
|
|
2
2
|
import { noop } from '@koine/utils';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* @borrows [dan abramov](https://overreacted.io/making-setinterval-declarative-with-react-hooks/)
|
|
6
|
+
*
|
|
7
|
+
* We just add `deps` array argument and typescript support
|
|
8
|
+
*/let useInterval=(n,l,u=[])=>{let o=useRef();useEffect(()=>{o.current=n;},// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
9
|
+
[n,...u]),useEffect(()=>{if(null!==l){let r=setInterval(function(){o.current&&o.current();},l);return ()=>clearInterval(r)}return noop},[l]);};
|
|
5
10
|
|
|
6
11
|
export { useInterval as default, useInterval };
|
|
@@ -5,7 +5,9 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var utils = require('@koine/utils');
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* @borrows [streamich/react-use](https://github.com/streamich/react-use/blob/master/src/useIsomorphicLayoutEffect.ts)
|
|
10
|
+
*/let useIsomorphicLayoutEffect=utils.isBrowser?react.useLayoutEffect:react.useEffect;
|
|
9
11
|
|
|
10
12
|
exports["default"] = useIsomorphicLayoutEffect;
|
|
11
13
|
exports.useIsomorphicLayoutEffect = useIsomorphicLayoutEffect;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { useLayoutEffect, useEffect } from 'react';
|
|
2
2
|
import { isBrowser } from '@koine/utils';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* @borrows [streamich/react-use](https://github.com/streamich/react-use/blob/master/src/useIsomorphicLayoutEffect.ts)
|
|
6
|
+
*/let useIsomorphicLayoutEffect=isBrowser?useLayoutEffect:useEffect;
|
|
5
7
|
|
|
6
8
|
export { useIsomorphicLayoutEffect as default, useIsomorphicLayoutEffect };
|
package/useKeyUp.cjs.js
CHANGED
|
@@ -5,7 +5,12 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var dom = require('@koine/dom');
|
|
7
7
|
|
|
8
|
-
let useKeyUp=(o,r=[])=>{react.useEffect(()=>dom.on(window,"keyup",e=>{
|
|
8
|
+
let useKeyUp=(o,r=[])=>{react.useEffect(()=>dom.on(window,"keyup",e=>{// const { key } = event;
|
|
9
|
+
// be sure we do not intercept keys combinations maybe used for other
|
|
10
|
+
// actions like native browser navigation shortcuts
|
|
11
|
+
// @see https://stackoverflow.com/a/37559790/1938970
|
|
12
|
+
e.ctrlKey||e.altKey||e.shiftKey||e.metaKey||o(e);}),// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
13
|
+
[o,...r]);};
|
|
9
14
|
|
|
10
15
|
exports["default"] = useKeyUp;
|
|
11
16
|
exports.useKeyUp = useKeyUp;
|
package/useKeyUp.esm.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { useEffect } from 'react';
|
|
2
2
|
import { on } from '@koine/dom';
|
|
3
3
|
|
|
4
|
-
let useKeyUp=(o,r=[])=>{useEffect(()=>on(window,"keyup",e=>{
|
|
4
|
+
let useKeyUp=(o,r=[])=>{useEffect(()=>on(window,"keyup",e=>{// const { key } = event;
|
|
5
|
+
// be sure we do not intercept keys combinations maybe used for other
|
|
6
|
+
// actions like native browser navigation shortcuts
|
|
7
|
+
// @see https://stackoverflow.com/a/37559790/1938970
|
|
8
|
+
e.ctrlKey||e.altKey||e.shiftKey||e.metaKey||o(e);}),// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
9
|
+
[o,...r]);};
|
|
5
10
|
|
|
6
11
|
export { useKeyUp as default, useKeyUp };
|
package/useMeasure.cjs.js
CHANGED
|
@@ -6,7 +6,39 @@ var react = require('react');
|
|
|
6
6
|
var utils = require('@koine/utils');
|
|
7
7
|
var dom = require('@koine/dom');
|
|
8
8
|
|
|
9
|
-
let e;let m=e=>{let t=[];if(!e||e===document.body)return t;let{overflow:r,overflowX:n,overflowY:u}=window.getComputedStyle(e);return [r,n,u].some(e=>"auto"===e||"scroll"===e)&&t.push(e),[...t,...m(e.parentElement)]},p=["x","y","top","bottom","left","right","width","height"],d=(e,t)=>p.every(r=>e[r]===t[r])
|
|
9
|
+
let e;let m=e=>{let t=[];if(!e||e===document.body)return t;let{overflow:r,overflowX:n,overflowY:u}=window.getComputedStyle(e);return [r,n,u].some(e=>"auto"===e||"scroll"===e)&&t.push(e),[...t,...m(e.parentElement)]},p=["x","y","top","bottom","left","right","width","height"],d=(e,t)=>p.every(r=>e[r]===t[r]);// offsetSize?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Use measure hook
|
|
12
|
+
*
|
|
13
|
+
* @borrows [pmndrs/react-use-measure](https://github.com/pmndrs/react-use-measure)
|
|
14
|
+
*/let useMeasure=p=>{let{scroll:h=!1}=/* offsetSize = false */p||{},[a,b]=react.useState({left:0,top:0,width:0,height:0,bottom:0,right:0,x:0,y:0}),// keep all state in a ref
|
|
15
|
+
g=react.useRef([// element
|
|
16
|
+
null,// scrollContainers
|
|
17
|
+
null,// resizeObserver
|
|
18
|
+
null,// lastBounds
|
|
19
|
+
a]),// make sure to update state only as long as the component is truly mounted
|
|
20
|
+
v=react.useRef(!1);react.useEffect(()=>(v.current=!0,()=>void(v.current=!1)),[]);// memoize handlers, so event-listeners know when they should update
|
|
21
|
+
let[w,,/* resizeChange */y]=react.useMemo(()=>{let e=(...e)=>{let[t,,,r]=g.current;if(!t)return;let n=t.getBoundingClientRect();// if (element instanceof HTMLElement && offsetSize) {
|
|
22
|
+
// size.height = element.offsetHeight;
|
|
23
|
+
// size.width = element.offsetWidth;
|
|
24
|
+
// }
|
|
25
|
+
Object.freeze(n),v.current&&!d(r,n)&&(g.current[3]=n,b(n));},t=utils.debounce(e);return [e,t,t]},[b]);/* , offsetSize */// cleanup current scroll-listeners / observers
|
|
26
|
+
function x(){let[,e,t]=g.current;e&&(e.forEach(e=>dom.off(e,"scroll",y)),g.current[1]=null),t&&(t.disconnect(),g.current[2]=null);}// add scroll-listeners / observers
|
|
27
|
+
function z(){let[t,r]=g.current;t&&!e&&ResizeObserver&&(e=new ResizeObserver(y),g.current[2]=e,e.observe(t),h&&r&&r.forEach(e=>dom.on(e,"scroll",y,{capture:!0,passive:!0})));}return(// add general event listeners
|
|
28
|
+
// useOnWindowScroll(forceRefresh, Boolean(scroll));
|
|
29
|
+
// useOnWindowResize(() => {
|
|
30
|
+
// debugger;
|
|
31
|
+
// forceRefresh();
|
|
32
|
+
// });
|
|
33
|
+
react.useEffect(()=>h?dom.listenScrollDebounced(0,w,100):utils.noop,[h,w]),react.useEffect(()=>// const listener = listenResizeDebounced(onWindowResize);
|
|
34
|
+
// return listener;
|
|
35
|
+
dom.listenResizeDebounced(0,w,100),[w]),// respond to changes that are relevant for the listeners
|
|
36
|
+
react.useEffect(()=>{x(),z();},// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
37
|
+
[h]),/* , scrollChange, resizeChange */react.useEffect(()=>(// operate on mount, @kuus on the original version there is no call on mount?
|
|
38
|
+
w(),// remove all listeners when the components unmounts
|
|
39
|
+
x),// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
40
|
+
[]),[// the ref we expose to the user
|
|
41
|
+
e=>{e&&e!==g.current[0]&&(x(),g.current[0]=e,g.current[1]=m(e),z());},a,w])};
|
|
10
42
|
|
|
11
43
|
exports["default"] = useMeasure;
|
|
12
44
|
exports.useMeasure = useMeasure;
|
package/useMeasure.esm.js
CHANGED
|
@@ -2,6 +2,38 @@ import { useState, useRef, useEffect, useMemo } from 'react';
|
|
|
2
2
|
import { debounce, noop } from '@koine/utils';
|
|
3
3
|
import { listenScrollDebounced, listenResizeDebounced, off, on } from '@koine/dom';
|
|
4
4
|
|
|
5
|
-
let e;let m=e=>{let t=[];if(!e||e===document.body)return t;let{overflow:r,overflowX:n,overflowY:u}=window.getComputedStyle(e);return [r,n,u].some(e=>"auto"===e||"scroll"===e)&&t.push(e),[...t,...m(e.parentElement)]},p=["x","y","top","bottom","left","right","width","height"],d=(e,t)=>p.every(r=>e[r]===t[r])
|
|
5
|
+
let e;let m=e=>{let t=[];if(!e||e===document.body)return t;let{overflow:r,overflowX:n,overflowY:u}=window.getComputedStyle(e);return [r,n,u].some(e=>"auto"===e||"scroll"===e)&&t.push(e),[...t,...m(e.parentElement)]},p=["x","y","top","bottom","left","right","width","height"],d=(e,t)=>p.every(r=>e[r]===t[r]);// offsetSize?: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Use measure hook
|
|
8
|
+
*
|
|
9
|
+
* @borrows [pmndrs/react-use-measure](https://github.com/pmndrs/react-use-measure)
|
|
10
|
+
*/let useMeasure=p=>{let{scroll:h=!1}=/* offsetSize = false */p||{},[a,b]=useState({left:0,top:0,width:0,height:0,bottom:0,right:0,x:0,y:0}),// keep all state in a ref
|
|
11
|
+
g=useRef([// element
|
|
12
|
+
null,// scrollContainers
|
|
13
|
+
null,// resizeObserver
|
|
14
|
+
null,// lastBounds
|
|
15
|
+
a]),// make sure to update state only as long as the component is truly mounted
|
|
16
|
+
v=useRef(!1);useEffect(()=>(v.current=!0,()=>void(v.current=!1)),[]);// memoize handlers, so event-listeners know when they should update
|
|
17
|
+
let[w,,/* resizeChange */y]=useMemo(()=>{let e=(...e)=>{let[t,,,r]=g.current;if(!t)return;let n=t.getBoundingClientRect();// if (element instanceof HTMLElement && offsetSize) {
|
|
18
|
+
// size.height = element.offsetHeight;
|
|
19
|
+
// size.width = element.offsetWidth;
|
|
20
|
+
// }
|
|
21
|
+
Object.freeze(n),v.current&&!d(r,n)&&(g.current[3]=n,b(n));},t=debounce(e);return [e,t,t]},[b]);/* , offsetSize */// cleanup current scroll-listeners / observers
|
|
22
|
+
function x(){let[,e,t]=g.current;e&&(e.forEach(e=>off(e,"scroll",y)),g.current[1]=null),t&&(t.disconnect(),g.current[2]=null);}// add scroll-listeners / observers
|
|
23
|
+
function z(){let[t,r]=g.current;t&&!e&&ResizeObserver&&(e=new ResizeObserver(y),g.current[2]=e,e.observe(t),h&&r&&r.forEach(e=>on(e,"scroll",y,{capture:!0,passive:!0})));}return(// add general event listeners
|
|
24
|
+
// useOnWindowScroll(forceRefresh, Boolean(scroll));
|
|
25
|
+
// useOnWindowResize(() => {
|
|
26
|
+
// debugger;
|
|
27
|
+
// forceRefresh();
|
|
28
|
+
// });
|
|
29
|
+
useEffect(()=>h?listenScrollDebounced(0,w,100):noop,[h,w]),useEffect(()=>// const listener = listenResizeDebounced(onWindowResize);
|
|
30
|
+
// return listener;
|
|
31
|
+
listenResizeDebounced(0,w,100),[w]),// respond to changes that are relevant for the listeners
|
|
32
|
+
useEffect(()=>{x(),z();},// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
33
|
+
[h]),/* , scrollChange, resizeChange */useEffect(()=>(// operate on mount, @kuus on the original version there is no call on mount?
|
|
34
|
+
w(),// remove all listeners when the components unmounts
|
|
35
|
+
x),// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
36
|
+
[]),[// the ref we expose to the user
|
|
37
|
+
e=>{e&&e!==g.current[0]&&(x(),g.current[0]=e,g.current[1]=m(e),z());},a,w])};
|
|
6
38
|
|
|
7
39
|
export { useMeasure as default, useMeasure };
|
package/useMountedState.cjs.js
CHANGED
|
@@ -4,7 +4,9 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var react = require('react');
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* @borrows [streamich/react-use](https://github.com/streamich/react-use/blob/master/src/useMountedState.ts)
|
|
9
|
+
*/let useMountedState=()=>{let u=react.useRef(!1),n=react.useCallback(()=>u.current,[]);return react.useEffect(()=>(u.current=!0,()=>{u.current=!1;}),[]),n};
|
|
8
10
|
|
|
9
11
|
exports["default"] = useMountedState;
|
|
10
12
|
exports.useMountedState = useMountedState;
|
package/useMountedState.esm.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { useRef, useCallback, useEffect } from 'react';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* @borrows [streamich/react-use](https://github.com/streamich/react-use/blob/master/src/useMountedState.ts)
|
|
5
|
+
*/let useMountedState=()=>{let u=useRef(!1),n=useCallback(()=>u.current,[]);return useEffect(()=>(u.current=!0,()=>{u.current=!1;}),[]),n};
|
|
4
6
|
|
|
5
7
|
export { useMountedState as default, useMountedState };
|
package/useNavigateAway.cjs.js
CHANGED
|
@@ -5,7 +5,53 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var dom = require('@koine/dom');
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
// string | boolean,
|
|
9
|
+
// (() => unknown) | undefined,
|
|
10
|
+
// (() => unknown) | undefined,
|
|
11
|
+
// ];
|
|
12
|
+
// type UseNavigateAwayPagehideHandler = (event: PageTransitionEvent) => unknown;
|
|
13
|
+
/**
|
|
14
|
+
* @resources
|
|
15
|
+
*
|
|
16
|
+
* About browser's specs see:
|
|
17
|
+
* - https://developer.mozilla.org/en-US/docs/Web/API/Window/pagehide_event
|
|
18
|
+
* - https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511-SW5
|
|
19
|
+
* - https://stackoverflow.com/questions/58009424/pagehide-event-on-google-chrome
|
|
20
|
+
*
|
|
21
|
+
* About react see:
|
|
22
|
+
* - https://github.com/jacobbuck/react-beforeunload
|
|
23
|
+
* - https://github.com/dioscarey/react-beforeunload-component
|
|
24
|
+
*
|
|
25
|
+
* About next.js see:
|
|
26
|
+
* - https://github.com/vercel/next.js/issues/2476
|
|
27
|
+
* - https://github.com/vercel/next.js/issues/2694
|
|
28
|
+
*
|
|
29
|
+
* For the callback technique see:
|
|
30
|
+
* - https://stackoverflow.com/a/11835394/1938970
|
|
31
|
+
*/let useNavigateAway=a=>{let o=react.useRef();// const pagehideHandlerRef = useRef<UseNavigateAwayPagehideHandler | undefined>();
|
|
32
|
+
react.useEffect(()=>{o.current=e=>{let t=a(e);return(// Handle legacy `event.returnValue` property
|
|
33
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event
|
|
34
|
+
(t&&e.preventDefault(),"string"==typeof t)?e.returnValue=t:// Chrome doesn't support `event.preventDefault()` on `BeforeUnloadEvent`,
|
|
35
|
+
// instead it requires `event.returnValue` to be set
|
|
36
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload#browser_compatibility
|
|
37
|
+
e.defaultPrevented?e.returnValue="":void 0)};},// pagehideHandlerRef.current = (event) => {
|
|
38
|
+
// const returnValue = handler?.(event);
|
|
39
|
+
// if (event.persisted) {
|
|
40
|
+
// // If the event's persisted property is `true` the page is about
|
|
41
|
+
// // to enter the Back-Forward Cache, which is also in the frozen state.
|
|
42
|
+
// } else {
|
|
43
|
+
// // If the event's persisted property is not `true` the page is
|
|
44
|
+
// // about to be unloaded.
|
|
45
|
+
// }
|
|
46
|
+
// };
|
|
47
|
+
[a]),react.useEffect(()=>dom.on(window,"beforeunload",e=>o.current?.(e)),// const listenerPagehide = on(window, "pagehide", (event) =>
|
|
48
|
+
// pagehideHandlerRef.current?.(event)
|
|
49
|
+
// );
|
|
50
|
+
// return () => {
|
|
51
|
+
// listenerBeforeunload();
|
|
52
|
+
// // listenerPagehide();
|
|
53
|
+
// };
|
|
54
|
+
[]);};
|
|
9
55
|
|
|
10
56
|
exports["default"] = useNavigateAway;
|
|
11
57
|
exports.useNavigateAway = useNavigateAway;
|
package/useNavigateAway.esm.js
CHANGED
|
@@ -1,6 +1,52 @@
|
|
|
1
1
|
import { useRef, useEffect } from 'react';
|
|
2
2
|
import { on } from '@koine/dom';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
// string | boolean,
|
|
5
|
+
// (() => unknown) | undefined,
|
|
6
|
+
// (() => unknown) | undefined,
|
|
7
|
+
// ];
|
|
8
|
+
// type UseNavigateAwayPagehideHandler = (event: PageTransitionEvent) => unknown;
|
|
9
|
+
/**
|
|
10
|
+
* @resources
|
|
11
|
+
*
|
|
12
|
+
* About browser's specs see:
|
|
13
|
+
* - https://developer.mozilla.org/en-US/docs/Web/API/Window/pagehide_event
|
|
14
|
+
* - https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511-SW5
|
|
15
|
+
* - https://stackoverflow.com/questions/58009424/pagehide-event-on-google-chrome
|
|
16
|
+
*
|
|
17
|
+
* About react see:
|
|
18
|
+
* - https://github.com/jacobbuck/react-beforeunload
|
|
19
|
+
* - https://github.com/dioscarey/react-beforeunload-component
|
|
20
|
+
*
|
|
21
|
+
* About next.js see:
|
|
22
|
+
* - https://github.com/vercel/next.js/issues/2476
|
|
23
|
+
* - https://github.com/vercel/next.js/issues/2694
|
|
24
|
+
*
|
|
25
|
+
* For the callback technique see:
|
|
26
|
+
* - https://stackoverflow.com/a/11835394/1938970
|
|
27
|
+
*/let useNavigateAway=a=>{let o=useRef();// const pagehideHandlerRef = useRef<UseNavigateAwayPagehideHandler | undefined>();
|
|
28
|
+
useEffect(()=>{o.current=e=>{let t=a(e);return(// Handle legacy `event.returnValue` property
|
|
29
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event
|
|
30
|
+
(t&&e.preventDefault(),"string"==typeof t)?e.returnValue=t:// Chrome doesn't support `event.preventDefault()` on `BeforeUnloadEvent`,
|
|
31
|
+
// instead it requires `event.returnValue` to be set
|
|
32
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload#browser_compatibility
|
|
33
|
+
e.defaultPrevented?e.returnValue="":void 0)};},// pagehideHandlerRef.current = (event) => {
|
|
34
|
+
// const returnValue = handler?.(event);
|
|
35
|
+
// if (event.persisted) {
|
|
36
|
+
// // If the event's persisted property is `true` the page is about
|
|
37
|
+
// // to enter the Back-Forward Cache, which is also in the frozen state.
|
|
38
|
+
// } else {
|
|
39
|
+
// // If the event's persisted property is not `true` the page is
|
|
40
|
+
// // about to be unloaded.
|
|
41
|
+
// }
|
|
42
|
+
// };
|
|
43
|
+
[a]),useEffect(()=>on(window,"beforeunload",e=>o.current?.(e)),// const listenerPagehide = on(window, "pagehide", (event) =>
|
|
44
|
+
// pagehideHandlerRef.current?.(event)
|
|
45
|
+
// );
|
|
46
|
+
// return () => {
|
|
47
|
+
// listenerBeforeunload();
|
|
48
|
+
// // listenerPagehide();
|
|
49
|
+
// };
|
|
50
|
+
[]);};
|
|
5
51
|
|
|
6
52
|
export { useNavigateAway as default, useNavigateAway };
|
package/useScrollPosition.cjs.js
CHANGED
|
@@ -7,7 +7,13 @@ var utils = require('@koine/utils');
|
|
|
7
7
|
var dom = require('@koine/dom');
|
|
8
8
|
var useIsomorphicLayoutEffect = require('./useIsomorphicLayoutEffect.cjs.js');
|
|
9
9
|
|
|
10
|
-
let l={x:0,y:0},n=t=>t?.getBoundingClientRect(),u=(t,e)=>{if(!utils.isBrowser)return l;if(!e)return {x:window.scrollX,y:window.scrollY};let o=n(t?.current||document.body),u=n(e.current);return o?u?{x:(u.x||0)-(o.x||0),y:(u.y||0)-(o.y||0)}:{x:o.left,y:o.top}:l}
|
|
10
|
+
let l={x:0,y:0},n=t=>t?.getBoundingClientRect(),u=(t,e)=>{if(!utils.isBrowser)return l;if(!e)return {x:window.scrollX,y:window.scrollY};let o=n(t?.current||document.body),u=n(e.current);return o?u?{x:(u.x||0)-(o.x||0),y:(u.y||0)-(o.y||0)}:{x:o.left,y:o.top}:l};/**
|
|
11
|
+
* @borrows [@n8tb1t/use-scroll-position@2.0.3](https://github.com/n8tb1t/use-scroll-position) by `n8tb1t <n8tb1t@gmail.com>`
|
|
12
|
+
*
|
|
13
|
+
* We've just:
|
|
14
|
+
* - reused internal helper functions
|
|
15
|
+
* - compacted object arguments in functions as plain argument list to improve compression
|
|
16
|
+
*/let useScrollPosition=(l,n=[],i,c,m)=>{let f=react.useRef(u(null,c)),s=null,d=()=>{let t=u(i,c);l(t,f.current),f.current=t,s=null;};useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(()=>{if(!utils.isBrowser)return;let t=dom.listenScroll(()=>{m?null===s&&(s=window.setTimeout(d,m)):d();},c?.current);return ()=>{t(),s&&clearTimeout(s);}},n);};
|
|
11
17
|
|
|
12
18
|
exports["default"] = useScrollPosition;
|
|
13
19
|
exports.useScrollPosition = useScrollPosition;
|
package/useScrollPosition.esm.js
CHANGED
|
@@ -3,6 +3,12 @@ import { isBrowser } from '@koine/utils';
|
|
|
3
3
|
import { listenScroll } from '@koine/dom';
|
|
4
4
|
import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect.esm.js';
|
|
5
5
|
|
|
6
|
-
let l={x:0,y:0},n=t=>t?.getBoundingClientRect(),u=(t,e)=>{if(!isBrowser)return l;if(!e)return {x:window.scrollX,y:window.scrollY};let o=n(t?.current||document.body),u=n(e.current);return o?u?{x:(u.x||0)-(o.x||0),y:(u.y||0)-(o.y||0)}:{x:o.left,y:o.top}:l}
|
|
6
|
+
let l={x:0,y:0},n=t=>t?.getBoundingClientRect(),u=(t,e)=>{if(!isBrowser)return l;if(!e)return {x:window.scrollX,y:window.scrollY};let o=n(t?.current||document.body),u=n(e.current);return o?u?{x:(u.x||0)-(o.x||0),y:(u.y||0)-(o.y||0)}:{x:o.left,y:o.top}:l};/**
|
|
7
|
+
* @borrows [@n8tb1t/use-scroll-position@2.0.3](https://github.com/n8tb1t/use-scroll-position) by `n8tb1t <n8tb1t@gmail.com>`
|
|
8
|
+
*
|
|
9
|
+
* We've just:
|
|
10
|
+
* - reused internal helper functions
|
|
11
|
+
* - compacted object arguments in functions as plain argument list to improve compression
|
|
12
|
+
*/let useScrollPosition=(l,n=[],i,c,m)=>{let f=useRef(u(null,c)),s=null,d=()=>{let t=u(i,c);l(t,f.current),f.current=t,s=null;};useIsomorphicLayoutEffect(()=>{if(!isBrowser)return;let t=listenScroll(()=>{m?null===s&&(s=window.setTimeout(d,m)):d();},c?.current);return ()=>{t(),s&&clearTimeout(s);}},n);};
|
|
7
13
|
|
|
8
14
|
export { useScrollPosition as default, useScrollPosition };
|
|
@@ -6,7 +6,10 @@ var react = require('react');
|
|
|
6
6
|
var utils = require('@koine/utils');
|
|
7
7
|
var dom = require('@koine/dom');
|
|
8
8
|
|
|
9
|
-
let useScrollThreshold=(i,m)=>{let[u,f]=react.useState(!1),n=react.useCallback(()=>{if(i){let r=window.scrollY
|
|
9
|
+
let useScrollThreshold=(i,m)=>{let[u,f]=react.useState(!1),n=react.useCallback(()=>{if(i){let r=window.scrollY,// * -1;
|
|
10
|
+
e=r<i,o=r>i;// console.log("useScrollThreshold setIsBelow", isBelow, posY, threshold);
|
|
11
|
+
f(o),m&&m(e,o);}},[i,m]);return react.useEffect(()=>{if(i){// const listener = listenScrollThrottled(0, handler, 50);
|
|
12
|
+
let r=dom.listenScroll(n);return n(),r}return utils.noop},[i,n]),u};
|
|
10
13
|
|
|
11
14
|
exports["default"] = useScrollThreshold;
|
|
12
15
|
exports.useScrollThreshold = useScrollThreshold;
|
|
@@ -2,6 +2,9 @@ import { useState, useCallback, useEffect } from 'react';
|
|
|
2
2
|
import { noop } from '@koine/utils';
|
|
3
3
|
import { listenScroll } from '@koine/dom';
|
|
4
4
|
|
|
5
|
-
let useScrollThreshold=(i,m)=>{let[u,f]=useState(!1),n=useCallback(()=>{if(i){let r=window.scrollY
|
|
5
|
+
let useScrollThreshold=(i,m)=>{let[u,f]=useState(!1),n=useCallback(()=>{if(i){let r=window.scrollY,// * -1;
|
|
6
|
+
e=r<i,o=r>i;// console.log("useScrollThreshold setIsBelow", isBelow, posY, threshold);
|
|
7
|
+
f(o),m&&m(e,o);}},[i,m]);return useEffect(()=>{if(i){// const listener = listenScrollThrottled(0, handler, 50);
|
|
8
|
+
let r=listenScroll(n);return n(),r}return noop},[i,n]),u};
|
|
6
9
|
|
|
7
10
|
export { useScrollThreshold as default, useScrollThreshold };
|
package/useScrollTo.cjs.js
CHANGED
|
@@ -4,7 +4,9 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var utils = require('@koine/utils');
|
|
6
6
|
|
|
7
|
-
let useScrollTo=(o="",t=0)=>{
|
|
7
|
+
let useScrollTo=(o="",t=0)=>{// FIXME: is the useHeader still needed?
|
|
8
|
+
// const [, , headerHeight] = useHeader();
|
|
9
|
+
if(!utils.isBrowser)return;let l=document.getElementById(o),r=0;if(l&&l.offsetParent)do r+=l.offsetTop;while(l=l.offsetParent)r-=t,r-=/* headerHeight || */0,window.scroll(0,r);};
|
|
8
10
|
|
|
9
11
|
exports["default"] = useScrollTo;
|
|
10
12
|
exports.useScrollTo = useScrollTo;
|
package/useScrollTo.esm.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { isBrowser } from '@koine/utils';
|
|
2
2
|
|
|
3
|
-
let useScrollTo=(o="",t=0)=>{
|
|
3
|
+
let useScrollTo=(o="",t=0)=>{// FIXME: is the useHeader still needed?
|
|
4
|
+
// const [, , headerHeight] = useHeader();
|
|
5
|
+
if(!isBrowser)return;let l=document.getElementById(o),r=0;if(l&&l.offsetParent)do r+=l.offsetTop;while(l=l.offsetParent)r-=t,r-=/* headerHeight || */0,window.scroll(0,r);};
|
|
4
6
|
|
|
5
7
|
export { useScrollTo as default, useScrollTo };
|
package/useSmoothScroll.cjs.js
CHANGED
|
@@ -8,7 +8,12 @@ var dom = require('@koine/dom');
|
|
|
8
8
|
var useFixedOffset = require('./useFixedOffset.cjs.js');
|
|
9
9
|
require('./useIsomorphicLayoutEffect.cjs.js');
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
/**
|
|
12
|
+
*
|
|
13
|
+
* @param disregardAutomaticFixedOffset When the `to` scroll argument is a DOM
|
|
14
|
+
* selector we will keep into account the _fixedOffset_ despite this option.
|
|
15
|
+
* @returns
|
|
16
|
+
*/let useSmoothScroll=m=>{let i=useFixedOffset.useFixedOffset();return react.useCallback((e,l,f,u,n)=>{let c;let p=!1;if(utils.isNumber(e))c=e;else if(e){let t=document.getElementById(e);t&&(c=dom.getOffsetTopSlim(t)-i.current,p=!0);}utils.isNumber(c)&&dom.scrollTo(c=c+(l||0)+(m||p?0:i.current),f,u,n);},[m,i])};
|
|
12
17
|
|
|
13
18
|
exports["default"] = useSmoothScroll;
|
|
14
19
|
exports.useSmoothScroll = useSmoothScroll;
|
package/useSmoothScroll.esm.js
CHANGED
|
@@ -4,6 +4,11 @@ import { getOffsetTopSlim, scrollTo } from '@koine/dom';
|
|
|
4
4
|
import { useFixedOffset } from './useFixedOffset.esm.js';
|
|
5
5
|
import './useIsomorphicLayoutEffect.esm.js';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* @param disregardAutomaticFixedOffset When the `to` scroll argument is a DOM
|
|
10
|
+
* selector we will keep into account the _fixedOffset_ despite this option.
|
|
11
|
+
* @returns
|
|
12
|
+
*/let useSmoothScroll=m=>{let i=useFixedOffset();return useCallback((e,l,f,u,n)=>{let c;let p=!1;if(isNumber(e))c=e;else if(e){let t=document.getElementById(e);t&&(c=getOffsetTopSlim(t)-i.current,p=!0);}isNumber(c)&&scrollTo(c=c+(l||0)+(m||p?0:i.current),f,u,n);},[m,i])};
|
|
8
13
|
|
|
9
14
|
export { useSmoothScroll as default, useSmoothScroll };
|