@alessiofrittoli/react-hooks 1.0.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.
Files changed (99) hide show
  1. package/README.md +830 -0
  2. package/dist/browser-api/index.d.mts +6 -0
  3. package/dist/browser-api/index.d.ts +6 -0
  4. package/dist/browser-api/index.js +2 -0
  5. package/dist/browser-api/index.js.map +1 -0
  6. package/dist/browser-api/index.mjs +2 -0
  7. package/dist/browser-api/index.mjs.map +1 -0
  8. package/dist/browser-api/storage/index.d.mts +4 -0
  9. package/dist/browser-api/storage/index.d.ts +4 -0
  10. package/dist/browser-api/storage/index.js +2 -0
  11. package/dist/browser-api/storage/index.js.map +1 -0
  12. package/dist/browser-api/storage/index.mjs +2 -0
  13. package/dist/browser-api/storage/index.mjs.map +1 -0
  14. package/dist/browser-api/storage/useLocalStorage.d.mts +11 -0
  15. package/dist/browser-api/storage/useLocalStorage.d.ts +11 -0
  16. package/dist/browser-api/storage/useLocalStorage.js +2 -0
  17. package/dist/browser-api/storage/useLocalStorage.js.map +1 -0
  18. package/dist/browser-api/storage/useLocalStorage.mjs +2 -0
  19. package/dist/browser-api/storage/useLocalStorage.mjs.map +1 -0
  20. package/dist/browser-api/storage/useSessionStorage.d.mts +11 -0
  21. package/dist/browser-api/storage/useSessionStorage.d.ts +11 -0
  22. package/dist/browser-api/storage/useSessionStorage.js +2 -0
  23. package/dist/browser-api/storage/useSessionStorage.js.map +1 -0
  24. package/dist/browser-api/storage/useSessionStorage.mjs +2 -0
  25. package/dist/browser-api/storage/useSessionStorage.mjs.map +1 -0
  26. package/dist/browser-api/storage/useStorage.d.mts +12 -0
  27. package/dist/browser-api/storage/useStorage.d.ts +12 -0
  28. package/dist/browser-api/storage/useStorage.js +2 -0
  29. package/dist/browser-api/storage/useStorage.js.map +1 -0
  30. package/dist/browser-api/storage/useStorage.mjs +2 -0
  31. package/dist/browser-api/storage/useStorage.mjs.map +1 -0
  32. package/dist/browser-api/useIsPortrait.d.mts +10 -0
  33. package/dist/browser-api/useIsPortrait.d.ts +10 -0
  34. package/dist/browser-api/useIsPortrait.js +2 -0
  35. package/dist/browser-api/useIsPortrait.js.map +1 -0
  36. package/dist/browser-api/useIsPortrait.mjs +2 -0
  37. package/dist/browser-api/useIsPortrait.mjs.map +1 -0
  38. package/dist/browser-api/useMediaQuery.d.mts +11 -0
  39. package/dist/browser-api/useMediaQuery.d.ts +11 -0
  40. package/dist/browser-api/useMediaQuery.js +2 -0
  41. package/dist/browser-api/useMediaQuery.js.map +1 -0
  42. package/dist/browser-api/useMediaQuery.mjs +2 -0
  43. package/dist/browser-api/useMediaQuery.mjs.map +1 -0
  44. package/dist/dom-api/index.d.mts +2 -0
  45. package/dist/dom-api/index.d.ts +2 -0
  46. package/dist/dom-api/index.js +2 -0
  47. package/dist/dom-api/index.js.map +1 -0
  48. package/dist/dom-api/index.mjs +2 -0
  49. package/dist/dom-api/index.mjs.map +1 -0
  50. package/dist/dom-api/useFocusTrap.d.mts +15 -0
  51. package/dist/dom-api/useFocusTrap.d.ts +15 -0
  52. package/dist/dom-api/useFocusTrap.js +2 -0
  53. package/dist/dom-api/useFocusTrap.js.map +1 -0
  54. package/dist/dom-api/useFocusTrap.mjs +2 -0
  55. package/dist/dom-api/useFocusTrap.mjs.map +1 -0
  56. package/dist/dom-api/useScrollBlock.d.mts +8 -0
  57. package/dist/dom-api/useScrollBlock.d.ts +8 -0
  58. package/dist/dom-api/useScrollBlock.js +2 -0
  59. package/dist/dom-api/useScrollBlock.js.map +1 -0
  60. package/dist/dom-api/useScrollBlock.mjs +2 -0
  61. package/dist/dom-api/useScrollBlock.mjs.map +1 -0
  62. package/dist/eslint.d.mts +11 -0
  63. package/dist/eslint.d.ts +11 -0
  64. package/dist/eslint.js +2 -0
  65. package/dist/eslint.js.map +1 -0
  66. package/dist/eslint.mjs +2 -0
  67. package/dist/eslint.mjs.map +1 -0
  68. package/dist/index.d.mts +11 -0
  69. package/dist/index.d.ts +11 -0
  70. package/dist/index.js +2 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/index.mjs +2 -0
  73. package/dist/index.mjs.map +1 -0
  74. package/dist/misc/index.d.mts +3 -0
  75. package/dist/misc/index.d.ts +3 -0
  76. package/dist/misc/index.js +2 -0
  77. package/dist/misc/index.js.map +1 -0
  78. package/dist/misc/index.mjs +2 -0
  79. package/dist/misc/index.mjs.map +1 -0
  80. package/dist/misc/useIsClient.d.mts +8 -0
  81. package/dist/misc/useIsClient.d.ts +8 -0
  82. package/dist/misc/useIsClient.js +2 -0
  83. package/dist/misc/useIsClient.js.map +1 -0
  84. package/dist/misc/useIsClient.mjs +2 -0
  85. package/dist/misc/useIsClient.mjs.map +1 -0
  86. package/dist/misc/useIsFirstRender.d.mts +9 -0
  87. package/dist/misc/useIsFirstRender.d.ts +9 -0
  88. package/dist/misc/useIsFirstRender.js +2 -0
  89. package/dist/misc/useIsFirstRender.js.map +1 -0
  90. package/dist/misc/useIsFirstRender.mjs +2 -0
  91. package/dist/misc/useIsFirstRender.mjs.map +1 -0
  92. package/dist/misc/useUpdateEffect.d.mts +9 -0
  93. package/dist/misc/useUpdateEffect.d.ts +9 -0
  94. package/dist/misc/useUpdateEffect.js +2 -0
  95. package/dist/misc/useUpdateEffect.js.map +1 -0
  96. package/dist/misc/useUpdateEffect.mjs +2 -0
  97. package/dist/misc/useUpdateEffect.mjs.map +1 -0
  98. package/license.md +21 -0
  99. package/package.json +144 -0
@@ -0,0 +1,6 @@
1
+ export { useStorage } from './storage/useStorage.mjs';
2
+ export { useLocalStorage } from './storage/useLocalStorage.mjs';
3
+ export { useSessionStorage } from './storage/useSessionStorage.mjs';
4
+ export { useIsPortrait } from './useIsPortrait.mjs';
5
+ export { useMediaQuery } from './useMediaQuery.mjs';
6
+ import 'react';
@@ -0,0 +1,6 @@
1
+ export { useStorage } from './storage/useStorage.js';
2
+ export { useLocalStorage } from './storage/useLocalStorage.js';
3
+ export { useSessionStorage } from './storage/useSessionStorage.js';
4
+ export { useIsPortrait } from './useIsPortrait.js';
5
+ export { useMediaQuery } from './useMediaQuery.js';
6
+ import 'react';
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),LocalStorage=require('@alessiofrittoli/web-utils/storage/LocalStorage'),SessionStorage=require('@alessiofrittoli/web-utils/storage/SessionStorage'),browserApi=require('@alessiofrittoli/web-utils/browser-api'),device=require('@alessiofrittoli/web-utils/device');var a=(e,t,r="local")=>{let o=react.useCallback(()=>(r==="local"?LocalStorage.LocalStorage:SessionStorage.SessionStorage).get(e)??t,[r,e,t]),[s,c]=react.useState(t),g=react.useCallback(n=>{c(p=>{let i=n instanceof Function?n(p):n;return (typeof window<"u"&&r==="local"?LocalStorage.LocalStorage:SessionStorage.SessionStorage).set(e,i),i});},[r,e]);return react.useEffect(()=>{c(o());},[o]),[s,g]};var b=(e,t)=>a(e,t,"local");var A=(e,t)=>a(e,t,"session");var d=e=>{let[t,r]=react.useState(browserApi.getMediaMatches(e)),o=react.useCallback(()=>r(browserApi.getMediaMatches(e)),[e]);return react.useEffect(()=>{let s=window.matchMedia(e);return o(),s.addEventListener("change",o),()=>{s.removeEventListener("change",o);}},[e,o]),t};var z=()=>d(device.portraitMediaQuery);exports.useIsPortrait=z;exports.useLocalStorage=b;exports.useMediaQuery=d;exports.useSessionStorage=A;exports.useStorage=a;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/browser-api/storage/useStorage.ts","../../src/browser-api/storage/useLocalStorage.ts","../../src/browser-api/storage/useSessionStorage.ts","../../src/browser-api/useMediaQuery.ts","../../src/browser-api/useIsPortrait.ts"],"names":["useStorage","key","initialValue","type","readValue","useCallback","LocalStorage","SessionStorage","storedValue","setStoredValue","useState","setValue","value","valueToStore","useEffect","useLocalStorage","useSessionStorage","useMediaQuery","query","matches","setMatches","getMediaMatches","matchMediaChangeHandler","matchMedia","useIsPortrait","portraitMediaQuery"],"mappings":"6SAcO,IAAMA,EAAa,CACzBC,CAAAA,CACAC,CACAC,CAAAA,CAAAA,CAA+B,OACO,GAAA,CAEtC,IAAMC,CAAYC,CAAAA,iBAAAA,CAAa,KAC5BF,CAAS,GAAA,OAAA,CAAUG,0BAAeC,6BAClC,EAAA,GAAA,CAAQN,CAAI,CAAA,EAAKC,CACjB,CAAA,CAAEC,EAAMF,CAAKC,CAAAA,CAAa,CAAE,CAQzB,CAAA,CAAEM,EAAaC,CAAe,CAAA,CAAIC,cAAoBR,CAAAA,CAAa,CAQnES,CAAAA,CAAAA,CAAWN,kBAAiCO,CAAS,EAAA,CAE1DH,EAAgBD,CAAe,EAAA,CAC9B,IAAMK,CAAeD,CAAAA,CAAAA,YAAiB,QAAWA,CAAAA,CAAAA,CAAOJ,CAAY,CAAA,CAAII,EAEvE,OACA,CAAA,OAAO,OAAW,GAClBT,EAAAA,CAAAA,GAAS,QAAUG,yBAAeC,CAAAA,6BAAAA,EACjC,GAAKN,CAAAA,CAAAA,CAAKY,CAAa,CAAA,CAElBA,CACR,CAAE,EAGH,EAAG,CAAEV,CAAAA,CAAMF,CAAI,CAAE,CAAA,CAEjB,OAAAa,eAAAA,CAAW,IAAM,CAChBL,EAAgBL,CAAU,EAAE,EAC7B,CAAG,CAAA,CAAEA,CAAU,CAAE,CAAA,CAEV,CAAEI,CAAAA,CAAaG,CAAS,CAChC,ECpDaI,IAAAA,CAAAA,CAAkB,CAC9Bd,CACAC,CAAAA,CAAAA,GACIF,EAAYC,CAAKC,CAAAA,CAAAA,CAAc,OAAQ,ECHrC,IAAMc,EAAoB,CAChCf,CAAAA,CACAC,IACIF,CAAYC,CAAAA,CAAAA,CAAKC,EAAc,SAAU,ECCvC,IAAMe,CAAkBC,CAAAA,CAAAA,EAAmB,CAEjD,GAAM,CAAEC,CAASC,CAAAA,CAAW,EAAIV,cAAUW,CAAAA,0BAAAA,CAAiBH,CAAM,CAAE,CAAA,CAC7DI,CAA0BjB,CAAAA,iBAAAA,CAAa,IAAMe,CAAAA,CAAYC,2BAAiBH,CAAM,CAAE,EAAG,CAAEA,CAAM,CAAE,CAGrG,CAAA,OAAAJ,eAAW,CAAA,IAAM,CAEhB,IAAMS,EAAa,MAAO,CAAA,UAAA,CAAYL,CAAM,CAE5C,CAAA,OAAAI,GAEAC,CAAAA,CAAAA,CAAW,gBAAkB,CAAA,QAAA,CAAUD,CAAwB,CAAA,CAExD,IAAM,CACZC,CAAAA,CAAW,oBAAqB,QAAUD,CAAAA,CAAwB,EACnE,CAED,CAAA,CAAG,CAAEJ,CAAAA,CAAOI,CAAwB,CAAE,EAE/BH,CAER,ECxBaK,IAAAA,CAAAA,CAAgB,IAAMP,CAAAA,CAAeQ,yBAAmB","file":"index.js","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { LocalStorage } from '@alessiofrittoli/web-utils/storage/LocalStorage'\nimport { SessionStorage } from '@alessiofrittoli/web-utils/storage/SessionStorage'\n\ntype Value<T>\t\t= T | undefined | null\ntype SetValue<T>\t= React.Dispatch<React.SetStateAction<T>>\n\n/**\n * Easly handle Local or Session Storage State.\n * \n * @param\tkey\t\t\t\tThe storage item key.\n * @param\tinitialValue\tThe storage item initial value.\n * @param\ttype\t\t\t( Optional ) The storage API to use. Default: `local`.\n */\nexport const useStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T,\n\ttype\t\t\t: 'local' | 'session' = 'local'\n): [ Value<T>, SetValue<Value<T>> ] => {\n\n\tconst readValue = useCallback( () => (\n\t\t( type === 'local' ? LocalStorage : SessionStorage )\n\t\t\t.get<T>( key ) ?? initialValue\n\t), [ type, key, initialValue ] )\n\n\n\t/**\n\t * State to store our value.\n\t * Pass initial state function to useState so logic is only executed once.\n\t * \n\t */\n\tconst [ storedValue, setStoredValue ] = useState<Value<T>>( initialValue )\n\n\t/**\n\t * Return a wrapped version of useState's setter function that\n\t * persists the new value to localStorage | sessionStorage.\n\t * \n\t * @param value The SetStateAction value.\n\t */\n\tconst setValue = useCallback<SetValue<Value<T>>>( value => {\n\n\t\tsetStoredValue( storedValue => {\n\t\t\tconst valueToStore = value instanceof Function ? value( storedValue ) : value\n\t\n\t\t\t;(\n\t\t\t\ttypeof window !== 'undefined' &&\n\t\t\t\ttype === 'local' ? LocalStorage : SessionStorage\n\t\t\t).set( key, valueToStore )\n\n\t\t\treturn valueToStore\n\t\t} )\n\n\n\t}, [ type, key ] )\n\n\tuseEffect( () => {\n\t\tsetStoredValue( readValue() )\n\t}, [ readValue ] )\n\n\treturn [ storedValue, setValue ]\n}","import { useStorage } from './useStorage'\n\n/**\n * useLocalStorage hook.\n * \n * @param\tkey\t\t\t\tThe local storage item key.\n * @param\tinitialValue\tThe local storage item initial value.\n */\nexport const useLocalStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T\n) => useStorage( key, initialValue, 'local' )","import { useStorage } from './useStorage'\n\n/**\n * useSessionStorage hook.\n * \n * @param\tkey\t\t\t\tThe session item key.\n * @param\tinitialValue\tThe session item initial value.\n */\nexport const useSessionStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T\n) => useStorage( key, initialValue, 'session' )","import { useCallback, useEffect, useState } from 'react'\nimport { getMediaMatches } from '@alessiofrittoli/web-utils/browser-api'\n\n\n/**\n * Get Document Media matches and listen for changes.\n *\n * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia)\n *\n * @param\tquery A string specifying the media query to parse into a `MediaQueryList`.\n * @returns\tA boolean value that returns `true` if the document currently matches the media query list, or `false` if not.\n */\nexport const useMediaQuery = ( query: string ) => {\n\n\tconst [ matches, setMatches ]\t= useState( getMediaMatches( query ) )\n\tconst matchMediaChangeHandler\t= useCallback( () => setMatches( getMediaMatches( query ) ), [ query ] )\n\n\n\tuseEffect( () => {\n\n\t\tconst matchMedia = window.matchMedia( query )\n\t\t// Triggered at the first client-side load\n\t\tmatchMediaChangeHandler()\n\t\t// Listen matchMedia\n\t\tmatchMedia.addEventListener( 'change', matchMediaChangeHandler )\n\n\t\treturn () => {\n\t\t\tmatchMedia.removeEventListener( 'change', matchMediaChangeHandler )\n\t\t}\n\n\t}, [ query, matchMediaChangeHandler ] )\n\n\treturn matches\n\t\n}","import { useMediaQuery } from './useMediaQuery'\nimport { portraitMediaQuery } from '@alessiofrittoli/web-utils/device'\n\n/**\n * Check if device is portrait oriented.\n * \n * State get updated when device orientation changes.\n *\n * @returns\t`true` if the device is portrait oriented, `false` otherwise.\n */\nexport const useIsPortrait = () => useMediaQuery( portraitMediaQuery )"]}
@@ -0,0 +1,2 @@
1
+ import {useCallback,useState,useEffect}from'react';import {LocalStorage}from'@alessiofrittoli/web-utils/storage/LocalStorage';import {SessionStorage}from'@alessiofrittoli/web-utils/storage/SessionStorage';import {getMediaMatches}from'@alessiofrittoli/web-utils/browser-api';import {portraitMediaQuery}from'@alessiofrittoli/web-utils/device';var a=(e,t,r="local")=>{let o=useCallback(()=>(r==="local"?LocalStorage:SessionStorage).get(e)??t,[r,e,t]),[s,c]=useState(t),g=useCallback(n=>{c(p=>{let i=n instanceof Function?n(p):n;return (typeof window<"u"&&r==="local"?LocalStorage:SessionStorage).set(e,i),i});},[r,e]);return useEffect(()=>{c(o());},[o]),[s,g]};var b=(e,t)=>a(e,t,"local");var A=(e,t)=>a(e,t,"session");var d=e=>{let[t,r]=useState(getMediaMatches(e)),o=useCallback(()=>r(getMediaMatches(e)),[e]);return useEffect(()=>{let s=window.matchMedia(e);return o(),s.addEventListener("change",o),()=>{s.removeEventListener("change",o);}},[e,o]),t};var z=()=>d(portraitMediaQuery);export{z as useIsPortrait,b as useLocalStorage,d as useMediaQuery,A as useSessionStorage,a as useStorage};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/browser-api/storage/useStorage.ts","../../src/browser-api/storage/useLocalStorage.ts","../../src/browser-api/storage/useSessionStorage.ts","../../src/browser-api/useMediaQuery.ts","../../src/browser-api/useIsPortrait.ts"],"names":["useStorage","key","initialValue","type","readValue","useCallback","LocalStorage","SessionStorage","storedValue","setStoredValue","useState","setValue","value","valueToStore","useEffect","useLocalStorage","useSessionStorage","useMediaQuery","query","matches","setMatches","getMediaMatches","matchMediaChangeHandler","matchMedia","useIsPortrait","portraitMediaQuery"],"mappings":"qVAcO,IAAMA,EAAa,CACzBC,CAAAA,CACAC,CACAC,CAAAA,CAAAA,CAA+B,OACO,GAAA,CAEtC,IAAMC,CAAYC,CAAAA,WAAAA,CAAa,KAC5BF,CAAS,GAAA,OAAA,CAAUG,aAAeC,cAClC,EAAA,GAAA,CAAQN,CAAI,CAAA,EAAKC,CACjB,CAAA,CAAEC,EAAMF,CAAKC,CAAAA,CAAa,CAAE,CAQzB,CAAA,CAAEM,EAAaC,CAAe,CAAA,CAAIC,QAAoBR,CAAAA,CAAa,CAQnES,CAAAA,CAAAA,CAAWN,YAAiCO,CAAS,EAAA,CAE1DH,EAAgBD,CAAe,EAAA,CAC9B,IAAMK,CAAeD,CAAAA,CAAAA,YAAiB,QAAWA,CAAAA,CAAAA,CAAOJ,CAAY,CAAA,CAAII,EAEvE,OACA,CAAA,OAAO,OAAW,GAClBT,EAAAA,CAAAA,GAAS,QAAUG,YAAeC,CAAAA,cAAAA,EACjC,GAAKN,CAAAA,CAAAA,CAAKY,CAAa,CAAA,CAElBA,CACR,CAAE,EAGH,EAAG,CAAEV,CAAAA,CAAMF,CAAI,CAAE,CAAA,CAEjB,OAAAa,SAAAA,CAAW,IAAM,CAChBL,EAAgBL,CAAU,EAAE,EAC7B,CAAG,CAAA,CAAEA,CAAU,CAAE,CAAA,CAEV,CAAEI,CAAAA,CAAaG,CAAS,CAChC,ECpDaI,IAAAA,CAAAA,CAAkB,CAC9Bd,CACAC,CAAAA,CAAAA,GACIF,EAAYC,CAAKC,CAAAA,CAAAA,CAAc,OAAQ,ECHrC,IAAMc,EAAoB,CAChCf,CAAAA,CACAC,IACIF,CAAYC,CAAAA,CAAAA,CAAKC,EAAc,SAAU,ECCvC,IAAMe,CAAkBC,CAAAA,CAAAA,EAAmB,CAEjD,GAAM,CAAEC,CAASC,CAAAA,CAAW,EAAIV,QAAUW,CAAAA,eAAAA,CAAiBH,CAAM,CAAE,CAAA,CAC7DI,CAA0BjB,CAAAA,WAAAA,CAAa,IAAMe,CAAAA,CAAYC,gBAAiBH,CAAM,CAAE,EAAG,CAAEA,CAAM,CAAE,CAGrG,CAAA,OAAAJ,SAAW,CAAA,IAAM,CAEhB,IAAMS,EAAa,MAAO,CAAA,UAAA,CAAYL,CAAM,CAE5C,CAAA,OAAAI,GAEAC,CAAAA,CAAAA,CAAW,gBAAkB,CAAA,QAAA,CAAUD,CAAwB,CAAA,CAExD,IAAM,CACZC,CAAAA,CAAW,oBAAqB,QAAUD,CAAAA,CAAwB,EACnE,CAED,CAAA,CAAG,CAAEJ,CAAAA,CAAOI,CAAwB,CAAE,EAE/BH,CAER,ECxBaK,IAAAA,CAAAA,CAAgB,IAAMP,CAAAA,CAAeQ,kBAAmB","file":"index.mjs","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { LocalStorage } from '@alessiofrittoli/web-utils/storage/LocalStorage'\nimport { SessionStorage } from '@alessiofrittoli/web-utils/storage/SessionStorage'\n\ntype Value<T>\t\t= T | undefined | null\ntype SetValue<T>\t= React.Dispatch<React.SetStateAction<T>>\n\n/**\n * Easly handle Local or Session Storage State.\n * \n * @param\tkey\t\t\t\tThe storage item key.\n * @param\tinitialValue\tThe storage item initial value.\n * @param\ttype\t\t\t( Optional ) The storage API to use. Default: `local`.\n */\nexport const useStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T,\n\ttype\t\t\t: 'local' | 'session' = 'local'\n): [ Value<T>, SetValue<Value<T>> ] => {\n\n\tconst readValue = useCallback( () => (\n\t\t( type === 'local' ? LocalStorage : SessionStorage )\n\t\t\t.get<T>( key ) ?? initialValue\n\t), [ type, key, initialValue ] )\n\n\n\t/**\n\t * State to store our value.\n\t * Pass initial state function to useState so logic is only executed once.\n\t * \n\t */\n\tconst [ storedValue, setStoredValue ] = useState<Value<T>>( initialValue )\n\n\t/**\n\t * Return a wrapped version of useState's setter function that\n\t * persists the new value to localStorage | sessionStorage.\n\t * \n\t * @param value The SetStateAction value.\n\t */\n\tconst setValue = useCallback<SetValue<Value<T>>>( value => {\n\n\t\tsetStoredValue( storedValue => {\n\t\t\tconst valueToStore = value instanceof Function ? value( storedValue ) : value\n\t\n\t\t\t;(\n\t\t\t\ttypeof window !== 'undefined' &&\n\t\t\t\ttype === 'local' ? LocalStorage : SessionStorage\n\t\t\t).set( key, valueToStore )\n\n\t\t\treturn valueToStore\n\t\t} )\n\n\n\t}, [ type, key ] )\n\n\tuseEffect( () => {\n\t\tsetStoredValue( readValue() )\n\t}, [ readValue ] )\n\n\treturn [ storedValue, setValue ]\n}","import { useStorage } from './useStorage'\n\n/**\n * useLocalStorage hook.\n * \n * @param\tkey\t\t\t\tThe local storage item key.\n * @param\tinitialValue\tThe local storage item initial value.\n */\nexport const useLocalStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T\n) => useStorage( key, initialValue, 'local' )","import { useStorage } from './useStorage'\n\n/**\n * useSessionStorage hook.\n * \n * @param\tkey\t\t\t\tThe session item key.\n * @param\tinitialValue\tThe session item initial value.\n */\nexport const useSessionStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T\n) => useStorage( key, initialValue, 'session' )","import { useCallback, useEffect, useState } from 'react'\nimport { getMediaMatches } from '@alessiofrittoli/web-utils/browser-api'\n\n\n/**\n * Get Document Media matches and listen for changes.\n *\n * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia)\n *\n * @param\tquery A string specifying the media query to parse into a `MediaQueryList`.\n * @returns\tA boolean value that returns `true` if the document currently matches the media query list, or `false` if not.\n */\nexport const useMediaQuery = ( query: string ) => {\n\n\tconst [ matches, setMatches ]\t= useState( getMediaMatches( query ) )\n\tconst matchMediaChangeHandler\t= useCallback( () => setMatches( getMediaMatches( query ) ), [ query ] )\n\n\n\tuseEffect( () => {\n\n\t\tconst matchMedia = window.matchMedia( query )\n\t\t// Triggered at the first client-side load\n\t\tmatchMediaChangeHandler()\n\t\t// Listen matchMedia\n\t\tmatchMedia.addEventListener( 'change', matchMediaChangeHandler )\n\n\t\treturn () => {\n\t\t\tmatchMedia.removeEventListener( 'change', matchMediaChangeHandler )\n\t\t}\n\n\t}, [ query, matchMediaChangeHandler ] )\n\n\treturn matches\n\t\n}","import { useMediaQuery } from './useMediaQuery'\nimport { portraitMediaQuery } from '@alessiofrittoli/web-utils/device'\n\n/**\n * Check if device is portrait oriented.\n * \n * State get updated when device orientation changes.\n *\n * @returns\t`true` if the device is portrait oriented, `false` otherwise.\n */\nexport const useIsPortrait = () => useMediaQuery( portraitMediaQuery )"]}
@@ -0,0 +1,4 @@
1
+ export { useStorage } from './useStorage.mjs';
2
+ export { useLocalStorage } from './useLocalStorage.mjs';
3
+ export { useSessionStorage } from './useSessionStorage.mjs';
4
+ import 'react';
@@ -0,0 +1,4 @@
1
+ export { useStorage } from './useStorage.js';
2
+ export { useLocalStorage } from './useLocalStorage.js';
3
+ export { useSessionStorage } from './useSessionStorage.js';
4
+ import 'react';
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),LocalStorage=require('@alessiofrittoli/web-utils/storage/LocalStorage'),SessionStorage=require('@alessiofrittoli/web-utils/storage/SessionStorage');var r=(e,o,t="local")=>{let a=react.useCallback(()=>(t==="local"?LocalStorage.LocalStorage:SessionStorage.SessionStorage).get(e)??o,[t,e,o]),[i,n]=react.useState(o),T=react.useCallback(s=>{n(f=>{let l=s instanceof Function?s(f):s;return (typeof window<"u"&&t==="local"?LocalStorage.LocalStorage:SessionStorage.SessionStorage).set(e,l),l});},[t,e]);return react.useEffect(()=>{n(a());},[a]),[i,T]};var L=(e,o)=>r(e,o,"local");var h=(e,o)=>r(e,o,"session");exports.useLocalStorage=L;exports.useSessionStorage=h;exports.useStorage=r;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/browser-api/storage/useStorage.ts","../../../src/browser-api/storage/useLocalStorage.ts","../../../src/browser-api/storage/useSessionStorage.ts"],"names":["useStorage","key","initialValue","type","readValue","useCallback","LocalStorage","SessionStorage","storedValue","setStoredValue","useState","setValue","value","valueToStore","useEffect","useLocalStorage","useSessionStorage"],"mappings":"4LAcaA,IAAAA,CAAAA,CAAa,CACzBC,CAAAA,CACAC,CACAC,CAAAA,CAAAA,CAA+B,OACO,GAAA,CAEtC,IAAMC,CAAAA,CAAYC,iBAAa,CAAA,IAAA,CAC5BF,CAAS,GAAA,OAAA,CAAUG,0BAAeC,6BAClC,EAAA,GAAA,CAAQN,CAAI,CAAA,EAAKC,CACjB,CAAA,CAAEC,CAAMF,CAAAA,CAAAA,CAAKC,CAAa,CAAE,CAQzB,CAAA,CAAEM,CAAaC,CAAAA,CAAe,CAAIC,CAAAA,cAAAA,CAAoBR,CAAa,CAAA,CAQnES,CAAWN,CAAAA,iBAAAA,CAAiCO,CAAS,EAAA,CAE1DH,CAAgBD,CAAAA,CAAAA,EAAe,CAC9B,IAAMK,CAAeD,CAAAA,CAAAA,YAAiB,QAAWA,CAAAA,CAAAA,CAAOJ,CAAY,CAAII,CAAAA,CAAAA,CAEvE,OACA,CAAA,OAAO,MAAW,CAAA,GAAA,EAClBT,CAAS,GAAA,OAAA,CAAUG,yBAAeC,CAAAA,6BAAAA,EACjC,GAAKN,CAAAA,CAAAA,CAAKY,CAAa,CAAA,CAElBA,CACR,CAAE,EAGH,CAAA,CAAG,CAAEV,CAAAA,CAAMF,CAAI,CAAE,CAEjB,CAAA,OAAAa,eAAW,CAAA,IAAM,CAChBL,CAAAA,CAAgBL,CAAU,EAAE,EAC7B,CAAG,CAAA,CAAEA,CAAU,CAAE,CAEV,CAAA,CAAEI,CAAaG,CAAAA,CAAS,CAChC,ECpDaI,IAAAA,CAAAA,CAAkB,CAC9Bd,CAAAA,CACAC,CACIF,GAAAA,CAAAA,CAAYC,CAAKC,CAAAA,CAAAA,CAAc,OAAQ,ECH/Bc,IAAAA,CAAAA,CAAoB,CAChCf,CAAAA,CACAC,CACIF,GAAAA,CAAAA,CAAYC,CAAKC,CAAAA,CAAAA,CAAc,SAAU","file":"index.js","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { LocalStorage } from '@alessiofrittoli/web-utils/storage/LocalStorage'\nimport { SessionStorage } from '@alessiofrittoli/web-utils/storage/SessionStorage'\n\ntype Value<T>\t\t= T | undefined | null\ntype SetValue<T>\t= React.Dispatch<React.SetStateAction<T>>\n\n/**\n * Easly handle Local or Session Storage State.\n * \n * @param\tkey\t\t\t\tThe storage item key.\n * @param\tinitialValue\tThe storage item initial value.\n * @param\ttype\t\t\t( Optional ) The storage API to use. Default: `local`.\n */\nexport const useStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T,\n\ttype\t\t\t: 'local' | 'session' = 'local'\n): [ Value<T>, SetValue<Value<T>> ] => {\n\n\tconst readValue = useCallback( () => (\n\t\t( type === 'local' ? LocalStorage : SessionStorage )\n\t\t\t.get<T>( key ) ?? initialValue\n\t), [ type, key, initialValue ] )\n\n\n\t/**\n\t * State to store our value.\n\t * Pass initial state function to useState so logic is only executed once.\n\t * \n\t */\n\tconst [ storedValue, setStoredValue ] = useState<Value<T>>( initialValue )\n\n\t/**\n\t * Return a wrapped version of useState's setter function that\n\t * persists the new value to localStorage | sessionStorage.\n\t * \n\t * @param value The SetStateAction value.\n\t */\n\tconst setValue = useCallback<SetValue<Value<T>>>( value => {\n\n\t\tsetStoredValue( storedValue => {\n\t\t\tconst valueToStore = value instanceof Function ? value( storedValue ) : value\n\t\n\t\t\t;(\n\t\t\t\ttypeof window !== 'undefined' &&\n\t\t\t\ttype === 'local' ? LocalStorage : SessionStorage\n\t\t\t).set( key, valueToStore )\n\n\t\t\treturn valueToStore\n\t\t} )\n\n\n\t}, [ type, key ] )\n\n\tuseEffect( () => {\n\t\tsetStoredValue( readValue() )\n\t}, [ readValue ] )\n\n\treturn [ storedValue, setValue ]\n}","import { useStorage } from './useStorage'\n\n/**\n * useLocalStorage hook.\n * \n * @param\tkey\t\t\t\tThe local storage item key.\n * @param\tinitialValue\tThe local storage item initial value.\n */\nexport const useLocalStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T\n) => useStorage( key, initialValue, 'local' )","import { useStorage } from './useStorage'\n\n/**\n * useSessionStorage hook.\n * \n * @param\tkey\t\t\t\tThe session item key.\n * @param\tinitialValue\tThe session item initial value.\n */\nexport const useSessionStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T\n) => useStorage( key, initialValue, 'session' )"]}
@@ -0,0 +1,2 @@
1
+ import {useCallback,useState,useEffect}from'react';import {LocalStorage}from'@alessiofrittoli/web-utils/storage/LocalStorage';import {SessionStorage}from'@alessiofrittoli/web-utils/storage/SessionStorage';var r=(e,o,t="local")=>{let a=useCallback(()=>(t==="local"?LocalStorage:SessionStorage).get(e)??o,[t,e,o]),[i,n]=useState(o),T=useCallback(s=>{n(f=>{let l=s instanceof Function?s(f):s;return (typeof window<"u"&&t==="local"?LocalStorage:SessionStorage).set(e,l),l});},[t,e]);return useEffect(()=>{n(a());},[a]),[i,T]};var L=(e,o)=>r(e,o,"local");var h=(e,o)=>r(e,o,"session");export{L as useLocalStorage,h as useSessionStorage,r as useStorage};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/browser-api/storage/useStorage.ts","../../../src/browser-api/storage/useLocalStorage.ts","../../../src/browser-api/storage/useSessionStorage.ts"],"names":["useStorage","key","initialValue","type","readValue","useCallback","LocalStorage","SessionStorage","storedValue","setStoredValue","useState","setValue","value","valueToStore","useEffect","useLocalStorage","useSessionStorage"],"mappings":"6MAcaA,IAAAA,CAAAA,CAAa,CACzBC,CAAAA,CACAC,CACAC,CAAAA,CAAAA,CAA+B,OACO,GAAA,CAEtC,IAAMC,CAAAA,CAAYC,WAAa,CAAA,IAAA,CAC5BF,CAAS,GAAA,OAAA,CAAUG,aAAeC,cAClC,EAAA,GAAA,CAAQN,CAAI,CAAA,EAAKC,CACjB,CAAA,CAAEC,CAAMF,CAAAA,CAAAA,CAAKC,CAAa,CAAE,CAQzB,CAAA,CAAEM,CAAaC,CAAAA,CAAe,CAAIC,CAAAA,QAAAA,CAAoBR,CAAa,CAAA,CAQnES,CAAWN,CAAAA,WAAAA,CAAiCO,CAAS,EAAA,CAE1DH,CAAgBD,CAAAA,CAAAA,EAAe,CAC9B,IAAMK,CAAeD,CAAAA,CAAAA,YAAiB,QAAWA,CAAAA,CAAAA,CAAOJ,CAAY,CAAII,CAAAA,CAAAA,CAEvE,OACA,CAAA,OAAO,MAAW,CAAA,GAAA,EAClBT,CAAS,GAAA,OAAA,CAAUG,YAAeC,CAAAA,cAAAA,EACjC,GAAKN,CAAAA,CAAAA,CAAKY,CAAa,CAAA,CAElBA,CACR,CAAE,EAGH,CAAA,CAAG,CAAEV,CAAAA,CAAMF,CAAI,CAAE,CAEjB,CAAA,OAAAa,SAAW,CAAA,IAAM,CAChBL,CAAAA,CAAgBL,CAAU,EAAE,EAC7B,CAAG,CAAA,CAAEA,CAAU,CAAE,CAEV,CAAA,CAAEI,CAAaG,CAAAA,CAAS,CAChC,ECpDaI,IAAAA,CAAAA,CAAkB,CAC9Bd,CAAAA,CACAC,CACIF,GAAAA,CAAAA,CAAYC,CAAKC,CAAAA,CAAAA,CAAc,OAAQ,ECH/Bc,IAAAA,CAAAA,CAAoB,CAChCf,CAAAA,CACAC,CACIF,GAAAA,CAAAA,CAAYC,CAAKC,CAAAA,CAAAA,CAAc,SAAU","file":"index.mjs","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { LocalStorage } from '@alessiofrittoli/web-utils/storage/LocalStorage'\nimport { SessionStorage } from '@alessiofrittoli/web-utils/storage/SessionStorage'\n\ntype Value<T>\t\t= T | undefined | null\ntype SetValue<T>\t= React.Dispatch<React.SetStateAction<T>>\n\n/**\n * Easly handle Local or Session Storage State.\n * \n * @param\tkey\t\t\t\tThe storage item key.\n * @param\tinitialValue\tThe storage item initial value.\n * @param\ttype\t\t\t( Optional ) The storage API to use. Default: `local`.\n */\nexport const useStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T,\n\ttype\t\t\t: 'local' | 'session' = 'local'\n): [ Value<T>, SetValue<Value<T>> ] => {\n\n\tconst readValue = useCallback( () => (\n\t\t( type === 'local' ? LocalStorage : SessionStorage )\n\t\t\t.get<T>( key ) ?? initialValue\n\t), [ type, key, initialValue ] )\n\n\n\t/**\n\t * State to store our value.\n\t * Pass initial state function to useState so logic is only executed once.\n\t * \n\t */\n\tconst [ storedValue, setStoredValue ] = useState<Value<T>>( initialValue )\n\n\t/**\n\t * Return a wrapped version of useState's setter function that\n\t * persists the new value to localStorage | sessionStorage.\n\t * \n\t * @param value The SetStateAction value.\n\t */\n\tconst setValue = useCallback<SetValue<Value<T>>>( value => {\n\n\t\tsetStoredValue( storedValue => {\n\t\t\tconst valueToStore = value instanceof Function ? value( storedValue ) : value\n\t\n\t\t\t;(\n\t\t\t\ttypeof window !== 'undefined' &&\n\t\t\t\ttype === 'local' ? LocalStorage : SessionStorage\n\t\t\t).set( key, valueToStore )\n\n\t\t\treturn valueToStore\n\t\t} )\n\n\n\t}, [ type, key ] )\n\n\tuseEffect( () => {\n\t\tsetStoredValue( readValue() )\n\t}, [ readValue ] )\n\n\treturn [ storedValue, setValue ]\n}","import { useStorage } from './useStorage'\n\n/**\n * useLocalStorage hook.\n * \n * @param\tkey\t\t\t\tThe local storage item key.\n * @param\tinitialValue\tThe local storage item initial value.\n */\nexport const useLocalStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T\n) => useStorage( key, initialValue, 'local' )","import { useStorage } from './useStorage'\n\n/**\n * useSessionStorage hook.\n * \n * @param\tkey\t\t\t\tThe session item key.\n * @param\tinitialValue\tThe session item initial value.\n */\nexport const useSessionStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T\n) => useStorage( key, initialValue, 'session' )"]}
@@ -0,0 +1,11 @@
1
+ import * as react from 'react';
2
+
3
+ /**
4
+ * useLocalStorage hook.
5
+ *
6
+ * @param key The local storage item key.
7
+ * @param initialValue The local storage item initial value.
8
+ */
9
+ declare const useLocalStorage: <T = string>(key: string, initialValue?: T) => [T | null | undefined, (value: react.SetStateAction<T | null | undefined>) => void];
10
+
11
+ export { useLocalStorage };
@@ -0,0 +1,11 @@
1
+ import * as react from 'react';
2
+
3
+ /**
4
+ * useLocalStorage hook.
5
+ *
6
+ * @param key The local storage item key.
7
+ * @param initialValue The local storage item initial value.
8
+ */
9
+ declare const useLocalStorage: <T = string>(key: string, initialValue?: T) => [T | null | undefined, (value: react.SetStateAction<T | null | undefined>) => void];
10
+
11
+ export { useLocalStorage };
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),LocalStorage=require('@alessiofrittoli/web-utils/storage/LocalStorage'),SessionStorage=require('@alessiofrittoli/web-utils/storage/SessionStorage');var S=(e,t,o="local")=>{let r=react.useCallback(()=>(o==="local"?LocalStorage.LocalStorage:SessionStorage.SessionStorage).get(e)??t,[o,e,t]),[T,s]=react.useState(t),i=react.useCallback(a=>{s(f=>{let l=a instanceof Function?a(f):a;return (typeof window<"u"&&o==="local"?LocalStorage.LocalStorage:SessionStorage.SessionStorage).set(e,l),l});},[o,e]);return react.useEffect(()=>{s(r());},[r]),[T,i]};var L=(e,t)=>S(e,t,"local");exports.useLocalStorage=L;//# sourceMappingURL=useLocalStorage.js.map
2
+ //# sourceMappingURL=useLocalStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/browser-api/storage/useStorage.ts","../../../src/browser-api/storage/useLocalStorage.ts"],"names":["useStorage","key","initialValue","type","readValue","useCallback","LocalStorage","SessionStorage","storedValue","setStoredValue","useState","setValue","value","valueToStore","useEffect","useLocalStorage"],"mappings":"4LAcO,IAAMA,CAAAA,CAAa,CACzBC,CAAAA,CACAC,EACAC,CAA+B,CAAA,OAAA,GACO,CAEtC,IAAMC,CAAYC,CAAAA,iBAAAA,CAAa,KAC5BF,CAAS,GAAA,OAAA,CAAUG,yBAAeC,CAAAA,6BAAAA,EAClC,GAAQN,CAAAA,CAAI,GAAKC,CACjB,CAAA,CAAEC,CAAMF,CAAAA,CAAAA,CAAKC,CAAa,CAAE,EAQzB,CAAEM,CAAAA,CAAaC,CAAe,CAAA,CAAIC,cAAoBR,CAAAA,CAAa,CAQnES,CAAAA,CAAAA,CAAWN,iBAAiCO,CAAAA,CAAAA,EAAS,CAE1DH,CAAAA,CAAgBD,CAAe,EAAA,CAC9B,IAAMK,CAAeD,CAAAA,CAAAA,YAAiB,QAAWA,CAAAA,CAAAA,CAAOJ,CAAY,CAAA,CAAII,EAEvE,OACA,CAAA,OAAO,MAAW,CAAA,GAAA,EAClBT,CAAS,GAAA,OAAA,CAAUG,0BAAeC,6BACjC,EAAA,GAAA,CAAKN,CAAKY,CAAAA,CAAa,CAElBA,CAAAA,CACR,CAAE,EAGH,CAAA,CAAG,CAAEV,CAAAA,CAAMF,CAAI,CAAE,EAEjB,OAAAa,eAAAA,CAAW,IAAM,CAChBL,CAAgBL,CAAAA,CAAAA,EAAY,EAC7B,CAAA,CAAG,CAAEA,CAAU,CAAE,CAAA,CAEV,CAAEI,CAAaG,CAAAA,CAAS,CAChC,CAAA,CCpDaI,IAAAA,CAAAA,CAAkB,CAC9Bd,CAAAA,CACAC,CACIF,GAAAA,CAAAA,CAAYC,CAAKC,CAAAA,CAAAA,CAAc,OAAQ","file":"useLocalStorage.js","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { LocalStorage } from '@alessiofrittoli/web-utils/storage/LocalStorage'\nimport { SessionStorage } from '@alessiofrittoli/web-utils/storage/SessionStorage'\n\ntype Value<T>\t\t= T | undefined | null\ntype SetValue<T>\t= React.Dispatch<React.SetStateAction<T>>\n\n/**\n * Easly handle Local or Session Storage State.\n * \n * @param\tkey\t\t\t\tThe storage item key.\n * @param\tinitialValue\tThe storage item initial value.\n * @param\ttype\t\t\t( Optional ) The storage API to use. Default: `local`.\n */\nexport const useStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T,\n\ttype\t\t\t: 'local' | 'session' = 'local'\n): [ Value<T>, SetValue<Value<T>> ] => {\n\n\tconst readValue = useCallback( () => (\n\t\t( type === 'local' ? LocalStorage : SessionStorage )\n\t\t\t.get<T>( key ) ?? initialValue\n\t), [ type, key, initialValue ] )\n\n\n\t/**\n\t * State to store our value.\n\t * Pass initial state function to useState so logic is only executed once.\n\t * \n\t */\n\tconst [ storedValue, setStoredValue ] = useState<Value<T>>( initialValue )\n\n\t/**\n\t * Return a wrapped version of useState's setter function that\n\t * persists the new value to localStorage | sessionStorage.\n\t * \n\t * @param value The SetStateAction value.\n\t */\n\tconst setValue = useCallback<SetValue<Value<T>>>( value => {\n\n\t\tsetStoredValue( storedValue => {\n\t\t\tconst valueToStore = value instanceof Function ? value( storedValue ) : value\n\t\n\t\t\t;(\n\t\t\t\ttypeof window !== 'undefined' &&\n\t\t\t\ttype === 'local' ? LocalStorage : SessionStorage\n\t\t\t).set( key, valueToStore )\n\n\t\t\treturn valueToStore\n\t\t} )\n\n\n\t}, [ type, key ] )\n\n\tuseEffect( () => {\n\t\tsetStoredValue( readValue() )\n\t}, [ readValue ] )\n\n\treturn [ storedValue, setValue ]\n}","import { useStorage } from './useStorage'\n\n/**\n * useLocalStorage hook.\n * \n * @param\tkey\t\t\t\tThe local storage item key.\n * @param\tinitialValue\tThe local storage item initial value.\n */\nexport const useLocalStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T\n) => useStorage( key, initialValue, 'local' )"]}
@@ -0,0 +1,2 @@
1
+ import {useCallback,useState,useEffect}from'react';import {LocalStorage}from'@alessiofrittoli/web-utils/storage/LocalStorage';import {SessionStorage}from'@alessiofrittoli/web-utils/storage/SessionStorage';var S=(e,t,o="local")=>{let r=useCallback(()=>(o==="local"?LocalStorage:SessionStorage).get(e)??t,[o,e,t]),[T,s]=useState(t),i=useCallback(a=>{s(f=>{let l=a instanceof Function?a(f):a;return (typeof window<"u"&&o==="local"?LocalStorage:SessionStorage).set(e,l),l});},[o,e]);return useEffect(()=>{s(r());},[r]),[T,i]};var L=(e,t)=>S(e,t,"local");export{L as useLocalStorage};//# sourceMappingURL=useLocalStorage.mjs.map
2
+ //# sourceMappingURL=useLocalStorage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/browser-api/storage/useStorage.ts","../../../src/browser-api/storage/useLocalStorage.ts"],"names":["useStorage","key","initialValue","type","readValue","useCallback","LocalStorage","SessionStorage","storedValue","setStoredValue","useState","setValue","value","valueToStore","useEffect","useLocalStorage"],"mappings":"6MAcO,IAAMA,CAAAA,CAAa,CACzBC,CAAAA,CACAC,EACAC,CAA+B,CAAA,OAAA,GACO,CAEtC,IAAMC,CAAYC,CAAAA,WAAAA,CAAa,KAC5BF,CAAS,GAAA,OAAA,CAAUG,YAAeC,CAAAA,cAAAA,EAClC,GAAQN,CAAAA,CAAI,GAAKC,CACjB,CAAA,CAAEC,CAAMF,CAAAA,CAAAA,CAAKC,CAAa,CAAE,EAQzB,CAAEM,CAAAA,CAAaC,CAAe,CAAA,CAAIC,QAAoBR,CAAAA,CAAa,CAQnES,CAAAA,CAAAA,CAAWN,WAAiCO,CAAAA,CAAAA,EAAS,CAE1DH,CAAAA,CAAgBD,CAAe,EAAA,CAC9B,IAAMK,CAAeD,CAAAA,CAAAA,YAAiB,QAAWA,CAAAA,CAAAA,CAAOJ,CAAY,CAAA,CAAII,EAEvE,OACA,CAAA,OAAO,MAAW,CAAA,GAAA,EAClBT,CAAS,GAAA,OAAA,CAAUG,aAAeC,cACjC,EAAA,GAAA,CAAKN,CAAKY,CAAAA,CAAa,CAElBA,CAAAA,CACR,CAAE,EAGH,CAAA,CAAG,CAAEV,CAAAA,CAAMF,CAAI,CAAE,EAEjB,OAAAa,SAAAA,CAAW,IAAM,CAChBL,CAAgBL,CAAAA,CAAAA,EAAY,EAC7B,CAAA,CAAG,CAAEA,CAAU,CAAE,CAAA,CAEV,CAAEI,CAAaG,CAAAA,CAAS,CAChC,CAAA,CCpDaI,IAAAA,CAAAA,CAAkB,CAC9Bd,CAAAA,CACAC,CACIF,GAAAA,CAAAA,CAAYC,CAAKC,CAAAA,CAAAA,CAAc,OAAQ","file":"useLocalStorage.mjs","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { LocalStorage } from '@alessiofrittoli/web-utils/storage/LocalStorage'\nimport { SessionStorage } from '@alessiofrittoli/web-utils/storage/SessionStorage'\n\ntype Value<T>\t\t= T | undefined | null\ntype SetValue<T>\t= React.Dispatch<React.SetStateAction<T>>\n\n/**\n * Easly handle Local or Session Storage State.\n * \n * @param\tkey\t\t\t\tThe storage item key.\n * @param\tinitialValue\tThe storage item initial value.\n * @param\ttype\t\t\t( Optional ) The storage API to use. Default: `local`.\n */\nexport const useStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T,\n\ttype\t\t\t: 'local' | 'session' = 'local'\n): [ Value<T>, SetValue<Value<T>> ] => {\n\n\tconst readValue = useCallback( () => (\n\t\t( type === 'local' ? LocalStorage : SessionStorage )\n\t\t\t.get<T>( key ) ?? initialValue\n\t), [ type, key, initialValue ] )\n\n\n\t/**\n\t * State to store our value.\n\t * Pass initial state function to useState so logic is only executed once.\n\t * \n\t */\n\tconst [ storedValue, setStoredValue ] = useState<Value<T>>( initialValue )\n\n\t/**\n\t * Return a wrapped version of useState's setter function that\n\t * persists the new value to localStorage | sessionStorage.\n\t * \n\t * @param value The SetStateAction value.\n\t */\n\tconst setValue = useCallback<SetValue<Value<T>>>( value => {\n\n\t\tsetStoredValue( storedValue => {\n\t\t\tconst valueToStore = value instanceof Function ? value( storedValue ) : value\n\t\n\t\t\t;(\n\t\t\t\ttypeof window !== 'undefined' &&\n\t\t\t\ttype === 'local' ? LocalStorage : SessionStorage\n\t\t\t).set( key, valueToStore )\n\n\t\t\treturn valueToStore\n\t\t} )\n\n\n\t}, [ type, key ] )\n\n\tuseEffect( () => {\n\t\tsetStoredValue( readValue() )\n\t}, [ readValue ] )\n\n\treturn [ storedValue, setValue ]\n}","import { useStorage } from './useStorage'\n\n/**\n * useLocalStorage hook.\n * \n * @param\tkey\t\t\t\tThe local storage item key.\n * @param\tinitialValue\tThe local storage item initial value.\n */\nexport const useLocalStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T\n) => useStorage( key, initialValue, 'local' )"]}
@@ -0,0 +1,11 @@
1
+ import * as react from 'react';
2
+
3
+ /**
4
+ * useSessionStorage hook.
5
+ *
6
+ * @param key The session item key.
7
+ * @param initialValue The session item initial value.
8
+ */
9
+ declare const useSessionStorage: <T = string>(key: string, initialValue?: T) => [T | null | undefined, (value: react.SetStateAction<T | null | undefined>) => void];
10
+
11
+ export { useSessionStorage };
@@ -0,0 +1,11 @@
1
+ import * as react from 'react';
2
+
3
+ /**
4
+ * useSessionStorage hook.
5
+ *
6
+ * @param key The session item key.
7
+ * @param initialValue The session item initial value.
8
+ */
9
+ declare const useSessionStorage: <T = string>(key: string, initialValue?: T) => [T | null | undefined, (value: react.SetStateAction<T | null | undefined>) => void];
10
+
11
+ export { useSessionStorage };
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),LocalStorage=require('@alessiofrittoli/web-utils/storage/LocalStorage'),SessionStorage=require('@alessiofrittoli/web-utils/storage/SessionStorage');var S=(e,t,o="local")=>{let r=react.useCallback(()=>(o==="local"?LocalStorage.LocalStorage:SessionStorage.SessionStorage).get(e)??t,[o,e,t]),[T,a]=react.useState(t),i=react.useCallback(s=>{a(f=>{let n=s instanceof Function?s(f):s;return (typeof window<"u"&&o==="local"?LocalStorage.LocalStorage:SessionStorage.SessionStorage).set(e,n),n});},[o,e]);return react.useEffect(()=>{a(r());},[r]),[T,i]};var R=(e,t)=>S(e,t,"session");exports.useSessionStorage=R;//# sourceMappingURL=useSessionStorage.js.map
2
+ //# sourceMappingURL=useSessionStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/browser-api/storage/useStorage.ts","../../../src/browser-api/storage/useSessionStorage.ts"],"names":["useStorage","key","initialValue","type","readValue","useCallback","LocalStorage","SessionStorage","storedValue","setStoredValue","useState","setValue","value","valueToStore","useEffect","useSessionStorage"],"mappings":"4LAcO,IAAMA,CAAAA,CAAa,CACzBC,CAAAA,CACAC,EACAC,CAA+B,CAAA,OAAA,GACO,CAEtC,IAAMC,CAAYC,CAAAA,iBAAAA,CAAa,KAC5BF,CAAS,GAAA,OAAA,CAAUG,yBAAeC,CAAAA,6BAAAA,EAClC,GAAQN,CAAAA,CAAI,GAAKC,CACjB,CAAA,CAAEC,CAAMF,CAAAA,CAAAA,CAAKC,CAAa,CAAE,EAQzB,CAAEM,CAAAA,CAAaC,CAAe,CAAA,CAAIC,cAAoBR,CAAAA,CAAa,CAQnES,CAAAA,CAAAA,CAAWN,iBAAiCO,CAAAA,CAAAA,EAAS,CAE1DH,CAAAA,CAAgBD,CAAe,EAAA,CAC9B,IAAMK,CAAeD,CAAAA,CAAAA,YAAiB,QAAWA,CAAAA,CAAAA,CAAOJ,CAAY,CAAA,CAAII,EAEvE,OACA,CAAA,OAAO,MAAW,CAAA,GAAA,EAClBT,CAAS,GAAA,OAAA,CAAUG,0BAAeC,6BACjC,EAAA,GAAA,CAAKN,CAAKY,CAAAA,CAAa,CAElBA,CAAAA,CACR,CAAE,EAGH,CAAA,CAAG,CAAEV,CAAAA,CAAMF,CAAI,CAAE,EAEjB,OAAAa,eAAAA,CAAW,IAAM,CAChBL,CAAgBL,CAAAA,CAAAA,EAAY,EAC7B,CAAA,CAAG,CAAEA,CAAU,CAAE,CAAA,CAEV,CAAEI,CAAaG,CAAAA,CAAS,CAChC,CAAA,CCpDaI,IAAAA,CAAAA,CAAoB,CAChCd,CAAAA,CACAC,CACIF,GAAAA,CAAAA,CAAYC,CAAKC,CAAAA,CAAAA,CAAc,SAAU","file":"useSessionStorage.js","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { LocalStorage } from '@alessiofrittoli/web-utils/storage/LocalStorage'\nimport { SessionStorage } from '@alessiofrittoli/web-utils/storage/SessionStorage'\n\ntype Value<T>\t\t= T | undefined | null\ntype SetValue<T>\t= React.Dispatch<React.SetStateAction<T>>\n\n/**\n * Easly handle Local or Session Storage State.\n * \n * @param\tkey\t\t\t\tThe storage item key.\n * @param\tinitialValue\tThe storage item initial value.\n * @param\ttype\t\t\t( Optional ) The storage API to use. Default: `local`.\n */\nexport const useStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T,\n\ttype\t\t\t: 'local' | 'session' = 'local'\n): [ Value<T>, SetValue<Value<T>> ] => {\n\n\tconst readValue = useCallback( () => (\n\t\t( type === 'local' ? LocalStorage : SessionStorage )\n\t\t\t.get<T>( key ) ?? initialValue\n\t), [ type, key, initialValue ] )\n\n\n\t/**\n\t * State to store our value.\n\t * Pass initial state function to useState so logic is only executed once.\n\t * \n\t */\n\tconst [ storedValue, setStoredValue ] = useState<Value<T>>( initialValue )\n\n\t/**\n\t * Return a wrapped version of useState's setter function that\n\t * persists the new value to localStorage | sessionStorage.\n\t * \n\t * @param value The SetStateAction value.\n\t */\n\tconst setValue = useCallback<SetValue<Value<T>>>( value => {\n\n\t\tsetStoredValue( storedValue => {\n\t\t\tconst valueToStore = value instanceof Function ? value( storedValue ) : value\n\t\n\t\t\t;(\n\t\t\t\ttypeof window !== 'undefined' &&\n\t\t\t\ttype === 'local' ? LocalStorage : SessionStorage\n\t\t\t).set( key, valueToStore )\n\n\t\t\treturn valueToStore\n\t\t} )\n\n\n\t}, [ type, key ] )\n\n\tuseEffect( () => {\n\t\tsetStoredValue( readValue() )\n\t}, [ readValue ] )\n\n\treturn [ storedValue, setValue ]\n}","import { useStorage } from './useStorage'\n\n/**\n * useSessionStorage hook.\n * \n * @param\tkey\t\t\t\tThe session item key.\n * @param\tinitialValue\tThe session item initial value.\n */\nexport const useSessionStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T\n) => useStorage( key, initialValue, 'session' )"]}
@@ -0,0 +1,2 @@
1
+ import {useCallback,useState,useEffect}from'react';import {LocalStorage}from'@alessiofrittoli/web-utils/storage/LocalStorage';import {SessionStorage}from'@alessiofrittoli/web-utils/storage/SessionStorage';var S=(e,t,o="local")=>{let r=useCallback(()=>(o==="local"?LocalStorage:SessionStorage).get(e)??t,[o,e,t]),[T,a]=useState(t),i=useCallback(s=>{a(f=>{let n=s instanceof Function?s(f):s;return (typeof window<"u"&&o==="local"?LocalStorage:SessionStorage).set(e,n),n});},[o,e]);return useEffect(()=>{a(r());},[r]),[T,i]};var R=(e,t)=>S(e,t,"session");export{R as useSessionStorage};//# sourceMappingURL=useSessionStorage.mjs.map
2
+ //# sourceMappingURL=useSessionStorage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/browser-api/storage/useStorage.ts","../../../src/browser-api/storage/useSessionStorage.ts"],"names":["useStorage","key","initialValue","type","readValue","useCallback","LocalStorage","SessionStorage","storedValue","setStoredValue","useState","setValue","value","valueToStore","useEffect","useSessionStorage"],"mappings":"6MAcO,IAAMA,CAAAA,CAAa,CACzBC,CAAAA,CACAC,EACAC,CAA+B,CAAA,OAAA,GACO,CAEtC,IAAMC,CAAYC,CAAAA,WAAAA,CAAa,KAC5BF,CAAS,GAAA,OAAA,CAAUG,YAAeC,CAAAA,cAAAA,EAClC,GAAQN,CAAAA,CAAI,GAAKC,CACjB,CAAA,CAAEC,CAAMF,CAAAA,CAAAA,CAAKC,CAAa,CAAE,EAQzB,CAAEM,CAAAA,CAAaC,CAAe,CAAA,CAAIC,QAAoBR,CAAAA,CAAa,CAQnES,CAAAA,CAAAA,CAAWN,WAAiCO,CAAAA,CAAAA,EAAS,CAE1DH,CAAAA,CAAgBD,CAAe,EAAA,CAC9B,IAAMK,CAAeD,CAAAA,CAAAA,YAAiB,QAAWA,CAAAA,CAAAA,CAAOJ,CAAY,CAAA,CAAII,EAEvE,OACA,CAAA,OAAO,MAAW,CAAA,GAAA,EAClBT,CAAS,GAAA,OAAA,CAAUG,aAAeC,cACjC,EAAA,GAAA,CAAKN,CAAKY,CAAAA,CAAa,CAElBA,CAAAA,CACR,CAAE,EAGH,CAAA,CAAG,CAAEV,CAAAA,CAAMF,CAAI,CAAE,EAEjB,OAAAa,SAAAA,CAAW,IAAM,CAChBL,CAAgBL,CAAAA,CAAAA,EAAY,EAC7B,CAAA,CAAG,CAAEA,CAAU,CAAE,CAAA,CAEV,CAAEI,CAAaG,CAAAA,CAAS,CAChC,CAAA,CCpDaI,IAAAA,CAAAA,CAAoB,CAChCd,CAAAA,CACAC,CACIF,GAAAA,CAAAA,CAAYC,CAAKC,CAAAA,CAAAA,CAAc,SAAU","file":"useSessionStorage.mjs","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { LocalStorage } from '@alessiofrittoli/web-utils/storage/LocalStorage'\nimport { SessionStorage } from '@alessiofrittoli/web-utils/storage/SessionStorage'\n\ntype Value<T>\t\t= T | undefined | null\ntype SetValue<T>\t= React.Dispatch<React.SetStateAction<T>>\n\n/**\n * Easly handle Local or Session Storage State.\n * \n * @param\tkey\t\t\t\tThe storage item key.\n * @param\tinitialValue\tThe storage item initial value.\n * @param\ttype\t\t\t( Optional ) The storage API to use. Default: `local`.\n */\nexport const useStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T,\n\ttype\t\t\t: 'local' | 'session' = 'local'\n): [ Value<T>, SetValue<Value<T>> ] => {\n\n\tconst readValue = useCallback( () => (\n\t\t( type === 'local' ? LocalStorage : SessionStorage )\n\t\t\t.get<T>( key ) ?? initialValue\n\t), [ type, key, initialValue ] )\n\n\n\t/**\n\t * State to store our value.\n\t * Pass initial state function to useState so logic is only executed once.\n\t * \n\t */\n\tconst [ storedValue, setStoredValue ] = useState<Value<T>>( initialValue )\n\n\t/**\n\t * Return a wrapped version of useState's setter function that\n\t * persists the new value to localStorage | sessionStorage.\n\t * \n\t * @param value The SetStateAction value.\n\t */\n\tconst setValue = useCallback<SetValue<Value<T>>>( value => {\n\n\t\tsetStoredValue( storedValue => {\n\t\t\tconst valueToStore = value instanceof Function ? value( storedValue ) : value\n\t\n\t\t\t;(\n\t\t\t\ttypeof window !== 'undefined' &&\n\t\t\t\ttype === 'local' ? LocalStorage : SessionStorage\n\t\t\t).set( key, valueToStore )\n\n\t\t\treturn valueToStore\n\t\t} )\n\n\n\t}, [ type, key ] )\n\n\tuseEffect( () => {\n\t\tsetStoredValue( readValue() )\n\t}, [ readValue ] )\n\n\treturn [ storedValue, setValue ]\n}","import { useStorage } from './useStorage'\n\n/**\n * useSessionStorage hook.\n * \n * @param\tkey\t\t\t\tThe session item key.\n * @param\tinitialValue\tThe session item initial value.\n */\nexport const useSessionStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T\n) => useStorage( key, initialValue, 'session' )"]}
@@ -0,0 +1,12 @@
1
+ type Value<T> = T | undefined | null;
2
+ type SetValue<T> = React.Dispatch<React.SetStateAction<T>>;
3
+ /**
4
+ * Easly handle Local or Session Storage State.
5
+ *
6
+ * @param key The storage item key.
7
+ * @param initialValue The storage item initial value.
8
+ * @param type ( Optional ) The storage API to use. Default: `local`.
9
+ */
10
+ declare const useStorage: <T = string>(key: string, initialValue?: T, type?: "local" | "session") => [Value<T>, SetValue<Value<T>>];
11
+
12
+ export { useStorage };
@@ -0,0 +1,12 @@
1
+ type Value<T> = T | undefined | null;
2
+ type SetValue<T> = React.Dispatch<React.SetStateAction<T>>;
3
+ /**
4
+ * Easly handle Local or Session Storage State.
5
+ *
6
+ * @param key The storage item key.
7
+ * @param initialValue The storage item initial value.
8
+ * @param type ( Optional ) The storage API to use. Default: `local`.
9
+ */
10
+ declare const useStorage: <T = string>(key: string, initialValue?: T, type?: "local" | "session") => [Value<T>, SetValue<Value<T>>];
11
+
12
+ export { useStorage };
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),LocalStorage=require('@alessiofrittoli/web-utils/storage/LocalStorage'),SessionStorage=require('@alessiofrittoli/web-utils/storage/SessionStorage');var p=(e,o,t="local")=>{let s=react.useCallback(()=>(t==="local"?LocalStorage.LocalStorage:SessionStorage.SessionStorage).get(e)??o,[t,e,o]),[S,l]=react.useState(o),T=react.useCallback(a=>{l(V=>{let n=a instanceof Function?a(V):a;return (typeof window<"u"&&t==="local"?LocalStorage.LocalStorage:SessionStorage.SessionStorage).set(e,n),n});},[t,e]);return react.useEffect(()=>{l(s());},[s]),[S,T]};exports.useStorage=p;//# sourceMappingURL=useStorage.js.map
2
+ //# sourceMappingURL=useStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/browser-api/storage/useStorage.ts"],"names":["useStorage","key","initialValue","type","readValue","useCallback","LocalStorage","SessionStorage","storedValue","setStoredValue","useState","setValue","value","valueToStore","useEffect"],"mappings":"4LAcaA,IAAAA,CAAAA,CAAa,CACzBC,CACAC,CAAAA,CAAAA,CACAC,CAA+B,CAAA,OAAA,GACO,CAEtC,IAAMC,EAAYC,iBAAa,CAAA,IAAA,CAC5BF,IAAS,OAAUG,CAAAA,yBAAAA,CAAeC,+BAClC,GAAQN,CAAAA,CAAI,CAAKC,EAAAA,CAAAA,CACjB,CAAEC,CAAAA,CAAMF,EAAKC,CAAa,CAAE,EAQzB,CAAEM,CAAAA,CAAaC,CAAe,CAAIC,CAAAA,cAAAA,CAAoBR,CAAa,CAAA,CAQnES,CAAWN,CAAAA,iBAAAA,CAAiCO,GAAS,CAE1DH,CAAAA,CAAgBD,GAAe,CAC9B,IAAMK,EAAeD,CAAiB,YAAA,QAAA,CAAWA,CAAOJ,CAAAA,CAAY,CAAII,CAAAA,CAAAA,CAEvE,QACA,OAAO,MAAA,CAAW,KAClBT,CAAS,GAAA,OAAA,CAAUG,0BAAeC,6BACjC,EAAA,GAAA,CAAKN,CAAKY,CAAAA,CAAa,CAElBA,CAAAA,CACR,CAAE,EAGH,CAAA,CAAG,CAAEV,CAAMF,CAAAA,CAAI,CAAE,CAEjB,CAAA,OAAAa,eAAW,CAAA,IAAM,CAChBL,CAAAA,CAAgBL,GAAY,EAC7B,EAAG,CAAEA,CAAU,CAAE,CAEV,CAAA,CAAEI,CAAaG,CAAAA,CAAS,CAChC","file":"useStorage.js","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { LocalStorage } from '@alessiofrittoli/web-utils/storage/LocalStorage'\nimport { SessionStorage } from '@alessiofrittoli/web-utils/storage/SessionStorage'\n\ntype Value<T>\t\t= T | undefined | null\ntype SetValue<T>\t= React.Dispatch<React.SetStateAction<T>>\n\n/**\n * Easly handle Local or Session Storage State.\n * \n * @param\tkey\t\t\t\tThe storage item key.\n * @param\tinitialValue\tThe storage item initial value.\n * @param\ttype\t\t\t( Optional ) The storage API to use. Default: `local`.\n */\nexport const useStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T,\n\ttype\t\t\t: 'local' | 'session' = 'local'\n): [ Value<T>, SetValue<Value<T>> ] => {\n\n\tconst readValue = useCallback( () => (\n\t\t( type === 'local' ? LocalStorage : SessionStorage )\n\t\t\t.get<T>( key ) ?? initialValue\n\t), [ type, key, initialValue ] )\n\n\n\t/**\n\t * State to store our value.\n\t * Pass initial state function to useState so logic is only executed once.\n\t * \n\t */\n\tconst [ storedValue, setStoredValue ] = useState<Value<T>>( initialValue )\n\n\t/**\n\t * Return a wrapped version of useState's setter function that\n\t * persists the new value to localStorage | sessionStorage.\n\t * \n\t * @param value The SetStateAction value.\n\t */\n\tconst setValue = useCallback<SetValue<Value<T>>>( value => {\n\n\t\tsetStoredValue( storedValue => {\n\t\t\tconst valueToStore = value instanceof Function ? value( storedValue ) : value\n\t\n\t\t\t;(\n\t\t\t\ttypeof window !== 'undefined' &&\n\t\t\t\ttype === 'local' ? LocalStorage : SessionStorage\n\t\t\t).set( key, valueToStore )\n\n\t\t\treturn valueToStore\n\t\t} )\n\n\n\t}, [ type, key ] )\n\n\tuseEffect( () => {\n\t\tsetStoredValue( readValue() )\n\t}, [ readValue ] )\n\n\treturn [ storedValue, setValue ]\n}"]}
@@ -0,0 +1,2 @@
1
+ import {useCallback,useState,useEffect}from'react';import {LocalStorage}from'@alessiofrittoli/web-utils/storage/LocalStorage';import {SessionStorage}from'@alessiofrittoli/web-utils/storage/SessionStorage';var p=(e,o,t="local")=>{let s=useCallback(()=>(t==="local"?LocalStorage:SessionStorage).get(e)??o,[t,e,o]),[S,l]=useState(o),T=useCallback(a=>{l(V=>{let n=a instanceof Function?a(V):a;return (typeof window<"u"&&t==="local"?LocalStorage:SessionStorage).set(e,n),n});},[t,e]);return useEffect(()=>{l(s());},[s]),[S,T]};export{p as useStorage};//# sourceMappingURL=useStorage.mjs.map
2
+ //# sourceMappingURL=useStorage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/browser-api/storage/useStorage.ts"],"names":["useStorage","key","initialValue","type","readValue","useCallback","LocalStorage","SessionStorage","storedValue","setStoredValue","useState","setValue","value","valueToStore","useEffect"],"mappings":"6MAcaA,IAAAA,CAAAA,CAAa,CACzBC,CACAC,CAAAA,CAAAA,CACAC,CAA+B,CAAA,OAAA,GACO,CAEtC,IAAMC,EAAYC,WAAa,CAAA,IAAA,CAC5BF,IAAS,OAAUG,CAAAA,YAAAA,CAAeC,gBAClC,GAAQN,CAAAA,CAAI,CAAKC,EAAAA,CAAAA,CACjB,CAAEC,CAAAA,CAAMF,EAAKC,CAAa,CAAE,EAQzB,CAAEM,CAAAA,CAAaC,CAAe,CAAIC,CAAAA,QAAAA,CAAoBR,CAAa,CAAA,CAQnES,CAAWN,CAAAA,WAAAA,CAAiCO,GAAS,CAE1DH,CAAAA,CAAgBD,GAAe,CAC9B,IAAMK,EAAeD,CAAiB,YAAA,QAAA,CAAWA,CAAOJ,CAAAA,CAAY,CAAII,CAAAA,CAAAA,CAEvE,QACA,OAAO,MAAA,CAAW,KAClBT,CAAS,GAAA,OAAA,CAAUG,aAAeC,cACjC,EAAA,GAAA,CAAKN,CAAKY,CAAAA,CAAa,CAElBA,CAAAA,CACR,CAAE,EAGH,CAAA,CAAG,CAAEV,CAAMF,CAAAA,CAAI,CAAE,CAEjB,CAAA,OAAAa,SAAW,CAAA,IAAM,CAChBL,CAAAA,CAAgBL,GAAY,EAC7B,EAAG,CAAEA,CAAU,CAAE,CAEV,CAAA,CAAEI,CAAaG,CAAAA,CAAS,CAChC","file":"useStorage.mjs","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { LocalStorage } from '@alessiofrittoli/web-utils/storage/LocalStorage'\nimport { SessionStorage } from '@alessiofrittoli/web-utils/storage/SessionStorage'\n\ntype Value<T>\t\t= T | undefined | null\ntype SetValue<T>\t= React.Dispatch<React.SetStateAction<T>>\n\n/**\n * Easly handle Local or Session Storage State.\n * \n * @param\tkey\t\t\t\tThe storage item key.\n * @param\tinitialValue\tThe storage item initial value.\n * @param\ttype\t\t\t( Optional ) The storage API to use. Default: `local`.\n */\nexport const useStorage = <T = string>(\n\tkey\t\t\t\t: string,\n\tinitialValue?\t: T,\n\ttype\t\t\t: 'local' | 'session' = 'local'\n): [ Value<T>, SetValue<Value<T>> ] => {\n\n\tconst readValue = useCallback( () => (\n\t\t( type === 'local' ? LocalStorage : SessionStorage )\n\t\t\t.get<T>( key ) ?? initialValue\n\t), [ type, key, initialValue ] )\n\n\n\t/**\n\t * State to store our value.\n\t * Pass initial state function to useState so logic is only executed once.\n\t * \n\t */\n\tconst [ storedValue, setStoredValue ] = useState<Value<T>>( initialValue )\n\n\t/**\n\t * Return a wrapped version of useState's setter function that\n\t * persists the new value to localStorage | sessionStorage.\n\t * \n\t * @param value The SetStateAction value.\n\t */\n\tconst setValue = useCallback<SetValue<Value<T>>>( value => {\n\n\t\tsetStoredValue( storedValue => {\n\t\t\tconst valueToStore = value instanceof Function ? value( storedValue ) : value\n\t\n\t\t\t;(\n\t\t\t\ttypeof window !== 'undefined' &&\n\t\t\t\ttype === 'local' ? LocalStorage : SessionStorage\n\t\t\t).set( key, valueToStore )\n\n\t\t\treturn valueToStore\n\t\t} )\n\n\n\t}, [ type, key ] )\n\n\tuseEffect( () => {\n\t\tsetStoredValue( readValue() )\n\t}, [ readValue ] )\n\n\treturn [ storedValue, setValue ]\n}"]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Check if device is portrait oriented.
3
+ *
4
+ * State get updated when device orientation changes.
5
+ *
6
+ * @returns `true` if the device is portrait oriented, `false` otherwise.
7
+ */
8
+ declare const useIsPortrait: () => boolean;
9
+
10
+ export { useIsPortrait };
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Check if device is portrait oriented.
3
+ *
4
+ * State get updated when device orientation changes.
5
+ *
6
+ * @returns `true` if the device is portrait oriented, `false` otherwise.
7
+ */
8
+ declare const useIsPortrait: () => boolean;
9
+
10
+ export { useIsPortrait };
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),browserApi=require('@alessiofrittoli/web-utils/browser-api'),device=require('@alessiofrittoli/web-utils/device');var o=e=>{let[s,i]=react.useState(browserApi.getMediaMatches(e)),t=react.useCallback(()=>i(browserApi.getMediaMatches(e)),[e]);return react.useEffect(()=>{let a=window.matchMedia(e);return t(),a.addEventListener("change",t),()=>{a.removeEventListener("change",t);}},[e,t]),s};var g=()=>o(device.portraitMediaQuery);exports.useIsPortrait=g;//# sourceMappingURL=useIsPortrait.js.map
2
+ //# sourceMappingURL=useIsPortrait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/browser-api/useMediaQuery.ts","../../src/browser-api/useIsPortrait.ts"],"names":["useMediaQuery","query","matches","setMatches","useState","getMediaMatches","matchMediaChangeHandler","useCallback","useEffect","matchMedia","useIsPortrait","portraitMediaQuery"],"mappings":"yJAYO,IAAMA,CAAAA,CAAkBC,CAAmB,EAAA,CAEjD,GAAM,CAAEC,CAAAA,CAASC,CAAW,CAAA,CAAIC,eAAUC,0BAAiBJ,CAAAA,CAAM,CAAE,CAAA,CAC7DK,EAA0BC,iBAAa,CAAA,IAAMJ,CAAYE,CAAAA,0BAAAA,CAAiBJ,CAAM,CAAE,CAAA,CAAG,CAAEA,CAAM,CAAE,EAGrG,OAAAO,eAAAA,CAAW,IAAM,CAEhB,IAAMC,CAAa,CAAA,MAAA,CAAO,UAAYR,CAAAA,CAAM,EAE5C,OAAAK,CAAAA,EAEAG,CAAAA,CAAAA,CAAW,iBAAkB,QAAUH,CAAAA,CAAwB,EAExD,IAAM,CACZG,EAAW,mBAAqB,CAAA,QAAA,CAAUH,CAAwB,EACnE,CAED,CAAG,CAAA,CAAEL,CAAOK,CAAAA,CAAwB,CAAE,CAE/BJ,CAAAA,CAER,CCjCA,KASaQ,CAAgB,CAAA,IAAMV,EAAeW,yBAAmB","file":"useIsPortrait.js","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { getMediaMatches } from '@alessiofrittoli/web-utils/browser-api'\n\n\n/**\n * Get Document Media matches and listen for changes.\n *\n * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia)\n *\n * @param\tquery A string specifying the media query to parse into a `MediaQueryList`.\n * @returns\tA boolean value that returns `true` if the document currently matches the media query list, or `false` if not.\n */\nexport const useMediaQuery = ( query: string ) => {\n\n\tconst [ matches, setMatches ]\t= useState( getMediaMatches( query ) )\n\tconst matchMediaChangeHandler\t= useCallback( () => setMatches( getMediaMatches( query ) ), [ query ] )\n\n\n\tuseEffect( () => {\n\n\t\tconst matchMedia = window.matchMedia( query )\n\t\t// Triggered at the first client-side load\n\t\tmatchMediaChangeHandler()\n\t\t// Listen matchMedia\n\t\tmatchMedia.addEventListener( 'change', matchMediaChangeHandler )\n\n\t\treturn () => {\n\t\t\tmatchMedia.removeEventListener( 'change', matchMediaChangeHandler )\n\t\t}\n\n\t}, [ query, matchMediaChangeHandler ] )\n\n\treturn matches\n\t\n}","import { useMediaQuery } from './useMediaQuery'\nimport { portraitMediaQuery } from '@alessiofrittoli/web-utils/device'\n\n/**\n * Check if device is portrait oriented.\n * \n * State get updated when device orientation changes.\n *\n * @returns\t`true` if the device is portrait oriented, `false` otherwise.\n */\nexport const useIsPortrait = () => useMediaQuery( portraitMediaQuery )"]}
@@ -0,0 +1,2 @@
1
+ import {useState,useCallback,useEffect}from'react';import {getMediaMatches}from'@alessiofrittoli/web-utils/browser-api';import {portraitMediaQuery}from'@alessiofrittoli/web-utils/device';var o=e=>{let[s,i]=useState(getMediaMatches(e)),t=useCallback(()=>i(getMediaMatches(e)),[e]);return useEffect(()=>{let a=window.matchMedia(e);return t(),a.addEventListener("change",t),()=>{a.removeEventListener("change",t);}},[e,t]),s};var g=()=>o(portraitMediaQuery);export{g as useIsPortrait};//# sourceMappingURL=useIsPortrait.mjs.map
2
+ //# sourceMappingURL=useIsPortrait.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/browser-api/useMediaQuery.ts","../../src/browser-api/useIsPortrait.ts"],"names":["useMediaQuery","query","matches","setMatches","useState","getMediaMatches","matchMediaChangeHandler","useCallback","useEffect","matchMedia","useIsPortrait","portraitMediaQuery"],"mappings":"2LAYO,IAAMA,CAAAA,CAAkBC,CAAmB,EAAA,CAEjD,GAAM,CAAEC,CAAAA,CAASC,CAAW,CAAA,CAAIC,SAAUC,eAAiBJ,CAAAA,CAAM,CAAE,CAAA,CAC7DK,EAA0BC,WAAa,CAAA,IAAMJ,CAAYE,CAAAA,eAAAA,CAAiBJ,CAAM,CAAE,CAAA,CAAG,CAAEA,CAAM,CAAE,EAGrG,OAAAO,SAAAA,CAAW,IAAM,CAEhB,IAAMC,CAAa,CAAA,MAAA,CAAO,UAAYR,CAAAA,CAAM,EAE5C,OAAAK,CAAAA,EAEAG,CAAAA,CAAAA,CAAW,iBAAkB,QAAUH,CAAAA,CAAwB,EAExD,IAAM,CACZG,EAAW,mBAAqB,CAAA,QAAA,CAAUH,CAAwB,EACnE,CAED,CAAG,CAAA,CAAEL,CAAOK,CAAAA,CAAwB,CAAE,CAE/BJ,CAAAA,CAER,CCjCA,KASaQ,CAAgB,CAAA,IAAMV,EAAeW,kBAAmB","file":"useIsPortrait.mjs","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { getMediaMatches } from '@alessiofrittoli/web-utils/browser-api'\n\n\n/**\n * Get Document Media matches and listen for changes.\n *\n * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia)\n *\n * @param\tquery A string specifying the media query to parse into a `MediaQueryList`.\n * @returns\tA boolean value that returns `true` if the document currently matches the media query list, or `false` if not.\n */\nexport const useMediaQuery = ( query: string ) => {\n\n\tconst [ matches, setMatches ]\t= useState( getMediaMatches( query ) )\n\tconst matchMediaChangeHandler\t= useCallback( () => setMatches( getMediaMatches( query ) ), [ query ] )\n\n\n\tuseEffect( () => {\n\n\t\tconst matchMedia = window.matchMedia( query )\n\t\t// Triggered at the first client-side load\n\t\tmatchMediaChangeHandler()\n\t\t// Listen matchMedia\n\t\tmatchMedia.addEventListener( 'change', matchMediaChangeHandler )\n\n\t\treturn () => {\n\t\t\tmatchMedia.removeEventListener( 'change', matchMediaChangeHandler )\n\t\t}\n\n\t}, [ query, matchMediaChangeHandler ] )\n\n\treturn matches\n\t\n}","import { useMediaQuery } from './useMediaQuery'\nimport { portraitMediaQuery } from '@alessiofrittoli/web-utils/device'\n\n/**\n * Check if device is portrait oriented.\n * \n * State get updated when device orientation changes.\n *\n * @returns\t`true` if the device is portrait oriented, `false` otherwise.\n */\nexport const useIsPortrait = () => useMediaQuery( portraitMediaQuery )"]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Get Document Media matches and listen for changes.
3
+ *
4
+ * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia)
5
+ *
6
+ * @param query A string specifying the media query to parse into a `MediaQueryList`.
7
+ * @returns A boolean value that returns `true` if the document currently matches the media query list, or `false` if not.
8
+ */
9
+ declare const useMediaQuery: (query: string) => boolean;
10
+
11
+ export { useMediaQuery };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Get Document Media matches and listen for changes.
3
+ *
4
+ * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia)
5
+ *
6
+ * @param query A string specifying the media query to parse into a `MediaQueryList`.
7
+ * @returns A boolean value that returns `true` if the document currently matches the media query list, or `false` if not.
8
+ */
9
+ declare const useMediaQuery: (query: string) => boolean;
10
+
11
+ export { useMediaQuery };
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),browserApi=require('@alessiofrittoli/web-utils/browser-api');var m=e=>{let[s,c]=react.useState(browserApi.getMediaMatches(e)),t=react.useCallback(()=>c(browserApi.getMediaMatches(e)),[e]);return react.useEffect(()=>{let a=window.matchMedia(e);return t(),a.addEventListener("change",t),()=>{a.removeEventListener("change",t);}},[e,t]),s};exports.useMediaQuery=m;//# sourceMappingURL=useMediaQuery.js.map
2
+ //# sourceMappingURL=useMediaQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/browser-api/useMediaQuery.ts"],"names":["useMediaQuery","query","matches","setMatches","useState","getMediaMatches","matchMediaChangeHandler","useCallback","useEffect","matchMedia"],"mappings":"qGAYaA,IAAAA,CAAAA,CAAkBC,GAAmB,CAEjD,GAAM,CAAEC,CAAAA,CAASC,CAAW,CAAA,CAAIC,cAAUC,CAAAA,0BAAAA,CAAiBJ,CAAM,CAAE,CAAA,CAC7DK,CAA0BC,CAAAA,iBAAAA,CAAa,IAAMJ,CAAAA,CAAYE,0BAAiBJ,CAAAA,CAAM,CAAE,CAAG,CAAA,CAAEA,CAAM,CAAE,CAGrG,CAAA,OAAAO,eAAW,CAAA,IAAM,CAEhB,IAAMC,CAAAA,CAAa,MAAO,CAAA,UAAA,CAAYR,CAAM,CAAA,CAE5C,OAAAK,CAAAA,GAEAG,CAAW,CAAA,gBAAA,CAAkB,QAAUH,CAAAA,CAAwB,CAExD,CAAA,IAAM,CACZG,CAAAA,CAAW,oBAAqB,QAAUH,CAAAA,CAAwB,EACnE,CAED,EAAG,CAAEL,CAAAA,CAAOK,CAAwB,CAAE,EAE/BJ,CAER","file":"useMediaQuery.js","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { getMediaMatches } from '@alessiofrittoli/web-utils/browser-api'\n\n\n/**\n * Get Document Media matches and listen for changes.\n *\n * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia)\n *\n * @param\tquery A string specifying the media query to parse into a `MediaQueryList`.\n * @returns\tA boolean value that returns `true` if the document currently matches the media query list, or `false` if not.\n */\nexport const useMediaQuery = ( query: string ) => {\n\n\tconst [ matches, setMatches ]\t= useState( getMediaMatches( query ) )\n\tconst matchMediaChangeHandler\t= useCallback( () => setMatches( getMediaMatches( query ) ), [ query ] )\n\n\n\tuseEffect( () => {\n\n\t\tconst matchMedia = window.matchMedia( query )\n\t\t// Triggered at the first client-side load\n\t\tmatchMediaChangeHandler()\n\t\t// Listen matchMedia\n\t\tmatchMedia.addEventListener( 'change', matchMediaChangeHandler )\n\n\t\treturn () => {\n\t\t\tmatchMedia.removeEventListener( 'change', matchMediaChangeHandler )\n\t\t}\n\n\t}, [ query, matchMediaChangeHandler ] )\n\n\treturn matches\n\t\n}"]}
@@ -0,0 +1,2 @@
1
+ import {useState,useCallback,useEffect}from'react';import {getMediaMatches}from'@alessiofrittoli/web-utils/browser-api';var m=e=>{let[s,c]=useState(getMediaMatches(e)),t=useCallback(()=>c(getMediaMatches(e)),[e]);return useEffect(()=>{let a=window.matchMedia(e);return t(),a.addEventListener("change",t),()=>{a.removeEventListener("change",t);}},[e,t]),s};export{m as useMediaQuery};//# sourceMappingURL=useMediaQuery.mjs.map
2
+ //# sourceMappingURL=useMediaQuery.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/browser-api/useMediaQuery.ts"],"names":["useMediaQuery","query","matches","setMatches","useState","getMediaMatches","matchMediaChangeHandler","useCallback","useEffect","matchMedia"],"mappings":"wHAYaA,IAAAA,CAAAA,CAAkBC,GAAmB,CAEjD,GAAM,CAAEC,CAAAA,CAASC,CAAW,CAAA,CAAIC,QAAUC,CAAAA,eAAAA,CAAiBJ,CAAM,CAAE,CAAA,CAC7DK,CAA0BC,CAAAA,WAAAA,CAAa,IAAMJ,CAAAA,CAAYE,eAAiBJ,CAAAA,CAAM,CAAE,CAAG,CAAA,CAAEA,CAAM,CAAE,CAGrG,CAAA,OAAAO,SAAW,CAAA,IAAM,CAEhB,IAAMC,CAAAA,CAAa,MAAO,CAAA,UAAA,CAAYR,CAAM,CAAA,CAE5C,OAAAK,CAAAA,GAEAG,CAAW,CAAA,gBAAA,CAAkB,QAAUH,CAAAA,CAAwB,CAExD,CAAA,IAAM,CACZG,CAAAA,CAAW,oBAAqB,QAAUH,CAAAA,CAAwB,EACnE,CAED,EAAG,CAAEL,CAAAA,CAAOK,CAAwB,CAAE,EAE/BJ,CAER","file":"useMediaQuery.mjs","sourcesContent":["import { useCallback, useEffect, useState } from 'react'\nimport { getMediaMatches } from '@alessiofrittoli/web-utils/browser-api'\n\n\n/**\n * Get Document Media matches and listen for changes.\n *\n * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia)\n *\n * @param\tquery A string specifying the media query to parse into a `MediaQueryList`.\n * @returns\tA boolean value that returns `true` if the document currently matches the media query list, or `false` if not.\n */\nexport const useMediaQuery = ( query: string ) => {\n\n\tconst [ matches, setMatches ]\t= useState( getMediaMatches( query ) )\n\tconst matchMediaChangeHandler\t= useCallback( () => setMatches( getMediaMatches( query ) ), [ query ] )\n\n\n\tuseEffect( () => {\n\n\t\tconst matchMedia = window.matchMedia( query )\n\t\t// Triggered at the first client-side load\n\t\tmatchMediaChangeHandler()\n\t\t// Listen matchMedia\n\t\tmatchMedia.addEventListener( 'change', matchMediaChangeHandler )\n\n\t\treturn () => {\n\t\t\tmatchMedia.removeEventListener( 'change', matchMediaChangeHandler )\n\t\t}\n\n\t}, [ query, matchMediaChangeHandler ] )\n\n\treturn matches\n\t\n}"]}
@@ -0,0 +1,2 @@
1
+ export { useFocusTrap } from './useFocusTrap.mjs';
2
+ export { useScrollBlock } from './useScrollBlock.mjs';
@@ -0,0 +1,2 @@
1
+ export { useFocusTrap } from './useFocusTrap.js';
2
+ export { useScrollBlock } from './useScrollBlock.js';
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),dom=require('@alessiofrittoli/web-utils/dom');var E=["input","select","textarea","button","[href]",'[tabindex]:not([tabindex="-1"])'].join(", "),y=e=>{let[r,o]=react.useState(false),c=react.useRef(null),m=react.useCallback(n=>{c.current=document.activeElement;let t=n||e?.current||false;if(t)return o(t)},[e]),i=react.useCallback(()=>{c.current?.focus(),o(false);},[]);return react.useEffect(()=>{if(!r)return;let n=t=>{if(t.key!=="Tab")return;let s=Array.from(r.querySelectorAll(E)),l=s.at(0),u=s.at(-1);if(!t.shiftKey){document.activeElement===u&&(t.preventDefault(),l?.focus());return}document.activeElement===l&&(t.preventDefault(),u?.focus());};return document.addEventListener("keydown",n),()=>{document.removeEventListener("keydown",n);}},[r]),[m,i]};var L=e=>{let r=react.useCallback(()=>dom.blockScroll(e?.current||void 0),[e]),o=react.useCallback(()=>dom.restoreScroll(e?.current||void 0),[e]);return [r,o]};exports.useFocusTrap=y;exports.useScrollBlock=L;//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/dom-api/useFocusTrap.ts","../../src/dom-api/useScrollBlock.ts"],"names":["focusableSelector","useFocusTrap","target","focusTrap","setFocusTrapDispatch","useState","lastActiveElement","useRef","setFocusTrap","useCallback","onDemandTarget","restoreFocusTrap","useEffect","keyDownHandler","event","focusableElements","firstFocusableElement","lastFocusableElement","useScrollBlock","blockScroll","blockScrollHandler","restoreScroll","restoreScrollHandler"],"mappings":"sFAKMA,IAAAA,CAAAA,CAAoB,CACzB,OAAS,CAAA,QAAA,CAAU,WACnB,QAAU,CAAA,QAAA,CAAU,iCACrB,CAAE,CAAA,IAAA,CAAM,IAAK,CAAA,CAaAC,CACZC,CAAAA,CAAAA,EACiD,CAEjD,GAAM,CAAEC,EAAWC,CAAqB,CAAA,CACvCC,eAA+B,KAAM,CAAA,CAGhCC,CAAoBC,CAAAA,YAAAA,CAAqB,IAAK,CAAA,CAM9CC,EAAeC,iBAA2BC,CAAAA,CAAAA,EAAkB,CAEjEJ,CAAkB,CAAA,OAAA,CAAU,SAAS,aACrC,CAAA,IAAMH,CAAeO,CAAAA,CAAAA,EAAkBR,CAAQ,EAAA,OAAA,EAAW,MAE1D,GAAOC,CAAAA,CAEP,OAAOC,CAAsBD,CAAAA,CAAU,CAExC,CAAG,CAAA,CAAED,CAAO,CAAE,CAMRS,CAAAA,CAAAA,CAAmBF,kBAA+B,IAAM,CAE7DH,EAAkB,OAAS,EAAA,KAAA,GAC3BF,CAAsB,CAAA,KAAM,EAE7B,CAAA,CAAG,EAAG,EAGN,OAAAQ,eAAAA,CAAW,IAAM,CAEhB,GAAK,CAAET,CAAY,CAAA,OAEnB,IAAMU,CAAAA,CAAmBC,CAA0B,EAAA,CAElD,GAAKA,CAAM,CAAA,GAAA,GAAQ,MAAQ,OAE3B,IAAMC,EAAqB,KAAM,CAAA,IAAA,CAAMZ,CAAU,CAAA,gBAAA,CAA+BH,CAAkB,CAAE,EACnGgB,CAAwBD,CAAAA,CAAAA,CAAkB,GAAI,CAAE,CAAA,CAChDE,EAAuBF,CAAkB,CAAA,EAAA,CAAI,EAAG,CAAA,CAEjD,GAAK,CAAED,EAAM,QAAW,CAAA,CAKlB,SAAS,aAAkBG,GAAAA,CAAAA,GAC/BH,EAAM,cAAe,EAAA,CACrBE,CAAuB,EAAA,KAAA,EAExB,CAAA,CAAA,MACD,CAQK,QAAS,CAAA,aAAA,GAAkBA,IAC/BF,CAAM,CAAA,cAAA,GACNG,CAAsB,EAAA,KAAA,EAGxB,EAAA,CAAA,CAEA,OAAS,QAAA,CAAA,gBAAA,CAAkB,UAAWJ,CAAe,CAAA,CAE9C,IAAM,CACZ,QAAA,CAAS,oBAAqB,SAAWA,CAAAA,CAAe,EACzD,CAED,CAAG,CAAA,CAAEV,CAAU,CAAE,CAAA,CAEV,CAAEK,CAAcG,CAAAA,CAAiB,CAEzC,EC7FO,IAAMO,EAAmBhB,CAAkD,EAAA,CAMjF,IAAMiB,CAAAA,CAAcV,iBACnB,CAAA,IAAMW,gBAAoBlB,CAAQ,EAAA,OAAA,EAAW,MAAU,CAAG,CAAA,CAAEA,CAAO,CACpE,CAAA,CAOMmB,CAAgBZ,CAAAA,iBAAAA,CACrB,IAAMa,iBAAAA,CAAsBpB,GAAQ,OAAW,EAAA,MAAU,CAAG,CAAA,CAAEA,CAAO,CACtE,EAGA,OAAO,CAAEiB,CAAaE,CAAAA,CAAc,CAErC","file":"index.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\n\ntype SetFocusTrap = ( target?: HTMLElement ) => void\ntype RestoreFocusTrap = () => void\n\nconst focusableSelector = [\n\t'input', 'select', 'textarea',\n\t'button', '[href]', '[tabindex]:not([tabindex=\"-1\"])',\n].join( ', ' )\n\n\n/**\n * Trap focus inside the given HTML Element.\n * \n * @param target (Optional) The target HTMLElement React RefObject to trap focus within.\n * \t\t\t\t\tIf no target is given, you must provide the target HTMLElement when calling `setFocusTrap`.\n * \n * @returns A tuple containing:\n * - `setFocusTrap`: A function to enable the focus trap. Optionally accept an HTMLElement as target.\n * - `restoreFocusTrap`: A function to restore the previous focus state.\n */\nexport const useFocusTrap = (\n\ttarget?: React.RefObject<HTMLElement | null>\n): readonly [ SetFocusTrap, RestoreFocusTrap ] => {\n\n\tconst [ focusTrap, setFocusTrapDispatch ] = (\n\t\tuseState<HTMLElement | false>( false )\n\t)\n\n\tconst lastActiveElement = useRef<HTMLElement>( null )\n\t\n\t/**\n\t * Enable the focus trap.\n\t * \n\t */\n\tconst setFocusTrap = useCallback<SetFocusTrap>( onDemandTarget => {\n\n\t\tlastActiveElement.current\t= document.activeElement as HTMLElement\n\t\tconst focusTrap\t\t\t\t= onDemandTarget || target?.current || false\n\t\t\n\t\tif ( ! focusTrap ) return\n\n\t\treturn setFocusTrapDispatch( focusTrap )\n\t\n\t}, [ target ] )\n\n\n\t/**\n\t * Restore the focus to the latest Document active Element.\n\t */\n\tconst restoreFocusTrap = useCallback<RestoreFocusTrap>( () => {\n\n\t\tlastActiveElement.current?.focus()\n\t\tsetFocusTrapDispatch( false )\n\t\n\t}, [] )\n\n\t\n\tuseEffect( () => {\n\n\t\tif ( ! focusTrap ) return\n\n\t\tconst keyDownHandler = ( event: KeyboardEvent ) => {\n\n\t\t\tif ( event.key !== 'Tab' ) return\n\n\t\t\tconst focusableElements\t\t= Array.from( focusTrap.querySelectorAll<HTMLElement>( focusableSelector ) ),\n\t\t\t\tfirstFocusableElement\t= focusableElements.at( 0 ),\n\t\t\t\tlastFocusableElement\t= focusableElements.at( -1 );\n\n\t\t\tif ( ! event.shiftKey ) {\n\t\t\t\t/**\n\t\t\t\t * Focust the firs element if\n\t\t\t\t * focusing forward and the current focused element is the last one.\n\t\t\t\t */\n\t\t\t\tif ( document.activeElement === lastFocusableElement ) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tfirstFocusableElement?.focus()\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\n\t\t\t/**\n\t\t\t * Focus the last focusable element if\n\t\t\t * focusing backward and the current focused element is the first one.\n\t\t\t * \n\t\t\t */\n\t\t\tif ( document.activeElement === firstFocusableElement ) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tlastFocusableElement?.focus()\n\t\t\t}\n\n\t\t}\n\n\t\tdocument.addEventListener( 'keydown', keyDownHandler );\n\t\n\t\treturn () => {\n\t\t\tdocument.removeEventListener( 'keydown', keyDownHandler );\n\t\t}\n\n\t}, [ focusTrap ] )\n\n\treturn [ setFocusTrap, restoreFocusTrap ]\n\n}","import { useCallback } from 'react'\nimport {\n\tblockScroll as blockScrollHandler,\n\trestoreScroll as restoreScrollHandler\n} from '@alessiofrittoli/web-utils/dom'\n\n\n/**\n * Prevent Element overflow.\n * \n * @param target (Optional) The React RefObject target HTMLElement. Default: `Document.documentElement`.\n */\nexport const useScrollBlock = ( target?: React.RefObject<HTMLElement | null> ) => {\n\t\n\t/**\n\t * Block scroll.\n\t * \n\t */\n\tconst blockScroll = useCallback(\n\t\t() => blockScrollHandler( target?.current || undefined ), [ target ]\n\t)\n\n\n\t/**\n\t * Restore scroll.\n\t * \n\t */\n\tconst restoreScroll = useCallback(\n\t\t() => restoreScrollHandler( target?.current || undefined ), [ target ]\n\t)\n\n\t\n\treturn [ blockScroll, restoreScroll ] as const\n\n}"]}
@@ -0,0 +1,2 @@
1
+ import {useState,useRef,useCallback,useEffect}from'react';import {blockScroll,restoreScroll}from'@alessiofrittoli/web-utils/dom';var E=["input","select","textarea","button","[href]",'[tabindex]:not([tabindex="-1"])'].join(", "),y=e=>{let[r,o]=useState(false),c=useRef(null),m=useCallback(n=>{c.current=document.activeElement;let t=n||e?.current||false;if(t)return o(t)},[e]),i=useCallback(()=>{c.current?.focus(),o(false);},[]);return useEffect(()=>{if(!r)return;let n=t=>{if(t.key!=="Tab")return;let s=Array.from(r.querySelectorAll(E)),l=s.at(0),u=s.at(-1);if(!t.shiftKey){document.activeElement===u&&(t.preventDefault(),l?.focus());return}document.activeElement===l&&(t.preventDefault(),u?.focus());};return document.addEventListener("keydown",n),()=>{document.removeEventListener("keydown",n);}},[r]),[m,i]};var L=e=>{let r=useCallback(()=>blockScroll(e?.current||void 0),[e]),o=useCallback(()=>restoreScroll(e?.current||void 0),[e]);return [r,o]};export{y as useFocusTrap,L as useScrollBlock};//# sourceMappingURL=index.mjs.map
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/dom-api/useFocusTrap.ts","../../src/dom-api/useScrollBlock.ts"],"names":["focusableSelector","useFocusTrap","target","focusTrap","setFocusTrapDispatch","useState","lastActiveElement","useRef","setFocusTrap","useCallback","onDemandTarget","restoreFocusTrap","useEffect","keyDownHandler","event","focusableElements","firstFocusableElement","lastFocusableElement","useScrollBlock","blockScroll","blockScrollHandler","restoreScroll","restoreScrollHandler"],"mappings":"iIAKMA,IAAAA,CAAAA,CAAoB,CACzB,OAAS,CAAA,QAAA,CAAU,WACnB,QAAU,CAAA,QAAA,CAAU,iCACrB,CAAE,CAAA,IAAA,CAAM,IAAK,CAAA,CAaAC,CACZC,CAAAA,CAAAA,EACiD,CAEjD,GAAM,CAAEC,EAAWC,CAAqB,CAAA,CACvCC,SAA+B,KAAM,CAAA,CAGhCC,CAAoBC,CAAAA,MAAAA,CAAqB,IAAK,CAAA,CAM9CC,EAAeC,WAA2BC,CAAAA,CAAAA,EAAkB,CAEjEJ,CAAkB,CAAA,OAAA,CAAU,SAAS,aACrC,CAAA,IAAMH,CAAeO,CAAAA,CAAAA,EAAkBR,CAAQ,EAAA,OAAA,EAAW,MAE1D,GAAOC,CAAAA,CAEP,OAAOC,CAAsBD,CAAAA,CAAU,CAExC,CAAG,CAAA,CAAED,CAAO,CAAE,CAMRS,CAAAA,CAAAA,CAAmBF,YAA+B,IAAM,CAE7DH,EAAkB,OAAS,EAAA,KAAA,GAC3BF,CAAsB,CAAA,KAAM,EAE7B,CAAA,CAAG,EAAG,EAGN,OAAAQ,SAAAA,CAAW,IAAM,CAEhB,GAAK,CAAET,CAAY,CAAA,OAEnB,IAAMU,CAAAA,CAAmBC,CAA0B,EAAA,CAElD,GAAKA,CAAM,CAAA,GAAA,GAAQ,MAAQ,OAE3B,IAAMC,EAAqB,KAAM,CAAA,IAAA,CAAMZ,CAAU,CAAA,gBAAA,CAA+BH,CAAkB,CAAE,EACnGgB,CAAwBD,CAAAA,CAAAA,CAAkB,GAAI,CAAE,CAAA,CAChDE,EAAuBF,CAAkB,CAAA,EAAA,CAAI,EAAG,CAAA,CAEjD,GAAK,CAAED,EAAM,QAAW,CAAA,CAKlB,SAAS,aAAkBG,GAAAA,CAAAA,GAC/BH,EAAM,cAAe,EAAA,CACrBE,CAAuB,EAAA,KAAA,EAExB,CAAA,CAAA,MACD,CAQK,QAAS,CAAA,aAAA,GAAkBA,IAC/BF,CAAM,CAAA,cAAA,GACNG,CAAsB,EAAA,KAAA,EAGxB,EAAA,CAAA,CAEA,OAAS,QAAA,CAAA,gBAAA,CAAkB,UAAWJ,CAAe,CAAA,CAE9C,IAAM,CACZ,QAAA,CAAS,oBAAqB,SAAWA,CAAAA,CAAe,EACzD,CAED,CAAG,CAAA,CAAEV,CAAU,CAAE,CAAA,CAEV,CAAEK,CAAcG,CAAAA,CAAiB,CAEzC,EC7FO,IAAMO,EAAmBhB,CAAkD,EAAA,CAMjF,IAAMiB,CAAAA,CAAcV,WACnB,CAAA,IAAMW,YAAoBlB,CAAQ,EAAA,OAAA,EAAW,MAAU,CAAG,CAAA,CAAEA,CAAO,CACpE,CAAA,CAOMmB,CAAgBZ,CAAAA,WAAAA,CACrB,IAAMa,aAAAA,CAAsBpB,GAAQ,OAAW,EAAA,MAAU,CAAG,CAAA,CAAEA,CAAO,CACtE,EAGA,OAAO,CAAEiB,CAAaE,CAAAA,CAAc,CAErC","file":"index.mjs","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\n\ntype SetFocusTrap = ( target?: HTMLElement ) => void\ntype RestoreFocusTrap = () => void\n\nconst focusableSelector = [\n\t'input', 'select', 'textarea',\n\t'button', '[href]', '[tabindex]:not([tabindex=\"-1\"])',\n].join( ', ' )\n\n\n/**\n * Trap focus inside the given HTML Element.\n * \n * @param target (Optional) The target HTMLElement React RefObject to trap focus within.\n * \t\t\t\t\tIf no target is given, you must provide the target HTMLElement when calling `setFocusTrap`.\n * \n * @returns A tuple containing:\n * - `setFocusTrap`: A function to enable the focus trap. Optionally accept an HTMLElement as target.\n * - `restoreFocusTrap`: A function to restore the previous focus state.\n */\nexport const useFocusTrap = (\n\ttarget?: React.RefObject<HTMLElement | null>\n): readonly [ SetFocusTrap, RestoreFocusTrap ] => {\n\n\tconst [ focusTrap, setFocusTrapDispatch ] = (\n\t\tuseState<HTMLElement | false>( false )\n\t)\n\n\tconst lastActiveElement = useRef<HTMLElement>( null )\n\t\n\t/**\n\t * Enable the focus trap.\n\t * \n\t */\n\tconst setFocusTrap = useCallback<SetFocusTrap>( onDemandTarget => {\n\n\t\tlastActiveElement.current\t= document.activeElement as HTMLElement\n\t\tconst focusTrap\t\t\t\t= onDemandTarget || target?.current || false\n\t\t\n\t\tif ( ! focusTrap ) return\n\n\t\treturn setFocusTrapDispatch( focusTrap )\n\t\n\t}, [ target ] )\n\n\n\t/**\n\t * Restore the focus to the latest Document active Element.\n\t */\n\tconst restoreFocusTrap = useCallback<RestoreFocusTrap>( () => {\n\n\t\tlastActiveElement.current?.focus()\n\t\tsetFocusTrapDispatch( false )\n\t\n\t}, [] )\n\n\t\n\tuseEffect( () => {\n\n\t\tif ( ! focusTrap ) return\n\n\t\tconst keyDownHandler = ( event: KeyboardEvent ) => {\n\n\t\t\tif ( event.key !== 'Tab' ) return\n\n\t\t\tconst focusableElements\t\t= Array.from( focusTrap.querySelectorAll<HTMLElement>( focusableSelector ) ),\n\t\t\t\tfirstFocusableElement\t= focusableElements.at( 0 ),\n\t\t\t\tlastFocusableElement\t= focusableElements.at( -1 );\n\n\t\t\tif ( ! event.shiftKey ) {\n\t\t\t\t/**\n\t\t\t\t * Focust the firs element if\n\t\t\t\t * focusing forward and the current focused element is the last one.\n\t\t\t\t */\n\t\t\t\tif ( document.activeElement === lastFocusableElement ) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tfirstFocusableElement?.focus()\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\n\t\t\t/**\n\t\t\t * Focus the last focusable element if\n\t\t\t * focusing backward and the current focused element is the first one.\n\t\t\t * \n\t\t\t */\n\t\t\tif ( document.activeElement === firstFocusableElement ) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tlastFocusableElement?.focus()\n\t\t\t}\n\n\t\t}\n\n\t\tdocument.addEventListener( 'keydown', keyDownHandler );\n\t\n\t\treturn () => {\n\t\t\tdocument.removeEventListener( 'keydown', keyDownHandler );\n\t\t}\n\n\t}, [ focusTrap ] )\n\n\treturn [ setFocusTrap, restoreFocusTrap ]\n\n}","import { useCallback } from 'react'\nimport {\n\tblockScroll as blockScrollHandler,\n\trestoreScroll as restoreScrollHandler\n} from '@alessiofrittoli/web-utils/dom'\n\n\n/**\n * Prevent Element overflow.\n * \n * @param target (Optional) The React RefObject target HTMLElement. Default: `Document.documentElement`.\n */\nexport const useScrollBlock = ( target?: React.RefObject<HTMLElement | null> ) => {\n\t\n\t/**\n\t * Block scroll.\n\t * \n\t */\n\tconst blockScroll = useCallback(\n\t\t() => blockScrollHandler( target?.current || undefined ), [ target ]\n\t)\n\n\n\t/**\n\t * Restore scroll.\n\t * \n\t */\n\tconst restoreScroll = useCallback(\n\t\t() => restoreScrollHandler( target?.current || undefined ), [ target ]\n\t)\n\n\t\n\treturn [ blockScroll, restoreScroll ] as const\n\n}"]}
@@ -0,0 +1,15 @@
1
+ type SetFocusTrap = (target?: HTMLElement) => void;
2
+ type RestoreFocusTrap = () => void;
3
+ /**
4
+ * Trap focus inside the given HTML Element.
5
+ *
6
+ * @param target (Optional) The target HTMLElement React RefObject to trap focus within.
7
+ * If no target is given, you must provide the target HTMLElement when calling `setFocusTrap`.
8
+ *
9
+ * @returns A tuple containing:
10
+ * - `setFocusTrap`: A function to enable the focus trap. Optionally accept an HTMLElement as target.
11
+ * - `restoreFocusTrap`: A function to restore the previous focus state.
12
+ */
13
+ declare const useFocusTrap: (target?: React.RefObject<HTMLElement | null>) => readonly [SetFocusTrap, RestoreFocusTrap];
14
+
15
+ export { useFocusTrap };
@@ -0,0 +1,15 @@
1
+ type SetFocusTrap = (target?: HTMLElement) => void;
2
+ type RestoreFocusTrap = () => void;
3
+ /**
4
+ * Trap focus inside the given HTML Element.
5
+ *
6
+ * @param target (Optional) The target HTMLElement React RefObject to trap focus within.
7
+ * If no target is given, you must provide the target HTMLElement when calling `setFocusTrap`.
8
+ *
9
+ * @returns A tuple containing:
10
+ * - `setFocusTrap`: A function to enable the focus trap. Optionally accept an HTMLElement as target.
11
+ * - `restoreFocusTrap`: A function to restore the previous focus state.
12
+ */
13
+ declare const useFocusTrap: (target?: React.RefObject<HTMLElement | null>) => readonly [SetFocusTrap, RestoreFocusTrap];
14
+
15
+ export { useFocusTrap };
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react');var E=["input","select","textarea","button","[href]",'[tabindex]:not([tabindex="-1"])'].join(", "),F=n=>{let[r,o]=react.useState(false),s=react.useRef(null),f=react.useCallback(t=>{s.current=document.activeElement;let e=t||n?.current||false;if(e)return o(e)},[n]),i=react.useCallback(()=>{s.current?.focus(),o(false);},[]);return react.useEffect(()=>{if(!r)return;let t=e=>{if(e.key!=="Tab")return;let c=Array.from(r.querySelectorAll(E)),u=c.at(0),a=c.at(-1);if(!e.shiftKey){document.activeElement===a&&(e.preventDefault(),u?.focus());return}document.activeElement===u&&(e.preventDefault(),a?.focus());};return document.addEventListener("keydown",t),()=>{document.removeEventListener("keydown",t);}},[r]),[f,i]};exports.useFocusTrap=F;//# sourceMappingURL=useFocusTrap.js.map
2
+ //# sourceMappingURL=useFocusTrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/dom-api/useFocusTrap.ts"],"names":["focusableSelector","useFocusTrap","target","focusTrap","setFocusTrapDispatch","useState","lastActiveElement","useRef","setFocusTrap","useCallback","onDemandTarget","restoreFocusTrap","useEffect","keyDownHandler","event","focusableElements","firstFocusableElement","lastFocusableElement"],"mappings":"wCAKA,IAAMA,EAAoB,CACzB,OAAA,CAAS,QAAU,CAAA,UAAA,CACnB,SAAU,QAAU,CAAA,iCACrB,CAAE,CAAA,IAAA,CAAM,IAAK,CAaAC,CAAAA,CAAAA,CACZC,CACiD,EAAA,CAEjD,GAAM,CAAEC,CAAAA,CAAWC,CAAqB,CAAA,CACvCC,eAA+B,KAAM,CAAA,CAGhCC,EAAoBC,YAAqB,CAAA,IAAK,EAM9CC,CAAeC,CAAAA,iBAAAA,CAA2BC,CAAkB,EAAA,CAEjEJ,EAAkB,OAAU,CAAA,QAAA,CAAS,aACrC,CAAA,IAAMH,EAAeO,CAAkBR,EAAAA,CAAAA,EAAQ,OAAW,EAAA,KAAA,CAE1D,GAAOC,CAEP,CAAA,OAAOC,CAAsBD,CAAAA,CAAU,CAExC,CAAG,CAAA,CAAED,CAAO,CAAE,EAMRS,CAAmBF,CAAAA,iBAAAA,CAA+B,IAAM,CAE7DH,EAAkB,OAAS,EAAA,KAAA,EAC3BF,CAAAA,CAAAA,CAAsB,KAAM,EAE7B,CAAA,CAAG,EAAG,CAAA,CAGN,OAAAQ,eAAW,CAAA,IAAM,CAEhB,GAAK,CAAET,CAAY,CAAA,OAEnB,IAAMU,CAAAA,CAAmBC,GAA0B,CAElD,GAAKA,CAAM,CAAA,GAAA,GAAQ,MAAQ,OAE3B,IAAMC,CAAqB,CAAA,KAAA,CAAM,KAAMZ,CAAU,CAAA,gBAAA,CAA+BH,CAAkB,CAAE,EACnGgB,CAAwBD,CAAAA,CAAAA,CAAkB,EAAI,CAAA,CAAE,EAChDE,CAAuBF,CAAAA,CAAAA,CAAkB,EAAI,CAAA,EAAG,EAEjD,GAAK,CAAED,EAAM,QAAW,CAAA,CAKlB,SAAS,aAAkBG,GAAAA,CAAAA,GAC/BH,CAAM,CAAA,cAAA,GACNE,CAAuB,EAAA,KAAA,EAExB,CAAA,CAAA,MACD,CAQK,QAAS,CAAA,aAAA,GAAkBA,CAC/BF,GAAAA,CAAAA,CAAM,gBACNG,CAAAA,CAAAA,EAAsB,KAAM,EAAA,EAG9B,EAEA,OAAS,QAAA,CAAA,gBAAA,CAAkB,SAAWJ,CAAAA,CAAe,EAE9C,IAAM,CACZ,QAAS,CAAA,mBAAA,CAAqB,UAAWA,CAAe,EACzD,CAED,CAAA,CAAG,CAAEV,CAAU,CAAE,EAEV,CAAEK,CAAAA,CAAcG,CAAiB,CAEzC","file":"useFocusTrap.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\n\ntype SetFocusTrap = ( target?: HTMLElement ) => void\ntype RestoreFocusTrap = () => void\n\nconst focusableSelector = [\n\t'input', 'select', 'textarea',\n\t'button', '[href]', '[tabindex]:not([tabindex=\"-1\"])',\n].join( ', ' )\n\n\n/**\n * Trap focus inside the given HTML Element.\n * \n * @param target (Optional) The target HTMLElement React RefObject to trap focus within.\n * \t\t\t\t\tIf no target is given, you must provide the target HTMLElement when calling `setFocusTrap`.\n * \n * @returns A tuple containing:\n * - `setFocusTrap`: A function to enable the focus trap. Optionally accept an HTMLElement as target.\n * - `restoreFocusTrap`: A function to restore the previous focus state.\n */\nexport const useFocusTrap = (\n\ttarget?: React.RefObject<HTMLElement | null>\n): readonly [ SetFocusTrap, RestoreFocusTrap ] => {\n\n\tconst [ focusTrap, setFocusTrapDispatch ] = (\n\t\tuseState<HTMLElement | false>( false )\n\t)\n\n\tconst lastActiveElement = useRef<HTMLElement>( null )\n\t\n\t/**\n\t * Enable the focus trap.\n\t * \n\t */\n\tconst setFocusTrap = useCallback<SetFocusTrap>( onDemandTarget => {\n\n\t\tlastActiveElement.current\t= document.activeElement as HTMLElement\n\t\tconst focusTrap\t\t\t\t= onDemandTarget || target?.current || false\n\t\t\n\t\tif ( ! focusTrap ) return\n\n\t\treturn setFocusTrapDispatch( focusTrap )\n\t\n\t}, [ target ] )\n\n\n\t/**\n\t * Restore the focus to the latest Document active Element.\n\t */\n\tconst restoreFocusTrap = useCallback<RestoreFocusTrap>( () => {\n\n\t\tlastActiveElement.current?.focus()\n\t\tsetFocusTrapDispatch( false )\n\t\n\t}, [] )\n\n\t\n\tuseEffect( () => {\n\n\t\tif ( ! focusTrap ) return\n\n\t\tconst keyDownHandler = ( event: KeyboardEvent ) => {\n\n\t\t\tif ( event.key !== 'Tab' ) return\n\n\t\t\tconst focusableElements\t\t= Array.from( focusTrap.querySelectorAll<HTMLElement>( focusableSelector ) ),\n\t\t\t\tfirstFocusableElement\t= focusableElements.at( 0 ),\n\t\t\t\tlastFocusableElement\t= focusableElements.at( -1 );\n\n\t\t\tif ( ! event.shiftKey ) {\n\t\t\t\t/**\n\t\t\t\t * Focust the firs element if\n\t\t\t\t * focusing forward and the current focused element is the last one.\n\t\t\t\t */\n\t\t\t\tif ( document.activeElement === lastFocusableElement ) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tfirstFocusableElement?.focus()\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\n\t\t\t/**\n\t\t\t * Focus the last focusable element if\n\t\t\t * focusing backward and the current focused element is the first one.\n\t\t\t * \n\t\t\t */\n\t\t\tif ( document.activeElement === firstFocusableElement ) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tlastFocusableElement?.focus()\n\t\t\t}\n\n\t\t}\n\n\t\tdocument.addEventListener( 'keydown', keyDownHandler );\n\t\n\t\treturn () => {\n\t\t\tdocument.removeEventListener( 'keydown', keyDownHandler );\n\t\t}\n\n\t}, [ focusTrap ] )\n\n\treturn [ setFocusTrap, restoreFocusTrap ]\n\n}"]}
@@ -0,0 +1,2 @@
1
+ import {useState,useRef,useCallback,useEffect}from'react';var E=["input","select","textarea","button","[href]",'[tabindex]:not([tabindex="-1"])'].join(", "),F=n=>{let[r,o]=useState(false),s=useRef(null),f=useCallback(t=>{s.current=document.activeElement;let e=t||n?.current||false;if(e)return o(e)},[n]),i=useCallback(()=>{s.current?.focus(),o(false);},[]);return useEffect(()=>{if(!r)return;let t=e=>{if(e.key!=="Tab")return;let c=Array.from(r.querySelectorAll(E)),u=c.at(0),a=c.at(-1);if(!e.shiftKey){document.activeElement===a&&(e.preventDefault(),u?.focus());return}document.activeElement===u&&(e.preventDefault(),a?.focus());};return document.addEventListener("keydown",t),()=>{document.removeEventListener("keydown",t);}},[r]),[f,i]};export{F as useFocusTrap};//# sourceMappingURL=useFocusTrap.mjs.map
2
+ //# sourceMappingURL=useFocusTrap.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/dom-api/useFocusTrap.ts"],"names":["focusableSelector","useFocusTrap","target","focusTrap","setFocusTrapDispatch","useState","lastActiveElement","useRef","setFocusTrap","useCallback","onDemandTarget","restoreFocusTrap","useEffect","keyDownHandler","event","focusableElements","firstFocusableElement","lastFocusableElement"],"mappings":"0DAKA,IAAMA,EAAoB,CACzB,OAAA,CAAS,QAAU,CAAA,UAAA,CACnB,SAAU,QAAU,CAAA,iCACrB,CAAE,CAAA,IAAA,CAAM,IAAK,CAaAC,CAAAA,CAAAA,CACZC,CACiD,EAAA,CAEjD,GAAM,CAAEC,CAAAA,CAAWC,CAAqB,CAAA,CACvCC,SAA+B,KAAM,CAAA,CAGhCC,EAAoBC,MAAqB,CAAA,IAAK,EAM9CC,CAAeC,CAAAA,WAAAA,CAA2BC,CAAkB,EAAA,CAEjEJ,EAAkB,OAAU,CAAA,QAAA,CAAS,aACrC,CAAA,IAAMH,EAAeO,CAAkBR,EAAAA,CAAAA,EAAQ,OAAW,EAAA,KAAA,CAE1D,GAAOC,CAEP,CAAA,OAAOC,CAAsBD,CAAAA,CAAU,CAExC,CAAG,CAAA,CAAED,CAAO,CAAE,EAMRS,CAAmBF,CAAAA,WAAAA,CAA+B,IAAM,CAE7DH,EAAkB,OAAS,EAAA,KAAA,EAC3BF,CAAAA,CAAAA,CAAsB,KAAM,EAE7B,CAAA,CAAG,EAAG,CAAA,CAGN,OAAAQ,SAAW,CAAA,IAAM,CAEhB,GAAK,CAAET,CAAY,CAAA,OAEnB,IAAMU,CAAAA,CAAmBC,GAA0B,CAElD,GAAKA,CAAM,CAAA,GAAA,GAAQ,MAAQ,OAE3B,IAAMC,CAAqB,CAAA,KAAA,CAAM,KAAMZ,CAAU,CAAA,gBAAA,CAA+BH,CAAkB,CAAE,EACnGgB,CAAwBD,CAAAA,CAAAA,CAAkB,EAAI,CAAA,CAAE,EAChDE,CAAuBF,CAAAA,CAAAA,CAAkB,EAAI,CAAA,EAAG,EAEjD,GAAK,CAAED,EAAM,QAAW,CAAA,CAKlB,SAAS,aAAkBG,GAAAA,CAAAA,GAC/BH,CAAM,CAAA,cAAA,GACNE,CAAuB,EAAA,KAAA,EAExB,CAAA,CAAA,MACD,CAQK,QAAS,CAAA,aAAA,GAAkBA,CAC/BF,GAAAA,CAAAA,CAAM,gBACNG,CAAAA,CAAAA,EAAsB,KAAM,EAAA,EAG9B,EAEA,OAAS,QAAA,CAAA,gBAAA,CAAkB,SAAWJ,CAAAA,CAAe,EAE9C,IAAM,CACZ,QAAS,CAAA,mBAAA,CAAqB,UAAWA,CAAe,EACzD,CAED,CAAA,CAAG,CAAEV,CAAU,CAAE,EAEV,CAAEK,CAAAA,CAAcG,CAAiB,CAEzC","file":"useFocusTrap.mjs","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\n\ntype SetFocusTrap = ( target?: HTMLElement ) => void\ntype RestoreFocusTrap = () => void\n\nconst focusableSelector = [\n\t'input', 'select', 'textarea',\n\t'button', '[href]', '[tabindex]:not([tabindex=\"-1\"])',\n].join( ', ' )\n\n\n/**\n * Trap focus inside the given HTML Element.\n * \n * @param target (Optional) The target HTMLElement React RefObject to trap focus within.\n * \t\t\t\t\tIf no target is given, you must provide the target HTMLElement when calling `setFocusTrap`.\n * \n * @returns A tuple containing:\n * - `setFocusTrap`: A function to enable the focus trap. Optionally accept an HTMLElement as target.\n * - `restoreFocusTrap`: A function to restore the previous focus state.\n */\nexport const useFocusTrap = (\n\ttarget?: React.RefObject<HTMLElement | null>\n): readonly [ SetFocusTrap, RestoreFocusTrap ] => {\n\n\tconst [ focusTrap, setFocusTrapDispatch ] = (\n\t\tuseState<HTMLElement | false>( false )\n\t)\n\n\tconst lastActiveElement = useRef<HTMLElement>( null )\n\t\n\t/**\n\t * Enable the focus trap.\n\t * \n\t */\n\tconst setFocusTrap = useCallback<SetFocusTrap>( onDemandTarget => {\n\n\t\tlastActiveElement.current\t= document.activeElement as HTMLElement\n\t\tconst focusTrap\t\t\t\t= onDemandTarget || target?.current || false\n\t\t\n\t\tif ( ! focusTrap ) return\n\n\t\treturn setFocusTrapDispatch( focusTrap )\n\t\n\t}, [ target ] )\n\n\n\t/**\n\t * Restore the focus to the latest Document active Element.\n\t */\n\tconst restoreFocusTrap = useCallback<RestoreFocusTrap>( () => {\n\n\t\tlastActiveElement.current?.focus()\n\t\tsetFocusTrapDispatch( false )\n\t\n\t}, [] )\n\n\t\n\tuseEffect( () => {\n\n\t\tif ( ! focusTrap ) return\n\n\t\tconst keyDownHandler = ( event: KeyboardEvent ) => {\n\n\t\t\tif ( event.key !== 'Tab' ) return\n\n\t\t\tconst focusableElements\t\t= Array.from( focusTrap.querySelectorAll<HTMLElement>( focusableSelector ) ),\n\t\t\t\tfirstFocusableElement\t= focusableElements.at( 0 ),\n\t\t\t\tlastFocusableElement\t= focusableElements.at( -1 );\n\n\t\t\tif ( ! event.shiftKey ) {\n\t\t\t\t/**\n\t\t\t\t * Focust the firs element if\n\t\t\t\t * focusing forward and the current focused element is the last one.\n\t\t\t\t */\n\t\t\t\tif ( document.activeElement === lastFocusableElement ) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tfirstFocusableElement?.focus()\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\n\t\t\t/**\n\t\t\t * Focus the last focusable element if\n\t\t\t * focusing backward and the current focused element is the first one.\n\t\t\t * \n\t\t\t */\n\t\t\tif ( document.activeElement === firstFocusableElement ) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tlastFocusableElement?.focus()\n\t\t\t}\n\n\t\t}\n\n\t\tdocument.addEventListener( 'keydown', keyDownHandler );\n\t\n\t\treturn () => {\n\t\t\tdocument.removeEventListener( 'keydown', keyDownHandler );\n\t\t}\n\n\t}, [ focusTrap ] )\n\n\treturn [ setFocusTrap, restoreFocusTrap ]\n\n}"]}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Prevent Element overflow.
3
+ *
4
+ * @param target (Optional) The React RefObject target HTMLElement. Default: `Document.documentElement`.
5
+ */
6
+ declare const useScrollBlock: (target?: React.RefObject<HTMLElement | null>) => readonly [() => void, () => void];
7
+
8
+ export { useScrollBlock };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Prevent Element overflow.
3
+ *
4
+ * @param target (Optional) The React RefObject target HTMLElement. Default: `Document.documentElement`.
5
+ */
6
+ declare const useScrollBlock: (target?: React.RefObject<HTMLElement | null>) => readonly [() => void, () => void];
7
+
8
+ export { useScrollBlock };
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),dom=require('@alessiofrittoli/web-utils/dom');var u=l=>{let r=react.useCallback(()=>dom.blockScroll(l?.current||void 0),[l]),c=react.useCallback(()=>dom.restoreScroll(l?.current||void 0),[l]);return [r,c]};exports.useScrollBlock=u;//# sourceMappingURL=useScrollBlock.js.map
2
+ //# sourceMappingURL=useScrollBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/dom-api/useScrollBlock.ts"],"names":["useScrollBlock","target","blockScroll","useCallback","blockScrollHandler","restoreScroll","restoreScrollHandler"],"mappings":"0FAYaA,CAAmBC,CAAAA,CAAAA,EAAkD,CAMjF,IAAMC,CAAAA,CAAcC,kBACnB,IAAMC,eAAAA,CAAoBH,GAAQ,OAAW,EAAA,MAAU,CAAG,CAAA,CAAEA,CAAO,CACpE,CAAA,CAOMI,EAAgBF,iBACrB,CAAA,IAAMG,kBAAsBL,CAAQ,EAAA,OAAA,EAAW,MAAU,CAAG,CAAA,CAAEA,CAAO,CACtE,CAAA,CAGA,OAAO,CAAEC,CAAAA,CAAaG,CAAc,CAErC","file":"useScrollBlock.js","sourcesContent":["import { useCallback } from 'react'\nimport {\n\tblockScroll as blockScrollHandler,\n\trestoreScroll as restoreScrollHandler\n} from '@alessiofrittoli/web-utils/dom'\n\n\n/**\n * Prevent Element overflow.\n * \n * @param target (Optional) The React RefObject target HTMLElement. Default: `Document.documentElement`.\n */\nexport const useScrollBlock = ( target?: React.RefObject<HTMLElement | null> ) => {\n\t\n\t/**\n\t * Block scroll.\n\t * \n\t */\n\tconst blockScroll = useCallback(\n\t\t() => blockScrollHandler( target?.current || undefined ), [ target ]\n\t)\n\n\n\t/**\n\t * Restore scroll.\n\t * \n\t */\n\tconst restoreScroll = useCallback(\n\t\t() => restoreScrollHandler( target?.current || undefined ), [ target ]\n\t)\n\n\t\n\treturn [ blockScroll, restoreScroll ] as const\n\n}"]}
@@ -0,0 +1,2 @@
1
+ import {useCallback}from'react';import {blockScroll,restoreScroll}from'@alessiofrittoli/web-utils/dom';var u=l=>{let r=useCallback(()=>blockScroll(l?.current||void 0),[l]),c=useCallback(()=>restoreScroll(l?.current||void 0),[l]);return [r,c]};export{u as useScrollBlock};//# sourceMappingURL=useScrollBlock.mjs.map
2
+ //# sourceMappingURL=useScrollBlock.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/dom-api/useScrollBlock.ts"],"names":["useScrollBlock","target","blockScroll","useCallback","blockScrollHandler","restoreScroll","restoreScrollHandler"],"mappings":"2GAYaA,CAAmBC,CAAAA,CAAAA,EAAkD,CAMjF,IAAMC,CAAAA,CAAcC,YACnB,IAAMC,WAAAA,CAAoBH,GAAQ,OAAW,EAAA,MAAU,CAAG,CAAA,CAAEA,CAAO,CACpE,CAAA,CAOMI,EAAgBF,WACrB,CAAA,IAAMG,cAAsBL,CAAQ,EAAA,OAAA,EAAW,MAAU,CAAG,CAAA,CAAEA,CAAO,CACtE,CAAA,CAGA,OAAO,CAAEC,CAAAA,CAAaG,CAAc,CAErC","file":"useScrollBlock.mjs","sourcesContent":["import { useCallback } from 'react'\nimport {\n\tblockScroll as blockScrollHandler,\n\trestoreScroll as restoreScrollHandler\n} from '@alessiofrittoli/web-utils/dom'\n\n\n/**\n * Prevent Element overflow.\n * \n * @param target (Optional) The React RefObject target HTMLElement. Default: `Document.documentElement`.\n */\nexport const useScrollBlock = ( target?: React.RefObject<HTMLElement | null> ) => {\n\t\n\t/**\n\t * Block scroll.\n\t * \n\t */\n\tconst blockScroll = useCallback(\n\t\t() => blockScrollHandler( target?.current || undefined ), [ target ]\n\t)\n\n\n\t/**\n\t * Restore scroll.\n\t * \n\t */\n\tconst restoreScroll = useCallback(\n\t\t() => restoreScrollHandler( target?.current || undefined ), [ target ]\n\t)\n\n\t\n\treturn [ blockScroll, restoreScroll ] as const\n\n}"]}