@koine/react 2.0.0-beta.75 → 2.0.0-beta.76

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 (182) hide show
  1. package/FaviconTags.js +1 -5
  2. package/Meta.js +1 -5
  3. package/NoJs.js +1 -7
  4. package/Polymorphic.js +1 -1
  5. package/calendar/CalendarDaygridCell.js +1 -42
  6. package/calendar/CalendarDaygridNav.js +1 -22
  7. package/calendar/CalendarDaygridTable.js +1 -50
  8. package/calendar/CalendarLegend.js +1 -4
  9. package/calendar/calendar-api-google.js +1 -90
  10. package/calendar/types.js +1 -1
  11. package/calendar/useCalendar.js +1 -175
  12. package/calendar/useDateLocale.js +1 -16
  13. package/calendar/utils.js +1 -172
  14. package/calendar.js +1 -7
  15. package/{components → cjs}/FaviconTags.d.ts +1 -0
  16. package/cjs/FaviconTags.js +1 -0
  17. package/{components → cjs}/Meta.d.ts +1 -0
  18. package/cjs/Meta.js +1 -0
  19. package/{components → cjs}/NoJs.d.ts +1 -0
  20. package/cjs/NoJs.js +1 -0
  21. package/cjs/Polymorphic.js +1 -0
  22. package/cjs/calendar/CalendarDaygridCell.d.ts +35 -0
  23. package/cjs/calendar/CalendarDaygridCell.js +1 -0
  24. package/cjs/calendar/CalendarDaygridNav.d.ts +27 -0
  25. package/cjs/calendar/CalendarDaygridNav.js +1 -0
  26. package/cjs/calendar/CalendarDaygridTable.d.ts +25 -0
  27. package/cjs/calendar/CalendarDaygridTable.js +1 -0
  28. package/cjs/calendar/CalendarLegend.d.ts +18 -0
  29. package/cjs/calendar/CalendarLegend.js +1 -0
  30. package/cjs/calendar/calendar-api-google.d.ts +10 -0
  31. package/cjs/calendar/calendar-api-google.js +1 -0
  32. package/cjs/calendar/types.d.ts +62 -0
  33. package/cjs/calendar/types.js +1 -0
  34. package/cjs/calendar/useCalendar.d.ts +35 -0
  35. package/cjs/calendar/useCalendar.js +1 -0
  36. package/cjs/calendar/useDateLocale.d.ts +2 -0
  37. package/cjs/calendar/useDateLocale.js +1 -0
  38. package/cjs/calendar/utils.d.ts +11 -0
  39. package/cjs/calendar/utils.js +1 -0
  40. package/cjs/calendar.d.ts +7 -0
  41. package/cjs/calendar.js +1 -0
  42. package/{utils → cjs}/classed.d.ts +2 -2
  43. package/cjs/classed.js +1 -0
  44. package/{utils → cjs}/createUseMediaQueryWidth.d.ts +1 -1
  45. package/cjs/createUseMediaQueryWidth.js +1 -0
  46. package/{utils → cjs}/extendComponent.d.ts +1 -1
  47. package/cjs/extendComponent.js +1 -0
  48. package/cjs/forms/antispam.d.ts +27 -0
  49. package/cjs/forms/antispam.js +1 -0
  50. package/cjs/forms.d.ts +1 -0
  51. package/cjs/forms.js +1 -0
  52. package/{hooks → cjs}/index.d.ts +9 -0
  53. package/cjs/index.js +1 -0
  54. package/{utils → cjs}/mergeRefs.d.ts +1 -0
  55. package/cjs/mergeRefs.js +1 -0
  56. package/cjs/package.json +31 -0
  57. package/cjs/types.d.ts +2 -0
  58. package/cjs/types.js +1 -0
  59. package/{hooks → cjs}/useAsyncFn.d.ts +1 -1
  60. package/cjs/useAsyncFn.js +1 -0
  61. package/{hooks → cjs}/useFirstMountState.d.ts +1 -0
  62. package/cjs/useFirstMountState.js +1 -0
  63. package/{hooks → cjs}/useFixedOffset.d.ts +1 -0
  64. package/cjs/useFixedOffset.js +1 -0
  65. package/{hooks → cjs}/useFocus.d.ts +1 -0
  66. package/cjs/useFocus.js +1 -0
  67. package/{hooks → cjs}/useInterval.d.ts +1 -0
  68. package/cjs/useInterval.js +1 -0
  69. package/cjs/useIsomorphicLayoutEffect.d.ts +3 -0
  70. package/cjs/useIsomorphicLayoutEffect.js +1 -0
  71. package/{hooks → cjs}/useKeyUp.d.ts +1 -0
  72. package/cjs/useKeyUp.js +1 -0
  73. package/{hooks → cjs}/useMeasure.d.ts +1 -1
  74. package/cjs/useMeasure.js +1 -0
  75. package/{hooks → cjs}/useMountedState.d.ts +1 -0
  76. package/cjs/useMountedState.js +1 -0
  77. package/{hooks → cjs}/useNavigateAway.d.ts +1 -0
  78. package/cjs/useNavigateAway.js +1 -0
  79. package/{hooks → cjs}/usePrevious.d.ts +1 -0
  80. package/cjs/usePrevious.js +1 -0
  81. package/{hooks → cjs}/usePreviousRef.d.ts +1 -0
  82. package/cjs/usePreviousRef.js +1 -0
  83. package/{hooks → cjs}/useReveal.d.ts +1 -0
  84. package/cjs/useReveal.js +1 -0
  85. package/{hooks → cjs}/useScrollPosition.d.ts +1 -1
  86. package/cjs/useScrollPosition.js +1 -0
  87. package/{hooks → cjs}/useScrollThreshold.d.ts +1 -0
  88. package/cjs/useScrollThreshold.js +1 -0
  89. package/{hooks → cjs}/useScrollTo.d.ts +1 -0
  90. package/cjs/useScrollTo.js +1 -0
  91. package/{hooks → cjs}/useSmoothScroll.d.ts +1 -0
  92. package/cjs/useSmoothScroll.js +1 -0
  93. package/{hooks → cjs}/useSpinDelay.d.ts +1 -0
  94. package/cjs/useSpinDelay.js +1 -0
  95. package/{hooks → cjs}/useTraceUpdate.d.ts +1 -0
  96. package/cjs/useTraceUpdate.js +1 -0
  97. package/{hooks → cjs}/useUpdateEffect.d.ts +1 -0
  98. package/cjs/useUpdateEffect.js +1 -0
  99. package/{hooks → cjs}/useWindowSize.d.ts +1 -0
  100. package/cjs/useWindowSize.js +1 -0
  101. package/classed.d.ts +1 -1
  102. package/classed.js +1 -41
  103. package/createUseMediaQueryWidth.js +1 -38
  104. package/extendComponent.js +1 -9
  105. package/forms/antispam.js +1 -29
  106. package/forms.js +1 -1
  107. package/index.js +1 -26
  108. package/mergeRefs.js +1 -13
  109. package/package.json +53 -136
  110. package/types.js +1 -1
  111. package/useAsyncFn.js +1 -26
  112. package/useFirstMountState.js +1 -10
  113. package/useFixedOffset.js +1 -42
  114. package/useFocus.js +1 -9
  115. package/useInterval.js +1 -20
  116. package/useIsomorphicLayoutEffect.d.ts +2 -2
  117. package/useIsomorphicLayoutEffect.js +1 -4
  118. package/useKeyUp.js +1 -16
  119. package/useMeasure.js +1 -119
  120. package/useMountedState.js +1 -13
  121. package/useNavigateAway.js +1 -25
  122. package/usePrevious.js +1 -9
  123. package/usePreviousRef.js +1 -9
  124. package/useReveal.js +1 -42
  125. package/useScrollPosition.js +1 -58
  126. package/useScrollThreshold.js +1 -26
  127. package/useScrollTo.js +1 -18
  128. package/useSmoothScroll.js +1 -32
  129. package/useSpinDelay.js +1 -36
  130. package/useTraceUpdate.js +1 -17
  131. package/useUpdateEffect.js +1 -11
  132. package/useWindowSize.js +1 -20
  133. package/README.md +0 -1
  134. package/calendar.cjs.d.ts +0 -1
  135. package/calendar.cjs.default.js +0 -1
  136. package/calendar.cjs.js +0 -62
  137. package/calendar.cjs.mjs +0 -2
  138. package/calendar.esm.js +0 -35
  139. package/components/FaviconTags.js +0 -4
  140. package/components/Meta.js +0 -4
  141. package/components/NoJs.js +0 -6
  142. package/forms.cjs.d.ts +0 -1
  143. package/forms.cjs.default.js +0 -1
  144. package/forms.cjs.js +0 -11
  145. package/forms.cjs.mjs +0 -2
  146. package/forms.esm.js +0 -6
  147. package/hooks/index.js +0 -19
  148. package/hooks/useAsyncFn.js +0 -25
  149. package/hooks/useFirstMountState.js +0 -9
  150. package/hooks/useFixedOffset.js +0 -41
  151. package/hooks/useFocus.js +0 -8
  152. package/hooks/useInterval.js +0 -19
  153. package/hooks/useIsomorphicLayoutEffect.d.ts +0 -2
  154. package/hooks/useIsomorphicLayoutEffect.js +0 -3
  155. package/hooks/useKeyUp.js +0 -15
  156. package/hooks/useMeasure.js +0 -118
  157. package/hooks/useMountedState.js +0 -12
  158. package/hooks/useNavigateAway.js +0 -24
  159. package/hooks/usePrevious.js +0 -8
  160. package/hooks/usePreviousRef.js +0 -8
  161. package/hooks/useReveal.js +0 -41
  162. package/hooks/useScrollPosition.js +0 -57
  163. package/hooks/useScrollThreshold.js +0 -25
  164. package/hooks/useScrollTo.js +0 -17
  165. package/hooks/useSmoothScroll.js +0 -31
  166. package/hooks/useSpinDelay.js +0 -35
  167. package/hooks/useTraceUpdate.js +0 -16
  168. package/hooks/useUpdateEffect.js +0 -10
  169. package/hooks/useWindowSize.js +0 -19
  170. package/index.cjs.d.ts +0 -1
  171. package/index.cjs.default.js +0 -1
  172. package/index.cjs.js +0 -87
  173. package/index.cjs.mjs +0 -2
  174. package/index.esm.js +0 -58
  175. package/utils/Polymorphic.js +0 -1
  176. package/utils/classed.js +0 -40
  177. package/utils/createUseMediaQueryWidth.js +0 -37
  178. package/utils/extendComponent.js +0 -8
  179. package/utils/index.d.ts +0 -5
  180. package/utils/index.js +0 -4
  181. package/utils/mergeRefs.js +0 -12
  182. /package/{utils → cjs}/Polymorphic.d.ts +0 -0
@@ -1,25 +0,0 @@
1
- import { useCallback, useEffect, useState } from "react";
2
- import { noop } from "@koine/utils";
3
- import { listenScroll } from "@koine/dom";
4
- export let useScrollThreshold = (threshold, callback) => {
5
- const [isBelow, setIsBelow] = useState(false);
6
- const handler = useCallback(() => {
7
- if (threshold) {
8
- const posY = window.scrollY;
9
- const isAbove = posY < threshold;
10
- const isBelow = posY > threshold;
11
- setIsBelow(isBelow);
12
- if (callback)
13
- callback(isAbove, isBelow);
14
- }
15
- }, [threshold, callback]);
16
- useEffect(() => {
17
- if (threshold) {
18
- const listener = listenScroll(handler);
19
- handler();
20
- return listener;
21
- }
22
- return noop;
23
- }, [threshold, handler]);
24
- return isBelow;
25
- };
@@ -1,17 +0,0 @@
1
- import { isBrowser } from "@koine/utils";
2
- export let useScrollTo = (id = "", offset = 0) => {
3
- if (!isBrowser) {
4
- return;
5
- }
6
- const headerOffset = 0;
7
- let element = document.getElementById(id);
8
- let top = 0;
9
- if (element && element.offsetParent) {
10
- do {
11
- top += element.offsetTop;
12
- } while ((element = element.offsetParent));
13
- }
14
- top -= offset;
15
- top -= headerOffset;
16
- window.scroll(0, top);
17
- };
@@ -1,31 +0,0 @@
1
- import { useCallback } from "react";
2
- import { isNumber } from "@koine/utils";
3
- import { getOffsetTopSlim, scrollTo } from "@koine/dom";
4
- import { useFixedOffset } from "./useFixedOffset";
5
- export let useSmoothScroll = (disregardAutomaticFixedOffset) => {
6
- const fixedOffset = useFixedOffset();
7
- const scroll = useCallback((to, customOffset, callback, fallbackTimeout, behavior) => {
8
- let top = undefined;
9
- let toIsElement = false;
10
- if (isNumber(to)) {
11
- top = to;
12
- }
13
- else if (to) {
14
- const el = document.getElementById(to);
15
- if (el) {
16
- top = getOffsetTopSlim(el) - fixedOffset.current;
17
- toIsElement = true;
18
- }
19
- }
20
- if (isNumber(top)) {
21
- top =
22
- top +
23
- (customOffset || 0) +
24
- (disregardAutomaticFixedOffset || toIsElement
25
- ? 0
26
- : fixedOffset.current);
27
- scrollTo(top, callback, fallbackTimeout, behavior);
28
- }
29
- }, [disregardAutomaticFixedOffset, fixedOffset]);
30
- return scroll;
31
- };
@@ -1,35 +0,0 @@
1
- import { useEffect, useRef, useState } from "react";
2
- var State;
3
- (function (State) {
4
- State[State["IDLE"] = 0] = "IDLE";
5
- State[State["DELAY"] = 1] = "DELAY";
6
- State[State["DISPLAY"] = 2] = "DISPLAY";
7
- State[State["EXPIRE"] = 3] = "EXPIRE";
8
- })(State || (State = {}));
9
- export let useSpinDelay = (loading, delay = 500, minDuration = 200) => {
10
- const [state, setState] = useState(State.IDLE);
11
- const timeout = useRef();
12
- useEffect(() => {
13
- if (loading && state === State.IDLE) {
14
- clearTimeout(timeout.current);
15
- timeout.current = setTimeout(() => {
16
- if (!loading) {
17
- return setState(State.IDLE);
18
- }
19
- timeout.current = setTimeout(() => {
20
- setState(State.EXPIRE);
21
- }, minDuration);
22
- setState(State.DISPLAY);
23
- }, delay);
24
- setState(State.DELAY);
25
- }
26
- if (!loading && state !== State.DISPLAY) {
27
- clearTimeout(timeout.current);
28
- setState(State.IDLE);
29
- }
30
- }, [loading, state, delay, minDuration]);
31
- useEffect(() => {
32
- return () => clearTimeout(timeout.current);
33
- }, []);
34
- return state === State.DISPLAY || state === State.EXPIRE;
35
- };
@@ -1,16 +0,0 @@
1
- import { useEffect, useRef } from "react";
2
- export let useTraceUpdate = (props) => {
3
- const prev = useRef(props);
4
- useEffect(() => {
5
- const changedProps = Object.entries(props).reduce((ps, [k, v]) => {
6
- if (prev.current[k] !== v) {
7
- ps[k] = [prev.current[k], v];
8
- }
9
- return ps;
10
- }, {});
11
- if (Object.keys(changedProps).length > 0) {
12
- console.info("[@koine/react:useTraceUpdate] changed props:", changedProps);
13
- }
14
- prev.current = props;
15
- });
16
- };
@@ -1,10 +0,0 @@
1
- import { useEffect } from "react";
2
- import { useFirstMountState } from "./useFirstMountState";
3
- export let useUpdateEffect = (effect, deps) => {
4
- const isFirstMount = useFirstMountState();
5
- useEffect(() => {
6
- if (!isFirstMount) {
7
- return effect();
8
- }
9
- }, deps);
10
- };
@@ -1,19 +0,0 @@
1
- import { useEffect, useState } from "react";
2
- import { debounce } from "@koine/utils";
3
- import { listenResize, listenResizeDebounced } from "@koine/dom";
4
- export let useWindowSize = (wait, immediate) => {
5
- const [width, widthSet] = useState(0);
6
- const [height, heightSet] = useState(0);
7
- useEffect(() => {
8
- const updateSize = () => {
9
- widthSet(window.innerWidth);
10
- heightSet(window.innerHeight);
11
- };
12
- const listener = wait
13
- ? listenResizeDebounced(0, updateSize, wait, immediate)
14
- : listenResize(updateSize);
15
- updateSize();
16
- return listener;
17
- }, [wait, immediate]);
18
- return [width, height];
19
- };
package/index.cjs.d.ts DELETED
@@ -1 +0,0 @@
1
- export * from "./index";
@@ -1 +0,0 @@
1
- exports._default = require('./index.cjs.js').default;
package/index.cjs.js DELETED
@@ -1,87 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var react = require('react');
6
- var utils = require('@koine/utils');
7
- var jsxRuntime = require('react/jsx-runtime');
8
- var dom = require('@koine/dom');
9
-
10
- let classed=r=>{let s=r.type||r;return function(r,...a){return react.forwardRef(function(e,n){let o=a.map((t,s)=>{let a="";return "function"==typeof t?a=t(e):void 0!==t&&(a=t.toString()),r[s]+a}).join(""),l="string"==typeof s,i=l?{}:e;if(l)for(let t in e)t.startsWith("$")||(i[t]=e[t]);let c=o||r[0];return c=(c.match(/class="([^"]*)/)?.[1]||c)+(e?.className?" "+e?.className:""),react.createElement(s,{...i,className:c||void 0,ref:n})})}};
11
-
12
- let useIsomorphicLayoutEffect=utils.isBrowser?react.useLayoutEffect:react.useEffect;
13
-
14
- let createUseMediaQueryWidth=n=>{let a=utils.getMediaQueryWidthResolvers(n);return function(t,n){let[o,s]=t.substring(1).split("-");utils.isUndefined(s)&&(s=o),utils.isUndefined(o)&&(o="min");let[d,m]=s.split("_"),u=a[o](d,m),[c,l]=react.useState(utils.isUndefined(n)?null:n);return useIsomorphicLayoutEffect(()=>{let e=window.matchMedia(u),t=e=>{l(e.matches);};return (l(e.matches),e.addEventListener)?(e.addEventListener("change",t),()=>{e.removeEventListener("change",t);}):(e.addListener(t),()=>{e.removeListener(t);})},[u]),c}};
15
-
16
- let extendComponent=(t,o)=>Object.assign(o=>react.createElement(t,o),{...o,defaultProps:o});
17
-
18
- let FaviconTags=({name:a,color:t,safariTabColor:o,tileColor:c,themeColor:l})=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("link",{rel:"shortcut icon",href:"/favicon.ico",type:"image/x-icon"}),jsxRuntime.jsx("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/apple-touch-icon.png"}),jsxRuntime.jsx("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicon-32x32.png"}),jsxRuntime.jsx("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicon-16x16.png"}),jsxRuntime.jsx("link",{rel:"manifest",href:"/site.webmanifest"}),jsxRuntime.jsx("link",{rel:"mask-icon",href:"/safari-pinned-tab.svg",color:o||t}),jsxRuntime.jsx("meta",{name:"apple-mobile-web-app-title",content:a}),jsxRuntime.jsx("meta",{name:"application-name",content:a}),jsxRuntime.jsx("meta",{name:"msapplication-TileColor",content:c||t}),jsxRuntime.jsx("meta",{name:"theme-color",content:l||t})]});
19
-
20
- let mergeRefs=e=>r=>{e.forEach(e=>{"function"==typeof e?e(r):null!=e&&(e.current=r);});};
21
-
22
- let Meta=({zoom:t})=>jsxRuntime.jsx("meta",{name:"viewport",content:`width=device-width, initial-scale=1, maximum-scale=1${t?"":", user-scalable=0"}`});
23
-
24
- let NoJs=t=>jsxRuntime.jsx("script",{id:"no-js",dangerouslySetInnerHTML:{__html:'document.querySelector("html").className=document.querySelector("html").className.replace(/no-js/,"") + "js";'}});
25
-
26
- let useMountedState=()=>{let u=react.useRef(!1),n=react.useCallback(()=>u.current,[]);return react.useEffect(()=>(u.current=!0,()=>{u.current=!1;}),[]),n};
27
-
28
- let useAsyncFn=(o,u=[],l={loading:!1})=>{let a=react.useRef(0),d=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]};
29
-
30
- let useFirstMountState=()=>{let r=react.useRef(!0);return r.current?(r.current=!1,!0):r.current};
31
-
32
- let n$1=e=>{dom.injectCss("useFixedOffset",`html{scroll-padding-top: ${e}px}`);};let useFixedOffset=i=>{let l=react.useRef(0);return useIsomorphicLayoutEffect(()=>{let e=()=>{let e=dom.calculateFixedOffset();l.current=e,n$1(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$1(r),400,!0)();});return dom.$each(i||"[data-fixed]",t=>{e&&e.observe(t);}),()=>{e?.disconnect();}}},[i]),l};
33
-
34
- let useFocus=()=>{let r=react.useRef(null);return [r,()=>{r.current&&r.current.focus();}]};
35
-
36
- 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]);};
37
-
38
- let useKeyUp=(o,r=[])=>{react.useEffect(()=>dom.on(window,"keyup",e=>{e.ctrlKey||e.altKey||e.shiftKey||e.metaKey||o(e);}),[o,...r]);};
39
-
40
- 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]};
41
-
42
- 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)),[]);};
43
-
44
- let usePrevious=(r,t)=>{let[o,u]=react.useState([r,t]);return o[1]!==r&&u([o[1],r]),o[0]};
45
-
46
- let usePreviousRef=t=>{let u=react.useRef();return react.useEffect(()=>{u.current=t;}),u.current};
47
-
48
- 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(()=>{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);};
49
-
50
- 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};
51
-
52
- let useSmoothScroll=m=>{let i=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])};
53
-
54
- let useSpinDelay=(u,c=500,i=200)=>{let[n,o]=react.useState(0),l=react.useRef();return react.useEffect(()=>{u&&0===n&&(clearTimeout(l.current),l.current=setTimeout(()=>{if(!u)return o(0);l.current=setTimeout(()=>{o(3);},i),o(2);},c),o(1)),u||2===n||(clearTimeout(l.current),o(0));},[u,n,c,i]),react.useEffect(()=>()=>clearTimeout(l.current),[]),2===n||3===n};
55
-
56
- let useTraceUpdate=r=>{let c=react.useRef(r);react.useEffect(()=>{let e=Object.entries(r).reduce((e,[t,r])=>(c.current[t]!==r&&(e[t]=[c.current[t],r]),e),{});Object.keys(e).length>0&&console.info("[@koine/react:useTraceUpdate] changed props:",e),c.current=r;});};
57
-
58
- let useUpdateEffect=(r,f)=>{let o=useFirstMountState();react.useEffect(()=>{if(!o)return r()},f);};
59
-
60
- let useWindowSize=(o,n)=>{let[d,w]=react.useState(0),[m,u]=react.useState(0);return react.useEffect(()=>{let e=()=>{w(window.innerWidth),u(window.innerHeight);},i=o?dom.listenResizeDebounced(0,e,o,n):dom.listenResize(e);return e(),i},[o,n]),[d,m]};
61
-
62
- exports.FaviconTags = FaviconTags;
63
- exports.Meta = Meta;
64
- exports.NoJs = NoJs;
65
- exports.classed = classed;
66
- exports.createUseMediaQueryWidth = createUseMediaQueryWidth;
67
- exports.extendComponent = extendComponent;
68
- exports.mergeRefs = mergeRefs;
69
- exports.useAsyncFn = useAsyncFn;
70
- exports.useFirstMountState = useFirstMountState;
71
- exports.useFixedOffset = useFixedOffset;
72
- exports.useFocus = useFocus;
73
- exports.useInterval = useInterval;
74
- exports.useIsomorphicLayoutEffect = useIsomorphicLayoutEffect;
75
- exports.useKeyUp = useKeyUp;
76
- exports.useMeasure = useMeasure;
77
- exports.useMountedState = useMountedState;
78
- exports.useNavigateAway = useNavigateAway;
79
- exports.usePrevious = usePrevious;
80
- exports.usePreviousRef = usePreviousRef;
81
- exports.useScrollPosition = useScrollPosition;
82
- exports.useScrollThreshold = useScrollThreshold;
83
- exports.useSmoothScroll = useSmoothScroll;
84
- exports.useSpinDelay = useSpinDelay;
85
- exports.useTraceUpdate = useTraceUpdate;
86
- exports.useUpdateEffect = useUpdateEffect;
87
- exports.useWindowSize = useWindowSize;
package/index.cjs.mjs DELETED
@@ -1,2 +0,0 @@
1
- export * from './index.cjs.js';
2
- export { _default as default } from './index.cjs.default.js';
package/index.esm.js DELETED
@@ -1,58 +0,0 @@
1
- import { forwardRef, createElement, useLayoutEffect, useEffect, useState, useRef, useCallback, useMemo } from 'react';
2
- import { isBrowser, getMediaQueryWidthResolvers, isUndefined, debounce, noop, isNumber } from '@koine/utils';
3
- import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
4
- import { listenResizeDebounced, $each, calculateFixedOffset, injectCss, on, listenScrollDebounced, off, listenScroll, getOffsetTopSlim, scrollTo, listenResize } from '@koine/dom';
5
-
6
- let classed=r=>{let s=r.type||r;return function(r,...a){return forwardRef(function(e,n){let o=a.map((t,s)=>{let a="";return "function"==typeof t?a=t(e):void 0!==t&&(a=t.toString()),r[s]+a}).join(""),l="string"==typeof s,i=l?{}:e;if(l)for(let t in e)t.startsWith("$")||(i[t]=e[t]);let c=o||r[0];return c=(c.match(/class="([^"]*)/)?.[1]||c)+(e?.className?" "+e?.className:""),createElement(s,{...i,className:c||void 0,ref:n})})}};
7
-
8
- let useIsomorphicLayoutEffect=isBrowser?useLayoutEffect:useEffect;
9
-
10
- let createUseMediaQueryWidth=n=>{let a=getMediaQueryWidthResolvers(n);return function(t,n){let[o,s]=t.substring(1).split("-");isUndefined(s)&&(s=o),isUndefined(o)&&(o="min");let[d,m]=s.split("_"),u=a[o](d,m),[c,l]=useState(isUndefined(n)?null:n);return useIsomorphicLayoutEffect(()=>{let e=window.matchMedia(u),t=e=>{l(e.matches);};return (l(e.matches),e.addEventListener)?(e.addEventListener("change",t),()=>{e.removeEventListener("change",t);}):(e.addListener(t),()=>{e.removeListener(t);})},[u]),c}};
11
-
12
- let extendComponent=(t,o)=>Object.assign(o=>createElement(t,o),{...o,defaultProps:o});
13
-
14
- let FaviconTags=({name:a,color:t,safariTabColor:o,tileColor:c,themeColor:l})=>jsxs(Fragment,{children:[jsx("link",{rel:"shortcut icon",href:"/favicon.ico",type:"image/x-icon"}),jsx("link",{rel:"apple-touch-icon",sizes:"180x180",href:"/apple-touch-icon.png"}),jsx("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicon-32x32.png"}),jsx("link",{rel:"icon",type:"image/png",sizes:"16x16",href:"/favicon-16x16.png"}),jsx("link",{rel:"manifest",href:"/site.webmanifest"}),jsx("link",{rel:"mask-icon",href:"/safari-pinned-tab.svg",color:o||t}),jsx("meta",{name:"apple-mobile-web-app-title",content:a}),jsx("meta",{name:"application-name",content:a}),jsx("meta",{name:"msapplication-TileColor",content:c||t}),jsx("meta",{name:"theme-color",content:l||t})]});
15
-
16
- let mergeRefs=e=>r=>{e.forEach(e=>{"function"==typeof e?e(r):null!=e&&(e.current=r);});};
17
-
18
- let Meta=({zoom:t})=>jsx("meta",{name:"viewport",content:`width=device-width, initial-scale=1, maximum-scale=1${t?"":", user-scalable=0"}`});
19
-
20
- let NoJs=t=>jsx("script",{id:"no-js",dangerouslySetInnerHTML:{__html:'document.querySelector("html").className=document.querySelector("html").className.replace(/no-js/,"") + "js";'}});
21
-
22
- let useMountedState=()=>{let u=useRef(!1),n=useCallback(()=>u.current,[]);return useEffect(()=>(u.current=!0,()=>{u.current=!1;}),[]),n};
23
-
24
- 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]};
25
-
26
- let useFirstMountState=()=>{let r=useRef(!0);return r.current?(r.current=!1,!0):r.current};
27
-
28
- let n$1=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$1(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$1(r),400,!0)();});return $each(i||"[data-fixed]",t=>{e&&e.observe(t);}),()=>{e?.disconnect();}}},[i]),l};
29
-
30
- let useFocus=()=>{let r=useRef(null);return [r,()=>{r.current&&r.current.focus();}]};
31
-
32
- 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]);};
33
-
34
- let useKeyUp=(o,r=[])=>{useEffect(()=>on(window,"keyup",e=>{e.ctrlKey||e.altKey||e.shiftKey||e.metaKey||o(e);}),[o,...r]);};
35
-
36
- 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]};
37
-
38
- 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)),[]);};
39
-
40
- let usePrevious=(r,t)=>{let[o,u]=useState([r,t]);return o[1]!==r&&u([o[1],r]),o[0]};
41
-
42
- let usePreviousRef=t=>{let u=useRef();return useEffect(()=>{u.current=t;}),u.current};
43
-
44
- 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);};
45
-
46
- 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};
47
-
48
- 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])};
49
-
50
- let useSpinDelay=(u,c=500,i=200)=>{let[n,o]=useState(0),l=useRef();return useEffect(()=>{u&&0===n&&(clearTimeout(l.current),l.current=setTimeout(()=>{if(!u)return o(0);l.current=setTimeout(()=>{o(3);},i),o(2);},c),o(1)),u||2===n||(clearTimeout(l.current),o(0));},[u,n,c,i]),useEffect(()=>()=>clearTimeout(l.current),[]),2===n||3===n};
51
-
52
- let useTraceUpdate=r=>{let c=useRef(r);useEffect(()=>{let e=Object.entries(r).reduce((e,[t,r])=>(c.current[t]!==r&&(e[t]=[c.current[t],r]),e),{});Object.keys(e).length>0&&console.info("[@koine/react:useTraceUpdate] changed props:",e),c.current=r;});};
53
-
54
- let useUpdateEffect=(r,f)=>{let o=useFirstMountState();useEffect(()=>{if(!o)return r()},f);};
55
-
56
- let useWindowSize=(o,n)=>{let[d,w]=useState(0),[m,u]=useState(0);return useEffect(()=>{let e=()=>{w(window.innerWidth),u(window.innerHeight);},i=o?listenResizeDebounced(0,e,o,n):listenResize(e);return e(),i},[o,n]),[d,m]};
57
-
58
- export { FaviconTags, Meta, NoJs, classed, createUseMediaQueryWidth, extendComponent, mergeRefs, useAsyncFn, useFirstMountState, useFixedOffset, useFocus, useInterval, useIsomorphicLayoutEffect, useKeyUp, useMeasure, useMountedState, useNavigateAway, usePrevious, usePreviousRef, useScrollPosition, useScrollThreshold, useSmoothScroll, useSpinDelay, useTraceUpdate, useUpdateEffect, useWindowSize };
@@ -1 +0,0 @@
1
- export {};
package/utils/classed.js DELETED
@@ -1,40 +0,0 @@
1
- import React, { createElement, forwardRef } from "react";
2
- export let classed = (component) => {
3
- const type = component.type || component;
4
- return function (strings, ...args) {
5
- const WrappedComponent = forwardRef(function (props, ref) {
6
- const argResolved = args
7
- .map((arg, index) => {
8
- let result = "";
9
- if (typeof arg === "function") {
10
- result = arg(props);
11
- }
12
- else if (typeof arg !== "undefined") {
13
- result = arg.toString();
14
- }
15
- return strings[index] + result;
16
- })
17
- .join("");
18
- const isNativeHtmlElement = typeof type === "string";
19
- const propsToForward = isNativeHtmlElement
20
- ? {}
21
- : props;
22
- if (isNativeHtmlElement) {
23
- for (const key in props) {
24
- if (!key.startsWith("$")) {
25
- propsToForward[key] = props[key];
26
- }
27
- }
28
- }
29
- let className = argResolved || strings[0];
30
- className = className.match(/class="([^"]*)/)?.[1] || className;
31
- className += props?.className ? " " + props?.className : "";
32
- return createElement(type, {
33
- ...propsToForward,
34
- className: className || undefined,
35
- ref,
36
- });
37
- });
38
- return WrappedComponent;
39
- };
40
- };
@@ -1,37 +0,0 @@
1
- import { useState } from "react";
2
- import { getMediaQueryWidthResolvers, isUndefined, } from "@koine/utils";
3
- import { useIsomorphicLayoutEffect } from "../hooks";
4
- export let createUseMediaQueryWidth = (customBreakpoints) => {
5
- const queryResolvers = getMediaQueryWidthResolvers(customBreakpoints);
6
- return function useMediaQueryWidth(media, serverValue) {
7
- const definition = media.substring(1);
8
- let [rule, ruleBreakpoint] = definition.split("-");
9
- if (isUndefined(ruleBreakpoint)) {
10
- ruleBreakpoint = rule;
11
- }
12
- if (isUndefined(rule)) {
13
- rule = "min";
14
- }
15
- const [br1, br2] = ruleBreakpoint.split("_");
16
- const query = queryResolvers[rule](br1, br2);
17
- const [matches, setMatches] = useState(isUndefined(serverValue) ? null : serverValue);
18
- useIsomorphicLayoutEffect(() => {
19
- const mq = window.matchMedia(query);
20
- const handleChange = (event) => {
21
- setMatches(event.matches);
22
- };
23
- setMatches(mq.matches);
24
- if (!mq.addEventListener) {
25
- mq.addListener(handleChange);
26
- return () => {
27
- mq.removeListener(handleChange);
28
- };
29
- }
30
- mq.addEventListener("change", handleChange);
31
- return () => {
32
- mq.removeEventListener("change", handleChange);
33
- };
34
- }, [query]);
35
- return matches;
36
- };
37
- };
@@ -1,8 +0,0 @@
1
- import { createElement } from "react";
2
- export let extendComponent = (component, defaultProps) => {
3
- const NewComponent = (props) => createElement(component, props);
4
- return Object.assign(NewComponent, {
5
- ...defaultProps,
6
- defaultProps,
7
- });
8
- };
package/utils/index.d.ts DELETED
@@ -1,5 +0,0 @@
1
- export { classed } from "./classed";
2
- export { createUseMediaQueryWidth, type MediaQuerWidthDef, type MediaQueryWidth, } from "./createUseMediaQueryWidth";
3
- export { type ExtendableComponent, type OverridableComponents, type WithComponents, extendComponent, } from "./extendComponent";
4
- export { mergeRefs } from "./mergeRefs";
5
- export type { Polymorphic } from "./Polymorphic";
package/utils/index.js DELETED
@@ -1,4 +0,0 @@
1
- export { classed } from "./classed";
2
- export { createUseMediaQueryWidth, } from "./createUseMediaQueryWidth";
3
- export { extendComponent, } from "./extendComponent";
4
- export { mergeRefs } from "./mergeRefs";
@@ -1,12 +0,0 @@
1
- export let mergeRefs = (refs) => {
2
- return (value) => {
3
- refs.forEach((ref) => {
4
- if (typeof ref === "function") {
5
- ref(value);
6
- }
7
- else if (ref != null) {
8
- ref.current = value;
9
- }
10
- });
11
- };
12
- };
File without changes