@koine/react 2.0.0-beta.82 → 2.0.0-beta.84

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.
Files changed (53) hide show
  1. package/FaviconTags.cjs.js +10 -1
  2. package/FaviconTags.esm.js +10 -1
  3. package/Meta.cjs.js +10 -1
  4. package/Meta.esm.js +10 -1
  5. package/NoJs.cjs.js +1 -1
  6. package/NoJs.esm.js +1 -1
  7. package/calendar.cjs.js +97 -8
  8. package/calendar.esm.js +97 -8
  9. package/classed.cjs.js +42 -1
  10. package/classed.esm.js +42 -1
  11. package/createUseMediaQueryWidth.cjs.js +15 -1
  12. package/createUseMediaQueryWidth.esm.js +15 -1
  13. package/extendComponent.cjs.js +5 -1
  14. package/extendComponent.esm.js +5 -1
  15. package/forms.cjs.js +27 -1
  16. package/forms.esm.js +27 -1
  17. package/package.json +3 -3
  18. package/useAsyncFn.cjs.js +4 -1
  19. package/useAsyncFn.esm.js +4 -1
  20. package/useFirstMountState.cjs.js +3 -1
  21. package/useFirstMountState.esm.js +3 -1
  22. package/useFixedOffset.cjs.js +12 -1
  23. package/useFixedOffset.esm.js +12 -1
  24. package/useFocus.cjs.js +3 -1
  25. package/useFocus.esm.js +3 -1
  26. package/useInterval.cjs.js +6 -1
  27. package/useInterval.esm.js +6 -1
  28. package/useIsomorphicLayoutEffect.cjs.js +3 -1
  29. package/useIsomorphicLayoutEffect.esm.js +3 -1
  30. package/useKeyUp.cjs.js +6 -1
  31. package/useKeyUp.esm.js +6 -1
  32. package/useMeasure.cjs.js +33 -1
  33. package/useMeasure.esm.js +33 -1
  34. package/useMountedState.cjs.js +3 -1
  35. package/useMountedState.esm.js +3 -1
  36. package/useNavigateAway.cjs.js +47 -1
  37. package/useNavigateAway.esm.js +47 -1
  38. package/useScrollPosition.cjs.js +7 -1
  39. package/useScrollPosition.esm.js +7 -1
  40. package/useScrollThreshold.cjs.js +4 -1
  41. package/useScrollThreshold.esm.js +4 -1
  42. package/useScrollTo.cjs.js +3 -1
  43. package/useScrollTo.esm.js +3 -1
  44. package/useSmoothScroll.cjs.js +6 -1
  45. package/useSmoothScroll.esm.js +6 -1
  46. package/useSpinDelay.cjs.js +12 -1
  47. package/useSpinDelay.esm.js +12 -1
  48. package/useTraceUpdate.cjs.js +4 -1
  49. package/useTraceUpdate.esm.js +4 -1
  50. package/useUpdateEffect.cjs.js +4 -1
  51. package/useUpdateEffect.esm.js +4 -1
  52. package/useWindowSize.cjs.js +9 -1
  53. 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
- 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:yup.object(o).required(),encodedNames:i}};let decodeForm=e=>{let r={};for(let i in e){let l=utils.decode(i);i.startsWith("_")?r[i.substring(1)]=e[i]:utils.isUndefined(e[i])||""!==e[l]||(r[l]=e[i]);}return r};
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
- 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:object(o).required(),encodedNames:i}};let decodeForm=e=>{let r={};for(let i in e){let l=decode(i);i.startsWith("_")?r[i.substring(1)]=e[i]:isUndefined(e[i])||""!==e[l]||(r[l]=e[i]);}return r};
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.82",
6
- "@koine/utils": "2.0.0-beta.82"
5
+ "@koine/dom": "2.0.0-beta.84",
6
+ "@koine/utils": "2.0.0-beta.84"
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.82"
193
+ "version": "2.0.0-beta.84"
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
- 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))},u);return [i,g]};
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
- 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))},u);return [i,g]};
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
- let useFirstMountState=()=>{let r=react.useRef(!0);return r.current?(r.current=!1,!0):r.current};
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
- let useFirstMountState=()=>{let r=useRef(!0);return r.current?(r.current=!1,!0):r.current};
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 };
@@ -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}`);};let useFixedOffset=i=>{let l=react.useRef(0);return useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(()=>{let e=()=>{let e=dom.calculateFixedOffset();l.current=e,n(e);};if(e(),!ResizeObserver)return dom.listenResizeDebounced(0,e);{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};
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;
@@ -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}`);};let useFixedOffset=i=>{let l=useRef(0);return useIsomorphicLayoutEffect(()=>{let e=()=>{let e=calculateFixedOffset();l.current=e,n(e);};if(e(),!ResizeObserver)return listenResizeDebounced(0,e);{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};
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
- let useFocus=()=>{let r=react.useRef(null);return [r,()=>{r.current&&r.current.focus();}]};
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
- let useFocus=()=>{let r=useRef(null);return [r,()=>{r.current&&r.current.focus();}]};
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 };
@@ -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
- let useInterval=(n,l,u=[])=>{let o=react.useRef();react.useEffect(()=>{o.current=n;},[n,...u]),react.useEffect(()=>{if(null!==l){let r=setInterval(function(){o.current&&o.current();},l);return ()=>clearInterval(r)}return utils.noop},[l]);};
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;
@@ -1,6 +1,11 @@
1
1
  import { useRef, useEffect } from 'react';
2
2
  import { noop } from '@koine/utils';
3
3
 
4
- let useInterval=(n,l,u=[])=>{let o=useRef();useEffect(()=>{o.current=n;},[n,...u]),useEffect(()=>{if(null!==l){let r=setInterval(function(){o.current&&o.current();},l);return ()=>clearInterval(r)}return noop},[l]);};
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
- let useIsomorphicLayoutEffect=utils.isBrowser?react.useLayoutEffect:react.useEffect;
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
- let useIsomorphicLayoutEffect=isBrowser?useLayoutEffect:useEffect;
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=>{e.ctrlKey||e.altKey||e.shiftKey||e.metaKey||o(e);}),[o,...r]);};
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=>{e.ctrlKey||e.altKey||e.shiftKey||e.metaKey||o(e);}),[o,...r]);};
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]);let useMeasure=p=>{let{scroll:h=!1}=p||{},[a,b]=react.useState({left:0,top:0,width:0,height:0,bottom:0,right:0,x:0,y:0}),g=react.useRef([null,null,null,a]),v=react.useRef(!1);react.useEffect(()=>(v.current=!0,()=>void(v.current=!1)),[]);let[w,,y]=react.useMemo(()=>{let e=(...e)=>{let[t,,,r]=g.current;if(!t)return;let n=t.getBoundingClientRect();Object.freeze(n),v.current&&!d(r,n)&&(g.current[3]=n,b(n));},t=utils.debounce(e);return [e,t,t]},[b]);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);}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 react.useEffect(()=>h?dom.listenScrollDebounced(0,w,100):utils.noop,[h,w]),react.useEffect(()=>dom.listenResizeDebounced(0,w,100),[w]),react.useEffect(()=>{x(),z();},[h]),react.useEffect(()=>(w(),x),[]),[e=>{e&&e!==g.current[0]&&(x(),g.current[0]=e,g.current[1]=m(e),z());},a,w]};
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]);let useMeasure=p=>{let{scroll:h=!1}=p||{},[a,b]=useState({left:0,top:0,width:0,height:0,bottom:0,right:0,x:0,y:0}),g=useRef([null,null,null,a]),v=useRef(!1);useEffect(()=>(v.current=!0,()=>void(v.current=!1)),[]);let[w,,y]=useMemo(()=>{let e=(...e)=>{let[t,,,r]=g.current;if(!t)return;let n=t.getBoundingClientRect();Object.freeze(n),v.current&&!d(r,n)&&(g.current[3]=n,b(n));},t=debounce(e);return [e,t,t]},[b]);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);}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 useEffect(()=>h?listenScrollDebounced(0,w,100):noop,[h,w]),useEffect(()=>listenResizeDebounced(0,w,100),[w]),useEffect(()=>{x(),z();},[h]),useEffect(()=>(w(),x),[]),[e=>{e&&e!==g.current[0]&&(x(),g.current[0]=e,g.current[1]=m(e),z());},a,w]};
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 };
@@ -4,7 +4,9 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var react = require('react');
6
6
 
7
- let useMountedState=()=>{let u=react.useRef(!1),n=react.useCallback(()=>u.current,[]);return react.useEffect(()=>(u.current=!0,()=>{u.current=!1;}),[]),n};
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;
@@ -1,5 +1,7 @@
1
1
  import { useRef, useCallback, useEffect } from 'react';
2
2
 
3
- let useMountedState=()=>{let u=useRef(!1),n=useCallback(()=>u.current,[]);return useEffect(()=>(u.current=!0,()=>{u.current=!1;}),[]),n};
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 };
@@ -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
- let useNavigateAway=a=>{let o=react.useRef();react.useEffect(()=>{o.current=e=>{let t=a(e);return (t&&e.preventDefault(),"string"==typeof t)?e.returnValue=t:e.defaultPrevented?e.returnValue="":void 0};},[a]),react.useEffect(()=>dom.on(window,"beforeunload",e=>o.current?.(e)),[]);};
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;
@@ -1,6 +1,52 @@
1
1
  import { useRef, useEffect } from 'react';
2
2
  import { on } from '@koine/dom';
3
3
 
4
- let useNavigateAway=a=>{let o=useRef();useEffect(()=>{o.current=e=>{let t=a(e);return (t&&e.preventDefault(),"string"==typeof t)?e.returnValue=t:e.defaultPrevented?e.returnValue="":void 0};},[a]),useEffect(()=>on(window,"beforeunload",e=>o.current?.(e)),[]);};
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 };
@@ -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};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);};
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;
@@ -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};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);};
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,e=r<i,o=r>i;f(o),m&&m(e,o);}},[i,m]);return react.useEffect(()=>{if(i){let r=dom.listenScroll(n);return n(),r}return utils.noop},[i,n]),u};
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,e=r<i,o=r>i;f(o),m&&m(e,o);}},[i,m]);return useEffect(()=>{if(i){let r=listenScroll(n);return n(),r}return noop},[i,n]),u};
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 };
@@ -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)=>{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-=0,window.scroll(0,r);};
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;
@@ -1,5 +1,7 @@
1
1
  import { isBrowser } from '@koine/utils';
2
2
 
3
- let useScrollTo=(o="",t=0)=>{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-=0,window.scroll(0,r);};
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 };
@@ -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
- 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])};
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;
@@ -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
- 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])};
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 };