@alessiofrittoli/react-hooks 3.3.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _react = require('react');var _LocalStorage = require('@alessiofrittoli/web-utils/storage/LocalStorage');var _SessionStorage = require('@alessiofrittoli/web-utils/storage/SessionStorage');var H=(e,n,t="local")=>{let r=_react.useCallback.call(void 0, ()=>_nullishCoalesce((t==="local"?_LocalStorage.LocalStorage:_SessionStorage.SessionStorage).get(e), () => (n)),[t,e,n]),[i,u]=_react.useState.call(void 0, n),s=_react.useCallback.call(void 0, o=>{u(c=>{let l=o instanceof Function?o(c):o;return(typeof window<"u"&&t==="local"?_LocalStorage.LocalStorage:_SessionStorage.SessionStorage).set(e,l),l})},[t,e]);return _react.useEffect.call(void 0, ()=>{u(r())},[r]),[i,s]};var $=(e,n)=>H(e,n,"local");var Xe=(e,n)=>H(e,n,"session");var j=e=>e?"online":"offline",tt= exports.useConnection =()=>{let[e,n]=_react.useState.call(void 0, j(!0)),t=e==="online",r=e==="offline",i=_react.useCallback.call(void 0, ()=>n(j(navigator.onLine)),[]);return P(["online","offline"],{listener:i,onLoad:i}),{connection:e,isOnline:t,isOffline:r}};var h=()=>{let e=_react.useRef.call(void 0, !0);return e.current?(e.current=!1,!0):e.current};var I=(e,n)=>{let t=h();_react.useEffect.call(void 0, ()=>{if(!t)return e()},n)};var _webutils = require('@alessiofrittoli/web-utils');var R=e=>typeof e=="string"?_webutils.isEmpty.call(void 0, e):!e,C={value:"",isTouched:!1,isValid:!0},B=(e,n)=>{switch(n.type){case"TOUCHED":return{...e,isTouched:!0};case"CHANGE":return{...e,value:n.value};case"BLUR":return{...e,value:e.value,isTouched:!R(_nullishCoalesce(e.value, () => ("")))};case"RESET":return C}};var vt=(e={})=>{let{inputRef:n}=e,{initialValue:t}=e,{touchTimeout:r=600}=e,{validate:i,parse:u}=e,{onChange:s}=e,[o,c]=_react.useReducer.call(void 0, B,{...C,value:t}),l=_react.useMemo.call(void 0, ()=>u?u(o.value):o.value,[o.value,u]),a=_react.useMemo.call(void 0, ()=>typeof i=="function"?i(l):!0,[l,i]),{isTouched:p}=o,d=R(l),f=!a&&p||!!t&&!a;I(()=>{let T=setTimeout(()=>{R(l)||c({type:"TOUCHED"})},r);return()=>clearTimeout(T)},[l,r]);let y=_react.useCallback.call(void 0, T=>{let{target:x}=T,{type:v}=x,M=v==="checkbox"?x.checked:x.value;c({type:"CHANGE",value:M}),_optionalChain([s, 'optionalCall', _2 => _2(u?u(M):M)])},[s,u]),S=_react.useCallback.call(void 0, ()=>{c({type:"BLUR"})},[]),O=_react.useCallback.call(void 0, ()=>{c({type:"TOUCHED"})},[]),E=_react.useCallback.call(void 0, T=>{c({type:"CHANGE",value:T})},[]),g=_react.useCallback.call(void 0, ()=>{_optionalChain([n, 'optionalAccess', _3 => _3.current, 'optionalAccess', _4 => _4.focus, 'call', _5 => _5()])},[n]),V=_react.useCallback.call(void 0, ()=>{c({type:"RESET"})},[]);return{value:l,isTouched:p,isValid:a,isEmpty:d,hasError:f,changeHandler:y,blurHandler:S,setValue:E,submit:O,focus:g,reset:V}};var gt=(e,n)=>_react.useCallback.call(void 0, _webutils.deferCallback.call(void 0, e),n);var ht=e=>{let n=h();_react.useEffect.call(void 0, ()=>{if(n)return e()},[])};var G=()=>{let[e,n]=_react.useState.call(void 0, !1);return _react.useEffect.call(void 0, ()=>n(!0),[]),e};var _helpers = require('@alessiofrittoli/math-utils/helpers');var Ut=(e={})=>_react.useMemo.call(void 0, ()=>_helpers.paginate.call(void 0, e),[e]);var Qt=(e,n=[])=>{let[t,r]=_react.useState.call(void 0, n),i=t.length>0,u=a=>t.includes(a),s=_react.useCallback.call(void 0, a=>r(p=>{let d=new Set(p);return d.has(a)?d.delete(a):d.add(a),Array.from(d.values())}),[]),o=_react.useCallback.call(void 0, a=>{r(p=>{if(p.length===0)return[a];let d=[...e],f=d.indexOf(p.at(0)),y=d.indexOf(a);if(f>y){let S=[...d].reverse(),O=S.indexOf(p.at(0)),E=S.indexOf(a);return S.slice(O,E+1)}return d.slice(f,y+1)})},[e]),c=_react.useCallback.call(void 0, ()=>{r(e)},[e]),l=_react.useCallback.call(void 0, a=>r(a?n:[]),[n]);return{selection:t,hasSelection:i,isSelected:u,setSelection:r,select:s,groupSelect:o,selectAll:c,resetSelection:l}};var _browserapi = require('@alessiofrittoli/web-utils/browser-api');function k(e,n={}){let{updateState:t=!0,onChange:r}=n,[i,u]=_react.useState.call(void 0, _browserapi.getMediaMatches.call(void 0, e)),s=_react.useCallback.call(void 0, ()=>{let o=_browserapi.getMediaMatches.call(void 0, e);t&&u(o),_optionalChain([r, 'optionalCall', _6 => _6(o)])},[e,t,r]);if(_react.useEffect.call(void 0, ()=>{let o=window.matchMedia(e),{matches:c}=o;return t&&u(c),_optionalChain([r, 'optionalCall', _7 => _7(c)]),o.addEventListener("change",s),()=>{o.removeEventListener("change",s)}},[e,t,r,s]),!!t)return i}var Xt=(e={})=>{let n=G(),t=k("(prefers-color-scheme: dark)"),{initial:r=t,docClassNames:i=[]}=e,[u,s]=$("dark-mode",r),o=_nullishCoalesce(u, () => (t)),[c,l]=i,a=_react.useRef.call(void 0, {light:"",dark:""});return I(()=>{s(t)},[t,s]),_react.useEffect.call(void 0, ()=>{c&&document.documentElement.classList.toggle(c,o),l&&document.documentElement.classList.toggle(l,!o)},[o,c,l]),_react.useEffect.call(void 0, ()=>{document.head.querySelectorAll('meta[name="theme-color"]').forEach(p=>{let d=p.getAttribute("media"),f=p.getAttribute("content");if(f){if(!d||d==="(prefers-color-scheme: light)"){a.current.light=f;return}a.current.dark=f}})},[]),I(()=>{let p=a.current.dark,d=a.current.light;u&&!p||!u&&!d||document.head.querySelectorAll('meta[name="theme-color"]').forEach(f=>{f.setAttribute("content",u?p:d)})},[u]),{isDarkMode:n?o:!1,isDarkOS:n?t:!1,toggleDarkMode:_react.useCallback.call(void 0, ()=>s(p=>!p),[s]),enableDarkMode:_react.useCallback.call(void 0, ()=>s(!0),[s]),disableDarkMode:_react.useCallback.call(void 0, ()=>s(!1),[s])}};function P(e,n){let{target:t,query:r,options:i,listener:u,onLoad:s,onCleanUp:o}=n;_react.useEffect.call(void 0, ()=>{let c=Array.isArray(e)?e:[e],l=_nullishCoalesce((r?window.matchMedia(r):t&&"current"in t?t.current:t), () => (window));if(l.addEventListener)return _optionalChain([s, 'optionalCall', _8 => _8()]),c.map(a=>{l.addEventListener(a,u,i)}),()=>{c.map(a=>{l.removeEventListener(a,u,i)}),_optionalChain([o, 'optionalCall', _9 => _9()])}},[e,t,r,i,u,s,o])}var _device = require('@alessiofrittoli/web-utils/device');var on=()=>k(_device.portraitMediaQuery);var Ie=["input","select","textarea","button","[href]",'[tabindex]:not([tabindex="-1"])'].join(", "),cn= exports.useFocusTrap =e=>{let[n,t]=_react.useState.call(void 0, !1),r=_react.useRef.call(void 0, null),i=_react.useCallback.call(void 0, s=>{r.current=document.activeElement;let o=s||_optionalChain([e, 'optionalAccess', _10 => _10.current])||!1;if(o)return t(o)},[e]),u=_react.useCallback.call(void 0, ()=>{_optionalChain([r, 'access', _11 => _11.current, 'optionalAccess', _12 => _12.focus, 'call', _13 => _13()]),t(!1)},[]);return _react.useEffect.call(void 0, ()=>{if(!n)return;let s=o=>{if(o.key!=="Tab")return;let c=Array.from(n.querySelectorAll(Ie)),l=c.at(0),a=c.at(-1);if(!o.shiftKey){document.activeElement===a&&(o.preventDefault(),_optionalChain([l, 'optionalAccess', _14 => _14.focus, 'call', _15 => _15()]));return}document.activeElement===l&&(o.preventDefault(),_optionalChain([a, 'optionalAccess', _16 => _16.focus, 'call', _17 => _17()]))};return document.addEventListener("keydown",s),()=>{document.removeEventListener("keydown",s)}},[n]),[i,u]};var mn=(e,n={})=>{let{initial:t=!1,once:r,amount:i,margin:u,root:s,enable:o=!0}=n,{onEnter:c,onExit:l,onIntersect:a}=n,p=_react.useRef.call(void 0, !0),[d,f]=_react.useState.call(void 0, t),[y,S]=_react.useState.call(void 0, o),O=_react.useRef.call(void 0, null),E=_react.useRef.call(void 0, !1),g=_react.useMemo.call(void 0, ()=>{if(!y||typeof IntersectionObserver>"u")return;let V=i==="all"?1:i==="some"?.5:i;try{return new IntersectionObserver(async([T],x)=>{if(!T)return;let v=T.isIntersecting;try{if(E.current=!v&&!!O.current,v&&c&&await c({entry:T,observer:x}),E.current&&l&&await l({entry:T,observer:x}),a&&(v||!v&&O.current!=null)){let M={isEntering:v,isExiting:E.current};await a({entry:T,observer:x,...M})}if(O.current=v,!p.current)return;f(v)}catch(M){console.error(M)}v&&r&&x.disconnect()},{root:s||void 0,rootMargin:u,threshold:V})}catch(T){console.error(T)}},[s,u,i,r,y,c,l,a]);return _react.useEffect.call(void 0, ()=>{if(p.current=!0,!(!y||!e.current||!g))return g.observe(e.current),()=>{p.current=!1,g.disconnect()}},[e,g,y]),{inView:d,enabled:y,observer:g,isExiting:E.current,setInView:f,setEnabled:S}};var _dom = require('@alessiofrittoli/web-utils/dom');var En=e=>{let n=_react.useCallback.call(void 0, ()=>_dom.blockScroll.call(void 0, _optionalChain([e, 'optionalAccess', _18 => _18.current])||void 0),[e]),t=_react.useCallback.call(void 0, ()=>_dom.restoreScroll.call(void 0, _optionalChain([e, 'optionalAccess', _19 => _19.current])||void 0),[e]);return[n,t]};var Z=(e,n={})=>{let{delay:t=1,args:r}=n;_react.useEffect.call(void 0, ()=>{let i=setTimeout(e,t,...r||[]);return()=>clearTimeout(i)},[t,r,e])};var Hn=(e,n=500)=>{let[t,r]=_react.useState.call(void 0, e),i=_react.useMemo.call(void 0, ()=>[e],[e]);return Z(r,{delay:n,args:i}),t};function _(e,n={}){let{delay:t=1,args:r,autoplay:i=!0,runOnStart:u=!1,updateState:s=!1}=n,o=_react.useRef.call(void 0, void 0),[c,l]=_react.useState.call(void 0, i),a=_react.useCallback.call(void 0, ()=>o.current?(clearInterval(o.current),o.current=void 0,!0):!1,[]),p=_react.useCallback.call(void 0, ()=>{let f=a();return u&&(r?e(...r):e()),o.current=setInterval(e,t,...r||[]),!f&&s&&l(!0),o.current},[t,r,s,u,e,a]),d=_react.useCallback.call(void 0, ()=>{a()&&s&&l(!1)},[s,a]);return _react.useEffect.call(void 0, ()=>{if(i)return p(),d},[i,p,d]),s?{isActive:c,start:p,stop:d}:{start:p,stop:d}}var Dn=(e,n={})=>{let{delay:t=1,args:r}=n;_react.useEffect.call(void 0, ()=>{let i=setInterval(e,t,...r||[]);return()=>clearInterval(i)},[t,r,e])};function Wn(e,n={}){let{autoplay:t=!0}=n,r=_(e,{autoplay:!1,...n}),{start:i,stop:u}=r,s=_react.useCallback.call(void 0, ()=>document.hidden?u():i(),[i,u]),o=_react.useCallback.call(void 0, ()=>{if(document.addEventListener("visibilitychange",s),!document.hidden)return i()},[i,s]),c=_react.useCallback.call(void 0, ()=>{u(),document.removeEventListener("visibilitychange",s)},[u,s]);return _react.useEffect.call(void 0, ()=>{if(t)return o(),c},[t,o,c]),{...r,start:o,stop:c}}function jn(e,n={}){let{delay:t=1,args:r,autoplay:i=!0,runOnStart:u=!1,updateState:s=!1}=n,o=_react.useRef.call(void 0, void 0),[c,l]=_react.useState.call(void 0, i),a=_react.useCallback.call(void 0, ()=>o.current?(clearTimeout(o.current),o.current=void 0,!0):!1,[]),p=_react.useCallback.call(void 0, ()=>{let f=a();return u&&(r?e(...r):e()),o.current=setTimeout(()=>{if(o.current=void 0,s&&l(!1),r)return e(...r);e()},t),!f&&s&&l(!0),o.current},[t,r,s,u,e,a]),d=_react.useCallback.call(void 0, ()=>{a()&&s&&l(!1)},[s,a]);return _react.useEffect.call(void 0, ()=>{if(i)return p(),d},[i,p,d]),s?{isActive:c,start:p,stop:d}:{start:p,stop:d}}exports.getState = j; exports.useConnection = tt; exports.useDarkMode = Xt; exports.useDebounce = Hn; exports.useDeferCallback = gt; exports.useEffectOnce = ht; exports.useEventListener = P; exports.useFocusTrap = cn; exports.useInView = mn; exports.useInput = vt; exports.useInterval = _; exports.useIntervalWhenVisible = Wn; exports.useIsClient = G; exports.useIsFirstRender = h; exports.useIsPortrait = on; exports.useLightInterval = Dn; exports.useLightTimeout = Z; exports.useLocalStorage = $; exports.useMediaQuery = k; exports.usePagination = Ut; exports.useScrollBlock = En; exports.useSelection = Qt; exports.useSessionStorage = Xe; exports.useStorage = H; exports.useTimeout = jn; exports.useUpdateEffect = I;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _react = require('react');var _LocalStorage = require('@alessiofrittoli/web-utils/storage/LocalStorage');var _SessionStorage = require('@alessiofrittoli/web-utils/storage/SessionStorage');var H=(e,t,n="local")=>{let r=_react.useCallback.call(void 0, ()=>_nullishCoalesce((n==="local"?_LocalStorage.LocalStorage:_SessionStorage.SessionStorage).get(e), () => (t)),[n,e,t]),[s,u]=_react.useState.call(void 0, t),i=_react.useCallback.call(void 0, o=>{u(c=>{let l=o instanceof Function?o(c):o;return(typeof window<"u"&&n==="local"?_LocalStorage.LocalStorage:_SessionStorage.SessionStorage).set(e,l),l})},[n,e]);return _react.useEffect.call(void 0, ()=>{u(r())},[r]),[s,i]};var $=(e,t)=>H(e,t,"local");var Ye=(e,t)=>H(e,t,"session");var j=e=>e?"online":"offline",rt= exports.useConnection =()=>{let[e,t]=_react.useState.call(void 0, j(!0)),n=e==="online",r=e==="offline",s=_react.useCallback.call(void 0, ()=>t(j(navigator.onLine)),[]);return P(["online","offline"],{listener:s,onLoad:s}),{connection:e,isOnline:n,isOffline:r}};var h=()=>{let e=_react.useRef.call(void 0, !0);return e.current?(e.current=!1,!0):e.current};var I=(e,t)=>{let n=h();_react.useEffect.call(void 0, ()=>{if(!n)return e()},t)};var _webutils = require('@alessiofrittoli/web-utils');var R=e=>typeof e=="string"?_webutils.isEmpty.call(void 0, e):!e,C={value:"",isTouched:!1,isValid:!0},B=(e,t)=>{switch(t.type){case"TOUCHED":return{...e,isTouched:!0};case"CHANGE":return{...e,value:t.value};case"BLUR":return{...e,value:e.value,isTouched:!R(_nullishCoalesce(e.value, () => ("")))};case"RESET":return C}};var xt=(e={})=>{let{inputRef:t}=e,{initialValue:n}=e,{touchTimeout:r=600}=e,{validate:s,parse:u}=e,{onChange:i}=e,[o,c]=_react.useReducer.call(void 0, B,{...C,value:n}),l=_react.useMemo.call(void 0, ()=>u?u(o.value):o.value,[o.value,u]),a=_react.useMemo.call(void 0, ()=>typeof s=="function"?s(l):!0,[l,s]),{isTouched:p}=o,d=R(l),f=!a&&p||!!n&&!a;I(()=>{let T=setTimeout(()=>{R(l)||c({type:"TOUCHED"})},r);return()=>clearTimeout(T)},[l,r]);let y=_react.useCallback.call(void 0, T=>{let{target:x}=T,{type:v}=x,M=v==="checkbox"?x.checked:x.value;c({type:"CHANGE",value:M}),_optionalChain([i, 'optionalCall', _2 => _2(u?u(M):M)])},[i,u]),S=_react.useCallback.call(void 0, ()=>{c({type:"BLUR"})},[]),O=_react.useCallback.call(void 0, ()=>{c({type:"TOUCHED"})},[]),E=_react.useCallback.call(void 0, T=>{c({type:"CHANGE",value:T})},[]),g=_react.useCallback.call(void 0, ()=>{_optionalChain([t, 'optionalAccess', _3 => _3.current, 'optionalAccess', _4 => _4.focus, 'call', _5 => _5()])},[t]),V=_react.useCallback.call(void 0, ()=>{c({type:"RESET"})},[]);return{value:l,isTouched:p,isValid:a,isEmpty:d,hasError:f,changeHandler:y,blurHandler:S,setValue:E,submit:O,focus:g,reset:V}};var bt=(e,t)=>_react.useCallback.call(void 0, _webutils.deferCallback.call(void 0, e),t);var Lt=e=>{let t=h();_react.useEffect.call(void 0, ()=>{if(t)return e()},[])};var G=()=>{let[e,t]=_react.useState.call(void 0, !1);return _react.useEffect.call(void 0, ()=>t(!0),[]),e};var _helpers = require('@alessiofrittoli/math-utils/helpers');var At=(e={})=>_react.useMemo.call(void 0, ()=>_helpers.paginate.call(void 0, e),[e]);var $t=(e,t=[])=>{let[n,r]=_react.useState.call(void 0, t),s=n.length>0,u=a=>n.includes(a),i=_react.useCallback.call(void 0, a=>r(p=>{let d=new Set(p);return d.has(a)?d.delete(a):d.add(a),Array.from(d.values())}),[]),o=_react.useCallback.call(void 0, a=>{r(p=>{if(p.length===0)return[a];let d=[...e],f=d.indexOf(p.at(0)),y=d.indexOf(a);if(f>y){let S=[...d].reverse(),O=S.indexOf(p.at(0)),E=S.indexOf(a);return S.slice(O,E+1)}return d.slice(f,y+1)})},[e]),c=_react.useCallback.call(void 0, ()=>{r(e)},[e]),l=_react.useCallback.call(void 0, a=>r(a?t:[]),[t]);return{selection:n,hasSelection:s,isSelected:u,setSelection:r,select:i,groupSelect:o,selectAll:c,resetSelection:l}};var _browserapi = require('@alessiofrittoli/web-utils/browser-api');function k(e,t={}){let{updateState:n=!0,onChange:r}=t,[s,u]=_react.useState.call(void 0, _browserapi.getMediaMatches.call(void 0, e)),i=_react.useCallback.call(void 0, ()=>{let o=_browserapi.getMediaMatches.call(void 0, e);n&&u(o),_optionalChain([r, 'optionalCall', _6 => _6(o)])},[e,n,r]);if(_react.useEffect.call(void 0, ()=>{let o=window.matchMedia(e),{matches:c}=o;return n&&u(c),_optionalChain([r, 'optionalCall', _7 => _7(c)]),o.addEventListener("change",i),()=>{o.removeEventListener("change",i)}},[e,n,r,i]),!!n)return s}var Yt=(e={})=>{let t=G(),n=k("(prefers-color-scheme: dark)"),{initial:r=n,docClassNames:s=[]}=e,[u,i]=$("dark-mode",r),o=_nullishCoalesce(u, () => (n)),[c,l]=s,a=_react.useRef.call(void 0, {light:"",dark:""});return I(()=>{i(n)},[n,i]),_react.useEffect.call(void 0, ()=>{c&&document.documentElement.classList.toggle(c,o),l&&document.documentElement.classList.toggle(l,!o)},[o,c,l]),_react.useEffect.call(void 0, ()=>{document.head.querySelectorAll('meta[name="theme-color"]').forEach(p=>{let d=p.getAttribute("media"),f=p.getAttribute("content");if(f){if(!d||d==="(prefers-color-scheme: light)"){a.current.light=f;return}a.current.dark=f}})},[]),I(()=>{let p=a.current.dark,d=a.current.light;u&&!p||!u&&!d||document.head.querySelectorAll('meta[name="theme-color"]').forEach(f=>{f.setAttribute("content",u?p:d)})},[u]),{isDarkMode:t?o:!1,isDarkOS:t?n:!1,toggleDarkMode:_react.useCallback.call(void 0, ()=>i(p=>!p),[i]),enableDarkMode:_react.useCallback.call(void 0, ()=>i(!0),[i]),disableDarkMode:_react.useCallback.call(void 0, ()=>i(!1),[i])}};function P(e,t){let{target:n,query:r,options:s,listener:u,onLoad:i,onCleanUp:o}=t;_react.useEffect.call(void 0, ()=>{let c=Array.isArray(e)?e:[e],l=_nullishCoalesce((r?window.matchMedia(r):n&&"current"in n?n.current:n), () => (window));if(l.addEventListener)return _optionalChain([i, 'optionalCall', _8 => _8()]),c.map(a=>{l.addEventListener(a,u,s)}),()=>{c.map(a=>{l.removeEventListener(a,u,s)}),_optionalChain([o, 'optionalCall', _9 => _9()])}},[e,n,r,s,u,i,o])}var _device = require('@alessiofrittoli/web-utils/device');var an=()=>k(_device.portraitMediaQuery);var He=["input","select","textarea","button","[href]",'[tabindex]:not([tabindex="-1"])'].join(", "),pn= exports.useFocusTrap =e=>{let t=_react.useMemo.call(void 0, ()=>_optionalChain([e, 'optionalAccess', _10 => _10.current]),[e]),[n,r]=_react.useState.call(void 0, !1),s=_react.useRef.call(void 0, null),u=_react.useCallback.call(void 0, o=>{s.current=document.activeElement;let c=o||t||!1;if(c)return r(c)},[t]),i=_react.useCallback.call(void 0, ()=>{_optionalChain([s, 'access', _11 => _11.current, 'optionalAccess', _12 => _12.focus, 'call', _13 => _13()]),r(!1)},[]);return _react.useEffect.call(void 0, ()=>{if(!n)return;let o=c=>{if(c.key!=="Tab")return;let l=Array.from(n.querySelectorAll(He)),a=l.at(0),p=l.at(-1);if(!c.shiftKey){document.activeElement===p&&(c.preventDefault(),_optionalChain([a, 'optionalAccess', _14 => _14.focus, 'call', _15 => _15()]));return}document.activeElement===a&&(c.preventDefault(),_optionalChain([p, 'optionalAccess', _16 => _16.focus, 'call', _17 => _17()]))};return document.addEventListener("keydown",o),()=>{document.removeEventListener("keydown",o)}},[n]),[u,i]};var Tn=(e,t={})=>{let{initial:n=!1,once:r,amount:s,margin:u,root:i,enable:o=!0}=t,{onEnter:c,onExit:l,onIntersect:a}=t,p=_react.useRef.call(void 0, !0),[d,f]=_react.useState.call(void 0, n),[y,S]=_react.useState.call(void 0, o),O=_react.useRef.call(void 0, null),E=_react.useRef.call(void 0, !1),g=_react.useMemo.call(void 0, ()=>{if(!y||typeof IntersectionObserver>"u")return;let V=s==="all"?1:s==="some"?.5:s;try{return new IntersectionObserver(async([T],x)=>{if(!T)return;let v=T.isIntersecting;try{if(E.current=!v&&!!O.current,v&&c&&await c({entry:T,observer:x}),E.current&&l&&await l({entry:T,observer:x}),a&&(v||!v&&O.current!=null)){let M={isEntering:v,isExiting:E.current};await a({entry:T,observer:x,...M})}if(O.current=v,!p.current)return;f(v)}catch(M){console.error(M)}v&&r&&x.disconnect()},{root:i||void 0,rootMargin:u,threshold:V})}catch(T){console.error(T)}},[i,u,s,r,y,c,l,a]);return _react.useEffect.call(void 0, ()=>{if(p.current=!0,!(!y||!e.current||!g))return g.observe(e.current),()=>{p.current=!1,g.disconnect()}},[e,g,y]),{inView:d,enabled:y,observer:g,isExiting:E.current,setInView:f,setEnabled:S}};var _dom = require('@alessiofrittoli/web-utils/dom');var Sn=e=>{let t=_react.useMemo.call(void 0, ()=>_optionalChain([e, 'optionalAccess', _18 => _18.current]),[e]),n=_react.useCallback.call(void 0, ()=>_dom.blockScroll.call(void 0, t||void 0),[t]),r=_react.useCallback.call(void 0, ()=>_dom.restoreScroll.call(void 0, t||void 0),[t]);return[n,r]};var Y=(e,t={})=>{let{delay:n=1,args:r}=t;_react.useEffect.call(void 0, ()=>{let s=setTimeout(e,n,...r||[]);return()=>clearTimeout(s)},[n,r,e])};var Rn=(e,t=500)=>{let[n,r]=_react.useState.call(void 0, e),s=_react.useMemo.call(void 0, ()=>[e],[e]);return Y(r,{delay:t,args:s}),n};function Z(e,t={}){let{delay:n=1,args:r,autoplay:s=!0,runOnStart:u=!1,updateState:i=!1}=t,o=_react.useRef.call(void 0, void 0),[c,l]=_react.useState.call(void 0, s),a=_react.useCallback.call(void 0, ()=>o.current?(clearInterval(o.current),o.current=void 0,!0):!1,[]),p=_react.useCallback.call(void 0, ()=>{let f=a();return u&&(r?e(...r):e()),o.current=setInterval(e,n,...r||[]),!f&&i&&l(!0),o.current},[n,r,i,u,e,a]),d=_react.useCallback.call(void 0, ()=>{a()&&i&&l(!1)},[i,a]);return _react.useEffect.call(void 0, ()=>{if(s)return p(),d},[s,p,d]),i?{isActive:c,start:p,stop:d}:{start:p,stop:d}}var Un=(e,t={})=>{let{delay:n=1,args:r}=t;_react.useEffect.call(void 0, ()=>{let s=setInterval(e,n,...r||[]);return()=>clearInterval(s)},[n,r,e])};function Fn(e,t={}){let{autoplay:n=!0}=t,r=Z(e,{autoplay:!1,...t}),{start:s,stop:u}=r,i=_react.useCallback.call(void 0, ()=>document.hidden?u():s(),[s,u]),o=_react.useCallback.call(void 0, ()=>{if(document.addEventListener("visibilitychange",i),!document.hidden)return s()},[s,i]),c=_react.useCallback.call(void 0, ()=>{u(),document.removeEventListener("visibilitychange",i)},[u,i]);return _react.useEffect.call(void 0, ()=>{if(n)return o(),c},[n,o,c]),{...r,start:o,stop:c}}function Bn(e,t={}){let{delay:n=1,args:r,autoplay:s=!0,runOnStart:u=!1,updateState:i=!1}=t,o=_react.useRef.call(void 0, void 0),[c,l]=_react.useState.call(void 0, s),a=_react.useCallback.call(void 0, ()=>o.current?(clearTimeout(o.current),o.current=void 0,!0):!1,[]),p=_react.useCallback.call(void 0, ()=>{let f=a();return u&&(r?e(...r):e()),o.current=setTimeout(()=>{if(o.current=void 0,i&&l(!1),r)return e(...r);e()},n),!f&&i&&l(!0),o.current},[n,r,i,u,e,a]),d=_react.useCallback.call(void 0, ()=>{a()&&i&&l(!1)},[i,a]);return _react.useEffect.call(void 0, ()=>{if(s)return p(),d},[s,p,d]),i?{isActive:c,start:p,stop:d}:{start:p,stop:d}}exports.getState = j; exports.useConnection = rt; exports.useDarkMode = Yt; exports.useDebounce = Rn; exports.useDeferCallback = bt; exports.useEffectOnce = Lt; exports.useEventListener = P; exports.useFocusTrap = pn; exports.useInView = Tn; exports.useInput = xt; exports.useInterval = Z; exports.useIntervalWhenVisible = Fn; exports.useIsClient = G; exports.useIsFirstRender = h; exports.useIsPortrait = an; exports.useLightInterval = Un; exports.useLightTimeout = Y; exports.useLocalStorage = $; exports.useMediaQuery = k; exports.usePagination = At; exports.useScrollBlock = Sn; exports.useSelection = $t; exports.useSessionStorage = Ye; exports.useStorage = H; exports.useTimeout = Bn; exports.useUpdateEffect = I;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{useCallback as Q,useEffect as te,useState as ne}from"react";import{LocalStorage as F}from"@alessiofrittoli/web-utils/storage/LocalStorage";import{SessionStorage as $}from"@alessiofrittoli/web-utils/storage/SessionStorage";var h=(e,n,t="local")=>{let r=Q(()=>(t==="local"?F:$).get(e)??n,[t,e,n]),[i,u]=ne(n),s=Q(o=>{u(c=>{let l=o instanceof Function?o(c):o;return(typeof window<"u"&&t==="local"?F:$).set(e,l),l})},[t,e]);return te(()=>{u(r())},[r]),[i,s]};var j=(e,n)=>h(e,n,"local");var Ye=(e,n)=>h(e,n,"session");import{useCallback as re,useState as oe}from"react";var P=e=>e?"online":"offline",nt=()=>{let[e,n]=oe(P(!0)),t=e==="online",r=e==="offline",i=re(()=>n(P(navigator.onLine)),[]);return B(["online","offline"],{listener:i,onLoad:i}),{connection:e,isOnline:t,isOffline:r}};import{useCallback as w,useEffect as J,useRef as Se}from"react";import{useCallback as I,useMemo as G,useReducer as ue}from"react";import{useEffect as ie}from"react";import{useRef as se}from"react";var R=()=>{let e=se(!0);return e.current?(e.current=!1,!0):e.current};var H=(e,n)=>{let t=R();ie(()=>{if(!t)return e()},n)};import{isEmpty as ae}from"@alessiofrittoli/web-utils";var L=e=>typeof e=="string"?ae(e):!e,D={value:"",isTouched:!1,isValid:!0},N=(e,n)=>{switch(n.type){case"TOUCHED":return{...e,isTouched:!0};case"CHANGE":return{...e,value:n.value};case"BLUR":return{...e,value:e.value,isTouched:!L(e.value??"")};case"RESET":return D}};var Et=(e={})=>{let{inputRef:n}=e,{initialValue:t}=e,{touchTimeout:r=600}=e,{validate:i,parse:u}=e,{onChange:s}=e,[o,c]=ue(N,{...D,value:t}),l=G(()=>u?u(o.value):o.value,[o.value,u]),a=G(()=>typeof i=="function"?i(l):!0,[l,i]),{isTouched:p}=o,d=L(l),T=!a&&p||!!t&&!a;H(()=>{let y=setTimeout(()=>{L(l)||c({type:"TOUCHED"})},r);return()=>clearTimeout(y)},[l,r]);let v=I(y=>{let{target:S}=y,{type:E}=S,b=E==="checkbox"?S.checked:S.value;c({type:"CHANGE",value:b}),s?.(u?u(b):b)},[s,u]),O=I(()=>{c({type:"BLUR"})},[]),g=I(()=>{c({type:"TOUCHED"})},[]),x=I(y=>{c({type:"CHANGE",value:y})},[]),M=I(()=>{n?.current?.focus()},[n]),C=I(()=>{c({type:"RESET"})},[]);return{value:l,isTouched:p,isValid:a,isEmpty:d,hasError:T,changeHandler:v,blurHandler:O,setValue:x,submit:g,focus:M,reset:C}};import{useCallback as ce}from"react";import{deferCallback as le}from"@alessiofrittoli/web-utils";var Mt=(e,n)=>ce(le(e),n);import{useEffect as pe}from"react";var Rt=e=>{let n=R();pe(()=>{if(n)return e()},[])};import{useEffect as de,useState as me}from"react";var q=()=>{let[e,n]=me(!1);return de(()=>n(!0),[]),e};import{useMemo as fe}from"react";import{paginate as Te}from"@alessiofrittoli/math-utils/helpers";var Kt=(e={})=>fe(()=>Te(e),[e]);import{useCallback as k,useState as ye}from"react";var Ft=(e,n=[])=>{let[t,r]=ye(n),i=t.length>0,u=a=>t.includes(a),s=k(a=>r(p=>{let d=new Set(p);return d.has(a)?d.delete(a):d.add(a),Array.from(d.values())}),[]),o=k(a=>{r(p=>{if(p.length===0)return[a];let d=[...e],T=d.indexOf(p.at(0)),v=d.indexOf(a);if(T>v){let O=[...d].reverse(),g=O.indexOf(p.at(0)),x=O.indexOf(a);return O.slice(g,x+1)}return d.slice(T,v+1)})},[e]),c=k(()=>{r(e)},[e]),l=k(a=>r(a?n:[]),[n]);return{selection:t,hasSelection:i,isSelected:u,setSelection:r,select:s,groupSelect:o,selectAll:c,resetSelection:l}};import{useCallback as ve,useEffect as Ee,useState as xe}from"react";import{getMediaMatches as z}from"@alessiofrittoli/web-utils/browser-api";function V(e,n={}){let{updateState:t=!0,onChange:r}=n,[i,u]=xe(z(e)),s=ve(()=>{let o=z(e);t&&u(o),r?.(o)},[e,t,r]);if(Ee(()=>{let o=window.matchMedia(e),{matches:c}=o;return t&&u(c),r?.(c),o.addEventListener("change",s),()=>{o.removeEventListener("change",s)}},[e,t,r,s]),!!t)return i}var Yt=(e={})=>{let n=q(),t=V("(prefers-color-scheme: dark)"),{initial:r=t,docClassNames:i=[]}=e,[u,s]=j("dark-mode",r),o=u??t,[c,l]=i,a=Se({light:"",dark:""});return H(()=>{s(t)},[t,s]),J(()=>{c&&document.documentElement.classList.toggle(c,o),l&&document.documentElement.classList.toggle(l,!o)},[o,c,l]),J(()=>{document.head.querySelectorAll('meta[name="theme-color"]').forEach(p=>{let d=p.getAttribute("media"),T=p.getAttribute("content");if(T){if(!d||d==="(prefers-color-scheme: light)"){a.current.light=T;return}a.current.dark=T}})},[]),H(()=>{let p=a.current.dark,d=a.current.light;u&&!p||!u&&!d||document.head.querySelectorAll('meta[name="theme-color"]').forEach(T=>{T.setAttribute("content",u?p:d)})},[u]),{isDarkMode:n?o:!1,isDarkOS:n?t:!1,toggleDarkMode:w(()=>s(p=>!p),[s]),enableDarkMode:w(()=>s(!0),[s]),disableDarkMode:w(()=>s(!1),[s])}};import{useEffect as Oe}from"react";function B(e,n){let{target:t,query:r,options:i,listener:u,onLoad:s,onCleanUp:o}=n;Oe(()=>{let c=Array.isArray(e)?e:[e],l=(r?window.matchMedia(r):t&&"current"in t?t.current:t)??window;if(l.addEventListener)return s?.(),c.map(a=>{l.addEventListener(a,u,i)}),()=>{c.map(a=>{l.removeEventListener(a,u,i)}),o?.()}},[e,t,r,i,u,s,o])}import{portraitMediaQuery as ge}from"@alessiofrittoli/web-utils/device";var sn=()=>V(ge);import{useCallback as X,useEffect as Me,useRef as be,useState as Ie}from"react";var He=["input","select","textarea","button","[href]",'[tabindex]:not([tabindex="-1"])'].join(", "),ln=e=>{let[n,t]=Ie(!1),r=be(null),i=X(s=>{r.current=document.activeElement;let o=s||e?.current||!1;if(o)return t(o)},[e]),u=X(()=>{r.current?.focus(),t(!1)},[]);return Me(()=>{if(!n)return;let s=o=>{if(o.key!=="Tab")return;let c=Array.from(n.querySelectorAll(He)),l=c.at(0),a=c.at(-1);if(!o.shiftKey){document.activeElement===a&&(o.preventDefault(),l?.focus());return}document.activeElement===l&&(o.preventDefault(),a?.focus())};return document.addEventListener("keydown",s),()=>{document.removeEventListener("keydown",s)}},[n]),[i,u]};import{useEffect as he,useMemo as Re,useRef as U,useState as Y}from"react";var fn=(e,n={})=>{let{initial:t=!1,once:r,amount:i,margin:u,root:s,enable:o=!0}=n,{onEnter:c,onExit:l,onIntersect:a}=n,p=U(!0),[d,T]=Y(t),[v,O]=Y(o),g=U(null),x=U(!1),M=Re(()=>{if(!v||typeof IntersectionObserver>"u")return;let C=i==="all"?1:i==="some"?.5:i;try{return new IntersectionObserver(async([y],S)=>{if(!y)return;let E=y.isIntersecting;try{if(x.current=!E&&!!g.current,E&&c&&await c({entry:y,observer:S}),x.current&&l&&await l({entry:y,observer:S}),a&&(E||!E&&g.current!=null)){let b={isEntering:E,isExiting:x.current};await a({entry:y,observer:S,...b})}if(g.current=E,!p.current)return;T(E)}catch(b){console.error(b)}E&&r&&S.disconnect()},{root:s||void 0,rootMargin:u,threshold:C})}catch(y){console.error(y)}},[s,u,i,r,v,c,l,a]);return he(()=>{if(p.current=!0,!(!v||!e.current||!M))return M.observe(e.current),()=>{p.current=!1,M.disconnect()}},[e,M,v]),{inView:d,enabled:v,observer:M,isExiting:x.current,setInView:T,setEnabled:O}};import{useCallback as Z}from"react";import{blockScroll as Le,restoreScroll as ke}from"@alessiofrittoli/web-utils/dom";var xn=e=>{let n=Z(()=>Le(e?.current||void 0),[e]),t=Z(()=>ke(e?.current||void 0),[e]);return[n,t]};import{useMemo as Ce,useState as De}from"react";import{useEffect as Ve}from"react";var _=(e,n={})=>{let{delay:t=1,args:r}=n;Ve(()=>{let i=setTimeout(e,t,...r||[]);return()=>clearTimeout(i)},[t,r,e])};var hn=(e,n=500)=>{let[t,r]=De(e),i=Ce(()=>[e],[e]);return _(r,{delay:n,args:i}),t};import{useCallback as K,useEffect as we,useRef as Ue,useState as Ke}from"react";function ee(e,n={}){let{delay:t=1,args:r,autoplay:i=!0,runOnStart:u=!1,updateState:s=!1}=n,o=Ue(void 0),[c,l]=Ke(i),a=K(()=>o.current?(clearInterval(o.current),o.current=void 0,!0):!1,[]),p=K(()=>{let T=a();return u&&(r?e(...r):e()),o.current=setInterval(e,t,...r||[]),!T&&s&&l(!0),o.current},[t,r,s,u,e,a]),d=K(()=>{a()&&s&&l(!1)},[s,a]);return we(()=>{if(i)return p(),d},[i,p,d]),s?{isActive:c,start:p,stop:d}:{start:p,stop:d}}import{useEffect as Ae}from"react";var wn=(e,n={})=>{let{delay:t=1,args:r}=n;Ae(()=>{let i=setInterval(e,t,...r||[]);return()=>clearInterval(i)},[t,r,e])};import{useCallback as A,useEffect as We}from"react";function Qn(e,n={}){let{autoplay:t=!0}=n,r=ee(e,{autoplay:!1,...n}),{start:i,stop:u}=r,s=A(()=>document.hidden?u():i(),[i,u]),o=A(()=>{if(document.addEventListener("visibilitychange",s),!document.hidden)return i()},[i,s]),c=A(()=>{u(),document.removeEventListener("visibilitychange",s)},[u,s]);return We(()=>{if(t)return o(),c},[t,o,c]),{...r,start:o,stop:c}}import{useCallback as W,useEffect as Qe,useRef as Fe,useState as $e}from"react";function Pn(e,n={}){let{delay:t=1,args:r,autoplay:i=!0,runOnStart:u=!1,updateState:s=!1}=n,o=Fe(void 0),[c,l]=$e(i),a=W(()=>o.current?(clearTimeout(o.current),o.current=void 0,!0):!1,[]),p=W(()=>{let T=a();return u&&(r?e(...r):e()),o.current=setTimeout(()=>{if(o.current=void 0,s&&l(!1),r)return e(...r);e()},t),!T&&s&&l(!0),o.current},[t,r,s,u,e,a]),d=W(()=>{a()&&s&&l(!1)},[s,a]);return Qe(()=>{if(i)return p(),d},[i,p,d]),s?{isActive:c,start:p,stop:d}:{start:p,stop:d}}export{P as getState,nt as useConnection,Yt as useDarkMode,hn as useDebounce,Mt as useDeferCallback,Rt as useEffectOnce,B as useEventListener,ln as useFocusTrap,fn as useInView,Et as useInput,ee as useInterval,Qn as useIntervalWhenVisible,q as useIsClient,R as useIsFirstRender,sn as useIsPortrait,wn as useLightInterval,_ as useLightTimeout,j as useLocalStorage,V as useMediaQuery,Kt as usePagination,xn as useScrollBlock,Ft as useSelection,Ye as useSessionStorage,h as useStorage,Pn as useTimeout,H as useUpdateEffect};
1
+ import{useCallback as Q,useEffect as te,useState as ne}from"react";import{LocalStorage as F}from"@alessiofrittoli/web-utils/storage/LocalStorage";import{SessionStorage as $}from"@alessiofrittoli/web-utils/storage/SessionStorage";var h=(e,t,n="local")=>{let r=Q(()=>(n==="local"?F:$).get(e)??t,[n,e,t]),[s,u]=ne(t),i=Q(o=>{u(c=>{let l=o instanceof Function?o(c):o;return(typeof window<"u"&&n==="local"?F:$).set(e,l),l})},[n,e]);return te(()=>{u(r())},[r]),[s,i]};var j=(e,t)=>h(e,t,"local");var Ze=(e,t)=>h(e,t,"session");import{useCallback as re,useState as oe}from"react";var P=e=>e?"online":"offline",ot=()=>{let[e,t]=oe(P(!0)),n=e==="online",r=e==="offline",s=re(()=>t(P(navigator.onLine)),[]);return B(["online","offline"],{listener:s,onLoad:s}),{connection:e,isOnline:n,isOffline:r}};import{useCallback as w,useEffect as z,useRef as Se}from"react";import{useCallback as I,useMemo as G,useReducer as ue}from"react";import{useEffect as ie}from"react";import{useRef as se}from"react";var R=()=>{let e=se(!0);return e.current?(e.current=!1,!0):e.current};var H=(e,t)=>{let n=R();ie(()=>{if(!n)return e()},t)};import{isEmpty as ae}from"@alessiofrittoli/web-utils";var L=e=>typeof e=="string"?ae(e):!e,D={value:"",isTouched:!1,isValid:!0},N=(e,t)=>{switch(t.type){case"TOUCHED":return{...e,isTouched:!0};case"CHANGE":return{...e,value:t.value};case"BLUR":return{...e,value:e.value,isTouched:!L(e.value??"")};case"RESET":return D}};var St=(e={})=>{let{inputRef:t}=e,{initialValue:n}=e,{touchTimeout:r=600}=e,{validate:s,parse:u}=e,{onChange:i}=e,[o,c]=ue(N,{...D,value:n}),l=G(()=>u?u(o.value):o.value,[o.value,u]),a=G(()=>typeof s=="function"?s(l):!0,[l,s]),{isTouched:p}=o,d=L(l),T=!a&&p||!!n&&!a;H(()=>{let y=setTimeout(()=>{L(l)||c({type:"TOUCHED"})},r);return()=>clearTimeout(y)},[l,r]);let v=I(y=>{let{target:S}=y,{type:E}=S,b=E==="checkbox"?S.checked:S.value;c({type:"CHANGE",value:b}),i?.(u?u(b):b)},[i,u]),O=I(()=>{c({type:"BLUR"})},[]),g=I(()=>{c({type:"TOUCHED"})},[]),x=I(y=>{c({type:"CHANGE",value:y})},[]),M=I(()=>{t?.current?.focus()},[t]),C=I(()=>{c({type:"RESET"})},[]);return{value:l,isTouched:p,isValid:a,isEmpty:d,hasError:T,changeHandler:v,blurHandler:O,setValue:x,submit:g,focus:M,reset:C}};import{useCallback as ce}from"react";import{deferCallback as le}from"@alessiofrittoli/web-utils";var It=(e,t)=>ce(le(e),t);import{useEffect as pe}from"react";var kt=e=>{let t=R();pe(()=>{if(t)return e()},[])};import{useEffect as de,useState as me}from"react";var q=()=>{let[e,t]=me(!1);return de(()=>t(!0),[]),e};import{useMemo as fe}from"react";import{paginate as Te}from"@alessiofrittoli/math-utils/helpers";var Wt=(e={})=>fe(()=>Te(e),[e]);import{useCallback as k,useState as ye}from"react";var jt=(e,t=[])=>{let[n,r]=ye(t),s=n.length>0,u=a=>n.includes(a),i=k(a=>r(p=>{let d=new Set(p);return d.has(a)?d.delete(a):d.add(a),Array.from(d.values())}),[]),o=k(a=>{r(p=>{if(p.length===0)return[a];let d=[...e],T=d.indexOf(p.at(0)),v=d.indexOf(a);if(T>v){let O=[...d].reverse(),g=O.indexOf(p.at(0)),x=O.indexOf(a);return O.slice(g,x+1)}return d.slice(T,v+1)})},[e]),c=k(()=>{r(e)},[e]),l=k(a=>r(a?t:[]),[t]);return{selection:n,hasSelection:s,isSelected:u,setSelection:r,select:i,groupSelect:o,selectAll:c,resetSelection:l}};import{useCallback as ve,useEffect as Ee,useState as xe}from"react";import{getMediaMatches as _}from"@alessiofrittoli/web-utils/browser-api";function V(e,t={}){let{updateState:n=!0,onChange:r}=t,[s,u]=xe(_(e)),i=ve(()=>{let o=_(e);n&&u(o),r?.(o)},[e,n,r]);if(Ee(()=>{let o=window.matchMedia(e),{matches:c}=o;return n&&u(c),r?.(c),o.addEventListener("change",i),()=>{o.removeEventListener("change",i)}},[e,n,r,i]),!!n)return s}var Zt=(e={})=>{let t=q(),n=V("(prefers-color-scheme: dark)"),{initial:r=n,docClassNames:s=[]}=e,[u,i]=j("dark-mode",r),o=u??n,[c,l]=s,a=Se({light:"",dark:""});return H(()=>{i(n)},[n,i]),z(()=>{c&&document.documentElement.classList.toggle(c,o),l&&document.documentElement.classList.toggle(l,!o)},[o,c,l]),z(()=>{document.head.querySelectorAll('meta[name="theme-color"]').forEach(p=>{let d=p.getAttribute("media"),T=p.getAttribute("content");if(T){if(!d||d==="(prefers-color-scheme: light)"){a.current.light=T;return}a.current.dark=T}})},[]),H(()=>{let p=a.current.dark,d=a.current.light;u&&!p||!u&&!d||document.head.querySelectorAll('meta[name="theme-color"]').forEach(T=>{T.setAttribute("content",u?p:d)})},[u]),{isDarkMode:t?o:!1,isDarkOS:t?n:!1,toggleDarkMode:w(()=>i(p=>!p),[i]),enableDarkMode:w(()=>i(!0),[i]),disableDarkMode:w(()=>i(!1),[i])}};import{useEffect as Oe}from"react";function B(e,t){let{target:n,query:r,options:s,listener:u,onLoad:i,onCleanUp:o}=t;Oe(()=>{let c=Array.isArray(e)?e:[e],l=(r?window.matchMedia(r):n&&"current"in n?n.current:n)??window;if(l.addEventListener)return i?.(),c.map(a=>{l.addEventListener(a,u,s)}),()=>{c.map(a=>{l.removeEventListener(a,u,s)}),o?.()}},[e,n,r,s,u,i,o])}import{portraitMediaQuery as ge}from"@alessiofrittoli/web-utils/device";var un=()=>V(ge);import{useCallback as J,useEffect as Me,useMemo as be,useRef as Ie,useState as He}from"react";var he=["input","select","textarea","button","[href]",'[tabindex]:not([tabindex="-1"])'].join(", "),dn=e=>{let t=be(()=>e?.current,[e]),[n,r]=He(!1),s=Ie(null),u=J(o=>{s.current=document.activeElement;let c=o||t||!1;if(c)return r(c)},[t]),i=J(()=>{s.current?.focus(),r(!1)},[]);return Me(()=>{if(!n)return;let o=c=>{if(c.key!=="Tab")return;let l=Array.from(n.querySelectorAll(he)),a=l.at(0),p=l.at(-1);if(!c.shiftKey){document.activeElement===p&&(c.preventDefault(),a?.focus());return}document.activeElement===a&&(c.preventDefault(),p?.focus())};return document.addEventListener("keydown",o),()=>{document.removeEventListener("keydown",o)}},[n]),[u,i]};import{useEffect as Re,useMemo as Le,useRef as U,useState as X}from"react";var yn=(e,t={})=>{let{initial:n=!1,once:r,amount:s,margin:u,root:i,enable:o=!0}=t,{onEnter:c,onExit:l,onIntersect:a}=t,p=U(!0),[d,T]=X(n),[v,O]=X(o),g=U(null),x=U(!1),M=Le(()=>{if(!v||typeof IntersectionObserver>"u")return;let C=s==="all"?1:s==="some"?.5:s;try{return new IntersectionObserver(async([y],S)=>{if(!y)return;let E=y.isIntersecting;try{if(x.current=!E&&!!g.current,E&&c&&await c({entry:y,observer:S}),x.current&&l&&await l({entry:y,observer:S}),a&&(E||!E&&g.current!=null)){let b={isEntering:E,isExiting:x.current};await a({entry:y,observer:S,...b})}if(g.current=E,!p.current)return;T(E)}catch(b){console.error(b)}E&&r&&S.disconnect()},{root:i||void 0,rootMargin:u,threshold:C})}catch(y){console.error(y)}},[i,u,s,r,v,c,l,a]);return Re(()=>{if(p.current=!0,!(!v||!e.current||!M))return M.observe(e.current),()=>{p.current=!1,M.disconnect()}},[e,M,v]),{inView:d,enabled:v,observer:M,isExiting:x.current,setInView:T,setEnabled:O}};import{useCallback as Y,useMemo as ke}from"react";import{blockScroll as Ve,restoreScroll as Ce}from"@alessiofrittoli/web-utils/dom";var On=e=>{let t=ke(()=>e?.current,[e]),n=Y(()=>Ve(t||void 0),[t]),r=Y(()=>Ce(t||void 0),[t]);return[n,r]};import{useMemo as we,useState as Ue}from"react";import{useEffect as De}from"react";var Z=(e,t={})=>{let{delay:n=1,args:r}=t;De(()=>{let s=setTimeout(e,n,...r||[]);return()=>clearTimeout(s)},[n,r,e])};var Ln=(e,t=500)=>{let[n,r]=Ue(e),s=we(()=>[e],[e]);return Z(r,{delay:t,args:s}),n};import{useCallback as K,useEffect as Ke,useRef as Ae,useState as We}from"react";function ee(e,t={}){let{delay:n=1,args:r,autoplay:s=!0,runOnStart:u=!1,updateState:i=!1}=t,o=Ae(void 0),[c,l]=We(s),a=K(()=>o.current?(clearInterval(o.current),o.current=void 0,!0):!1,[]),p=K(()=>{let T=a();return u&&(r?e(...r):e()),o.current=setInterval(e,n,...r||[]),!T&&i&&l(!0),o.current},[n,r,i,u,e,a]),d=K(()=>{a()&&i&&l(!1)},[i,a]);return Ke(()=>{if(s)return p(),d},[s,p,d]),i?{isActive:c,start:p,stop:d}:{start:p,stop:d}}import{useEffect as Qe}from"react";var Kn=(e,t={})=>{let{delay:n=1,args:r}=t;Qe(()=>{let s=setInterval(e,n,...r||[]);return()=>clearInterval(s)},[n,r,e])};import{useCallback as A,useEffect as Fe}from"react";function $n(e,t={}){let{autoplay:n=!0}=t,r=ee(e,{autoplay:!1,...t}),{start:s,stop:u}=r,i=A(()=>document.hidden?u():s(),[s,u]),o=A(()=>{if(document.addEventListener("visibilitychange",i),!document.hidden)return s()},[s,i]),c=A(()=>{u(),document.removeEventListener("visibilitychange",i)},[u,i]);return Fe(()=>{if(n)return o(),c},[n,o,c]),{...r,start:o,stop:c}}import{useCallback as W,useEffect as $e,useRef as je,useState as Pe}from"react";function Nn(e,t={}){let{delay:n=1,args:r,autoplay:s=!0,runOnStart:u=!1,updateState:i=!1}=t,o=je(void 0),[c,l]=Pe(s),a=W(()=>o.current?(clearTimeout(o.current),o.current=void 0,!0):!1,[]),p=W(()=>{let T=a();return u&&(r?e(...r):e()),o.current=setTimeout(()=>{if(o.current=void 0,i&&l(!1),r)return e(...r);e()},n),!T&&i&&l(!0),o.current},[n,r,i,u,e,a]),d=W(()=>{a()&&i&&l(!1)},[i,a]);return $e(()=>{if(s)return p(),d},[s,p,d]),i?{isActive:c,start:p,stop:d}:{start:p,stop:d}}export{P as getState,ot as useConnection,Zt as useDarkMode,Ln as useDebounce,It as useDeferCallback,kt as useEffectOnce,B as useEventListener,dn as useFocusTrap,yn as useInView,St as useInput,ee as useInterval,$n as useIntervalWhenVisible,q as useIsClient,R as useIsFirstRender,un as useIsPortrait,Kn as useLightInterval,Z as useLightTimeout,j as useLocalStorage,V as useMediaQuery,Wt as usePagination,On as useScrollBlock,jt as useSelection,Ze as useSessionStorage,h as useStorage,Nn as useTimeout,H as useUpdateEffect};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alessiofrittoli/react-hooks",
3
- "version": "3.3.0",
3
+ "version": "3.4.0",
4
4
  "description": "TypeScript React utility Hooks",
5
5
  "author": {
6
6
  "name": "Alessio Frittoli",
@@ -87,48 +87,48 @@
87
87
  "test:misc": "pnpm test:watch misc/*",
88
88
  "test:timers": "pnpm test:watch timers/*"
89
89
  },
90
+ "peerDependencies": {
91
+ "@types/react": "^19",
92
+ "@types/react-dom": "^19",
93
+ "react": "^19",
94
+ "react-dom": "^19"
95
+ },
90
96
  "devDependencies": {
91
- "@alessiofrittoli/event-emitter": "^1.5.0",
92
- "@alessiofrittoli/node-scripts": "^3.0.0",
93
- "@eslint/compat": "^1.3.1",
94
- "@eslint/eslintrc": "^3.3.1",
95
- "@eslint/js": "^9.31.0",
96
- "@jest/globals": "^30.0.4",
97
- "@testing-library/dom": "^10.4.0",
98
- "@testing-library/jest-dom": "^6.6.3",
97
+ "@alessiofrittoli/event-emitter": "^1.6.0",
98
+ "@alessiofrittoli/node-scripts": "^3.2.0",
99
+ "@eslint/compat": "^2.0.0",
100
+ "@eslint/eslintrc": "^3.3.3",
101
+ "@eslint/js": "^9.39.1",
102
+ "@jest/globals": "^30.2.0",
103
+ "@testing-library/dom": "^10.4.1",
104
+ "@testing-library/jest-dom": "^6.9.1",
99
105
  "@testing-library/react": "^16.3.0",
100
106
  "@testing-library/user-event": "^14.6.1",
101
107
  "@types/jest": "^30.0.0",
102
- "@types/node": "^24.0.15",
103
- "@types/react": "^19.1.8",
104
- "@types/react-dom": "^19.1.6",
105
- "concurrently": "^9.2.0",
106
- "cross-env": "^7.0.3",
107
- "dotenv": "^17.2.0",
108
- "eslint": "^9.31.0",
108
+ "@types/node": "^24.10.1",
109
+ "@types/react": "^19.2.7",
110
+ "@types/react-dom": "^19.2.3",
111
+ "concurrently": "^9.2.1",
112
+ "cross-env": "^10.1.0",
113
+ "dotenv": "^17.2.3",
114
+ "eslint": "^9.39.1",
109
115
  "eslint-plugin-react": "^7.37.5",
110
- "eslint-plugin-react-hooks": "^5.2.0",
111
- "globals": "^16.3.0",
116
+ "eslint-plugin-react-hooks": "^7.0.1",
117
+ "globals": "^16.5.0",
112
118
  "http-server": "^14.1.1",
113
- "jest": "^30.0.4",
114
- "jest-environment-jsdom": "^30.0.4",
115
- "react": "^19.1.0",
116
- "react-dom": "^19.1.0",
117
- "ts-jest": "^29.4.0",
119
+ "jest": "^30.2.0",
120
+ "jest-environment-jsdom": "^30.2.0",
121
+ "react": "^19.2.1",
122
+ "react-dom": "^19.2.1",
123
+ "ts-jest": "^29.4.6",
118
124
  "ts-node": "^10.9.2",
119
- "tsup": "^8.5.0",
120
- "typescript": "^5.8.3",
121
- "typescript-eslint": "^8.37.0"
125
+ "tsup": "^8.5.1",
126
+ "typescript": "^5.9.3",
127
+ "typescript-eslint": "^8.48.1"
122
128
  },
123
129
  "dependencies": {
124
- "@alessiofrittoli/math-utils": "^1.14.0",
125
- "@alessiofrittoli/type-utils": "^1.8.0",
126
- "@alessiofrittoli/web-utils": "^1.16.1"
127
- },
128
- "peerDependencies": {
129
- "@types/react": "^19",
130
- "@types/react-dom": "^19",
131
- "react": "^19",
132
- "react-dom": "^19"
130
+ "@alessiofrittoli/math-utils": "^1.16.0",
131
+ "@alessiofrittoli/type-utils": "^1.9.0",
132
+ "@alessiofrittoli/web-utils": "^1.18.0"
133
133
  }
134
134
  }