{"_id":"@alessiofrittoli/react-hooks","_rev":"28-acc396d1a12a5268d8779d29602805b0","name":"@alessiofrittoli/react-hooks","dist-tags":{"alpha":"3.3.0-alpha.3","latest":"4.2.2"},"versions":{"1.0.0":{"name":"@alessiofrittoli/react-hooks","version":"1.0.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@1.0.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"58146fa7b9ad1468e6073b9960fe239af93e434c","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-1.0.0.tgz","fileCount":99,"integrity":"sha512-pi1EaqDUH9Fzm1Pk6ZUbrXtSmSQeH6ue1m3h9R4jUOuED9eNQBSRusAMzGrOcfA0zf9UDI/p84wjDS6EHgC/Ew==","signatures":[{"sig":"MEUCICexgqv6bV9g7CRlplp/qd5eCz9U9J7frICzATecYNVbAiEA1dkigfwqdrsYzY8o5QNuE8I+dwJzBkXRUc83Z1V/QSQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":170481},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["@alessiofrittoli/type-utils","esbuild"]},"types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./misc":{"types":"./dist/misc/index.d.ts","import":"./dist/misc/index.mjs","require":"./dist/misc/index.js"},"./eslint":{"types":"./dist/eslint.d.ts","import":"./dist/eslint.mjs","require":"./dist/eslint.js"},"./dom-api":{"types":"./dist/dom-api/index.d.ts","import":"./dist/dom-api/index.mjs","require":"./dist/dom-api/index.js"},"./browser-api":{"types":"./dist/browser-api/index.d.ts","import":"./dist/browser-api/index.mjs","require":"./dist/browser-api/index.js"},"./browser-api/storage":{"types":"./dist/browser-api/storage/index.d.ts","import":"./dist/browser-api/storage/index.mjs","require":"./dist/browser-api/storage/index.js"}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"6a0083d8e3948f858e6ac76b383adbc29cd9c50f","scripts":{"//1a":"*********************************************************************","//1b":"*********************** BUILD - LINT - RELEASE **********************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && tsup","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","test:watch":"jest --watchAll --verbose","build:watch":"tsup --watch","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.0.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{"@alessiofrittoli/web-utils":"^1.9.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","react":"^19.1.0","dotenv":"^16.5.0","eslint":"^9.25.1","globals":"^16.0.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","react-dom":"^19.1.0","@eslint/js":"^9.25.1","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.14.1","http-server":"^14.1.1","@types/react":"^19.1.2","concurrently":"^9.1.2","@jest/globals":"^29.7.0","@eslint/compat":"^1.2.8","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.2","typescript-eslint":"^8.31.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^2.4.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_1.0.0_1745432481583_0.20142284799452348","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@alessiofrittoli/react-hooks","version":"1.1.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@1.1.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"fcb5da149be0b57d2bd87eeba55a712a480d8637","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-1.1.0.tgz","fileCount":105,"integrity":"sha512-tp8apdwBaaUrg7rwsER3LHULQRvp0H3NVOcABT9P13Tev1eiwBnK2IrUDO7cEDBq2RVWc3Amd4DejmfgPwvk4g==","signatures":[{"sig":"MEQCIEPmUUvyRAV1wbRsW77LDL/znn7WTkiUPkg8kgcImN9aAiAXt5Lnn0AIwNI6qMz8vqHVGzabM37F3FBJjmbj4M9iAg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":174320},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["@alessiofrittoli/type-utils","esbuild"]},"types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./misc":{"types":"./dist/misc/index.d.ts","import":"./dist/misc/index.mjs","require":"./dist/misc/index.js"},"./eslint":{"types":"./dist/eslint.d.ts","import":"./dist/eslint.mjs","require":"./dist/eslint.js"},"./dom-api":{"types":"./dist/dom-api/index.d.ts","import":"./dist/dom-api/index.mjs","require":"./dist/dom-api/index.js"},"./browser-api":{"types":"./dist/browser-api/index.d.ts","import":"./dist/browser-api/index.mjs","require":"./dist/browser-api/index.js"},"./browser-api/storage":{"types":"./dist/browser-api/storage/index.d.ts","import":"./dist/browser-api/storage/index.mjs","require":"./dist/browser-api/storage/index.js"}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"37d2d8e42479073a97356280f8e69376100ee225","scripts":{"//1a":"*********************************************************************","//1b":"*********************** BUILD - LINT - RELEASE **********************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && tsup","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","test:watch":"jest --watchAll --verbose","build:watch":"tsup --watch","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.0.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{"@alessiofrittoli/web-utils":"^1.9.1","@alessiofrittoli/math-utils":"^1.12.0","@alessiofrittoli/type-utils":"^1.7.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","react":"^19.1.0","dotenv":"^16.5.0","eslint":"^9.25.1","globals":"^16.0.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","react-dom":"^19.1.0","@eslint/js":"^9.25.1","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.15.2","http-server":"^14.1.1","@types/react":"^19.1.2","concurrently":"^9.1.2","@jest/globals":"^29.7.0","@eslint/compat":"^1.2.8","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.2","typescript-eslint":"^8.31.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^2.4.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_1.1.0_1745617816118_0.08970894421321596","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@alessiofrittoli/react-hooks","version":"1.2.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@1.2.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"457918b54612330386f608d2fda211f717b9df9e","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-1.2.0.tgz","fileCount":99,"integrity":"sha512-pJzarD5hDdhqAfEv5pDH/23I5nX6Ow2xibXBSyFF/e2xKWkO/RhjzW6kNZFZRB/pqQPF+JwPnM79Catxq1hHDg==","signatures":[{"sig":"MEUCIGJlzrKPH640BnkrTV5lScvshDj+SWeIjpu0UZnOy5ldAiEAgPYnC4omm4oRpS8tRjcAlxgJRNCsw/hPOfnrjvFd3HM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52239},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["@alessiofrittoli/type-utils","esbuild"]},"types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./misc":{"types":"./dist/misc/index.d.ts","import":"./dist/misc/index.mjs","require":"./dist/misc/index.js"},"./eslint":{"types":"./dist/eslint.d.ts","import":"./dist/eslint.mjs","require":"./dist/eslint.js"},"./dom-api":{"types":"./dist/dom-api/index.d.ts","import":"./dist/dom-api/index.mjs","require":"./dist/dom-api/index.js"},"./browser-api":{"types":"./dist/browser-api/index.d.ts","import":"./dist/browser-api/index.mjs","require":"./dist/browser-api/index.js"},"./browser-api/storage":{"types":"./dist/browser-api/storage/index.d.ts","import":"./dist/browser-api/storage/index.mjs","require":"./dist/browser-api/storage/index.js"}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"10916d5095c1c85ea62ff964f9bf9afbd3b07d28","scripts":{"dev":"NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.0.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{"@alessiofrittoli/web-utils":"^1.10.0","@alessiofrittoli/math-utils":"^1.13.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","react":"^19.1.0","dotenv":"^16.5.0","eslint":"^9.26.0","globals":"^16.0.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","react-dom":"^19.1.0","@eslint/js":"^9.26.0","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.15.3","http-server":"^14.1.1","@types/react":"^19.1.2","concurrently":"^9.1.2","@jest/globals":"^29.7.0","@eslint/compat":"^1.2.9","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.3","typescript-eslint":"^8.31.1","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^2.5.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_1.2.0_1746378414400_0.07608530664541702","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@alessiofrittoli/react-hooks","version":"2.0.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@2.0.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"7a8d53a0291444d979c5a802648d1b66c59186e6","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-2.0.0.tgz","fileCount":11,"integrity":"sha512-TgsVXzFZuvTDVaSFZzJkcq2IUzJgc5msTXdHXROO9AIck+2X05Ef//vE9oFZrsPHkI79z8vo/7fbdp9Stf8Hbw==","signatures":[{"sig":"MEQCIAMmmJrfQ6+ApuTXzoDQ+M9OlwWD+aZIgonZY8lh45IZAiAugKl60IqOsNwESplMFyC9XMkiiXQ3WT1xl8gZsNFeVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118555},"main":"./dist/index.js","_from":"file:alessiofrittoli-react-hooks-2.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"scripts":{"dev":"NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"_resolved":"/private/var/folders/hm/28zlwpys6mxb5bt6k3pzmgsw0000gp/T/3994d4cabbbd9680b4d99a1f4acfdd36/alessiofrittoli-react-hooks-2.0.0.tgz","_integrity":"sha512-TgsVXzFZuvTDVaSFZzJkcq2IUzJgc5msTXdHXROO9AIck+2X05Ef//vE9oFZrsPHkI79z8vo/7fbdp9Stf8Hbw==","repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.10.0","@alessiofrittoli/math-utils":"^1.13.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","react":"^19.1.0","dotenv":"^16.5.0","eslint":"^9.26.0","globals":"^16.1.0","ts-jest":"^29.3.3","ts-node":"^10.9.2","react-dom":"^19.1.0","@eslint/js":"^9.26.0","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.15.18","http-server":"^14.1.1","@types/react":"^19.1.4","concurrently":"^9.1.2","@jest/globals":"^29.7.0","@eslint/compat":"^1.2.9","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.5","typescript-eslint":"^8.32.1","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^2.5.0","@alessiofrittoli/event-emitter":"^1.4.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_2.0.0_1747332690256_0.17199229755988332","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@alessiofrittoli/react-hooks","version":"2.0.1","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@2.0.1","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"a283e2a2ca667e6c4eae4fc2a9c8bff835998456","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-2.0.1.tgz","fileCount":11,"integrity":"sha512-lYPTvIG8DkRy8UizoggIcO5w/IIAY/8SAhwVMqBwnRj76WdhfUdcUV2Z71IhBXFlvlekwnM0WsusXqt1rPhvUg==","signatures":[{"sig":"MEQCIBOa99ZFyxAVCVwefrJrMvpbf45321CiIggR04G2qOmtAiA6V7HVJgqI9CS0yU67X9/0rIwoHyLhpysiiCjQCE7x5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118446},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["@alessiofrittoli/type-utils","esbuild"]},"types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"58d304909887286f80a8c7c5ea34cbaff48ade97","scripts":{"dev":"NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.10.0","@alessiofrittoli/math-utils":"^1.13.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","react":"^19.1.0","dotenv":"^16.5.0","eslint":"^9.26.0","globals":"^16.1.0","ts-jest":"^29.3.3","ts-node":"^10.9.2","react-dom":"^19.1.0","@eslint/js":"^9.26.0","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.15.18","http-server":"^14.1.1","@types/react":"^19.1.4","concurrently":"^9.1.2","@jest/globals":"^29.7.0","@eslint/compat":"^1.2.9","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.5","typescript-eslint":"^8.32.1","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^2.5.0","@alessiofrittoli/event-emitter":"^1.4.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_2.0.1_1747405896030_0.7175337859891435","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@alessiofrittoli/react-hooks","version":"3.0.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.0.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"63efb2c5f26c2102a51d754e2ceccc965f0d34a7","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.0.0.tgz","fileCount":11,"integrity":"sha512-shxrprDY+Kk9S3NnDCqJMhrN/O0Td64Z+wSXYo3WBocniESeXHODg9oBmpi203QkfUpY+d21OUWCHi9RWWD/ZQ==","signatures":[{"sig":"MEUCIFOA+wOLYyHi8TpxjxG7wPQoQmKKKXEwV3ni4MVtZT1tAiEA+wpaynKsvPwC49gW7Oi3TiaUCYlDbeKKy2sbfl3F5O4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":126168},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["@alessiofrittoli/type-utils","esbuild"]},"types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"bc4eb236f18a22f7183743affde8089a2762a72f","scripts":{"dev":"NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.10.0","@alessiofrittoli/math-utils":"^1.13.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","react":"^19.1.0","dotenv":"^16.5.0","eslint":"^9.26.0","globals":"^16.1.0","ts-jest":"^29.3.3","ts-node":"^10.9.2","react-dom":"^19.1.0","@eslint/js":"^9.26.0","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.15.18","http-server":"^14.1.1","@types/react":"^19.1.4","concurrently":"^9.1.2","@jest/globals":"^29.7.0","@eslint/compat":"^1.2.9","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.5","typescript-eslint":"^8.32.1","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^2.5.0","@alessiofrittoli/event-emitter":"^1.4.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.0.0_1747572651087_0.727029553065732","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@alessiofrittoli/react-hooks","version":"3.1.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.1.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"0c39386ad40e3c5690debeee4e60dd50ea94607a","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.1.0.tgz","fileCount":11,"integrity":"sha512-qUisDMPxMCSIrB64Ez6MtM70KsEyaURuo7YFghvtVqhewsmG7dxQw3DzUvODHS+SIUjIcIAmHUMC1/vnDWa8hA==","signatures":[{"sig":"MEYCIQDUn2tndAgdVwmgbhDQinzfIPW/J2TJoJ0lxYhqnjymaAIhALJEWyKBxFM3ab7I8b3Sdg7HI0Q4o6coOIq6dK19v3wc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131033},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["@alessiofrittoli/type-utils","esbuild"]},"types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"456f69d28987a06d1e3a500f0663b302d21912f2","scripts":{"dev":"NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","actor":{"name":"alessiofrittoli","type":"user","email":"info@alessiofrittoli.it"},"email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.4.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.10.0","@alessiofrittoli/math-utils":"^1.13.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","react":"^19.1.0","dotenv":"^16.5.0","eslint":"^9.26.0","globals":"^16.1.0","ts-jest":"^29.3.3","ts-node":"^10.9.2","react-dom":"^19.1.0","@eslint/js":"^9.26.0","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.15.18","http-server":"^14.1.1","@types/react":"^19.1.4","concurrently":"^9.1.2","@jest/globals":"^29.7.0","@eslint/compat":"^1.2.9","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.5","typescript-eslint":"^8.32.1","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^2.5.0","@alessiofrittoli/event-emitter":"^1.4.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.1.0_1751036172680_0.20970868948007082","host":"s3://npm-registry-packages-npm-production"}},"3.2.0-alpha.1":{"name":"@alessiofrittoli/react-hooks","version":"3.2.0-alpha.1","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.2.0-alpha.1","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"fc6a66ad44702b51e333e5b11059402f582e8a0c","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.2.0-alpha.1.tgz","fileCount":11,"integrity":"sha512-gnT8qcWF8JWAlmvl4MyvvbUPjFsDEGp5Xu2O4banexyhHo1DmfLRWQiECGsrzXZwuGGba5qWfo9RV5L2yJc+OA==","signatures":[{"sig":"MEUCIQDDPAOsuaT1NVTrRpniwQrhMnbz9o0Osb/Hi+i+ijlRBgIgG6arQYz/zZ9oxPSmDiUvBkRPgksTRvlf+I/L8Vfc3nA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":130944},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"6750f1afb65b039d97a349dc89d505f21c14b091","scripts":{"dev":"NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","actor":{"name":"alessiofrittoli","type":"user","email":"info@alessiofrittoli.it"},"email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.4.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.12.0","@alessiofrittoli/math-utils":"^1.14.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.0.4","tsup":"^8.5.0","react":"^19.1.0","dotenv":"^17.1.0","eslint":"^9.30.1","globals":"^16.3.0","ts-jest":"^29.4.0","ts-node":"^10.9.2","react-dom":"^19.1.0","@eslint/js":"^9.30.1","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node":"^24.0.10","http-server":"^14.1.1","@types/react":"^19.1.8","concurrently":"^9.2.0","@jest/globals":"^30.0.4","@eslint/compat":"^1.3.1","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.6","typescript-eslint":"^8.36.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^2.6.0","@alessiofrittoli/event-emitter":"^1.5.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.2.0-alpha.1_1751975108565_0.005311801241123959","host":"s3://npm-registry-packages-npm-production"}},"3.2.0-alpha.2":{"name":"@alessiofrittoli/react-hooks","version":"3.2.0-alpha.2","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.2.0-alpha.2","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"4713ddfbb5e716d3255a3cf172581dfbb4e997d8","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.2.0-alpha.2.tgz","fileCount":11,"integrity":"sha512-z8cxOaqQoVpZKZKs32olBq69OJBCi7G64YL9aQl5CRFQV+IZeuAdQ1OAslOzKqxyUHcN9AOlKjSbROfKJwI8jw==","signatures":[{"sig":"MEUCIALEm8xAI04gvpuwzJ9h1Iya+Habmixrz1xn17uZG2lOAiEA/MNfE2HwzThQ5/Inuc4gxVHtR9t0ROl0z4lGM8zWjfM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":141723},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"f673b8c35208984a86fd2f694103d7755febed1f","scripts":{"dev":"NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","actor":{"name":"alessiofrittoli","type":"user","email":"info@alessiofrittoli.it"},"email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.4.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.12.0","@alessiofrittoli/math-utils":"^1.14.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.0.4","tsup":"^8.5.0","react":"^19.1.0","dotenv":"^17.1.0","eslint":"^9.30.1","globals":"^16.3.0","ts-jest":"^29.4.0","ts-node":"^10.9.2","react-dom":"^19.1.0","@eslint/js":"^9.30.1","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node":"^24.0.10","http-server":"^14.1.1","@types/react":"^19.1.8","concurrently":"^9.2.0","@jest/globals":"^30.0.4","@eslint/compat":"^1.3.1","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.6","typescript-eslint":"^8.36.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^2.6.0","@alessiofrittoli/event-emitter":"^1.5.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.2.0-alpha.2_1751990972778_0.07873146619974625","host":"s3://npm-registry-packages-npm-production"}},"3.2.0-alpha.3":{"name":"@alessiofrittoli/react-hooks","version":"3.2.0-alpha.3","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.2.0-alpha.3","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"7320b5650466aaad4500affd240d77146aba7afd","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.2.0-alpha.3.tgz","fileCount":11,"integrity":"sha512-IO4WMKba0e1a7Wb8tU5YwpPNqng2YWeFOVpO8WrKzv0LNtxNW5+T+mZNR+t+zWaKe4DB+jIaAZoqrH1tEwiWCA==","signatures":[{"sig":"MEQCIHBpLxliYcoR1mR8Drtcc3I5vhyXq9+TunxE4ue+NnKZAiByHzaTBIAPsmiU+6a1z6LABIrmyFNjEm/PG/JN7Mp3XA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":155442},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"8475b00b95dde28a27c07cbd31068b1b7e3e349a","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","actor":{"name":"alessiofrittoli","type":"user","email":"info@alessiofrittoli.it"},"email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.4.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"23.11.1","dependencies":{"@alessiofrittoli/web-utils":"^1.12.0","@alessiofrittoli/math-utils":"^1.14.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.0.4","tsup":"^8.5.0","react":"^19.1.0","dotenv":"^17.1.0","eslint":"^9.30.1","globals":"^16.3.0","ts-jest":"^29.4.0","ts-node":"^10.9.2","cross-env":"^7.0.3","react-dom":"^19.1.0","@eslint/js":"^9.30.1","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node":"^24.0.10","http-server":"^14.1.1","@types/react":"^19.1.8","concurrently":"^9.2.0","@jest/globals":"^30.0.4","@eslint/compat":"^1.3.1","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.6","typescript-eslint":"^8.36.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^2.6.0","@alessiofrittoli/event-emitter":"^1.5.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.2.0-alpha.3_1752164080074_0.14775968365743086","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"@alessiofrittoli/react-hooks","version":"3.2.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.2.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"133c03e37b2d21d856be92d86084abc72d142522","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.2.0.tgz","fileCount":11,"integrity":"sha512-UunvQIlrTFDSB35BYYWiTAzNcWaRpC5Ka5GxOVoKZmV70oKVERFQDY+UYlPqSEX8+kdJHNazLYCE1TxiSjaIDg==","signatures":[{"sig":"MEYCIQDq5OHC/d1pIBhRmzNtTkd/4s4YAbpLm6j9jVfc8JTL7gIhAMdVtJ/23iufocD5ZE1YALgW1chGLiU7Hil+5HOJFTnk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":155568},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"103663c8b23552713814d16e5b469ddba877e746","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","actor":{"name":"alessiofrittoli","type":"user","email":"info@alessiofrittoli.it"},"email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.4.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"23.11.1","dependencies":{"@alessiofrittoli/web-utils":"^1.12.0","@alessiofrittoli/math-utils":"^1.14.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.4","tsup":"^8.5.0","react":"^19.1.0","dotenv":"^17.1.0","eslint":"^9.30.1","globals":"^16.3.0","ts-jest":"^29.4.0","ts-node":"^10.9.2","cross-env":"^7.0.3","react-dom":"^19.1.0","@eslint/js":"^9.30.1","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node":"^24.0.10","http-server":"^14.1.1","@types/react":"^19.1.8","concurrently":"^9.2.0","@jest/globals":"^30.0.4","@eslint/compat":"^1.3.1","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.6","typescript-eslint":"^8.36.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^2.6.0","@alessiofrittoli/event-emitter":"^1.5.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.2.0_1752164188908_0.9502108354166177","host":"s3://npm-registry-packages-npm-production"}},"3.3.0-alpha.1":{"name":"@alessiofrittoli/react-hooks","version":"3.3.0-alpha.1","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.3.0-alpha.1","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"666b655f64027bd7c4c4aa77c30805769c0266d0","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.3.0-alpha.1.tgz","fileCount":11,"integrity":"sha512-fgjqYYgQ7sKAZdkW/WbdAvMkLGYw6NZS35BNdIhuKglBN6GNsy87Hq7lC7jWqzK7czDNNH2Xe9mYuJ2rMMKg6A==","signatures":[{"sig":"MEYCIQCCVvqV6NhGF0G/niMkEmSmFIfqiadv97pGSCH+Jjf+gAIhAOBTV7RXevstFj4WbwdyrQ1HtV/r8x25aEJw4w+Ky9wc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154173},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"36dd303ae92700c41a5bbff32bf91d27e30546a5","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.4.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.15.0","@alessiofrittoli/math-utils":"^1.14.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.0.4","tsup":"^8.5.0","react":"^19.1.0","dotenv":"^17.2.0","eslint":"^9.31.0","globals":"^16.3.0","ts-jest":"^29.4.0","ts-node":"^10.9.2","cross-env":"^7.0.3","react-dom":"^19.1.0","@eslint/js":"^9.31.0","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node":"^24.0.14","http-server":"^14.1.1","@types/react":"^19.1.8","concurrently":"^9.2.0","@jest/globals":"^30.0.4","@eslint/compat":"^1.3.1","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.6","typescript-eslint":"^8.37.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.0.0","@alessiofrittoli/event-emitter":"^1.5.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.3.0-alpha.1_1752850247302_0.2967167506435546","host":"s3://npm-registry-packages-npm-production"}},"3.3.0-alpha.2":{"name":"@alessiofrittoli/react-hooks","version":"3.3.0-alpha.2","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.3.0-alpha.2","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"524009172ddccfaa05a70cac8e148a52edb4515b","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.3.0-alpha.2.tgz","fileCount":11,"integrity":"sha512-ofdMTcQl1xJodhlwzCxWju+WUkTiiaFngA0RFavfslCc/TYoonlTt1qDLTiikHTJgPghIVgfMgGmNXEuz4AzVQ==","signatures":[{"sig":"MEQCIHPCr0v6Mlpcmv9XAb4mTqtuOJ3nOloBwaFyD9JOQD94AiANBXokwSnNgSOklaH68SRRwMSgxjoVnafv1oFPwyfsBw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":158691},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"89d94228c26b30be1d14d2fc5f3494c8b409fffd","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.4.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.16.1","@alessiofrittoli/math-utils":"^1.14.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.0.4","tsup":"^8.5.0","react":"^19.1.0","dotenv":"^17.2.0","eslint":"^9.31.0","globals":"^16.3.0","ts-jest":"^29.4.0","ts-node":"^10.9.2","cross-env":"^7.0.3","react-dom":"^19.1.0","@eslint/js":"^9.31.0","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node":"^24.0.15","http-server":"^14.1.1","@types/react":"^19.1.8","concurrently":"^9.2.0","@jest/globals":"^30.0.4","@eslint/compat":"^1.3.1","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.6","typescript-eslint":"^8.37.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.0.0","@alessiofrittoli/event-emitter":"^1.5.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.3.0-alpha.2_1752926300658_0.7456420917260767","host":"s3://npm-registry-packages-npm-production"}},"3.2.1":{"name":"@alessiofrittoli/react-hooks","version":"3.2.1","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.2.1","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"0ab42a366d86e81fad080797a09ab823478a94cd","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.2.1.tgz","fileCount":11,"integrity":"sha512-rWNPk3XwF961jqlmf96Y5IXPztMejPIERXxJDjj0i2Mtc/AMGplqXU3cnhhFPUgzEREGxSeD+rVpG5Q39zauAg==","signatures":[{"sig":"MEUCIEzqNX3MVnIACpgXgcA3uhWWLh2ATxw9L4ChOFtE1TbSAiEAi2UN5zQo4uHgoGcocPMqhHkBcGyLbZnuYXOl4wqC4wk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154335},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"96bde0e675a3e3a3883efd18c54e352fe461bc32","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.4.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.12.0","@alessiofrittoli/math-utils":"^1.14.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.4","tsup":"^8.5.0","react":"^19.1.0","dotenv":"^17.1.0","eslint":"^9.30.1","globals":"^16.3.0","ts-jest":"^29.4.0","ts-node":"^10.9.2","cross-env":"^7.0.3","react-dom":"^19.1.0","@eslint/js":"^9.30.1","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node":"^24.0.10","http-server":"^14.1.1","@types/react":"^19.1.8","concurrently":"^9.2.0","@jest/globals":"^30.0.4","@eslint/compat":"^1.3.1","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.6","typescript-eslint":"^8.36.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^2.6.0","@alessiofrittoli/event-emitter":"^1.5.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.2.1_1752949695632_0.49564167630813905","host":"s3://npm-registry-packages-npm-production"}},"3.3.0-alpha.3":{"name":"@alessiofrittoli/react-hooks","version":"3.3.0-alpha.3","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.3.0-alpha.3","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"d9728fb295bc6528a7845aee7c5b2b3144b896af","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.3.0-alpha.3.tgz","fileCount":11,"integrity":"sha512-OJM/Tg5wArUdM8+uXJk8Gcx79z76+meZR1PyQ/3vknnWi8QIios6aFI8aXJCZnvTwTZO8k/+lVql4sAxQBL2gQ==","signatures":[{"sig":"MEUCIFPnxr9LxpcTpHB7xzk+qjK6TYtYBOyZLcOw+h5Q7kt5AiEA4oaciT1xiuzsZeRjXuc7WNLZ8gwn46jt2Uln2KV8CGI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187321},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"b685a872669b376d6a241dd707e7e870fdb7ab75","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.4.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.16.1","@alessiofrittoli/math-utils":"^1.14.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.0.4","tsup":"^8.5.0","react":"^19.1.0","dotenv":"^17.2.0","eslint":"^9.31.0","globals":"^16.3.0","ts-jest":"^29.4.0","ts-node":"^10.9.2","cross-env":"^7.0.3","react-dom":"^19.1.0","@eslint/js":"^9.31.0","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node":"^24.0.15","http-server":"^14.1.1","@types/react":"^19.1.8","concurrently":"^9.2.0","@jest/globals":"^30.0.4","@eslint/compat":"^1.3.1","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.6","typescript-eslint":"^8.37.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.0.0","@alessiofrittoli/event-emitter":"^1.5.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.3.0-alpha.3_1753035821454_0.17219599629087168","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"@alessiofrittoli/react-hooks","version":"3.3.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.3.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"4f41ecc3661cb61b66662ca787c083f8b1b0ca35","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.3.0.tgz","fileCount":11,"integrity":"sha512-s+aXOUsgmGnfLC/QHBAszaQEEYYEuMVmOg1uUXVExDdrW/66d6/IX/PSsMQoK2SPhU6B6+XIeBfGWgUF2px/MA==","signatures":[{"sig":"MEUCICjrqWfjgymChyFzM+ygVPvVHB8m2z0a+zrqaVqHXgYJAiEA2yZEa5XhUHYwHRicdVFjpvf9ZNBloAJ5hlXGUxYxdLc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187313},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"bbac850ab43e83c963bffb55bf8a9472e8acea84","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.4.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.16.1","@alessiofrittoli/math-utils":"^1.14.0","@alessiofrittoli/type-utils":"^1.8.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.4","tsup":"^8.5.0","react":"^19.1.0","dotenv":"^17.2.0","eslint":"^9.31.0","globals":"^16.3.0","ts-jest":"^29.4.0","ts-node":"^10.9.2","cross-env":"^7.0.3","react-dom":"^19.1.0","@eslint/js":"^9.31.0","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node":"^24.0.15","http-server":"^14.1.1","@types/react":"^19.1.8","concurrently":"^9.2.0","@jest/globals":"^30.0.4","@eslint/compat":"^1.3.1","@eslint/eslintrc":"^3.3.1","@types/react-dom":"^19.1.6","typescript-eslint":"^8.37.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^30.0.4","@testing-library/jest-dom":"^6.6.3","eslint-plugin-react-hooks":"^5.2.0","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.0.0","@alessiofrittoli/event-emitter":"^1.5.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.3.0_1753036061902_0.011186538916278632","host":"s3://npm-registry-packages-npm-production"}},"3.4.0":{"name":"@alessiofrittoli/react-hooks","version":"3.4.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.4.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"9f13ddf7ec53b0c257c9af74c0ae7452a33d8c19","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.4.0.tgz","fileCount":11,"integrity":"sha512-TOQo6RXtFPWdx7OcI632g3ZOK7rlF7vtTCN7Pv3CSjbCETnto0nCT8d1tgX01EZymQSJCrGkCyI2OcmuzwHsjg==","signatures":[{"sig":"MEUCIQCejN1GTnPXws4HYLWV4W7prD+TsxCQpo94m8pedVIXbwIgFFgyvv0oFoIPO/o78K8oTR+GDrNLSCaEHD045sBHmkk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187393},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"cb4bc9ab49db8d8fd0c8ec854e99086bc52704b5","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.5.2","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.18.0","@alessiofrittoli/math-utils":"^1.16.0","@alessiofrittoli/type-utils":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","react":"^19.2.1","dotenv":"^17.2.3","eslint":"^9.39.1","globals":"^16.5.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","react-dom":"^19.2.1","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^24.10.1","http-server":"^14.1.1","@types/react":"^19.2.7","concurrently":"^9.2.1","@jest/globals":"^30.2.0","@eslint/compat":"^2.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"^8.48.1","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.0","jest-environment-jsdom":"^30.2.0","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.2.0","@alessiofrittoli/event-emitter":"^1.6.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.4.0_1764846817816_0.5492146724033726","host":"s3://npm-registry-packages-npm-production"}},"3.5.0":{"name":"@alessiofrittoli/react-hooks","version":"3.5.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.5.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"0244a74bf04a08fe274295a8aab98948b1826598","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.5.0.tgz","fileCount":11,"integrity":"sha512-OQi4kpP62IZrnfqZEFVQUw2eU8r3D85JRkJ9T89yQf1t+vWmfaC4MXniG1edRXZW9WaXfyXh3Fetig/EnSWNRw==","signatures":[{"sig":"MEUCIA/N351kwUU2Z+obArYLWVaPex36W5nmvRzhw8a8Kpn3AiEAlul9G4fZwYdjpX5yfDRhm+BC22P1OPinZnRwRlp8nmo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220608},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"1729cde20c54fe1e96334df79459c1337a98a1c4","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.7.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.18.0","@alessiofrittoli/math-utils":"^1.17.0","@alessiofrittoli/type-utils":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","react":"^19.2.3","dotenv":"^17.2.3","eslint":"^9.39.2","globals":"^16.5.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","react-dom":"^19.2.3","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.0.3","http-server":"^14.1.1","@types/react":"^19.2.7","concurrently":"^9.2.1","@jest/globals":"^30.2.0","@eslint/compat":"^2.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"^8.50.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.1","jest-environment-jsdom":"^30.2.0","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.3.0","@alessiofrittoli/event-emitter":"^1.6.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.5.0_1766086970137_0.7189431384401508","host":"s3://npm-registry-packages-npm-production"}},"3.6.0":{"name":"@alessiofrittoli/react-hooks","version":"3.6.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.6.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"b33a649311ae08234d556ede8a75b119b1261046","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.6.0.tgz","fileCount":11,"integrity":"sha512-zdzan++Bj41cABxldWMZuoDY5TN6JqRdLE7X5xKArVv1dH+mFy6xE5SZwVlMg6qlSENeTEertrov6DdNA+IqaQ==","signatures":[{"sig":"MEUCIQDGPPvBSiWJB3JKV9L9TzZk7B5KZO9xRRjRgI/hBqCyqwIgf4koBqZglYFUXeJIMOQwmaSP+q1lQn+OgtMD+Xl8C5M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":222399},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"43c1ee47296e29f8ff844dc8b2c186e2f2bcb506","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"11.7.0","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/web-utils":"^1.18.0","@alessiofrittoli/math-utils":"^1.17.0","@alessiofrittoli/type-utils":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","react":"^19.2.3","dotenv":"^17.2.3","eslint":"^9.39.2","globals":"^16.5.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","react-dom":"^19.2.3","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.0.3","http-server":"^14.1.1","@types/react":"^19.2.7","concurrently":"^9.2.1","@jest/globals":"^30.2.0","@eslint/compat":"^2.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"^8.50.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.1","jest-environment-jsdom":"^30.2.0","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.3.0","@alessiofrittoli/event-emitter":"^1.6.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.6.0_1767114850939_0.7069508222837659","host":"s3://npm-registry-packages-npm-production"}},"3.7.0":{"name":"@alessiofrittoli/react-hooks","version":"3.7.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.7.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"9f1922d0341cbbcce85cb5578c663bf0670424ec","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.7.0.tgz","fileCount":11,"integrity":"sha512-VmzaAblYPUkSJ7KwYLvTDhw14wCmCV0C7eNoxmqdR9eFS/EDrob8a7JePMAEGGiL00OAmcHYI89osWYLISzSGQ==","signatures":[{"sig":"MEQCIEKXzdO8kf3WGcWuMWPYdLXNt80g/QttTZqcY7S/0X3BAiAU9Ej3mmqwTjVmnom5lNu8w62o+upEXbdkVe20SjREHQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":222436},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"5c57aac73b6fbba8f05a833372b5a792965a713c","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/math-utils":"^1.18.0","@alessiofrittoli/type-utils":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","react":"^19.2.4","dotenv":"^17.3.1","eslint":"^10.0.0","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","react-dom":"^19.2.4","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.3","http-server":"^14.1.1","@types/react":"^19.2.14","concurrently":"^9.2.1","@jest/globals":"^30.2.0","@eslint/compat":"^2.0.2","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"^8.55.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.2","jest-environment-jsdom":"^30.2.0","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.3.0","@alessiofrittoli/event-emitter":"^1.6.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.7.0_1771159301616_0.29301455061128023","host":"s3://npm-registry-packages-npm-production"}},"3.7.1":{"name":"@alessiofrittoli/react-hooks","version":"3.7.1","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.7.1","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"79d054bd655a701cf32e626935f2b99d95a2ebcb","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.7.1.tgz","fileCount":11,"integrity":"sha512-6wQPmiUB5j39IT8NFALXO2uMMzYu8J3jJ0BEznNlELVLd63oRRhgUNLUVET2Xd15RXXV5ZlMxayFqut9NrN/Gw==","signatures":[{"sig":"MEUCIEccyv6rxrQAUWA4Zagts+m2WCZ9FrMOOARyTTop56ajAiEAzI1XUwzG0WzkP0+gtj8NnImCkTiqg1Bv0sVRi+5g8S4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":222382},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"8161760d263e86df9dff979b17df7c2cd4153622","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/web-utils":"^1.20.0","@alessiofrittoli/math-utils":"^1.18.0","@alessiofrittoli/type-utils":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","react":"^19.2.4","dotenv":"^17.3.1","eslint":"^10.0.0","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","react-dom":"^19.2.4","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.3","http-server":"^14.1.1","@types/react":"^19.2.14","concurrently":"^9.2.1","@jest/globals":"^30.2.0","@eslint/compat":"^2.0.2","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"^8.55.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.2","jest-environment-jsdom":"^30.2.0","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.3.0","@alessiofrittoli/event-emitter":"^1.6.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.7.1_1771159750707_0.7358924292998688","host":"s3://npm-registry-packages-npm-production"}},"3.8.0":{"name":"@alessiofrittoli/react-hooks","version":"3.8.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@3.8.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"e1c1c27b8d250430931bebbe006145f28b79658d","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-3.8.0.tgz","fileCount":11,"integrity":"sha512-sf+/cDqvMa2PTEaiSTNSlzYMFS9TPhr2oRTnfFAfTWajDtC3IyBLwIiesUksCiyFLkNGb2MDLcEkq0vX9ivNDg==","signatures":[{"sig":"MEYCIQDEfDcdMx6atKfhtikXK14st4bXHkxXGF1ooBMQMq5kewIhAJpL2WcyIsrpsDKYserWZhg1Tr7OCeeX96Z1XvwtD4ZM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":223778},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"8445d5568f116caa6420286c353bcdfa5460d3cf","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/web-utils":"^2.0.1","@alessiofrittoli/math-utils":"^2.0.0","@alessiofrittoli/type-utils":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","react":"^19.2.4","dotenv":"^17.3.1","eslint":"^10.0.2","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","react-dom":"^19.2.4","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.3","http-server":"^14.1.1","@types/react":"^19.2.14","concurrently":"^9.2.1","@jest/globals":"^30.2.0","@eslint/compat":"^2.0.2","@eslint/eslintrc":"^3.3.4","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.1","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.2","jest-environment-jsdom":"^30.2.0","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.3.0","@alessiofrittoli/event-emitter":"^1.6.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_3.8.0_1772333451014_0.2497024406710846","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@alessiofrittoli/react-hooks","version":"4.0.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@4.0.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"e227b2abc2a30c8bab64a14078a995200d453f7c","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-4.0.0.tgz","fileCount":11,"integrity":"sha512-YXXGuMfhLZjq5Z3nFly303IaGxFMvLUpaJQhMdxWE3kZDp6Vn+sHeK8kCp3YKizpwSNfzmh7g+T7Ovr7z4t3dw==","signatures":[{"sig":"MEUCIBNx4+atZbwVV8F0bUEXgVAgZP00Hn5iAM5d3tfzYqpoAiEA7fM15nWjWQ+O5TSSGp6S7sYhJodIX1RtmCZ/w4adn2U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":228195},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"b8f093cc3d8ec266cab3d66118f00384b278a298","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/web-utils":"^2.1.0","@alessiofrittoli/math-utils":"^2.0.0","@alessiofrittoli/type-utils":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","react":"^19.2.4","dotenv":"^17.3.1","eslint":"^10.0.2","globals":"^17.4.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","react-dom":"^19.2.4","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.3","http-server":"^14.1.1","@types/react":"^19.2.14","concurrently":"^9.2.1","@jest/globals":"^30.2.0","@eslint/compat":"^2.0.2","@eslint/eslintrc":"^3.3.4","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.1","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.2","jest-environment-jsdom":"^30.2.0","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.3.0","@alessiofrittoli/event-emitter":"^1.6.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_4.0.0_1772390583225_0.15056478101307724","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"@alessiofrittoli/react-hooks","version":"4.1.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@4.1.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"0684662c7a036d80e940d065754a95f35a5681c4","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-4.1.0.tgz","fileCount":11,"integrity":"sha512-K/47iaxrPcCCLubsJOgIUfeZSHUiiitEsC/xK10CO2sbk1/375jpAsZcNH/CLgB+LeH8nIyy6PujQWdYuyTQcQ==","signatures":[{"sig":"MEQCICaZi2XIqVdyj6h+5k5YMPB6Wk8MZMboAqxSFIzoDe+DAiBGUCxZckr3gbrnviocj5+3GwQbCqx+vyKzrtYu+7K9wA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":229959},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"827e1f6ddd28f641ace3a80776daecc0be3d62c3","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/web-utils":"^2.1.0","@alessiofrittoli/math-utils":"^2.0.0","@alessiofrittoli/type-utils":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","react":"^19.2.4","dotenv":"^17.3.1","eslint":"^10.0.2","globals":"^17.4.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","react-dom":"^19.2.4","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.3","http-server":"^14.1.1","@types/react":"^19.2.14","concurrently":"^9.2.1","@jest/globals":"^30.2.0","@eslint/compat":"^2.0.2","@eslint/eslintrc":"^3.3.4","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.1","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.2","jest-environment-jsdom":"^30.2.0","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.3.0","@alessiofrittoli/event-emitter":"^1.6.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_4.1.0_1772494756845_0.5828248475744517","host":"s3://npm-registry-packages-npm-production"}},"4.1.1":{"name":"@alessiofrittoli/react-hooks","version":"4.1.1","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@4.1.1","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"e6dc311caf1f5159a697a6e186943d9b2dfe231c","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-4.1.1.tgz","fileCount":11,"integrity":"sha512-nRPc6Fp5vjr0Cguu4Fs+fqgLtxuGuFcHSWZ4SvSw1PvxPDchjEv2j+FhxHPknKKU/1dc3zCHRyxR0nI+8xGMZA==","signatures":[{"sig":"MEUCIQChR1ZmuFiFNFv52q9qmhXzQCByKU1Rgp8ImTBglgzL0wIgUYaQFAmZVoHtXv3xUXIY2sHLXoma3Tv2rxh/VWjnleU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":231579},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"5a2570dc96052d30cea5e667b3511345735d15f9","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/web-utils":"^2.1.0","@alessiofrittoli/math-utils":"^2.0.0","@alessiofrittoli/type-utils":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","react":"^19.2.4","dotenv":"^17.3.1","eslint":"^10.0.2","globals":"^17.4.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","react-dom":"^19.2.4","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.3","http-server":"^14.1.1","@types/react":"^19.2.14","concurrently":"^9.2.1","@jest/globals":"^30.2.0","@eslint/compat":"^2.0.2","@eslint/eslintrc":"^3.3.4","@types/react-dom":"^19.2.3","typescript-eslint":"^8.56.1","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.2","jest-environment-jsdom":"^30.2.0","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.3.0","@alessiofrittoli/event-emitter":"^1.6.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_4.1.1_1772495015208_0.5996072259598704","host":"s3://npm-registry-packages-npm-production"}},"4.2.0":{"name":"@alessiofrittoli/react-hooks","version":"4.2.0","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@4.2.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"04a7cdc3161a4a979b4f2a6f63a4589d4206787a","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-4.2.0.tgz","fileCount":23,"integrity":"sha512-QVcEIABZDdVTsRXwL/muuNyGQ4OSZ5vJml3aYeDL1wxXEt6BRy/SEsmnzL855nfy0lW3l7mcvPcXAKhxuxs2jw==","signatures":[{"sig":"MEQCIE0GiAmf58HMC9No27uBJ9/LCVO5duH7TEx0f70tY8aZAiAUlgZXHI3aXsAY/p/UzX3Xflb4dYT5CEf7mWgZgJ1sww==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":285230},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./queue":{"import":{"types":"./dist/misc/queue/index.d.mts","default":"./dist/misc/queue/index.mjs"},"require":{"types":"./dist/misc/queue/index.d.ts","default":"./dist/misc/queue/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}},"./queue/utils":{"import":{"types":"./dist/misc/queue/utils.d.mts","default":"./dist/misc/queue/utils.mjs"},"require":{"types":"./dist/misc/queue/utils.d.ts","default":"./dist/misc/queue/utils.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"b4c1b65fefcb401f5a3670cc381cc21b8b95f84e","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/web-utils":"^2.3.0","@alessiofrittoli/math-utils":"^2.0.0","@alessiofrittoli/type-utils":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","tsup":"^8.5.1","react":"^19.2.4","dotenv":"^17.3.1","eslint":"^10.0.3","globals":"^17.4.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","react-dom":"^19.2.4","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.5.0","http-server":"^14.1.1","@types/react":"^19.2.14","concurrently":"^9.2.1","@jest/globals":"^30.3.0","@eslint/compat":"^2.0.3","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.2","jest-environment-jsdom":"^30.3.0","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.3.0","@alessiofrittoli/event-emitter":"^1.6.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_4.2.0_1773538819252_0.5202060595387143","host":"s3://npm-registry-packages-npm-production"}},"4.2.1":{"name":"@alessiofrittoli/react-hooks","version":"4.2.1","keywords":["react","react-hooks"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/react-hooks@4.2.1","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"dd3c897cb969c7dcd65aa7faf557f76b9facf928","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-4.2.1.tgz","fileCount":23,"integrity":"sha512-D6rGgntHHK7gV+prmdqlLSOIKAvCsFTtxN0OE7RWGL0hpcolG2+vbbzUvR/iyG+9Yb01rnKHJFtKfxr3HBnopA==","signatures":[{"sig":"MEUCIQDjV7FyCWoMGe7tqGM6fDJvHz1mpjgYrk2zsRev6Z2lpQIgalzUujRz5Rp3ML5X2Xmx0N50ChMtMI2QdBLH7qGQzYw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":285249},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./queue":{"import":{"types":"./dist/misc/queue/index.d.mts","default":"./dist/misc/queue/index.mjs"},"require":{"types":"./dist/misc/queue/index.d.ts","default":"./dist/misc/queue/index.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}},"./queue/utils":{"import":{"types":"./dist/misc/queue/utils.d.mts","default":"./dist/misc/queue/utils.mjs"},"require":{"types":"./dist/misc/queue/utils.d.ts","default":"./dist/misc/queue/utils.js"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"55fcfcf566b24b03e638f955bf5729edf8565234","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc/*","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:timers":"pnpm test:watch timers/*","test:dom-api":"pnpm test:watch dom-api/*","test:storage":"pnpm test:watch browser-api/storage/*","test:coverage":"pnpm test:watch --coverage","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:coverage:ci":"pnpm test:ci --coverage","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/react-hooks.git","type":"git"},"_npmVersion":"10.9.4","description":"TypeScript React utility Hooks","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"@alessiofrittoli/web-utils":"^2.3.0","@alessiofrittoli/math-utils":"^2.0.0","@alessiofrittoli/type-utils":"^1.9.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.3.0","tsup":"^8.5.1","react":"^19.2.4","dotenv":"^17.3.1","eslint":"^10.0.3","globals":"^17.4.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","react-dom":"^19.2.4","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.5.0","http-server":"^14.1.1","@types/react":"^19.2.14","concurrently":"^9.2.1","@jest/globals":"^30.3.0","@eslint/compat":"^2.0.3","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"^8.57.0","eslint-plugin-react":"^7.37.5","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.2","jest-environment-jsdom":"^30.3.0","@testing-library/jest-dom":"^6.9.1","eslint-plugin-react-hooks":"^7.0.1","@testing-library/user-event":"^14.6.1","@alessiofrittoli/node-scripts":"^3.3.0","@alessiofrittoli/event-emitter":"^1.6.0"},"peerDependencies":{"react":"^19","react-dom":"^19","@types/react":"^19","@types/react-dom":"^19"},"_npmOperationalInternal":{"tmp":"tmp/react-hooks_4.2.1_1774026322382_0.45419327982035407","host":"s3://npm-registry-packages-npm-production"}},"4.2.2":{"name":"@alessiofrittoli/react-hooks","version":"4.2.2","description":"TypeScript React utility Hooks","author":{"name":"Alessio Frittoli","email":"info@alessiofrittoli.it","url":"https://alessiofrittoli.it"},"license":"MIT","funding":[{"type":"github","url":"https://github.com/sponsors/alessiofrittoli"}],"keywords":["react","react-hooks"],"homepage":"https://github.com/alessiofrittoli/react-hooks#readme","bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"repository":{"type":"git","url":"git+https://github.com/alessiofrittoli/react-hooks.git"},"main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./queue":{"import":{"types":"./dist/misc/queue/index.d.mts","default":"./dist/misc/queue/index.mjs"},"require":{"types":"./dist/misc/queue/index.d.ts","default":"./dist/misc/queue/index.js"}},"./queue/utils":{"import":{"types":"./dist/misc/queue/utils.d.mts","default":"./dist/misc/queue/utils.mjs"},"require":{"types":"./dist/misc/queue/utils.d.ts","default":"./dist/misc/queue/utils.js"}},"./eslint":{"import":{"types":"./dist/eslint.d.mts","default":"./dist/eslint.mjs"},"require":{"types":"./dist/eslint.d.ts","default":"./dist/eslint.js"}}},"sideEffects":false,"scripts":{"//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","dev":"cross-env NODE_ENV=development tsup --watch","build:prod":"cross-env NODE_ENV=production tsup","build":"pnpm lint && pnpm test:ci && pnpm build:prod","lint":"eslint","release":"node scripts/release.js --verbose --npm","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","test":"jest --verbose","test:watch":"jest --watchAll --verbose","test:ci":"jest --ci --verbose","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","test:storage":"pnpm test:watch browser-api/storage/*","test:browser-api":"pnpm test:watch --testPathPattern='browser-api/(?!storage/).*\\.test\\.(js|jsx|ts|tsx)'","test:dom-api":"pnpm test:watch dom-api/*","test:misc":"pnpm test:watch misc/*","test:timers":"pnpm test:watch timers/*"},"peerDependencies":{"@types/react":"^19","@types/react-dom":"^19","react":"^19","react-dom":"^19"},"devDependencies":{"@alessiofrittoli/event-emitter":"^1.6.0","@alessiofrittoli/node-scripts":"^3.3.0","@eslint/compat":"^2.0.3","@eslint/eslintrc":"^3.3.5","@eslint/js":"^10.0.1","@jest/globals":"^30.3.0","@testing-library/dom":"^10.4.1","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@testing-library/user-event":"^14.6.1","@types/jest":"^30.0.0","@types/node":"^25.5.0","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","concurrently":"^9.2.1","cross-env":"^10.1.0","dotenv":"^17.3.1","eslint":"^10.0.3","eslint-plugin-react":"^7.37.5","eslint-plugin-react-hooks":"^7.0.1","globals":"^17.4.0","http-server":"^14.1.1","jest":"^30.3.0","jest-environment-jsdom":"^30.3.0","react":"^19.2.4","react-dom":"^19.2.4","ts-jest":"^29.4.6","ts-node":"^10.9.2","tsup":"^8.5.1","typescript":"^5.9.3","typescript-eslint":"^8.57.0"},"dependencies":{"@alessiofrittoli/math-utils":"^2.0.0","@alessiofrittoli/type-utils":"^1.9.0","@alessiofrittoli/web-utils":"^2.3.0"},"_id":"@alessiofrittoli/react-hooks@4.2.2","gitHead":"73f874e0a08896009b8eed42672cd5355fea8ba3","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-JNE+KraqWDzSDEXwPei959RE1jk+9S9A7IS8gy8s4/TC6xlkm/0VnbU6u1MT/JvMMq0KRzB3Z9oMU50qEqPHMQ==","shasum":"55c5d940eea886706e04627de2615ea5d45f3f44","tarball":"https://registry.npmjs.org/@alessiofrittoli/react-hooks/-/react-hooks-4.2.2.tgz","fileCount":23,"unpackedSize":285255,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIElHd95OlWH/YumkSnLsGz5TmxfddHI1rsYcgekzIY09AiAYMh/Qg9/zkVkcZwd2+usqgzPElkl0ZfUaL0LZHxfDEg=="}]},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"directories":{},"maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-hooks_4.2.2_1774026794186_0.8851212209918353"},"_hasShrinkwrap":false}},"time":{"created":"2025-04-23T18:21:21.472Z","modified":"2026-03-20T17:13:14.541Z","1.0.0":"2025-04-23T18:21:21.861Z","1.1.0":"2025-04-25T21:50:16.298Z","1.2.0":"2025-05-04T17:06:54.600Z","2.0.0":"2025-05-15T18:11:30.471Z","2.0.1":"2025-05-16T14:31:36.235Z","3.0.0":"2025-05-18T12:50:51.311Z","3.1.0":"2025-06-27T14:56:12.843Z","3.2.0-alpha.1":"2025-07-08T11:45:08.741Z","3.2.0-alpha.2":"2025-07-08T16:09:32.971Z","3.2.0-alpha.3":"2025-07-10T16:14:40.573Z","3.2.0":"2025-07-10T16:16:29.083Z","3.3.0-alpha.1":"2025-07-18T14:50:47.508Z","3.3.0-alpha.2":"2025-07-19T11:58:20.865Z","3.2.1":"2025-07-19T18:28:15.871Z","3.3.0-alpha.3":"2025-07-20T18:23:41.669Z","3.3.0":"2025-07-20T18:27:42.075Z","3.4.0":"2025-12-04T11:13:37.977Z","3.5.0":"2025-12-18T19:42:50.267Z","3.6.0":"2025-12-30T17:14:11.173Z","3.7.0":"2026-02-15T12:41:41.765Z","3.7.1":"2026-02-15T12:49:10.855Z","3.8.0":"2026-03-01T02:50:51.203Z","4.0.0":"2026-03-01T18:43:03.384Z","4.1.0":"2026-03-02T23:39:17.054Z","4.1.1":"2026-03-02T23:43:35.366Z","4.2.0":"2026-03-15T01:40:19.411Z","4.2.1":"2026-03-20T17:05:22.624Z","4.2.2":"2026-03-20T17:13:14.413Z"},"bugs":{"url":"https://github.com/alessiofrittoli/react-hooks/issues","email":"info@alessiofrittoli.it"},"author":{"name":"Alessio Frittoli","email":"info@alessiofrittoli.it","url":"https://alessiofrittoli.it"},"license":"MIT","homepage":"https://github.com/alessiofrittoli/react-hooks#readme","keywords":["react","react-hooks"],"repository":{"type":"git","url":"git+https://github.com/alessiofrittoli/react-hooks.git"},"description":"TypeScript React utility Hooks","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"readme":"<h1 align=\"center\">React Hooks 🪝</h1>\n<p align=\"center\">\n  TypeScript React utility Hooks\n</p>\n<p align=\"center\">\n  <a href=\"https://npmjs.org/package/@alessiofrittoli/react-hooks\">\n    <img src=\"https://img.shields.io/npm/v/@alessiofrittoli/react-hooks\" alt=\"Latest version\"/>\n  </a>\n  <a href=\"https://coveralls.io/github/alessiofrittoli/react-hooks\">\n    <img src=\"https://coveralls.io/repos/github/alessiofrittoli/react-hooks/badge.svg\" alt=\"Test coverage\"/>\n  </a>\n  <a href=\"https://socket.dev/npm/package/@alessiofrittoli/react-hooks/overview\">\n    <img src=\"https://socket.dev/api/badge/npm/package/@alessiofrittoli/react-hooks\" alt=\"Socket Security score\"/>\n  </a>\n  <a href=\"https://npmjs.org/package/@alessiofrittoli/react-hooks\">\n    <img src=\"https://img.shields.io/npm/dm/@alessiofrittoli/react-hooks.svg\" alt=\"npm downloads\"/>\n  </a>\n  <a href=\"https://bundlephobia.com/package/@alessiofrittoli/react-hooks\">\n    <img src=\"https://badgen.net/bundlephobia/dependency-count/@alessiofrittoli/react-hooks\" alt=\"Dependencies\"/>\n  </a>\n  <a href=\"https://libraries.io/npm/%40alessiofrittoli%2Freact-hooks\">\n    <img src=\"https://img.shields.io/librariesio/release/npm/@alessiofrittoli/react-hooks\" alt=\"Dependencies status\"/>\n  </a>\n</p>\n<p align=\"center\">\n  <a href=\"https://bundlephobia.com/package/@alessiofrittoli/react-hooks\">\n    <img src=\"https://badgen.net/bundlephobia/min/@alessiofrittoli/react-hooks\" alt=\"minified\"/>\n  </a>\n  <a href=\"https://bundlephobia.com/package/@alessiofrittoli/react-hooks\">\n    <img src=\"https://badgen.net/bundlephobia/minzip/@alessiofrittoli/react-hooks\" alt=\"minizipped\"/>\n  </a>\n  <a href=\"https://bundlephobia.com/package/@alessiofrittoli/react-hooks\">\n    <img src=\"https://badgen.net/bundlephobia/tree-shaking/@alessiofrittoli/react-hooks\" alt=\"Tree shakable\"/>\n  </a>\n</p>\n<p align=\"center\">\n  <a href=\"https://github.com/sponsors/alessiofrittoli\">\n    <img src=\"https://img.shields.io/static/v1?label=Fund%20this%20package&message=%E2%9D%A4&logo=GitHub&color=%23DB61A2\" alt=\"Fund this package\"/>\n  </a>\n</p>\n\n[sponsor-badge]: https://img.shields.io/static/v1?label=Fund%20this%20package&message=%E2%9D%A4&logo=GitHub&color=%23DB61A2\n[sponsor-url]: https://github.com/sponsors/alessiofrittoli\n\n### Table of Contents\n\n- [Getting started](#getting-started)\n- [ESLint Configuration](#eslint-configuration)\n- [What's Changed](#whats-changed)\n- [API Reference](#api-reference)\n  - [Browser API](#browser-api)\n    - [`useStorage`](#usestorage)\n    - [`useLocalStorage`](#uselocalstorage)\n    - [`useSessionStorage`](#usesessionstorage)\n    - [`useConnection`](#useconnection)\n    - [`useDarkMode`](#usedarkmode)\n    - [`useEventListener`](#useeventlistener)\n    - [`useIsPortrait`](#useisportrait)\n    - [`useIsTouchDevice`](#useistouchdevice)\n    - [`useMediaQuery`](#usemediaquery)\n    - [`usePreventContextMenu`](#usepreventcontextmenu)\n    - [`useDocumentVisibility`](#usedocumentvisibility)\n    - [`useWakeLock`](#usewakelock)\n  - [DOM API](#dom-api)\n    - [`useFocusTrap`](#usefocustrap)\n    - [`useInView`](#useinview)\n    - [`useScrollBlock`](#usescrollblock)\n  - [Miscellaneous](#miscellaneous)\n    - [`useInput`](#useinput)\n    - [`useDeferCallback`](#usedefercallback)\n    - [`useEffectOnce`](#useeffectonce)\n    - [`useUpdateEffect`](#useupdateeffect)\n    - [`useIsClient`](#useisclient)\n    - [`useIsFirstRender`](#useisfirstrender)\n    - [`usePagination`](#usepagination)\n    - [`useSelection`](#useselection)\n    - [Queue](#queue)\n      - [Queue Types](#queue-types)\n      - [Queue Utils](#queue-utils)\n      - [`useShuffle`](#useshuffle)\n      - [`useQueue`](#usequeue)\n  - [Timers](#timers)\n    - [`useDebounce`](#usedebounce)\n    - [`useInterval`](#useinterval)\n    - [`useIntervalWhenVisible`](#useintervalwhenvisible)\n    - [`useLightInterval`](#uselightinterval)\n    - [`useTimeout`](#usetimeout)\n    - [`useLightTimeout`](#uselighttimeout)\n- [Development](#development)\n  - [Install dependencies](#install-dependencies)\n  - [Build the source code](#build-the-source-code)\n  - [ESLint](#eslint)\n  - [Jest](#jest)\n- [Contributing](#contributing)\n- [Security](#security)\n- [Credits](#made-with-)\n\n---\n\n### Getting started\n\nRun the following command to start using `react-hooks` in your projects:\n\n```bash\nnpm i @alessiofrittoli/react-hooks\n```\n\nor using `pnpm`\n\n```bash\npnpm i @alessiofrittoli/react-hooks\n```\n\n---\n\n### ESLint Configuration\n\nThis library may define and exports hooks that requires additional ESLint configuration for your project such as [`useUpdateEffect`](#useupdateeffect).\n\nSimply imports recommended configuration from `@alessiofrittoli/react-hooks/eslint` and add them to your ESLint configuration like so:\n\n```mjs\nimport { config as AFReactHooksEslint } from \"@alessiofrittoli/react-hooks/eslint\";\n\n/** @type {import('eslint').Linter.Config[]} */\nconst config = [\n  ...AFReactHooksEslint.recommended,\n  // ... other configurations\n];\n\nexport default config;\n```\n\n---\n\n### What's Changed\n\n#### Updates in the latest release 🎉\n\n- Added `useQueue` hook. See [API Reference](#usequeue) for more info.\n- Added `useShuffle` hook. See [API Reference](#useshuffle) for more info.\n\n---\n\nOld major updates\n\n- Added `usePreventContextMenu` hook. See [API Reference](#usepreventcontextmenu) for more info.\n- Improved `useConnection` hook. It now returns\n  [`NetworkInformation`](https://github.com/alessiofrittoli/web-utils?tab=readme-ov-file#network-information) when available.\n  See [API Reference](#useconnection) for more info.\n- Improved `useEventListener` hook types. It now supports `EventTarget` as listener targets.\n  See [API Reference](#useeventlistener) for more info.\n- Added `useDocumentVisibility` hook. See [API Reference](#usedocumentvisibility) for more info.\n- Added `useWakeLock` hook. See [API Reference](#usewakelock) for more info.\n- Added `useDeferCallback` hook. See [API Reference](#usedefercallback) for more info.\n\n---\n\n### API Reference\n\n#### Browser API\n\n##### Storage\n\nThe following storage hooks use Storage Utilities from [`@alessiofrittoli/web-utils`](https://npmjs.com/package/@alessiofrittoli/web-utils#storage-utilities) adding a React oriented implementation.\n\n###### `useStorage`\n\nEasly handle Local or Session Storage State.\n\n<details>\n\n<summary style=\"cursor:pointer\">Type parameters</summary>\n\n| Parameter | Type  | Default  | Description                               |\n| --------- | ----- | -------- | ----------------------------------------- |\n| `T`       | `any` | `string` | A custom type applied to the stored item. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type             | Default | Description                        |\n| --------- | ---------------- | ------- | ---------------------------------- |\n| `key`     | `string`         | -       | The storage item key.              |\n| `initial` | `T`              | -       | The storage item initial value.    |\n| `type`    | `local\\|session` | local   | (Optional) The storage API to use. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `[ Value<T>, SetValue<Value<T>> ]`\n\nA tuple with the stored item value or initial value and the setter function.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n###### Importing the hooks\n\n```tsx\nimport {\n  useStorage,\n  useLocalStorage,\n  useSessionStorage,\n} from \"@alessiofrittoli/react-hooks\";\n```\n\n---\n\n###### Reading item value from storage\n\n```tsx\n'use client'\n\nimport { useStorage } from '@alessiofrittoli/react-hooks'\n\ntype Locale = 'it' | 'en'\n\nconst storage       = 'local' // or 'session'\nconst defaultLocale = 'it'\n\nexport const SomeComponent: React.FC = () => {\n\n  const [ userLocale ] = useStorage<Locale>( 'user-locale', defaultLocale, storage )\n\n  return (\n    ...\n  )\n\n}\n```\n\n---\n\n###### Updating storage item value\n\n```tsx\n'use client'\n\nimport { useCallback } from 'react'\nimport { useStorage } from '@alessiofrittoli/react-hooks'\n\ntype Locale = 'it' | 'en'\n\nconst storage       = 'local' // or 'session'\nconst defaultLocale = 'it'\n\nexport const LanguageSwitcher: React.FC = () => {\n\n  const [ userLocale, setUserLocale ] = useStorage<Locale>( 'user-locale', defaultLocale, storage )\n\n  const clickHandler = useCallback( () => {\n    setUserLocale( 'en' )\n  }, [ setUserLocale ] )\n\n  return (\n    ...\n  )\n\n}\n```\n\n---\n\n###### Deleting storage item\n\n```tsx\n'use client'\n\nimport { useCallback } from 'react'\nimport { useStorage } from '@alessiofrittoli/react-hooks'\n\ntype Locale = 'it' | 'en'\n\nconst storage       = 'local' // or 'session'\nconst defaultLocale = 'it'\n\nexport const LanguageSwitcher: React.FC = () => {\n\n  const [ userLocale, setUserLocale ] = useStorage<Locale>( 'user-locale', defaultLocale, storage )\n\n  const deleteHandler = useCallback( () => {\n    setUserLocale( null )\n    // or\n    setUserLocale( undefined )\n    // or\n    setUserLocale( '' )\n  }, [ setUserLocale ] )\n\n  return (\n    ...\n  )\n\n}\n```\n\n</details>\n\n---\n\n###### `useLocalStorage`\n\nShortcut React Hook for [`useStorage`](#usestorage).\n\nApplies the same API Reference.\n\n---\n\n###### `useSessionStorage`\n\nShortcut React Hook for [`useStorage`](#usestorage).\n\nApplies the same API Reference.\n\n---\n\n##### `useConnection`\n\nGet states about Internet Connection.\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `Connection`\n\nAn object defining network status and `NetworkInformation`.\n\n- See [`Connection`](https://github.com/alessiofrittoli/web-utils?tab=readme-ov-file#connection-interface) interface from [`@alessiofrittoli/web-utils`](https://www.npmjs.com/package/@alessiofrittoli/web-utils)\n\n</details>\n\n---\n\n##### `useDarkMode`\n\nEasily manage dark mode with full respect for user device preferences.\n\nThis hook is user-oriented and built to honor system-level color scheme settings:\n\n- If the device prefers a dark color scheme, dark mode is automatically enabled on first load.\n- If the user enables/disables dark mode via a web widget, the preference is stored in `localStorage` under the key `dark-mode`.\n- If the device color scheme preference changes (e.g. via OS settings), that change takes precedence and is stored for future visits.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter               | Type                            | Description                                                                                                                           |\n| ----------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |\n| `options`               | `UseDarkModeOptions`            | (Optional) Configuration object for the hook.                                                                                         |\n| `options.initial`       | `boolean`                       | (Optional) The fallback value to use if no preference is saved in `localStorage`. Defaults to `true` if the device prefers dark mode. |\n| `options.docClassNames` | `[dark: string, light: string]` | (Optional) Array of class names to toggle on the `<html>` element, e.g. `['dark', 'light']`.                                          |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `UseDarkModeOutput`\n\nAn object containing utilities for managing dark mode:\n\n- `isDarkMode`: `boolean` — Whether dark mode is currently enabled.\n- `isDarkOS`: `boolean` — Whether the user's system prefers dark mode.\n- `toggleDarkMode`: `() => void` — Toggles dark mode and saves the preference.\n- `enableDarkMode`: `() => void` — Enables dark mode and saves the preference.\n- `disableDarkMode`: `() => void` — Disables dark mode and saves the preference.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n###### Basic usage\n\n```tsx\n\"use client\";\n\nimport { useDarkMode } from \"@alessiofrittoli/react-hooks\";\n\nexport const Component: React.FC = () => {\n  const { isDarkMode } = useDarkMode();\n\n  return <div>{isDarkMode ? \"Dark mode enabled\" : \"Dark mode disabled\"}</div>;\n};\n```\n\n---\n\n###### Update Document class names for CSS styling\n\n```tsx\n// Component.tsx\n\"use client\";\n\nimport { useDarkMode } from \"@alessiofrittoli/react-hooks\";\n\nexport const Component: React.FC = () => {\n  const { isDarkMode } = useDarkMode({\n    docClassNames: [\"dark\", \"light\"],\n  });\n\n  return <div>{isDarkMode ? \"Dark mode enabled\" : \"Dark mode disabled\"}</div>;\n};\n```\n\n```css\n/* style.css */\n.light {\n  color-scheme: light;\n}\n\n.dark {\n  color-scheme: dark;\n}\n\n.light body {\n  color: black;\n  background: white;\n}\n\n.dark body {\n  color: white;\n  background: black;\n}\n```\n\n---\n\n###### Custom theme switcher\n\n```tsx\n\"use client\";\n\nimport { useDarkMode } from \"@alessiofrittoli/react-hooks\";\n\nexport const ThemeSwitcher: React.FC = () => {\n  const { isDarkMode, toggleDarkMode } = useDarkMode();\n\n  return <button onClick={toggleDarkMode}>{isDarkMode ? \"🌙\" : \"☀️\"}</button>;\n};\n```\n\n---\n\n###### Sync Document theme-color for consistent browser styling\n\nBrowsers automatically apply colorization using:\n\n```html\n<meta name=\"theme-color\" media=\"(prefers-color-scheme: dark)\" />\n```\n\nThis works based on the OS preference — _not your site theme_. That can cause mismatches if, for example, the system is in dark mode but the user disabled dark mode via a web toggle.\n\nTo ensure consistency, `useDarkMode` updates these meta tags dynamically based on the actual mode.\n\nJust make sure to define both `light` and `dark` theme-color tags in your document:\n\n```html\n<head>\n  <meta\n    name=\"theme-color\"\n    media=\"(prefers-color-scheme: light)\"\n    content=\"lime\"\n  />\n  <meta\n    name=\"theme-color\"\n    media=\"(prefers-color-scheme: dark)\"\n    content=\"aqua\"\n  />\n</head>\n```\n\n</details>\n\n---\n\n##### `useEventListener`\n\nAttach a new Event listener to the `Window`, `Document`, `MediaQueryList` or an `HTMLElement`.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n<details>\n\n<summary style=\"cursor:pointer\">Window events</summary>\n\n| Parameter           | Type                       | Description                                                                                                                                                     |\n| ------------------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `type`              | `K\\|K[]`                   | The `Window` event name or an array of event names.                                                                                                             |\n|                     |                            | ⚠️ Please, make sure to memoize the event names array with `useMemo`                                                                                            |\n|                     |                            | or declare that array outside your Component/hook in order to avoid infinite loops when a React state changes.                                                  |\n| `options`           | `WindowListenerOptions<K>` | An object defining init options.                                                                                                                                |\n| `options.listener`  | `WindowEventListener<K>`   | The Window Event listener.                                                                                                                                      |\n| `options.onLoad`    | `() => void`               | A custom callback executed before event listener get attached.                                                                                                  |\n| `options.onCleanUp` | `() => void`               | A custom callback executed after event listener get removed.                                                                                                    |\n| `options.options`   | `ListenerOptions`          | Specifies characteristics about the event listener. See [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#options). |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Document events</summary>\n\n| Parameter           | Type                                              | Description                                                                                                                                                     |\n| ------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `type`              | `K\\|K[]`                                          | The `Document` event name or an array of event names.                                                                                                           |\n|                     |                                                   | ⚠️ Please, make sure to memoize the event names array with `useMemo`                                                                                            |\n|                     |                                                   | or declare that array outside your Component/hook in order to avoid infinite loops when a React state changes.                                                  |\n| `options`           | `DocumentListenerOptions<K>`                      | An object defining init options.                                                                                                                                |\n| `options.target`    | `Document\\|null\\|React.RefObject<Document\\|null>` | The `Document` reference or a React RefObject of the `Document`.                                                                                                |\n| `options.listener`  | `DocumentEventListener<K>`                        | The Document Event listener.                                                                                                                                    |\n| `options.onLoad`    | `() => void`                                      | A custom callback executed before event listener get attached.                                                                                                  |\n| `options.onCleanUp` | `() => void`                                      | A custom callback executed after event listener get removed.                                                                                                    |\n| `options.options`   | `ListenerOptions`                                 | Specifies characteristics about the event listener. See [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#options). |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">HTMLElement events</summary>\n\n| Parameter           | Type                           | Description                                                                                                                                                     |\n| ------------------- | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `type`              | `K\\|K[]`                       | The `HTMLElement` event name or an array of event names.                                                                                                        |\n|                     |                                | ⚠️ Please, make sure to memoize the event names array with `useMemo`                                                                                            |\n|                     |                                | or declare that array outside your Component/hook in order to avoid infinite loops when a React state changes.                                                  |\n| `options`           | `ElementListenerOptions<K>`    | An object defining init options.                                                                                                                                |\n| `options.target`    | `T\\|React.RefObject<T\\| null>` | The React RefObject of the target where the listener get attached to.                                                                                           |\n| `options.listener`  | `ElementEventListener<K>`      | The HTMLElement Event listener.                                                                                                                                 |\n| `options.onLoad`    | `() => void`                   | A custom callback executed before event listener get attached.                                                                                                  |\n| `options.onCleanUp` | `() => void`                   | A custom callback executed after event listener get removed.                                                                                                    |\n| `options.options`   | `ListenerOptions`              | Specifies characteristics about the event listener. See [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#options). |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">MediaQuery events</summary>\n\n| Parameter           | Type                        | Description                                                                                                                                                     |\n| ------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `type`              | `change`                    | The `MediaQueryList` event name.                                                                                                                                |\n| `options`           | `MediaQueryListenerOptions` | An object defining init options.                                                                                                                                |\n| `options.query`     | `string`                    | The Media Query string to check.                                                                                                                                |\n| `options.listener`  | `MediaQueryChangeListener`  | The MediaQueryList Event listener.                                                                                                                              |\n| `options.onLoad`    | `() => void`                | A custom callback executed before event listener get attached.                                                                                                  |\n| `options.onCleanUp` | `() => void`                | A custom callback executed after event listener get removed.                                                                                                    |\n| `options.options`   | `ListenerOptions`           | Specifies characteristics about the event listener. See [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#options). |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Custom events</summary>\n\n| Parameter           | Type                                                                                     | Description                                                                                                                                                     |\n| ------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `type`              | `K\\|K[]`                                                                                 | The custom event name or an array of event names.                                                                                                               |\n|                     |                                                                                          | ⚠️ Please, make sure to memoize the event names array with `useMemo`                                                                                            |\n|                     |                                                                                          | or declare that array outside your Component/hook in order to avoid infinite loops when a React state changes.                                                  |\n| `options`           | `CustomEventListenerOptions<T, K>`                                                       | An object defining init options.                                                                                                                                |\n| `options.target`    | `Document\\|EventTarget\\|HTMLElement\\|null\\|React.RefObject<Document\\|HTMLElement\\|null>` | (Optional) The target where the listener get attached to. If not set, the listener will get attached to the `Window` object.                                    |\n| `options.listener`  | `( event: T[ K ] ) => void`                                                              | The Event listener.                                                                                                                                             |\n| `options.onLoad`    | `() => void`                                                                             | A custom callback executed before event listener get attached.                                                                                                  |\n| `options.onCleanUp` | `() => void`                                                                             | A custom callback executed after event listener get removed.                                                                                                    |\n| `options.options`   | `ListenerOptions`                                                                        | Specifies characteristics about the event listener. See [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#options). |\n\n</details>\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n###### Attach listeners to the Window object\n\n```tsx\n'use client'\n\nimport { useCallback } from 'react'\nimport { useEventListener } from '@alessiofrittoli/react-hooks'\n\nexport const MyComponent: React.FC = () => {\n\n  useEventListener( 'popstate', {\n    listener: useCallback( event => {\n      ...\n    }, [] ),\n  } )\n\n}\n```\n\n---\n\n###### Attach listeners to the Document object\n\n```tsx\n'use client'\n\nimport { useCallback } from 'react'\nimport { useEventListener } from '@alessiofrittoli/react-hooks'\n\nexport const MyComponent: React.FC = () => {\n\n  useEventListener( 'click', {\n    target    : typeof document !== 'undefined' ? document : null,\n    listener  : useCallback( event => {\n      ...\n    }, [] ),\n  } )\n\n}\n```\n\n---\n\n###### Attach listeners to an HTMLElement\n\n```tsx\n'use client'\n\nimport { useCallback, useRef } from 'react'\nimport { useEventListener } from '@alessiofrittoli/react-hooks'\n\nexport const MyComponent: React.FC = () => {\n\n  const buttonRef = useRef<HTMLButtonElement>( null )\n\n  useEventListener( 'click', {\n    target: buttonRef,\n    listener: useCallback( event => {\n      ...\n    }, [] ),\n  } )\n\n  return (\n    <button ref={ buttonRef }>Button</button>\n  )\n\n}\n```\n\n---\n\n###### Attach listeners to a MediaQueryList\n\n```tsx\nimport { useCallback } from 'react'\nimport { useEventListener } from '@alessiofrittoli/react-hooks'\n\nexport const MyComponent: React.FC = () => {\n\n  useEventListener( 'change', {\n    query     : '(max-width: 768px)',\n    listener  : useCallback( event => {\n      if ( event.matches ) {\n        ...\n      }\n    }, [] )\n  } )\n\n}\n```\n\n---\n\n###### Listen dispatched custom events\n\n```tsx\nimport { useCallback } from 'react'\nimport { useEventListener } from '@alessiofrittoli/react-hooks'\n\nclass CustomEvent extends Event\n{\n  isCustom: boolean\n\n  constructor( type: string, eventInitDict?: EventInit )\n  {\n    super( type, eventInitDict )\n    this.isCustom = true\n  }\n}\n\n\ntype CustomEventMap = {\n  customEventName: CustomEvent\n}\n\n\nexport const MyComponent: React.FC = () => {\n\n  const clickHandler = useCallback( () => {\n    document.dispatchEvent( new CustomEvent( 'customEventName' ) )\n  }, [] )\n\n  useEventListener<CustomEventMap>( 'customEventName', {\n    target    : typeof document !== 'undefined' ? document : null,\n    listener  : useCallback( event => {\n      if ( event.isCustom ) {\n        ...\n      }\n    }, [] )\n  } )\n\n\n  return (\n    <button onClick={ clickHandler }>Click me to dispatch custom event</button>\n  )\n\n}\n```\n\n---\n\n###### Attach listeners to multiple events\n\n```tsx\nimport { useCallback, useState } from \"react\";\nimport { useEventListener } from \"@alessiofrittoli/react-hooks\";\n\n/**\n * We define events outside the Component to avoid array recreation when a state update is triggered.\n *\n * This prevents infinite loops for `useEventListener` life-cycle\n */\nconst events: (keyof WindowEventMap)[] = [\"resize\", \"scroll\"];\n\nexport const MyComponent: React.FC = () => {\n  const [isInteracting, setIsIntercting] = useState(false);\n\n  useEventListener(events, {\n    listener: useCallback(() => {\n      setIsIntercting(true);\n    }, []),\n  });\n};\n```\n\n</details>\n\n---\n\n##### `useIsPortrait`\n\nCheck if device is portrait oriented.\n\nReact State get updated when device orientation changes.\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `boolean`\n\n- `true` if the device is portrait oriented.\n- `false` otherwise.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n###### Check if user device is in landscape\n\n```tsx\nimport { useIsPortrait } from \"@alessiofrittoli/react-hooks\";\n\nconst isLandscape = !useIsPortrait();\n```\n\n</details>\n\n---\n\n##### `useIsTouchDevice`\n\nDetects if the current device supports touch events.\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `boolean`\n\n- `true` if the device is touch device.\n- `false` otherwise.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n```tsx\nimport { useIsTouchDevice } from \"@alessiofrittoli/react-hooks\";\n\nconst isTouchDevice = useIsTouchDevice();\n```\n\n</details>\n\n---\n\n##### `useMediaQuery`\n\nGet Document Media matches and listen for changes.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter             | Type                                              | Default | Description                                                                                                         |\n| --------------------- | ------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------- |\n| `query`               | `string`                                          | -       | A string specifying the media query to parse into a `MediaQueryList`.                                               |\n| `options`             | `UseMediaQueryOptions\\|UseMediaQueryStateOptions` | -       | An object defining custom options.                                                                                  |\n| `options.updateState` | `boolean`                                         | `true`  | Indicates whether the hook will dispatch a React state update when the given `query` change event get dispatched.   |\n| `options.onChange`    | `OnChangeHandler`                                 | -       | A custom callback that will be invoked on initial page load and when the given `query` change event get dispatched. |\n|                       |                                                   |         | This callback is required if `updateState` is set to `false`.                                                       |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `boolean|void`\n\n- `true` or `false` if the document currently matches the media query list or not.\n- `void` if `updateState` is set to `false`.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n###### Check if user device prefers dark color scheme\n\n```tsx\nimport { useMediaQuery } from \"@alessiofrittoli/react-hooks\";\n\nconst isDarkOS = useMediaQuery(\"(prefers-color-scheme: dark)\");\n```\n\n---\n\n###### Listen changes with no state updates\n\n```tsx\nimport { useMediaQuery } from \"@alessiofrittoli/react-hooks\";\n\nuseMediaQuery(\"(prefers-color-scheme: dark)\", {\n  updateState: false,\n  onChange(matches) {\n    console.log(\"is dark OS?\", matches);\n  },\n});\n```\n\n</details>\n\n---\n\n##### `usePreventContextMenu`\n\nPrevents the context menu from appearing on a specified target element.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                                                        | Default  | Description                                                                           |\n| --------- | ----------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------- |\n| `target`  | `EventListenerTarget\\|React.RefObject<EventListenerTarget>` | `window` | The target element or a `React.RefObject` where the context menu should be prevented. |\n|           |                                                             |          | If not provided, the listener will be attached to the top `window`.                   |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Examples</summary>\n\n```tsx\n// Prevent context menu on the entire top window.\nusePreventContextMenu();\n\n// Prevent context menu on a specific target.\nconst ref = useRef<HTMLDivElement>(null);\nusePreventContextMenu(ref);\n```\n\n</details>\n\n---\n\n##### `useDocumentVisibility`\n\nTrack the visibility state of the document (i.e., whether the page is visible or hidden).\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter                    | Type                                                                      | Default | Description                                                           |\n| ---------------------------- | ------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------- |\n| `options`                    | `UseDocumentVisibilityOptions\\|StateDisabledUseDocumentVisibilityOptions` | -       | Configuration options for the hook.                                   |\n| `options.updateState`        | `boolean`                                                                 | `true`  | Whether to update React state about Document visibility state or not. |\n| `options.onVisibilityChange` | `VisibilityChangeHandler`                                                 | -       | A custom callback executed when Document visiblity sate changes.      |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `boolean | void`\n\nReturns `true` if the document is visible, `false` if hidden, or `void` if `updateState` is set to `false`.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n###### Simple usage\n\n```tsx\nimport { useDocumentVisibility } from \"@alessiofrittoli/react-hooks\";\n\nconst isDocumentVisible = useDocumentVisibility();\n```\n\n---\n\n###### Disable state updates and listen visibility changes\n\n```tsx\nimport {\n  useDocumentVisibility,\n  type VisibilityChangeHandler,\n} from \"@alessiofrittoli/react-hooks\";\n\nconst onVisibilityChange = useCallback<VisibilityChangeHandler>((isVisible) => {\n  // ... do something\n}, []);\nuseDocumentVisibility({ updateState: false, onVisibilityChange });\n```\n\n</details>\n\n---\n\n##### `useWakeLock`\n\nEasily manage the [Screen Wake Lock API](https://developer.mozilla.org/en-US/docs/Web/API/Screen_Wake_Lock_API) to prevent the device screen from dimming or locking while your app is in use.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter         | Type                     | Default | Description                                                      |\n| ----------------- | ------------------------ | ------- | ---------------------------------------------------------------- |\n| `options`         | `UseWakeLockOptions`     | -       | (Optional) An object defining hook options.                      |\n| `options.onMount` | `boolean`                | `true`  | Indicates whether to request the screen WakeLock on mount.       |\n| `options.onError` | `OnWakeLockRequestError` | -       | A custom callback executed when a screen WakeLock request fails. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `UseWakeLock`\n\nAn object returning The current `WakeLockSentinel` instance or `null` if not enabled and utility functions.\n\n- `wakeLock`: `WakeLockSentinel | null` — The current Wake Lock instance, or null if not enabled.\n- `enabled`: `boolean` — Whether the Wake Lock is currently active.\n- `requestWakeLock`: `() => Promise<void>` — Manually request the Wake Lock.\n- `releaseWakeLock`: `() => Promise<void>` — Manually release the Wake Lock.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n###### Enable Wake Lock on mount\n\n```tsx\nimport { useWakeLock } from \"@alessiofrittoli/react-hooks\";\n\nuseWakeLock();\n```\n\n---\n\n###### Manually enable and disable Wake Lock\n\n```tsx\nimport { useWakeLock } from \"@alessiofrittoli/react-hooks\";\n\nexport const WakeLockButton: React.FC = () => {\n  const { enabled, requestWakeLock, releaseWakeLock } = useWakeLock({\n    enableOnLoad: false,\n  });\n\n  return (\n    <>\n      <h1>Wakelock enabled: {enabled.toString()}</h1>\n      <button onClick={requestWakeLock}>Enable wakelock</button>\n      <button onClick={releaseWakeLock}>Disable wakelock</button>\n    </>\n  );\n};\n```\n\n---\n\n###### Handling Wake Lock errors\n\n```tsx\nimport {\n  useWakeLock,\n  type OnWakeLockRequestError,\n} from \"@alessiofrittoli/react-hooks\";\n\nconst onError: OnWakeLockRequestError = (error) => {\n  alert(\"Could not enable Wake Lock: \" + error.message);\n};\n\nexport const WakeLockWithError: React.FC = () => {\n  const { enabled, requestWakeLock } = useWakeLock({ onError });\n\n  return (\n    <button onClick={requestWakeLock}>\n      {enabled ? \"Wake Lock enabled\" : \"Enable Wake Lock\"}\n    </button>\n  );\n};\n```\n\n</details>\n\n---\n\n#### DOM API\n\n##### `useFocusTrap`\n\nTrap focus inside the given HTML Element.\n\nThis comes pretty handy when rendering a modal that shouldn't be closed without a user required action.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                                 | Description                                                                                 |\n| --------- | ------------------------------------ | ------------------------------------------------------------------------------------------- |\n| `target`  | `React.RefObject<HTMLElement\\|null>` | The target HTMLElement React RefObject to trap focus within.                                |\n|           |                                      | If no target is given, you must provide the target HTMLElement when calling `setFocusTrap`. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `readonly [ SetFocusTrap, RestoreFocusTrap ]`\n\nA tuple containing:\n\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\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n###### Defining the target on hook initialization\n\n```tsx\nimport { useFocusTrap } from \"@alessiofrittoli/react-hooks\";\n\nconst modalRef = useRef<HTMLDivElement>(null);\nconst [setFocusTrap, restoreFocusTrap] = useFocusTrap(modalRef);\n\nconst modalOpenHandler = useCallback(() => {\n  if (!modalRef.current) return;\n  // ... open modal\n  setFocusTrap();\n  modalRef.current.focus(); // focus the dialog so next tab will focus the next element inside the modal\n}, [setFocusTrap]);\n\nconst modalCloseHandler = useCallback(() => {\n  // ... close modal\n  restoreFocusTrap(); // cancel focus trap and restore focus to the last active element before enablig the focus trap\n}, [restoreFocusTrap]);\n```\n\n---\n\n###### Defining the target ondemand\n\n```tsx\nimport { useFocusTrap } from \"@alessiofrittoli/react-hooks\";\n\nconst modalRef = useRef<HTMLDivElement>(null);\nconst modal2Ref = useRef<HTMLDivElement>(null);\nconst [setFocusTrap, restoreFocusTrap] = useFocusTrap();\n\nconst modalOpenHandler = useCallback(() => {\n  if (!modalRef.current) return;\n  // ... open modal\n  setFocusTrap(modalRef.current);\n  modalRef.current.focus();\n}, [setFocusTrap]);\n\nconst modal2OpenHandler = useCallback(() => {\n  if (!modal2Ref.current) return;\n  // ... open modal\n  setFocusTrap(modal2Ref.current);\n  modal2Ref.current.focus();\n}, [setFocusTrap]);\n```\n\n</details>\n\n---\n\n##### `useInView`\n\nCheck if the given target Element is intersecting with an ancestor Element or with a top-level document's viewport.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter             | Type                              | Description                                                                                                                                                    |\n| --------------------- | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `target`              | `React.RefObject<Element\\|null>`  | The React.RefObject of the target Element to observe.                                                                                                          |\n| `options`             | `UseInViewOptions`                | (Optional) An object defining custom `IntersectionObserver` options.                                                                                           |\n| `options.root`        | `Element\\|Document\\|false\\|null`  | (Optional) Identifies the `Element` or `Document` whose bounds are treated as the bounding box of the viewport for the Element which is the observer's target. |\n| `options.margin`      | `MarginType`                      | (Optional) A string, formatted similarly to the CSS margin property's value, which contains offsets for one or more sides of the root's bounding box.          |\n| `options.amount`      | `'all'\\|'some'\\|number\\|number[]` | (Optional) The intersecting target thresholds.                                                                                                                 |\n|                       |                                   | Threshold can be set to:                                                                                                                                       |\n|                       |                                   | - `all` - `1` will be used.                                                                                                                                    |\n|                       |                                   | - `some` - `0.5` will be used.                                                                                                                                 |\n|                       |                                   | - `number`                                                                                                                                                     |\n|                       |                                   | - `number[]`                                                                                                                                                   |\n| `options.once`        | `boolean`                         | (Optional) By setting this to `true` the observer will be disconnected after the target Element enters the viewport.                                           |\n| `options.initial`     | `boolean`                         | (Optional) Initial value. This value is used while server rendering then will be updated in the client based on target visibility. Default: `false`.           |\n| `options.enable`      | `boolean`                         | (Optional) Defines the initial observation activity. Use the returned `setEnabled` to update this state. Default: `true`.                                      |\n| `options.onIntersect` | `OnIntersectStateHandler`         | (Optional) A custom callback executed when target element's visibility has crossed one or more thresholds.                                                     |\n|                       |                                   | This callback is awaited before any state update.                                                                                                              |\n|                       |                                   | If an error is thrown the React State update won't be fired.                                                                                                   |\n|                       |                                   | ⚠️ Wrap your callback with `useCallback` to avoid unnecessary `IntersectionObserver` recreation.                                                               |\n| `options.onEnter`     | `OnIntersectHandler`              | (Optional) A custom callback executed when target element's visibility has crossed one or more thresholds.                                                     |\n|                       |                                   | This callback is awaited before any state update.                                                                                                              |\n|                       |                                   | If an error is thrown the React State update won't be fired.                                                                                                   |\n|                       |                                   | ⚠️ Wrap your callback with `useCallback` to avoid unnecessary `IntersectionObserver` recreation.                                                               |\n| `options.onExit`      | `OnIntersectHandler`              | (Optional) A custom callback executed when target element's visibility has crossed one or more thresholds.                                                     |\n|                       |                                   | This callback is awaited before any state update.                                                                                                              |\n|                       |                                   | If an error is thrown the React State update won't be fired.                                                                                                   |\n|                       |                                   | ⚠️ Wrap your callback with `useCallback` to avoid unnecessary `IntersectionObserver` recreation.                                                               |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `UseInViewReturnType`\n\nAn object containing:\n\n- `inView`: `boolean` - Indicates whether the target Element is in viewport or not.\n- `setInView`: `React.Dispatch<React.SetStateAction<boolean>>` - A React Dispatch SetState action that allows custom state updates.\n- `enabled`: `boolean` - Indicates whether the target Element is being observed or not.\n- `setEnabled`: `React.Dispatch<React.SetStateAction<boolean>>` - A React Dispatch SetState action that allows to enable/disable observation when needed.\n- `observer`: `IntersectionObserver | undefined` - The `IntersectionObserver` instance. It could be `undefined` if `IntersectionObserver` is not available or observation is not enabled.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n###### Basic usage\n\n```tsx\n\"use client\";\n\nimport { useRef } from \"react\";\nimport { useInView } from \"@alessiofrittoli/react-hooks\";\n\nconst UseInViewExample: React.FC = () => {\n  const targetRef = useRef<HTMLDivElement>(null);\n  const { inView } = useInView(ref);\n\n  return Array.from(Array(6)).map((value, index) => (\n    <div\n      key={index}\n      style={{\n        height: \"50vh\",\n        border: \"1px solid red\",\n        display: \"flex\",\n        alignItems: \"center\",\n        justifyContent: \"center\",\n      }}\n    >\n      <div\n        ref={index === 2 ? targetRef : undefined}\n        style={{\n          width: 150,\n          height: 150,\n          borderRadius: 12,\n          display: \"flex\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          background: inView ? \"#51AF83\" : \"#201A1B\",\n          color: inView ? \"#201A1B\" : \"#FFFFFF\",\n        }}\n      >\n        {index + 1}\n      </div>\n    </div>\n  ));\n};\n```\n\n---\n\n###### Disconnect observer after target enters the viewport\n\n```tsx\n\"use client\";\n\nimport { useRef } from \"react\";\nimport { useInView } from \"@alessiofrittoli/react-hooks\";\n\nconst OnceExample: React.FC = () => {\n  const targetRef = useRef<HTMLDivElement>(null);\n  const { inView } = useInView(targetRef, { once: true });\n\n  useEffect(() => {\n    if (!inView) return;\n    console.count(\"Fired only once: element entered viewport.\");\n  }, [inView]);\n\n  return (\n    <div\n      ref={targetRef}\n      style={{\n        height: 200,\n        background: inView ? \"lime\" : \"gray\",\n      }}\n    />\n  );\n};\n```\n\n---\n\n###### Observe target only when needed\n\n```tsx\n\"use client\";\n\nimport { useRef } from \"react\";\nimport { useInView } from \"@alessiofrittoli/react-hooks\";\n\nconst OnDemandObservation: React.FC = () => {\n  const targetRef = useRef<HTMLDivElement>(null);\n  const { inView, enabled, setEnabled } = useInView(targetRef, {\n    enable: false,\n  });\n\n  return (\n    <div>\n      <button onClick={() => setEnabled((prev) => !prev)}>\n        {enabled ? \"Disconnect observer\" : \"Observe\"}\n      </button>\n      <div\n        ref={targetRef}\n        style={{\n          height: 200,\n          marginTop: 50,\n          background: inView ? \"lime\" : \"gray\",\n        }}\n      />\n    </div>\n  );\n};\n```\n\n---\n\n###### Execute custom callback when intersection occurs\n\n```tsx\n\"use client\";\n\nimport { useRef } from \"react\";\nimport {\n  useInView,\n  type OnIntersectStateHandler,\n} from \"@alessiofrittoli/react-hooks\";\n\nconst AsyncStartExample: React.FC = () => {\n  const targetRef = useRef<HTMLDivElement>(null);\n  const onIntersect = useCallback<OnIntersectStateHandler>(\n    async ({ entry, isEntering }) => {\n      if (isEntering) {\n        console.log(\"Delaying state update...\");\n        await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulate delay\n        console.log(\"Async task completed. `inView` will now be updated.\");\n        return;\n      }\n\n      console.log(\"Delaying state update...\");\n      await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulate delay\n      console.log(\"Async task completed. `inView` will now be updated.\");\n    },\n    [],\n  );\n\n  const { inView } = useInView(targetRef, { onIntersect });\n\n  return (\n    <div\n      ref={targetRef}\n      style={{\n        height: 200,\n        background: inView ? \"lime\" : \"gray\",\n      }}\n    />\n  );\n};\n```\n\n---\n\n###### Execute custom callback when `onEnter` and `onExit`\n\n```tsx\n\"use client\";\n\nimport { useRef } from \"react\";\nimport {\n  useInView,\n  type OnIntersectHandler,\n} from \"@alessiofrittoli/react-hooks\";\n\nconst AsyncStartExample: React.FC = () => {\n  const targetRef = useRef<HTMLDivElement>(null);\n  const onEnter = useCallback<OnIntersectHandler>(async ({ entry }) => {\n    console.log(\"In viewport - \", entry);\n  }, []);\n  const onExit = useCallback<OnIntersectHandler>(async ({ entry }) => {\n    console.log(\"Exited viewport - \", entry);\n  }, []);\n\n  const { inView } = useInView(targetRef, { onEnter, onExit });\n\n  return (\n    <div\n      ref={targetRef}\n      style={{\n        height: 200,\n        background: inView ? \"lime\" : \"gray\",\n      }}\n    />\n  );\n};\n```\n\n</details>\n\n---\n\n##### `useScrollBlock`\n\nPrevent Element overflow.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                                 | Default                    | Description                                        |\n| --------- | ------------------------------------ | -------------------------- | -------------------------------------------------- |\n| `target`  | `React.RefObject<HTMLElement\\|null>` | `Document.documentElement` | (Optional) The React RefObject target HTMLElement. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `[ () => void, () => void ]`\n\nA tuple with block and restore scroll callbacks.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n###### Block Document Overflow\n\n```tsx\nimport { useScrollBlock } from '@alessiofrittoli/react-hooks'\n\nconst [ blockScroll, restoreScroll ] = useScrollBlock()\n\nconst openPopUpHandler = useCallback( () => {\n  ...\n  blockScroll()\n}, [ blockScroll ] )\n\nconst closePopUpHandler = useCallback( () => {\n  ...\n  restoreScroll()\n}, [ restoreScroll ] )\n\n...\n```\n\n---\n\n###### Block HTML Element Overflow\n\n```tsx\nconst elementRef = useRef<HTMLDivElement>( null )\n\nconst [ blockScroll, restoreScroll ] = useScrollBlock( elementRef )\n\nconst scrollBlockHandler = useCallback( () => {\n  ...\n  blockScroll()\n}, [ blockScroll ] )\n\nconst scrollRestoreHandler = useCallback( () => {\n  ...\n  restoreScroll()\n}, [ restoreScroll ] )\n\n...\n```\n\n</details>\n\n---\n\n#### Miscellaneous\n\n##### `useInput`\n\nHandle input states with ease.\n\n<details>\n\n<summary style=\"cursor:pointer\">Type Parameters</summary>\n\n| Parameter | Description            |\n| --------- | ---------------------- |\n| `I`       | The input value type.  |\n| `O`       | The output value type. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter              | Type                         | Default | Description                                                                                                                                          |\n| ---------------------- | ---------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `options`              | `UseInputOptions<I, O>`      | `{}`    | An object defining custom options.                                                                                                                   |\n| `options.inputRef`     | `React.RefObject<InputType>` | -       | (Optional) The React HTML input element ref.                                                                                                         |\n| `options.initialValue` | `O\\|null`                    | -       | (Optional) The input initial value.                                                                                                                  |\n| `options.touchTimeout` | `number`                     | 600     | (Optional) A timeout in milliseconds which will be used to define the input as \"touched\" thus validations are triggered and errors can be displayed. |\n| `options.validate`     | `ValidateValueHandler<O>`    | -       | (Optional) Value validation handler. If `parse` callback is given, the `value` will be parsed before validation.                                     |\n| `options.parse`        | `ParseValueHandler<I, O>`    | -       | (Optional) Parse value.                                                                                                                              |\n| `options.onChange`     | `ChangeHandler<O>`           | -       | (Optional) A callable function executed when the `ChangeEvent` is dispatched on the HTML input element.                                              |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `UseInputOutput<I, O>`\n\nAn object containing the following properties:\n\n| Property        | Type                                  | Description                                                                                                          |\n| --------------- | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |\n| `isEmpty`       | `boolean`                             | Indicates whether the Input is empty or not.                                                                         |\n| `hasError`      | `boolean`                             | Indicates whether the input has error or not.                                                                        |\n|                 |                                       | It will return true if the Input does not pass the validation checks and it has been touched.                        |\n|                 |                                       | Please refer to the `isValid` property to check the Input validity regardless of whether it has been touched or not. |\n| `changeHandler` | `React.ChangeEventHandler<InputType>` | Change handler callback used to handle Input change events.                                                          |\n| `blurHandler`   | `() => void`                          | Blur handler callback used to handle Input blur events.                                                              |\n| `setValue`      | `( value: O ) => void`                | Call `setValue` method to update input value.                                                                        |\n| `submit`        | `() => void`                          | Call `submit` method to re-run validations and ensure error state is updated successfully.                           |\n| `reset`         | `() => void`                          | Call `reset` method to reset the Input state.                                                                        |\n| `focus`         | `() => void`                          | Call `focus` method to focus the Input Element. `inputRef` must be provided in the input options.                    |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n###### Basic usage\n\n```tsx\nconst MyComponent: React.FC = () => {\n  const input = useInput<string>();\n\n  return (\n    <input\n      type=\"text\"\n      value={input.value || \"\"}\n      onChange={input.changeHandler}\n      onBlur={input.blurHandler}\n    />\n  );\n};\n```\n\n---\n\n###### Displaying custom error messages\n\n```tsx\nimport {\n  useInput,\n  type ValidateValueHandler,\n} from \"@alessiofrittoli/react-hooks\";\n\nconst isNotEmpty: ValidateValueHandler<string> = (value) =>\n  !value ? false : value.trim().length > 0;\n\nconst MyComponent: React.FC = () => {\n  const input = useInput<string>({\n    validate: isNotEmpty,\n  });\n\n  return (\n    <>\n      <input\n        value={input.value || \"\"}\n        onChange={input.changeHandler}\n        onBlur={input.blurHandler}\n      />\n      {input.hasError && <span>The input cannot be empty.</span>}\n    </>\n  );\n};\n```\n\n---\n\n###### Parsing and validating parsed value\n\n```tsx\nimport { formatDate, isValidDate } from \"@alessiofrittoli/date-utils\";\nimport {\n  useInput,\n  type ValidateValueHandler,\n  type ParseValueHandler,\n} from \"@alessiofrittoli/react-hooks\";\n\nconst parseStringToDate: ParseValueHandler<string, Date> = (value) =>\n  value ? new Date(value) : undefined;\n\nconst validateInputDate: ValidateValueHandler<Date> = (value) =>\n  isValidDate(value) && value.getTime() > Date.now();\n\nconst MyComponent: React.FC = () => {\n  const input = useInput<string, Date>({\n    parse: parseStringToDate,\n    validate: validateInputDate,\n  });\n\n  return (\n    <>\n      <input\n        type=\"datetime-local\"\n        value={input.value ? formatDate(input.value, \"Y-m-dTH:i\") : \"\"}\n        onChange={input.changeHandler}\n        onBlur={input.blurHandler}\n      />\n      {input.hasError && (\n        <span>Please choose a date no earlier than today</span>\n      )}\n    </>\n  );\n};\n```\n\n</details>\n\n---\n\n##### `useDeferCallback`\n\n`useDeferCallback` will return a memoized and deferred version of the callback that only changes if one of the `inputs` in the dependency list has changed.\n\nSince [`deferCallback`](https://npmjs.com/package/@alessiofrittoli/web-utils?activeTab=readme#deferCallback) returns a new function when called, it may cause your child components to uselessly re-validate when a state update occurs in the main component.\nTo avoid these pitfalls you can memoize and defer your task with `useDeferCallback`.\n\nTake a look at [`deferTask`](https://npmjs.com/package/@alessiofrittoli/web-utils?activeTab=readme#deferTask) to defer single tasks in a function handler.\n\n<details>\n\n<summary style=\"cursor:pointer\">Type Parameters</summary>\n\n| Parameter | Description                                                                                       |\n| --------- | ------------------------------------------------------------------------------------------------- |\n| `T`       | The task function definition. `unknown` types will be inherited by your function type definition. |\n| `U`       | The task function arguments. `unknown` types will be inherited by your function type.             |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type | Description                 |\n| --------- | ---- | --------------------------- |\n| `task`    | `T`  | The task callable function. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `( ...args: U ) => Promise<Awaited<ReturnType<T>>>`\n\nA new memoized handler which returns a new Promise that returns the `task` result once fulfilled.\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n```tsx\nconst MyComponent: React.FC = () => {\n\n  const clickHandler = useDeferCallback<React.MouseEventHandler>(\n    event => { ... }, []\n  )\n\n  return (\n    <button onClick={ clickHandler }>Button</button>\n  )\n\n}\n```\n\n</details>\n\n---\n\n##### `useEffectOnce`\n\nModified version of `useEffect` that only run once on intial load.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                   | Description                                             |\n| --------- | ---------------------- | ------------------------------------------------------- |\n| `effect`  | `React.EffectCallback` | Imperative function that can return a cleanup function. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n```tsx\n\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useEffectOnce } from \"@alessiofrittoli/react-hooks\";\n\nexport const ClientComponent: React.FC = () => {\n  const [count, setCount] = useState(0);\n\n  useEffect(() => {\n    const intv = setInterval(() => {\n      setCount((prev) => prev + 1); // update state each 1s\n    }, 1000);\n    return () => clearInterval(intv);\n  }, []);\n\n  useEffectOnce(() => {\n    console.log(\"Component did mount\");\n    return () => {\n      console.log(\"Component did unmount\");\n    };\n  });\n\n  return <div>{count}</div>;\n};\n```\n\n</details>\n\n---\n\n##### `useUpdateEffect`\n\nModified version of `useEffect` that skips the first render.\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                   | Description                                                             |\n| --------- | ---------------------- | ----------------------------------------------------------------------- |\n| `effect`  | `React.EffectCallback` | Imperative function that can return a cleanup function.                 |\n| `deps`    | `React.DependencyList` | If present, effect will only activate if the values in the list change. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Usage</summary>\n\n```tsx\n\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useUpdateEffect } from \"@alessiofrittoli/react-hooks\";\n\nexport const ClientComponent: React.FC = () => {\n  const [count, setCount] = useState(0);\n\n  useEffect(() => {\n    const intv = setInterval(() => {\n      setCount((prev) => prev + 1);\n    }, 1000);\n    return () => clearInterval(intv);\n  }, []);\n\n  useEffect(() => {\n    console.log(\"useEffect\", count); // starts from 0\n    return () => {\n      console.log(\"useEffect - clean up\", count); // starts from 0\n    };\n  }, [count]);\n\n  useUpdateEffect(() => {\n    console.log(\"useUpdateEffect\", count); // starts from 1\n    return () => {\n      console.log(\"useUpdateEffect - clean up\", count); // starts from 1\n    };\n  }, [count]);\n\n  return <div>{count}</div>;\n};\n```\n\n</details>\n\n---\n\n##### `useIsClient`\n\nCheck if the React Hook or Component where this hook is executed is running in a browser environmen","readmeFilename":"README.md"}