{"_id":"react-hookable","_rev":"61-75a6442d92e362ab1616bf06ed1ce112","name":"react-hookable","dist-tags":{"beta":"1.0.0-beta.60","latest":"1.0.0-beta.1"},"versions":{"1.0.0-beta.1":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.1","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint lib/**","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","release":"semantic-release"},"peerDependencies":{"react":"^16 | ^17"},"devDependencies":{"@commitlint/cli":"^13.2.0","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-plugin-d.ts":"^1.0.6","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","husky":"^7.0.2","jest":"^27.2.4","npm-run-all":"^4.1.5","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.3.4","typescript":"^4.4.3"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"gitHead":"f4a61a383259e1a7904af3ddcf4e4a8709ebcaa1","_id":"react-hookable@1.0.0-beta.1","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-Tik7QSdwz1miORue5/VEc2AR7CDmUnMInRDmS8NZwTRNIFOEMpjWSMlPIOpbr+MW5WBmQDYAvaBlqEIWI+ICMQ==","shasum":"6e006dce1ccc0a654954099b6cfbf9a5d409e44c","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.1.tgz","fileCount":8,"unpackedSize":6472,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh24X3CRA9TVsSAnZWagAAnt0P/2fhOsGIu3YCMMlb0zlI\n+QeoCc0MJ3n0LNR5V1A/QkfJfvofM7V7DweFnXwKfnl1EX8acXWVlag89+z/\nY3XiDc+7rDwxYsF7S9s7H+QvpbJCdVOsgMMsuFXd8DS/KIGsq9KBq3Lo5kFQ\ntpjT5cPyVD0XkAHsLt3IiUfgoAeJpOWjVgODFI9ExlHBZ10TyI+4Uv60is4x\nimm3FO4qTtncWeRF1SrDkpWBavuO5FbnPcpZFAMEDTq48Yh0e0SnfOn6d8m/\n8mRa3mvtS/zxTJnraZMF71x7auPGgvrBIjyBYgLMbfErE1tebx/GzfQFjUrg\n141U/mYo/mO6W4unA9oioQz8fJJeG0cuc0WOZQphbL2N1UBGRMOVk2HBk7se\nv3QGB3Qc8YRx9cWDXnHFH4QemnBlZHnAddww14hkqOO/NUa1eXD65fbJnU4d\nvTzPDdnJV9zNvtXoD9S/ask4FzgSnsJusmSn3FXRei73ApmTV6m5oiCFXE0S\ng4v7SPd+QYpVGgnh5qOee/e+/5cl+xLG3cGenrwwKcfFZjEKTHCKDRRLVuW5\nV5tZ3JA1ch5/LT2YV/GMEAwZyuWEqQDmzjbVW543/9v/pI7qicGTiJYKQ0Ri\nzd/BAohZKofKhCRKlx+Fha8MII5bEaLvoakMwJ7mSDFk9fufAs7ajM8bgP29\nZonq\r\n=820m\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD6VEjvoJtR0F6zKHOqen/qy5l2iYJBbtytEouyqHTZWgIgLuu33PCOnTPC9idD//uuRoYc6bl6Uv0IXAfQgbJvDjY="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.1_1633191977359_0.03420390358867831"},"_hasShrinkwrap":false},"1.0.0-beta.2":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.2","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore lib/**","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","release":"semantic-release"},"peerDependencies":{"react":"^16 | ^17"},"devDependencies":{"@commitlint/cli":"^13.2.0","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-plugin-d.ts":"^1.0.6","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","husky":"^7.0.2","jest":"^27.2.4","npm-run-all":"^4.1.5","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.3.4","typescript":"^4.4.3"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nWIP\n","readmeFilename":"README.md","gitHead":"f10ac2e760f523597f6e819f5f159a0a63519c8d","_id":"react-hookable@1.0.0-beta.2","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-rQ3xgMSCRijIZckdtppElUm6JHKAJD7fF+X8f1hMj+F3hDqjoOJQLAh9e1Z7V3sZ4t4mii6qJxrfFbGwfzY4LQ==","shasum":"e663bf1b5b4d1fe1a495f7d41a5728f00e4e1403","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.2.tgz","fileCount":8,"unpackedSize":9800,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFn73/c4kq0nQEXomDoV1xdX3OIBN1N/JSuhcAyJw7/6AiEAl/9iQvPfzY/zetJv2aeRP7J8cihgVnGN7EbuZ2wmqyA="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.2_1633228123973_0.2333148409096426"},"_hasShrinkwrap":false},"1.0.0-beta.3":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.3","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore lib/**","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","release":"semantic-release"},"peerDependencies":{"react":"^16.8 | ^17"},"devDependencies":{"@commitlint/cli":"^13.2.0","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-plugin-d.ts":"^1.0.6","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","husky":"^7.0.2","jest":"^27.2.4","npm-run-all":"^4.1.5","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.3.4","typescript":"^4.4.3"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nWIP\n","readmeFilename":"README.md","gitHead":"610420f0d1c75e4347e2003c74fe5f3d963b0c45","_id":"react-hookable@1.0.0-beta.3","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-BZjU8Qb4RFlc3/TA7lDkSSsU4MC2f12lr4rVHLxHp+LEojDypCQVWRk+9WpDWrZyyGUq7WQ8JQAU71QTtSISVQ==","shasum":"42330622515b49ed4933806f2b00e5dfb208e9f5","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.3.tgz","fileCount":8,"unpackedSize":13821,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDpV9UtH5MCh4niyojvh7zwX9yfZ2wqwJtcx/4BsKgYHgIhAMY9VOy2hjkmgnRB2YBu8PCBpUfBmNDLW/ECefj7vxPu"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.3_1633240008184_0.09233250903325962"},"_hasShrinkwrap":false},"1.0.0-beta.4":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.4","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore lib/**","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","release":"semantic-release"},"peerDependencies":{"react":"^16.8 | ^17"},"devDependencies":{"@commitlint/cli":"^13.2.0","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-plugin-d.ts":"^1.0.6","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","husky":"^7.0.2","jest":"^27.2.4","npm-run-all":"^4.1.5","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.3.4","typescript":"^4.4.3"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nWIP\n","readmeFilename":"README.md","gitHead":"564c4ca93289d5560da454554dece849f5f36057","_id":"react-hookable@1.0.0-beta.4","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-mROYnpOUKl3h0gjanG9Z9Cws2UD7vOCFTL2EMJUBqMcrmH8rCfGLMmW70ErMWit3tF6WJPveY32dmZIPYo/Acw==","shasum":"2c14b8bb935c23945e4c59b909c82b183fe724b5","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.4.tgz","fileCount":8,"unpackedSize":14581,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDwnVYjUcJW7zm8e9TNC3PSKEtlJ2Aoj3WLLPlNJsEL3gIgD57xxAKJpbdCo13Bd+CmC/zkaIGbYm6+sw3O/ArEEgs="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.4_1633260055378_0.05581963888464081"},"_hasShrinkwrap":false},"1.0.0-beta.5":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.5","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore lib/**","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","release":"semantic-release"},"peerDependencies":{"react":"^16.8 | ^17"},"devDependencies":{"@commitlint/cli":"^13.2.0","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-plugin-d.ts":"^1.0.6","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","husky":"^7.0.2","jest":"^27.2.4","npm-run-all":"^4.1.5","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.3.4","typescript":"^4.4.3"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nWIP\n","readmeFilename":"README.md","gitHead":"f2f3b3e421517cc72540c160dfaa4ffa04c9898c","_id":"react-hookable@1.0.0-beta.5","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-MH01kwD9TvkRzLirDlOTiLMuGQRrmkF5329oiqESIQ3vPhlD36PPBaFt3PgP4tq22waGil2ZDL6CXSVotXRWEg==","shasum":"b0c2ca0bb6bc14c27eb4c7a0b58a065ffc892be3","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.5.tgz","fileCount":8,"unpackedSize":22515,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCiu9QiAKKkN+pUT3RXiKtdpl1X8dMBeB8nD3ADvrRqrQIhAO/yOc2sUQVow4gj3mHnd8JE/hSndF7y3N08Z7U2vTeV"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.5_1633260524907_0.6873065292753877"},"_hasShrinkwrap":false},"1.0.0-beta.6":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.6","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore lib/**","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","release":"semantic-release"},"peerDependencies":{"react":"^16.8 | ^17"},"devDependencies":{"@commitlint/cli":"^13.2.0","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-plugin-d.ts":"^1.0.6","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","husky":"^7.0.2","jest":"^27.2.4","npm-run-all":"^4.1.5","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.3.4","typescript":"^4.4.3"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nWIP\n","readmeFilename":"README.md","gitHead":"4dde3033b090dc8091638a4b0e40398be50893d8","_id":"react-hookable@1.0.0-beta.6","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-hksfg4Uy4itgZdd2pMLtlvvsJinSNglpntzSwwpdFbKAqxjR/fulhvyzNRYI8G5ZYtSm+kVH7whU8G+X73KGzg==","shasum":"5a83f195b70af8d59f4abdb9f84e22d8fbb41736","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.6.tgz","fileCount":8,"unpackedSize":22854,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCHwuSR4//67TmpZKMWQUOPGfFh+YapBifBabUmk3v5BcCIQCcos5ae+9gsbsqbBH1zVK/JsdndizvPL1Yo1PlenOloA=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.6_1633262040301_0.7966259293948477"},"_hasShrinkwrap":false},"1.0.0-beta.7":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.7","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore lib/**","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","release":"semantic-release"},"peerDependencies":{"react":"^16.8 | ^17"},"devDependencies":{"@commitlint/cli":"^13.2.0","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-plugin-d.ts":"^1.0.6","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","husky":"^7.0.2","jest":"^27.2.4","npm-run-all":"^4.1.5","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.3.4","typescript":"^4.4.3"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nWIP\n","readmeFilename":"README.md","gitHead":"f841ad436c745b843d55a006b5c10e2ac0d6cf55","_id":"react-hookable@1.0.0-beta.7","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-8SpQ+1aAJgYGO0HnLiyPQNAk6i/4bVC4MlX5YjBwWJrJPP1hAAJMifLOW4/Ovb8Uu6YBUpu33FmhAnknPi8jZA==","shasum":"6a70db62cbf1f87b08550e299acfd31aa1e625da","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.7.tgz","fileCount":8,"unpackedSize":23420,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC4fweX0wh6+kwRDjlc0f8/vuwCq1t+lWsllWSsUmO4AwIgSQDNgppvyLKTc21ioKZObqZnDwOoXsOiwoXl7Qefqks="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.7_1633263249039_0.8885033143338117"},"_hasShrinkwrap":false},"1.0.0-beta.8":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.8","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore lib/**","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","release":"semantic-release"},"peerDependencies":{"react":"^16.8 | ^17"},"devDependencies":{"@commitlint/cli":"^13.2.0","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-plugin-d.ts":"^1.0.6","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","husky":"^7.0.2","jest":"^27.2.4","npm-run-all":"^4.1.5","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.3.4","typescript":"^4.4.3"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nWIP\n","readmeFilename":"README.md","gitHead":"84dcfe8edce82aa61126ff56f6c0a0a4c996239b","_id":"react-hookable@1.0.0-beta.8","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-jbfV3v6wZdc8OGui3+yeJi7yTpJERA9QSLw5FUQit2tzdllzRW6nVs4HTC7kfp3pzu59Z1heP9C6mPeJjU5Aqg==","shasum":"1bc4ea960767092dd682b5ba056cf538acb36a07","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.8.tgz","fileCount":8,"unpackedSize":26971,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9dUXfeqXkLWZGgMPJKtIGVuH+BKMDUPBDsBdHQal/0gIgMqcLiJP2R7ezIjy7JcuE+/2dHdagHLXHwaC9JLmQAh8="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.8_1633275440202_0.2943034182247737"},"_hasShrinkwrap":false},"1.0.0-beta.9":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.9","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore lib/**","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","release":"semantic-release"},"peerDependencies":{"react":"^16.8 | ^17"},"devDependencies":{"@commitlint/cli":"^13.2.0","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-plugin-d.ts":"^1.0.6","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","husky":"^7.0.2","jest":"^27.2.4","npm-run-all":"^4.1.5","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.3.4","typescript":"^4.4.3"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nWIP\n","readmeFilename":"README.md","gitHead":"b8398cd001b1d63dcdf2cdefb2a7c42b39c1aaab","_id":"react-hookable@1.0.0-beta.9","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-LHcEscCj/nVT2FkEmyRGu9TQ5zZebSVhoSGLM/CIa4+H3X5szE6iMGTgd1Q8LB0AjD5r4RiKSOKjPuL42I8V6g==","shasum":"288e9393ff0580908bcfb7cce1c7238c37dbd0a3","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.9.tgz","fileCount":8,"unpackedSize":30423,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHK9/2wQiGxJIYGWyz03Odjn/SBU+rknVY3Faza/09rgAiBd04sD13Zd46pmNLNDsonprC2r2EV5P016EHlVUNL3Pg=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.9_1633308269871_0.7688976492420878"},"_hasShrinkwrap":false},"1.0.0-beta.10":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.10","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore lib/**","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","release":"semantic-release"},"peerDependencies":{"react":"^16.8 | ^17"},"devDependencies":{"@commitlint/cli":"^13.2.0","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-plugin-d.ts":"^1.0.6","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","husky":"^7.0.2","jest":"^27.2.4","npm-run-all":"^4.1.5","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.3.4","typescript":"^4.4.3"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nWIP\n","readmeFilename":"README.md","gitHead":"18126945e09f17f2314fa6b326401a562ecf2cfb","_id":"react-hookable@1.0.0-beta.10","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-zYLmntiQ7O4+bZQV8ENVZTIgy8pL7A/mA657/uV6o+sljTeKOz/nQWksD+Orvwa7Ijoc/3HJI/uwYuko7uujQQ==","shasum":"54e8acd316b601c1a503716c5c13ea5484a6f556","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.10.tgz","fileCount":8,"unpackedSize":29946,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbNfqDlR42D1jexk6j351X/oo4/hcEfOPCFYcUmZrx/AIhAOlKCtGYX9K5WnJ2PVcIGknH0Bn5MrA/XCYAVnZjGdsp"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.10_1633310039758_0.3964186379825634"},"_hasShrinkwrap":false},"1.0.0-beta.11":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.11","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@mdx-js/preact":"^1.6.22","@preact/preset-vite":"^2.1.2","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","framer-motion":"^4","husky":"^7.0.2","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"1.3.4","storybook-builder-vite":"^0.1.0","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4","vite":"^2.6.2"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nWIP\n","readmeFilename":"README.md","gitHead":"3f328c6f2fd330b7cde3e3d695d5d119d6304806","_id":"react-hookable@1.0.0-beta.11","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-UdYlovkE1i41lstnArgVOKbKzwzCZebwvwannCK1kAuME7W38qQOOnjugEb/+bjJoEce8qb44xrkR7C2aVz0eQ==","shasum":"b2976ac3c03fb6b90ba8585ad52a510bb2fb7fe5","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.11.tgz","fileCount":8,"unpackedSize":28286,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1fvjus1aCPmKx6FKLllVRTjqk5J/dtLBMdkuQ1NWvUwIgdTu6c/WjrpmClifJ1n2i9gh7RgJDx1Hp/WcHfKACzOg="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.11_1633338827229_0.5851647980419581"},"_hasShrinkwrap":false},"1.0.0-beta.12":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.12","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","framer-motion":"^4","husky":"^7.0.2","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"1.3.4","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Lifecycle\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean`\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed.\n","readmeFilename":"README.md","gitHead":"8e8840d9f434a9c6248278becc877a8fb812bcf4","_id":"react-hookable@1.0.0-beta.12","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-q27piTXgW1VcwKOTspCEpbIe03Fk+1u4n0l7gIle3Hy3n3KyGV2YXfbQ3/gwJoqumOR+hrDJmas573kIk76PuQ==","shasum":"a3b2b5cb9c413d1487e6ed25d51d45d379320194","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.12.tgz","fileCount":8,"unpackedSize":33446,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDnEUn4UUQYqJa7WE1aKo4PqhYxcGgeD6wsSwItutFbmAIhAJplWkesLxLYGAvsYWQXfvuCoOlDao3hK7FSqq71h7rE"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.12_1633400323507_0.4009388249780146"},"_hasShrinkwrap":false},"1.0.0-beta.13":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.13","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"1.3.4","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Lifecycle\n\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed.\n\n## Utility\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean`\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter\n","readmeFilename":"README.md","gitHead":"55a11059d81bbb25226c90e64e554343f5a290cb","_id":"react-hookable@1.0.0-beta.13","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-mSfNQmVxn2jfAZBSmJnY+fafGydousvFP+QeiSMwSuDY8V/J4LqVWrZLpYBkLiGxUrP5m6StGFcVq1wdRoIt1w==","shasum":"b794daa08a9ed82819256f01d9eb12d5b28e115f","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.13.tgz","fileCount":8,"unpackedSize":39073,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHhpNhlwTQIDVaJlWlle98cjFF+XM2gjKDqveJm7/lffAiAYhR22cu2fzRwJV4J+82dr8UJeQ2LSHdaR0dU9FpgDLQ=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.13_1633423767528_0.567960865542817"},"_hasShrinkwrap":false},"1.0.0-beta.14":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.14","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"1.3.4","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Lifecycle\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect`\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency\n\n## Utility\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean`\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted\n","readmeFilename":"README.md","gitHead":"25cef7bc56081449e22cfaecb1a769220bea6c79","_id":"react-hookable@1.0.0-beta.14","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-oRqxb4An1EGfoZv9bKYxaLAUUhPl39UFsjBWzPTUkFafCYwgcQ9xj9hYfFBygAcr3NT+sg4Xzqk829553VSabA==","shasum":"98acf461a96ef5bd468438492d5730bdbcf6baae","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.14.tgz","fileCount":8,"unpackedSize":49143,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCaO480QPYlgPM+xmgEbOHz+HisjnepsXY3yw+7FG/STAIhAJDdyzk+fVKh1GvLxZOVDswWuXJQGp3o0DiM4I7+nD+M"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.14_1633452780847_0.09874881789243162"},"_hasShrinkwrap":false},"1.0.0-beta.15":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.15","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"1.3.4","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Lifecycle\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect`\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency\n\n## Utility\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean`\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted\n","readmeFilename":"README.md","gitHead":"64631c832c4c6cdbdf6a667594563c1d58c87727","_id":"react-hookable@1.0.0-beta.15","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-iCPNBEo/baLmzDQCunKGkE1Nse4W4GMNWz8e33MD8LWP++0su2fzLWn5kJw8fmKxqW1OQbo6Xw2NILLvg5UgPQ==","shasum":"d4af0ce0dfcc6a28f3d9caa68d80128262ed3c57","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.15.tgz","fileCount":8,"unpackedSize":49965,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEM7JJ8ZkTLfx5hTlW69kQ6wyHezav+TJUijCCON2s1xAiBJas/lP4pcXg6UflGdEhwIlxyvXSa6Yn75bybkcZ6uSQ=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.15_1633482449381_0.5574681405824733"},"_hasShrinkwrap":false},"1.0.0-beta.16":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.16","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"1.3.4","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Lifecycle\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect`\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency\n\n## Utility\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean`\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount.\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted\n","readmeFilename":"README.md","gitHead":"cd948cf7513a198a5274fffecd1977a7568cb711","_id":"react-hookable@1.0.0-beta.16","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-zYDo8RJqlLmM16MVkrs+xt/m4cY/dQVIRnTE83ZiYxx+IYjsRDZbHbLQ117YYhV9iLtBay/ksR+9ox5G2HgisQ==","shasum":"7d19eeaa5b2c376c9abdfc02e70382c8c85f93e3","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.16.tgz","fileCount":8,"unpackedSize":55064,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE+6wo9CPcJnT22jMAENNcTP4dPqVvvw4eODOXL+2CuLAiA7N9yneNUcZABeW/IL70diZGk0EpnirJ3j+MCPuAE3dQ=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.16_1633594871679_0.011839672327775164"},"_hasShrinkwrap":false},"1.0.0-beta.17":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.17","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"1.3.4","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Type of hooks\n\nWe have classified hooks into three categories.\nEach category has a different interface.\n\n- [State](#state) => `[state, dispatcher/{ dispatchers }]`\n- [Stateless](#stateless) => `{ appliers }`\n- [Lifecycle](#lifecycle)`(..., deps)` => void\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`. However, a `dispatcher` may be an object with multiple update functions.\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useHash`](docs/useHash.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usehash) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n\n## Stateless\n\nA function with no stateful value. Typically, a set of `add` and `remove` functions that can safely handle side effects.\n\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateless-usedebounce) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateless-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateless-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateless-usetimeout) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Lifecycle\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecyle-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecyle-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useupdateeffect)\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"6466bad9f9c309a4e9ed452d2bb70a4d074d5159","_id":"react-hookable@1.0.0-beta.17","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-aVrsjcogVypga1tBUHqfLVt9WGNREfsHO+Z64xVM8GbwUALsjLLKVItRBepEOXbGV9W36sW1xmJk2KjYHYs+6Q==","shasum":"b26e91d20167694e27dff0f779275e1ac05fa6f5","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.17.tgz","fileCount":8,"unpackedSize":64804,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDBE42bgIMiNc39B3uAZ+69TuAZ/or8sg5X89moEJjABwIhANKfb7Jr7bIhE3y3bTCrYDd5T12KxOTPX7u1m9CzDAWA"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.17_1633683633705_0.10303377202399577"},"_hasShrinkwrap":false},"1.0.0-beta.18":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.18","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"1.3.4","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Type of hooks\n\nWe have classified hooks into three categories.\nEach category has a different interface.\n\n- [State](#state) => `[state, dispatcher/{ dispatchers }]`\n- [Stateless](#stateless) => `{ appliers }`\n- [Lifecycle](#lifecycle)`(..., deps)` => void\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`. However, a `dispatcher` may be an object with multiple update functions.\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useHash`](docs/useHash.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usehash) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n\n## Stateless\n\nA function with no stateful value. Typically, a set of `add` and `remove` functions that can safely handle side effects.\n\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateless-usedebounce) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateless-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateless-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateless-usetimeout) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Lifecycle\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecyle-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecyle-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useupdateeffect)\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"7ebea5c6ee3f4bdf6c9fa4861ea41e1ecf3d0565","_id":"react-hookable@1.0.0-beta.18","_nodeVersion":"16.10.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-GMFomFuykdmm/RWTCFVZl7K1oIbg0SV8vbiGjN4y+yFVJNkKfunoT2h6Ui7YP8o3dUEVAAAz+BKRGWD5LQqHhw==","shasum":"caa1670e0a379a3d6d77405b77f1b75459aaffe3","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.18.tgz","fileCount":8,"unpackedSize":65759,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDm0cGvq8Xcod4rJ3kW8ZOt8v9LBFTRttVssT8aodJBHQIhAN7poUS+ohqHd4qPOPDQNq+SKFi33WSyirHP9zdXXT65"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.18_1633709829301_0.6394604984799213"},"_hasShrinkwrap":false},"1.0.0-beta.19":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.19","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n## Type of hooks\n\nWe have classified hooks into three categories.\nEach category has a different interface.\n\n- [StateSet](#stateset) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useStateSet(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useboolean)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usenumber)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usedebounce) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usetimeout) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useunmount)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"77ae1d072bf29a53d9afdaabbfef74c1f93eee7f","_id":"react-hookable@1.0.0-beta.19","_nodeVersion":"16.11.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-9wxfP14MqWNa2+MngFmu3Y5SteqDzvkBasyl7KsgHif6QT+9AWHJXUhDhhKrG8kkAOJ5KlgoOTGKpZrbqoq01g==","shasum":"6fc7ac24e11af8cb37fca957ebb4e854226d4e60","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.19.tgz","fileCount":8,"unpackedSize":75562,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH5fJKlWtKnYFYy7LGjLyn5gUVqs5Puhmfv8E/TgSrH/AiEA1u2ubWsWvVTjOZJo1ZGUSADbSciSwpiI1/LxBF3w2H8="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.19_1633842449243_0.13501954703811148"},"_hasShrinkwrap":false},"1.0.0-beta.20":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.20","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n## Type of hooks\n\nWe have classified hooks into three categories.\nEach category has a different interface.\n\n- [StateSet](#stateset) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useStateSet(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useboolean)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usenumber)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usedebounce) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usetimeout) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useunmount)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"3ca17a7a86fa0dd772f972880870502b7d1df58b","_id":"react-hookable@1.0.0-beta.20","_nodeVersion":"16.11.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-lwoAchDMaWznio6sNNzIncmsJNEZVHbSsX6KXh1oa+cY8kX83kSJy/nHXNf+KNoUTUbf1aUMgFkWNxmxL0i8Yg==","shasum":"0ed2a242d5d497ea114eedc0548189d4179e6e08","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.20.tgz","fileCount":8,"unpackedSize":77148,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDy7Cirq0DQWv3fHPCBeB1HTzryljjrzp2qShH4a/SvsAIgJAmd9xI0VrQjEcOhJa3J/xZ5TreifwrKGwXKao5yOpQ="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.20_1633863684551_0.770628411926702"},"_hasShrinkwrap":false},"1.0.0-beta.21":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.21","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n## Type of hooks\n\nWe have classified hooks into three categories.\nEach category has a different interface.\n\n- [StateSet](#stateset) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useStateSet(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useboolean)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usenumber)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usedebounce) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usetimeout) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useunmount)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"57155c92123840b22696b8721aad58c1c1b089d1","_id":"react-hookable@1.0.0-beta.21","_nodeVersion":"16.11.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-gKjMqz9+e0AFuLeBMzHpLgklkGH4Ojz3gOwyYVrsJ5yyG1Aw5nQlWnCKiWlNcf7lLPwRAxZoPKqCJZksH5NyMQ==","shasum":"52f8c5d4bba22cc79b4c9cd853c5a7fbf7057ae6","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.21.tgz","fileCount":8,"unpackedSize":80805,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAJTwfuAPkXIWOcGC7I3Pp6VnyOTA47KL9PVDZ8E6sUwAiEAmVzQIOS5ue0E9fLYabb3Rk/WwJiFElUwOC/R/3vE9w4="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.21_1633879510377_0.2859607268963804"},"_hasShrinkwrap":false},"1.0.0-beta.22":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.22","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n## Type of hooks\n\nWe have classified hooks into four categories.\nEach category has a different interface.\n\n- [StateSet](#stateset) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useStateSet(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useboolean)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usenumber)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usedebounce) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usetimeout) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useunmount)\n- [`useWait`](docs/useWait.mdx) - Safe process wait [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usewait) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"dce944b949f2c4fdf0528f53fcb59163f7444903","_id":"react-hookable@1.0.0-beta.22","_nodeVersion":"16.11.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-4A9hZPfFYpZCqFNNpliwk69fIKXBcirj5R1ONUsuAwN9cSZocnCz7/l5ZgEERY9FjQ6fBAfarzFKbvVQ5lm5hg==","shasum":"33f801ff884486d6e52a2a17a30b68452dfc1a30","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.22.tgz","fileCount":8,"unpackedSize":86271,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCya5jg/3pyvKC9NBdBKIn9zBngGapXYMkaegHJ775wzgIhAP6xqxsg4bhj/Qh9sZej6rzNSPkSUZFHlnGUBs43aP+X"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.22_1633926102489_0.8255694970835812"},"_hasShrinkwrap":false},"1.0.0-beta.23":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.23","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n## Type of hooks\n\nWe have classified hooks into four categories.\nEach category has a different interface.\n\n- [StateSet](#stateset) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useStateSet(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useboolean)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usenumber)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usedebounce) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usetimeout) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useunmount)\n- [`useWait`](docs/useWait.mdx) - Safe process wait [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usewait) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"72a90b740cfa67c4c5f871c99690c230debafa64","_id":"react-hookable@1.0.0-beta.23","_nodeVersion":"16.11.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-TL251XkEOZl4D4srXn70vKZZIiXTzekHFjPb1j6+FBXF8NqLRrp1g++kFQkzBhuuBeJww7yKlZhH5iW+BLrjAA==","shasum":"218ee075ef11c988e55cc31255f6c4cd0b831922","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.23.tgz","fileCount":8,"unpackedSize":86784,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDKPWWvaLFXBR3ESjSvzKrxNKRHa34rHKEENOpJlZHFWwIgRwve6roKuR0wQw/ckWrcn7nDQ/3VMf2798K2iWUp6XY="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.23_1633933315970_0.03994985875449997"},"_hasShrinkwrap":false},"1.0.0-beta.24":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.24","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n## Type of hooks\n\nWe have classified hooks into four categories.\nEach category has a different interface.\n\n- [StateSet](#stateset) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useStateSet(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useboolean)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usenumber)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usedebounce) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useFetch`](docs/useFetch.mdx) - Safe fetch hooks that abort http request on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usefetch) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usetimeout) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useWait`](docs/useWait.mdx) - Safe process wait [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usewait) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"03db5c77b3d57aba2eea9e2c4e016058c1e09c54","_id":"react-hookable@1.0.0-beta.24","_nodeVersion":"16.11.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-PkA16vWRjvpuDLxd5lv7venV9LQXa2+rSgzlC5hZtrobbjahE1LhbOVGGoeGfOD9kPYiPqSBjcdWRGF44CSGIw==","shasum":"ea5e363b2dea2c17b9930d1c04500c4fa1490f95","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.24.tgz","fileCount":8,"unpackedSize":91285,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQAO92qEIqWojY+b4FSzJOMPdSYHWjUTOsXNRqxYNnFQIgb4cHCxRBo1jsDFjcRFd9rD0AjPISp3fYOZio/0a3onM="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.24_1633971991660_0.24502680214588146"},"_hasShrinkwrap":false},"1.0.0-beta.25":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.25","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n## Type of hooks\n\nWe have classified hooks into four categories.\nEach category has a different interface.\n\n- [StateSet](#stateset) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useStateSet(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useboolean)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usenumber)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useSwipeState`](docs/useSwipeState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useswipestate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usedebounce) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useFetch`](docs/useFetch.mdx) - Safe fetch hooks that abort http request on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usefetch) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usetimeout) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useWait`](docs/useWait.mdx) - Safe process wait [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usewait) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"c4af21a352303f893c76e611a781f79200addcfe","_id":"react-hookable@1.0.0-beta.25","_nodeVersion":"16.11.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-J+Cz9pO35DN7T2DELjLhpCFTMp+9DUv9z2pPKmoFh1B+LdxedS0pxmRYHVO1nEnraomONenCOuGUdbdCzpcXkQ==","shasum":"4bfcf28e8da072f84bb472c6165db69b985ef91f","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.25.tgz","fileCount":8,"unpackedSize":104920,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICTHuHx68LtjLeEtQnCfVQ7NMJJCeQNE4AJ2FnIf4uXPAiBnirTrfd1i701i9q4Z32051hKKyQr5qR537IkNkNQCaQ=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.25_1634107232621_0.27968421774284025"},"_hasShrinkwrap":false},"1.0.0-beta.26":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.26","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","babel-loader":"^8.2.2","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n## Type of hooks\n\nWe have classified hooks into four categories.\nEach category has a different interface.\n\n- [StateSet](#stateset) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useStateSet(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useboolean)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usenumber)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useSwipeState`](docs/useSwipeState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useswipestate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usedebounce) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useFetch`](docs/useFetch.mdx) - Safe fetch hooks that abort http request on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usefetch) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usetimeout) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useWait`](docs/useWait.mdx) - Safe process wait [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usewait) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"abe69db49070c6268839b0b7acca039ac459210b","_id":"react-hookable@1.0.0-beta.26","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-eBFFMCaw3N6maSPKeTc90tI//oNVxL3W+9ro2BeY3Awp/QA/6449KhkTQkI/zS8+ngV29Os6JIVzbSZYvIJcbA==","shasum":"b431cd16019450c765d16447a8cb65a753e69a86","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.26.tgz","fileCount":8,"unpackedSize":108316,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICs0AuPUohSKFdd/qWUNta3wX+3V67YCekdPTyRkjeh9AiAptCwuD1D8KAYUyps0z+/uHjWDqna/ARGCrp47koZ7oA=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.26_1634279234936_0.06063386511927882"},"_hasShrinkwrap":false},"1.0.0-beta.27":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.27","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [StateSet](#stateset) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useStateSet(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useboolean)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usenumber)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useSwipeState`](docs/useSwipeState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useswipestate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n[`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n[`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usedebounce) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useFetch`](docs/useFetch.mdx) - Safe fetch hooks that abort http request on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usefetch) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usetimeout) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useWait`](docs/useWait.mdx) - Safe process wait [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usewait) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"f09c4fcb7e973ae518a2e386c369cca0c7ece5bb","_id":"react-hookable@1.0.0-beta.27","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-Ql4qpybCo/OewXqDTGxa7RCGR8u6P+RyT8uGPlFUzkskpD9zaVClRZaNCWWfondBRoqJGy4k9h3iqVOr870A0Q==","shasum":"bb71fef889d792d7bc0626cc4dbeddd13e98bc6a","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.27.tgz","fileCount":8,"unpackedSize":119897,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRkhm8MI9aBRpVbkBWSGi66IDEmkkBtorf5Auh0cxQfwIhAOa2hN9MQWVugoo9nxS5VnVM5XxjZ59yXQLgKTEtA6q1"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.27_1634313176278_0.2270524076650735"},"_hasShrinkwrap":false},"1.0.0-beta.28":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.28","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [StateSet](#stateset) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useStateSet(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useboolean)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usenumber)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useSwipeState`](docs/useSwipeState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useswipestate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n[`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n[`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n[`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usedebounce) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useFetch`](docs/useFetch.mdx) - Safe fetch hooks that abort http request on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usefetch) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usetimeout) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useWait`](docs/useWait.mdx) - Safe process wait [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usewait) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"3ac67f71d70de318d9576de70ecca0774a9a4471","_id":"react-hookable@1.0.0-beta.28","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-iSv9s72kM24w/Ea87mtVZhZLyY+xsBzZjuobMAPOQ0eQ90IJuWnqfDJaGzrn+TNens0sVRNJ5V1s/U+ZQ9xAOw==","shasum":"e39a2cbcadd766a1fa3c016959f101c67934cb03","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.28.tgz","fileCount":8,"unpackedSize":127463,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJkA0x3tyB3Un+dgsRjWdJwkcgGHqmtrsQNTKk6/PXuwIhAI6ESJygxL+NC+SCPgoUFXiaE59jDYDPmx2TRXZ1BDh/"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.28_1634353566671_0.517116829269529"},"_hasShrinkwrap":false},"1.0.0-beta.29":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.29","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into seven categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useSwipeState`](docs/useSwipeState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useswipestate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n\n### Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useDebounce`](docs/useDebounce.mdx) - Safe debounce function that can be executed anywhere [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usedebounce) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useFetch`](docs/useFetch.mdx) - Safe fetch hooks that abort http request on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usefetch) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useTimeout`](docs/useTimeout.mdx) - Safe timeout function that provides named timer setter and clearer, auto clear timer when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usetimeout) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useWait`](docs/useWait.mdx) - Safe process wait [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usewait) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"8993a1651376270c592860c4b790177621f33db3","_id":"react-hookable@1.0.0-beta.29","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-3RS374b+n/lA1HQ2EGdEupnmUxcFwYSNLwTfgs+K1XfI3V5nWX2/Z+VmogARrRf8VUn3jjjKqMPkfODETlcS6Q==","shasum":"66ae9532b5f28f879eeeccf360b6e3b39a2774d1","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.29.tgz","fileCount":8,"unpackedSize":134473,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeuSXU7fmGL384LF3GGHsMgxdGx9lWQ1tw2J4NWXdFkAIhAKRnlOXjnRanZERngD25zoFmEx2TGSgFtog+Jf+z+LZY"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.29_1634367379210_0.7635924362506794"},"_hasShrinkwrap":false},"1.0.0-beta.30":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.30","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:scripts":"eslint --ignore-path .gitignore .","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into seven categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useSwipeState`](docs/useSwipeState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useswipestate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n\n### Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useFetch`](docs/useFetch.mdx) - Safe fetch hooks that abort http request on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-usefetch) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useShortcut`](docs/useShortcut.mdx) - Hooks for `keydown` shortcut dispatcher [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useshortcut) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"569748b24dd2994b17433d4079a0e1159d8d205f","_id":"react-hookable@1.0.0-beta.30","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-OYnyKh1rbEg05vnRWaz2yH2pULsbiAnSn2Kgi+oyEYTYdgsPMo0MA6t7lWO/iUpgVwrQsFbe8NKoqqmcGfk8nw==","shasum":"5df5291a58f2c0526684e28c5eb0e99dd8ed5868","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.30.tgz","fileCount":8,"unpackedSize":121034,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCgn90od3NuWbkm95eYpTLX/blTF8Af6Qw0Z+qxclmcEAIgJr9zxbH4OkrYZEUXNiHRjFoi6H0Z3WNYLTLI6fK0zQM="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.30_1634393849697_0.06168521321927378"},"_hasShrinkwrap":false},"1.0.0-beta.31":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.31","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into seven categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useSwipeState`](docs/useSwipeState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-useswipestate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n\n### Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"938af1fe5b4ca60cd97f743e934af7e99d9b87f0","_id":"react-hookable@1.0.0-beta.31","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-uy5k7KMH+uCIwS6ubeiZSLUvzNbNJhc/W1TKj+htEafT/UHutVZzJJdYRFPGPpngBqV/ayqyj4G9jyFVu17sZw==","shasum":"9516709ffa71cafe6bc6b19f27c383cc21eb7f58","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.31.tgz","fileCount":8,"unpackedSize":116592,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCmRJYcxAO3XCvtcVKr5DRMWMCmtPBfilHsXoXtNhIR8wIhAO3V5fghCcs68dINeZdSdXdYYar7c5+2tRyLXpVdwBhH"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.31_1634449746075_0.41985229315530326"},"_hasShrinkwrap":false},"1.0.0-beta.32":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.32","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into seven categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Auto aborting `fetch` API effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n\n### Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"50a0b03cc931c563240e5dc9e67de11405c1fcca","_id":"react-hookable@1.0.0-beta.32","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-W4qG3FEwKQoKDS8TI7VOAce6kbTdCTMQY8rv1t83SSB1/7CBc3vYi1EPsIbQjUsPSHoMxBHfUWMYwtPHMqf+2w==","shasum":"549dc9752cb89fc2903490be007e2be72fcd8a3c","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.32.tgz","fileCount":8,"unpackedSize":122393,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE/XVX4TbZaSXF9mpEYHrK6DUQDdw/Gqak0joHwTzfLMAiEAkOikgRmNHhWpeFT+FK0zJX6rSaarwccTZUTjyw3atFw="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.32_1634486192216_0.8749906070371809"},"_hasShrinkwrap":false},"1.0.0-beta.33":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.33","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into seven categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Auto aborting `fetch` API effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n\n### Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"b8e8df82cd7ce6d5052761869f9842daa288dbfa","_id":"react-hookable@1.0.0-beta.33","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-YceMNlXrBNhvWH7Z6UQe2LoNHxK+dOhRxcnaE7Sl/X43VABXoxjS6LAWwfdxZzeLXZYWwxUz57hTkFjNiZrcuA==","shasum":"f1b110e4166c7dc5bf4dd72329e81195a62e5bfa","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.33.tgz","fileCount":8,"unpackedSize":123511,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID0npdrVxU9Wb2ObBa3QkAhdWLtK4J86wuIMNd0mPU0MAiEA/zv8h55ueMRjjvsywLNc/YeXoCxUmRcs36Y4C0xIzMM="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.33_1634488021434_0.43018697822994634"},"_hasShrinkwrap":false},"1.0.0-beta.34":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.34","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- Consistent interface\n- Pure TypeScript\n- Full support for preact\n- Full support for Deno\n- Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into seven categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Auto aborting `fetch` API effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n\n### Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"9d834be37fce853977b8a3c8ed3edf8626d0665e","_id":"react-hookable@1.0.0-beta.34","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-/+EnnkEXk/v2BDc8AcI7FjG4AF6qWSv9IOdLuzzmgktDP9NwK+a9UdnjIq0RXqwrkXBiDVaYV34baAtSRjbVdg==","shasum":"eeff99869ea4e097f27ff21458ff71df49d5a2ac","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.34.tgz","fileCount":8,"unpackedSize":128088,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDjsMvYVgqbxTRuwJpi3ubF0cDUMyIAb4z+Vy+CxkQgFAiEA3TvF+3I1L7Xkikxfmrm30/MM5yLctND6KGoqvErx5xo="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.34_1634522769088_0.005650975201804576"},"_hasShrinkwrap":false},"1.0.0-beta.35":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.35","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- :sparkles: Consistent interface\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into seven categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Auto aborting `fetch` API effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n\n### Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"642198cd63da73528aaa0d72919b5903c1167868","_id":"react-hookable@1.0.0-beta.35","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-U45z5Yl9DnUycClfo18qEIaTIx5tWVu/Hzy38jcT3nzkJPljatnJj4P+Cefgz5mUmW3yPzQZT3C3F7SqJhqeFQ==","shasum":"4d242d021b8fd87a6d0313377d4cf670701a4442","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.35.tgz","fileCount":8,"unpackedSize":133348,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCfbstyuqEKCQd3HHLteKcTysCpMvycuMEqgmN+etDTLwIgWO8Tg8bwF0fPdNrx4FVXw/4KhogtU7McXl6ikU7JwlY="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.35_1634531091081_0.3277365640572969"},"_hasShrinkwrap":false},"1.0.0-beta.36":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.36","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- :sparkles: Consistent interface\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into seven categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Auto aborting `fetch` API effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n\n### Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"49e7497cff2fb7aca78f065f345323f287750305","_id":"react-hookable@1.0.0-beta.36","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-50mDg6dj+aGs1uhFvRTVQS20Wlnq4MVMLT2dDdQ/Z1BKOEhAPzzTy0iElyLKEVUVMOtpNxc60UDbXx7mhFyrsA==","shasum":"a07d13664015705c14ce843120ce3eccfdf82288","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.36.tgz","fileCount":8,"unpackedSize":133297,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHm65yXw0IH6s3rTJ0WDTuXAO5vdZfi9AJmEfnDenHznAiBOwlndl4AQMXOtvzEYMpvuwWCZUc1sgh9F7M0WjDJzvg=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.36_1634532365576_0.41291619089971654"},"_hasShrinkwrap":false},"1.0.0-beta.37":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.37","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"# react-hookable\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n## Feature\n\n- :sparkles: Consistent interface\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into seven categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Procedure](#procedure) => `{ appliers }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## StateSet\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n- [`useWindowScrollState`](docs/useWindowScrollState.mdx) - Reactive window scroll [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usewindowscrollstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Auto aborting `fetch` API effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n### Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Procedure\n\nA collection of functions that depend on `ref`. Often causes side effects. There are no reactive states. As an escape hatch, an internal `ref` can be referenced from a `_ref`.\n\n### Interface\n\n```tsx\nconst { appliers, _ref } = useProcedure(...)\n```\n\n- [`useEventListener`](docs/useEventListener.mdx) - Returns a set of event listeners `add` and `remove` functions that can be called anywhere. The event listeners will automatically be removed on unmount. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/procedure-useeventlistener) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"780b43e42d9fa3251739a740f3572994ae40714a","_id":"react-hookable@1.0.0-beta.37","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-O/UbwtyVFoDeOL0CbZT5kU+p1NZtxqlImGUmDaAJ9FrLa494dk7ltxnSUD7k1zqGmWwBDFQy/zkjeuIVmeDzCw==","shasum":"2da0b2132a13be73f1cd5a5ad9bc26a987d52c3b","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.37.tgz","fileCount":8,"unpackedSize":139591,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDShtSIHD5d/vCM54lNZVo7iKc2rJaaeYp9082Jh5RZ6wIhAOGB4jwl8kCJ8PuuWKzwU1MUenNNtyKP1czAuPC/S84c"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.37_1634547870122_0.20380112164470732"},"_hasShrinkwrap":false},"1.0.0-beta.38":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.38","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Feature\n\n- :sparkles: Consistent interface\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Auto aborting `fetch` API effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"86efe73c353db07cec664f999bcbd0ce0ad138e6","_id":"react-hookable@1.0.0-beta.38","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-daWOGG90HOLZVZLCRL5FGWpx1BuObzo8v+UNP0njNAnNoYFQVo6k1m48zWB3ewA+Be89GwSFyJLIks+yZhSN1g==","shasum":"c9aff46f79f78fdea58e38d99f7c97c86558ab21","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.38.tgz","fileCount":8,"unpackedSize":140636,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICk5kjB/EYfc/3HHtJacEBNqEBh+uZrJ7laVtakc4+5/AiEAhu8ZD29uw1AhWOhPyuKJg2OayrF/kEs/aEdKCUSBpeI="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.38_1634605720303_0.732543081443972"},"_hasShrinkwrap":false},"1.0.0-beta.39":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.39","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"dts-bundle-generator --no-check --no-banner --external-imports=react --external-imports=react-dom -o dist/index.d.ts lib/index.ts","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","dts-bundle-generator":"^5.9.0","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Feature\n\n- :sparkles: Consistent interface\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Auto aborting `fetch` API effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"0bca7b80a568b9eb17b8288fa6c3bfd5b4289385","_id":"react-hookable@1.0.0-beta.39","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-5cl4JuoaDxN+AvUVKr8pGVKPkWNhhGUGh3s5EfFew5Ob0SbrREF28dpUq93zA4Pk/0ArTQJ3+omTWwoSZK6/Yw==","shasum":"f1fcebc232eaa4f1438065ab05f697976842897b","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.39.tgz","fileCount":8,"unpackedSize":133698,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCigZjqRQ9us2JWTKBqMVAE/v16/q6OQulyxIGFo8oINAIgCE9EUe/IG9fq0uvP5p8MlHrpzVxC9enBqvLFNiDeqkc="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.39_1634649653693_0.3817169059672141"},"_hasShrinkwrap":false},"1.0.0-beta.40":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.40","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"^1.3.10","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Feature\n\n- :sparkles: Consistent interface\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Auto aborting `fetch` API effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"d98ebc6b47d51654ec7aab78a92efd786c00f17c","_id":"react-hookable@1.0.0-beta.40","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-vPJR4SRPaKIg3ZDyqrR1mWWivq+AKYvDgHMr61F2MUB0jtWjBUeqHKefyNwSPPgOcdQW1XYsTupBCphf4Au28g==","shasum":"d039daad36b0b13e8a4b53f3a227dfdb721c0ecf","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.40.tgz","fileCount":73,"unpackedSize":163538,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDjusr85fbenyuPTQmjjZdohYZb2/bLmZWxONk84h/DUAIhAJIrVguHtZdOi3fUVRH71FA8tW8Y7JJxtBSvD/+S8OX0"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.40_1634656561928_0.5578902722540453"},"_hasShrinkwrap":false},"1.0.0-beta.41":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.41","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"^1.3.10","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Feature\n\n- :sparkles: Consistent interface\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Auto aborting `fetch` API effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"652d1b7abf850382e2a9d43d4e9a6d52616d1e3c","_id":"react-hookable@1.0.0-beta.41","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-VSg4LwVahKx8mfJNFYNG9X4wKL3H7un73it2/2BVR/gJnOQIlSmd42mk2+cv643MZ61NjSdjzuPs4bhEjC/Tkg==","shasum":"0ccaeb81181f1ccef25cdd04a949d6ad2aa1271d","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.41.tgz","fileCount":69,"unpackedSize":167509,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFrs86kjQv84vvkR+Gnq/sUDuyccYY3NWwmxHFRZvGA6AiAoB7y8jLoux2VKfuAngTT4RO5H9NcTrx53AsqnWLEFYg=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.41_1634661186741_0.6999115219934926"},"_hasShrinkwrap":false},"1.0.0-beta.42":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.42","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"^1.3.10","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Feature\n\n- :sparkles: Consistent interface\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Auto aborting `fetch` API effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"8d39682e027d9c6ba3561fb941dbead1b7ed238e","_id":"react-hookable@1.0.0-beta.42","_nodeVersion":"16.11.1","_npmVersion":"7.24.1","dist":{"integrity":"sha512-75cHUhdjIHcRlS37e2m8XrWUstgD6zbMJZ4Bd0r0BA/fq4AV3i4JxFEmmgfClcxXUCS5WcvYYZaUNo+I6N2lLQ==","shasum":"eb83b75d48ac1867e7569316db7c3421a6266671","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.42.tgz","fileCount":69,"unpackedSize":175608,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEhmIgF334oabLa7sRMy70bpOZUAGRQghcpaIQwLYye6AiAyZegCeDH4GNmi/WOMasSh3cLc/0/ZCcn/zCC8h8LdAA=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.42_1634716394361_0.030103486979081717"},"_hasShrinkwrap":false},"1.0.0-beta.43":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.43","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-simple-import-sort":"^7.0.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"^1.3.10","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Auto aborting `fetch` API effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`useTouchEffect`](docs/useTouchEffect.mdx) - `TouchEvents` effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetoucheffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"eb2f56d431150a726756f6f2b1b33c74cdf4ba41","_id":"react-hookable@1.0.0-beta.43","_nodeVersion":"16.12.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-li0sYKH/YMUyP9Agt1WkSKdiBT1SFOklxB0w5rTRCC4jx4Pt7IA+pkKpfPLdRkKTibtew00GzoS3PJM9LB4Ucw==","shasum":"2040522e39032643d548c22778ad9d3376af2ff0","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.43.tgz","fileCount":73,"unpackedSize":193657,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDxgcvhZK/E2ESRcwR0yy3SfrJp/Q0CkSKxLzSmAiZpuQIgcWVXE/7B3MPiLPE5svEPZ6OeL17yimeF91pXZV8EC60="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.43_1634802157130_0.4335594503165643"},"_hasShrinkwrap":false},"1.0.0-beta.44":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.44","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"^1.3.10","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Auto aborting `fetch` API effect [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"f28d1cb296c803afe74f426596f3e029c0609aec","_id":"react-hookable@1.0.0-beta.44","_nodeVersion":"16.12.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-FVxEaR7i21p3h66QBNlPveUiNzNea9uXgNMmBtlhpIZ0uZw/s3RWKf+lFV1ofX1f+u5lkNaJxXj3PfIL4BkmIA==","shasum":"ef06510563d4728661abf35b4a0f04b6512914ad","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.44.tgz","fileCount":73,"unpackedSize":195946,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPxN1220XxLOhe8FbiO9M/APlQjOKMPTwnmGzCYBw/9AIhAODswQ3m9s8jB5owjfQtMVxjgEP03oMcxVgR1g6Hd4Si"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.44_1634862554711_0.9933149311973577"},"_hasShrinkwrap":false},"1.0.0-beta.45":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.45","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"^1.3.10","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"67740b6c8282c650f4fd187bf18fb701a126caea","_id":"react-hookable@1.0.0-beta.45","_nodeVersion":"16.12.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-g3vvRR+uY5sJQ8qpBE5WdrCtKwpVfLLh+Ol/ds493Q4x+j4H8Q1x0sNA57X2Q4cECAQoV6WDQotZjaCaPEV+tw==","shasum":"3600e431680068a5092a5f6dc90f88458074fb73","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.45.tgz","fileCount":73,"unpackedSize":203604,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCr5qMLr3EkRzmEdpzIv4S39okyr4WD/9HTkWV0v6e3YwIhALqVOTNXVH19I3jO8lTRQpyra4d53TX4tQ7Hm4asqE6S"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.45_1634870881890_0.6320746948438731"},"_hasShrinkwrap":false},"1.0.0-beta.46":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.46","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"^1.3.10","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx}":"eslint --fix","*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"f79778f6bc218c475d238d6964edb6b955278799","_id":"react-hookable@1.0.0-beta.46","_nodeVersion":"16.12.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-tpkHVTgasd8TEz5fw9LnKmnjDKcQoRRmYmnZ1bf5IVSbtqRgE3cmr/DNHMZJ831pP7R79hTcxV7kZmAI1sbaMA==","shasum":"01316cb1da2c000aacdf5f25dd50474b1b60a7f1","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.46.tgz","fileCount":73,"unpackedSize":205030,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFbhefn0t2iL+4QrQJO6LuY0xwpQ0T8ebrKxjvMFz6R5AiArD97xwwELPeCUTKhrLu1IJa8YjmjUTMR0mBqXQqch3A=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.46_1634901831515_0.6450740990021682"},"_hasShrinkwrap":false},"1.0.0-beta.47":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.47","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"^1.3.10","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx}":"eslint --fix","*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"bd1c16d952dc244646ca3d24ae2beadd77e3baf3","_id":"react-hookable@1.0.0-beta.47","_nodeVersion":"16.12.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-aY6CY+7rfPM0iWUCHa7fRsJPLLdqsLtmPQHWrvLd/KRE8nYvOOadTrYcUqW8b6pc1pWVk0zLAdOHrUtcD/uUsA==","shasum":"d2bf302b7cecd7f312ca7a94686709d6e877a7a2","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.47.tgz","fileCount":73,"unpackedSize":205651,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDc9BVmv1Xw7s/hKWwe4cz8M3WjhAj8WFa7a0uHv30LhAIgfOJDaIawEztUMjFtRCcCPcFalrQqcg4fNJJvjEGooGs="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.47_1634917108434_0.736620933719315"},"_hasShrinkwrap":false},"1.0.0-beta.48":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.48","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"^1.3.10","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx}":"eslint --fix","*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTransitionEffect`](docs/useTransitionEffect.mdx) - Effect for transition [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetransitioneffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"410b9d916b2cd170ecfbab5e9b8846b770d97f1c","_id":"react-hookable@1.0.0-beta.48","_nodeVersion":"16.12.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-f+e8tbaAWLlL5fcSTYkZOlbDkdONZ75uKUyYI5OstqElsur+/qlvA5F1bvvDTU04/fVJsthz/DfLPrr46x9FAg==","shasum":"5f5ad82126d7067c247527db59cbd47a9f437232","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.48.tgz","fileCount":81,"unpackedSize":231642,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH9e8/9mfeje3SicRAu7LqrQGeu1D8Sajm1vjrhjr603AiA9q9SrPY/0FlHW98pMACEchR3NaQLV+I2OgCu4o8VDnw=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.48_1635153737168_0.8209269460367234"},"_hasShrinkwrap":false},"1.0.0-beta.49":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.49","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"^1.3.10","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx}":"eslint --fix","*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTransitionEffect`](docs/useTransitionEffect.mdx) - Effect for transition [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetransitioneffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"7f66b1faf2a1dc7eb1452a069b54f65af01af0da","_id":"react-hookable@1.0.0-beta.49","_nodeVersion":"16.12.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-CmT7iw9vGEtNPdQadOG02drEdsiSLyv74RSdg/adtH7WzHIn4kWhexkLvMrIWv+5hqTRQ9hEG0lSsE8OhWaGOA==","shasum":"43012f88c1c29e0f24c50b2d6f83eab19a1f068c","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.49.tgz","fileCount":81,"unpackedSize":236972,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICJgRRUTOr8cMxsi+k7CeLZFWplhrdk/KGEqHNkeKSWNAiBjsr7UF8is6sk2nq8jV4ZYLjTiiWbi2VhkBm+vkQZDgQ=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.49_1635227554667_0.7820920900624542"},"_hasShrinkwrap":false},"1.0.0-beta.50":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.50","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"^1.3.10","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx}":"eslint --fix","*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTransitionEffect`](docs/useTransitionEffect.mdx) - Effect for transition [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetransitioneffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"bfa6825f972613234f5cb44dacb443327508d505","_id":"react-hookable@1.0.0-beta.50","_nodeVersion":"16.13.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-AZsyMqDOI3440iIxvEevYqXFEPS/MhfkgRJfhIREi+w52rL14DlIrSEArgXZvPqA5h2n7FB8ml+JQMtpefC/eg==","shasum":"c8b73800f730cfb3ff0016c9b0aafb154d64f595","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.50.tgz","fileCount":81,"unpackedSize":237039,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA/17iMwP+YCNzO5Jhkn0+8fNlkBBa5otPX2/vm2n6CiAiEAt4Eu0RShz+5UTGA92XqN0d6OdQUf9HI6qXUcny2kFkU="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.50_1635295641556_0.3484920894162973"},"_hasShrinkwrap":false},"1.0.0-beta.51":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.51","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"1.3.10","tsc-files":"^1.1.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx,js}":["tsc-files --noEmit","eslint --cache --fix"],"*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTransitionEffect`](docs/useTransitionEffect.mdx) - Effect for transition [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetransitioneffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"a036b4fdcc5eafec91f99dbdb321fecfe74d9fb8","_id":"react-hookable@1.0.0-beta.51","_nodeVersion":"16.13.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-RS5F6ofv9hd0Ylce0XpEiXmaAvf5S+RHms+d3x+4r5U8iUAhct19/EhRvvn/AyP0ZjJmiz1MyU3C3fM7J0xpKQ==","shasum":"fac8ae3379fe1ab792968a6f70ea97f76813241d","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.51.tgz","fileCount":81,"unpackedSize":238489,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAP8plIKm8moT23RJnwRhU0uHCtCkoPKGHWtfavxNT+eAiAkLSIrJNtULdcM9vnX3xK/G6qndmlKBcZAF32z/KO6dQ=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.51_1635321478029_0.43015812253888597"},"_hasShrinkwrap":false},"1.0.0-beta.52":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.52","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"1.3.10","tsc-files":"^1.1.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx,js}":["tsc-files --noEmit","eslint --cache --fix"],"*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTransitionEffect`](docs/useTransitionEffect.mdx) - Effect for transition [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetransitioneffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"e1ee82c48bd0c154d35cac63fb51906b48229efc","_id":"react-hookable@1.0.0-beta.52","_nodeVersion":"16.13.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-akGe99YFGTwO0/5DyOmyYEangv6V/XcmkhgBACyTAAUifDMh/psZYIXO68pw4J7qdvwB0MJeVoFdWTxwDU9Bnw==","shasum":"ece30a736812a0caab37bd4db207e9847a1461dc","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.52.tgz","fileCount":81,"unpackedSize":241701,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAo23L7BdGu0bO2S+N1IGBiVwdgZeUoTOC4WWk0bCF0LAiBvjsL4QlC8aVzuWGKKDKgTum6OBwyi2H2Yv8HHR6g7cw=="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.52_1635442267380_0.41264010295439935"},"_hasShrinkwrap":false},"1.0.0-beta.53":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.53","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"1.3.10","tsc-files":"^1.1.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx,js}":["tsc-files --noEmit","eslint --cache --fix"],"*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTransitionEffect`](docs/useTransitionEffect.mdx) - Effect for transition [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetransitioneffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"a7a8fb7efd4e85cb9e68c479f803a3971cf18476","_id":"react-hookable@1.0.0-beta.53","_nodeVersion":"16.13.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-MF9UuCyXMxLQ8NVlNSEEDDp8S9R0Fj/WAV2bpBW7PpQBKee1v2I/2/jW0dbrxO1SM6gGr+od0ef7HLwDL8oafQ==","shasum":"3575beb12e321ab06c4e579e06232833c4069324","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.53.tgz","fileCount":81,"unpackedSize":243256,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCpictcLfNtbt9HnnsWd7grNKIXB7zwoicokVQkU/lVvwIgQVsk+tAAAih+z+kReMpUJaSIwkzOHxgjjt/sQONa4Qk="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.53_1635474155095_0.7735163143722481"},"_hasShrinkwrap":false},"1.0.0-beta.54":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.54","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"1.3.10","tsc-files":"^1.1.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx,js}":["tsc-files --noEmit","eslint --cache --fix"],"*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTransitionEffect`](docs/useTransitionEffect.mdx) - Effect for transition [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetransitioneffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n- [`Portal`](docs/components/Portal.mdx) - Portal is used to transport any component or element to the end of `document.body` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-portal)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"84c8e5ac0417f7671d085bc8af30d9bce1e7b7c6","_id":"react-hookable@1.0.0-beta.54","_nodeVersion":"16.13.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-NyQBfgD6xnriHzu7qEkSIq5In6bGtrJADKaJMyKhaCgc0M01lIKxJNDuY23NcuXU+SybqWYeJgAob8Bl3p8kUw==","shasum":"e537391f0a48ae9ff2421ff15597e87184191430","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.54.tgz","fileCount":83,"unpackedSize":1035521,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCbZXL2m6XbysX3ekeE6agLWRFgZtoUuIvwtyAbCB6EZwIhAMhaT7Ul3EkAxIdS4up6ZNAA5gBBf9uIt5r48ZrS4ri6"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.54_1635483786648_0.056420409818219275"},"_hasShrinkwrap":false},"1.0.0-beta.55":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.55","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0","react-dom":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"1.3.10","tsc-files":"^1.1.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx,js}":["tsc-files --noEmit","eslint --cache --fix"],"*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTransitionEffect`](docs/useTransitionEffect.mdx) - Effect for transition [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetransitioneffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n- [`Portal`](docs/components/Portal.mdx) - Portal is used to transport any component or element to the end of `document.body` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-portal)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"32a648cb9bd124ba1999deafe3c5695eda756746","_id":"react-hookable@1.0.0-beta.55","_nodeVersion":"16.13.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-EcSp8gYQf49B+hOutz8y13ES2DWhq0MIkDyxyUjLXMw8a51P6TwyZiaIjzkgRSxuRO/LwMYkT+eOCnQDeQ/q4A==","shasum":"d423034f089a807a076ffd5710eeffa0df343127","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.55.tgz","fileCount":83,"unpackedSize":248437,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF59jdggnaRCT3roYxanLVI5ti8YnDJOs7hQ2VSt6Bm5AiEA8DYCw2qkEVTeK/PuA0Tgt6gdw6OjAirLKDNM+vgIlHM="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.55_1635484889726_0.31224876824567027"},"_hasShrinkwrap":false},"1.0.0-beta.56":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.56","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0","react-dom":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"1.3.10","tsc-files":"^1.1.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx,js}":["tsc-files --noEmit","eslint --cache --fix"],"*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useClickOutsideEffect`](docs/useClickOutsideEffect.mdx) - Effect for click outside of target [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useclickoutsideeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTransitionEffect`](docs/useTransitionEffect.mdx) - Effect for transition [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetransitioneffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n- [`Portal`](docs/components/Portal.mdx) - Portal is used to transport any component or element to the end of `document.body` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-portal)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"90d21933355bd144e488321c6e89376c9b7989b2","_id":"react-hookable@1.0.0-beta.56","_nodeVersion":"16.13.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-NgYBaL9vfSoZch3ibymgVD8l2FlHp74ixbs6R7OM+77eA7MrpdxuB2PsTddFj1tusfcQU959BnXOGkVqh+OniA==","shasum":"6f1cdda8b0777f68584c38fa9dbaa6b890ce375b","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.56.tgz","fileCount":85,"unpackedSize":257445,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCb6jMcIzhxvtsqRHhmNe3DAkW28Vd0hok/V0Z7k7hspAIhAMd33sOVJtKE7jXSJZZ9Mws8xVrAwUj7+a7LNRjBPBVl"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.56_1635495589236_0.3288966551931143"},"_hasShrinkwrap":false},"1.0.0-beta.57":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.57","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0","react-dom":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"1.3.10","tsc-files":"^1.1.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx,js}":["tsc-files --noEmit","eslint --cache --fix"],"*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useClickOutsideEffect`](docs/useClickOutsideEffect.mdx) - Effect for click outside of target [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useclickoutsideeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTransitionEffect`](docs/useTransitionEffect.mdx) - Effect for transition [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetransitioneffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n- [`UseClickOutside`](docs/components/UseClickOutside.mdx) - Click outside for component [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useclickoutside)\n- [`Portal`](docs/components/Portal.mdx) - Portal is used to transport any component or element to the end of `document.body` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-portal)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"03734edac14e636c25cbc3983c60d0a7cf12c438","_id":"react-hookable@1.0.0-beta.57","_nodeVersion":"16.13.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-yGq1gEVDYke7iQeMDGbxQ8W1yUAx8ZM+ay38Dn4Ukuva5goQiIadq8NcWDpRGCyUIqB5X8uj4UzaWuaqupCuuw==","shasum":"d79403418b84958e6d4b775575ceb65f629670ff","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.57.tgz","fileCount":87,"unpackedSize":263190,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFUcpmnJ3ANbzP62kQA5LFng/JOgXk06r4JtuKrbryGqAiEAsQpI3GEMDf2ihG2UlbQm9a11VUt0kXqUC7ziGpnYvVw="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.57_1635687988716_0.8850444502109149"},"_hasShrinkwrap":false},"1.0.0-beta.58":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.58","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0","react-dom":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"1.3.10","tsc-files":"^1.1.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx,js}":["tsc-files --noEmit","eslint --cache --fix"],"*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useClickOutsideEffect`](docs/useClickOutsideEffect.mdx) - Effect for click outside of target [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useclickoutsideeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTransitionEffect`](docs/useTransitionEffect.mdx) - Effect for transition [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetransitioneffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n- [`UseClickOutside`](docs/components/UseClickOutside.mdx) - Click outside for component [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useclickoutside)\n- [`Portal`](docs/components/Portal.mdx) - Portal is used to transport any component or element to the end of `document.body` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-portal)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"7fc6c00d69b693bd1539f3ade11d842364d586e7","_id":"react-hookable@1.0.0-beta.58","_nodeVersion":"16.13.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-9FdRMsFIytosTQnkxO+f0qZGDEAvdVdPQO/RrG71SUttFNmRvZu1DORK9aOKbBql7ulssyV23HFzF4C6tCGJ1A==","shasum":"54d91b39cde5bd99e953a9b4007a9d1e594f7871","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.58.tgz","fileCount":87,"unpackedSize":265091,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDX1vGTFDZfEVPhfB54iYCu4ijTyIsHadNLGMb0qZIyQgIgWtTa9jndvKPVVEg90Svubg2J1Y0Jj4wdXtKcw4utno8="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.58_1635692623648_0.12599600315290194"},"_hasShrinkwrap":false},"1.0.0-beta.59":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.59","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0","react-dom":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","lint-staged":"^11.2.3","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"1.3.10","tsc-files":"^1.1.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx,js}":["tsc-files --noEmit","eslint --cache --fix"],"*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useClickOutsideEffect`](docs/useClickOutsideEffect.mdx) - Effect for click outside of target [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useclickoutsideeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTransitionEffect`](docs/useTransitionEffect.mdx) - Effect for transition [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetransitioneffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n- [`UseClickOutside`](docs/components/UseClickOutside.mdx) - Click outside for component [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useclickoutside)\n- [`Portal`](docs/components/Portal.mdx) - Portal is used to transport any component or element to the end of `document.body` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-portal)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"aeff6444924f48bb366278c843b9d214e06b24e7","_id":"react-hookable@1.0.0-beta.59","_nodeVersion":"16.13.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-K77cH/sggaCutsF8NF+3+AXp2/LBiM4SawW3/mjQUt3MzJDbmlHIN3qxzMUENqfx1tYybloed/z7xB969bgKeQ==","shasum":"9c5f494716a06eafa0ce20439b30da399a91770f","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.59.tgz","fileCount":87,"unpackedSize":267394,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFOS/dnpYGdz8KPnd3HlP27RJ6jxS6+veFfSLkG+rGmeAiEAmuOyaKtAt/VZLm1eszaKEiEcibOvMfWDQons2rmS2HA="}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.59_1635743536108_0.09605335842521723"},"_hasShrinkwrap":false},"1.0.0-beta.60":{"name":"react-hookable","description":"Collection of essential React Composition Utilities","version":"1.0.0-beta.60","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"require":"./dist/index.cjs.js","import":"./dist/index.es.js"}},"sideEffects":false,"license":"MIT","scripts":{"commit":"cz","prepare":"husky install","lint":"run-p lint:*","lint:eslint":"eslint --ignore-path .gitignore .","lint:tsc":"tsc --noEmit","test":"run-p test:*","test:unit":"jest","build":"run-p build:*","build:scripts":"node -r esbuild-register scripts/build.ts","build:types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","storybook":"start-storybook -p 6006","docs":"build-storybook","release":"semantic-release"},"peerDependencies":{"react":"^16.8.0","react-dom":"^16.8.0"},"devDependencies":{"@babel/core":"^7.15.5","@chakra-ui/icons":"^1.0.15","@chakra-ui/react":"^1.6.8","@commitlint/cli":"^13.2.0","@emotion/react":"^11","@emotion/styled":"^11","@semantic-release/changelog":"^6.0.0","@semantic-release/git":"^10.0.0","@storybook/addon-actions":"^6.3.9","@storybook/addon-essentials":"^6.3.9","@storybook/addon-links":"^6.3.9","@storybook/addon-postcss":"^2.0.0","@storybook/preact":"^6.3.9","@swc/core":"^1.2.92","@swc/jest":"^0.2.4","@testing-library/jest-dom":"^5.14.1","@testing-library/react":"^12.1.1","@testing-library/react-hooks":"^7.0.2","@types/jest":"^27.0.2","@types/node":"^16.10.2","@types/react":"^17.0.26","@typescript-eslint/eslint-plugin":"^4.32.0","@typescript-eslint/parser":"^4.32.0","autoprefixer":"^10.3.7","babel-loader":"^8.2.2","clsx":"^1.1.1","commitizen":"^4.2.4","commitlint-config-gitmoji":"^2.2.5","cz-emoji":"^1.3.1","esbuild":"^0.13.3","esbuild-register":"^3.0.0","eslint":"^7.32.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.25.2","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-tsdoc":"^0.2.14","framer-motion":"^4","husky":"^7.0.2","hygen":"^6.1.0","is-email":"^1.0.1","jest":"^27.2.4","jest-websocket-mock":"^2.2.1","lint-staged":"^11.2.3","mock-socket":"^9.0.7","npm-run-all":"^4.1.5","postcss":"^8.3.9","preact":"^10.5.14","prettier":"^2.4.1","react":"^17.0.2","react-dom":"^17.0.2","semantic-release":"^18.0.0","semantic-release-gitmoji":"^1.4.2","tailwindcss":"^3.0.0-alpha.1","tsc-alias":"1.3.10","tsc-files":"^1.1.2","typescript":"^4.4.3","utilitypes":"^1.0.0-beta.4"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"funding":{"type":"patreon","url":"https://www.patreon.com/tomoki_miyauci"},"keywords":["react","hook","hooks","use","collection","utility"],"lint-staged":{"*.{ts,tsx,js}":["tsc-files --noEmit","eslint --cache --fix"],"*.{json,md,mdx}":"prettier -w"},"readme":"<div align=\"center\">\n\n# react-hookable\n\n<img width=\"180\" src=\"https://res.cloudinary.com/dz3vsv9pg/image/upload/v1634554925/projects/react-hookable/logo.svg\">\n\nCollection of essential React Composition Utilities\n\n[![codecov](https://codecov.io/gh/TomokiMiyauci/react-hookable/branch/main/graph/badge.svg?token=kb8KG2KSaR)](https://codecov.io/gh/TomokiMiyauci/react-hookable)\n\n</div >\n\n---\n\n## Status\n\n:seedling: beta\n\nWhen a common interface has been defined, it becomes a public release.\n\n## Feature\n\n- :sparkles: Consistent interface\n- :page_facing_up: Declarative\n- :memo: Pure TypeScript\n- :seedling: Full support for preact\n- :green_heart: Full support for Deno\n- :white_check_mark: Tested with CSR and SSR\n\n## Install\n\n### Node.js\n\n```bash\nnpm i react-hook@beta\n// or\nyarn add react-hook@beta\n```\n\n### Deno\n\n```ts\nimport {*} from 'https://esm.sh/react-hookable'\n```\n\n## Type of hooks\n\nWe have classified hooks into six categories.\nEach category has a different interface.\n\n- [State](#state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Effect](#effect) => `void`\n- [EffectState](#effect-state) => `[state/{ states }, dispatcher/{ dispatchers }]`\n- [Ref](#ref) => `{ _ref, ... }`\n- [Enhancement](#enhancement) extends `react` / `preact` standard hooks\n- [Lifecycle](#lifecycle) Component lifecycle\n\nEach function that contains a side-effect also has an\n\n![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black) tag.\n\n## State\n\nSet of stateful value, and a function to update it. All functions are interfaces of `[state, dispatcher]`, like `useState`.\n\n### Interface\n\n```tsx\nconst [state, dispatcher] = useMyState(...)\n// state: state/{ states }\n// dispatcher: dispatch/{ dispatches }\n```\n\n- [`useBoolean`](docs/useBoolean.mdx) - Switchable `boolean` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-useboolean)\n- [`useNumber`](docs/useNumber.mdx) - Basic number counter [![tag][demo]](https://react-hookable.vercel.app/?path=/story/state-usenumber)\n- [`useHashState`](docs/useHashState.mdx) - Tracks location hash value [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usehashstate) ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n- [`useSequenceState`](docs/useSequenceState.mdx) - Prevents other processes from running until the end of the process. This is ideal for preventing chattering. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/stateset-usesequencestate)\n\n## Effect\n\nEffect deals with side effects. It does not have a return value like `useEffect`. It takes as argument a `condition` function that handles the effect dynamically.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nuseMyEffect(effect, deps, () => Maybe<boolean>) // void\n```\n\n- [`useAnimationFrameEffect`](docs/useAnimationFrameEffect.mdx) - Effect for `requestAnimationFrame` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useanimationframeeffect)\n- [`useClickOutsideEffect`](docs/useClickOutsideEffect.mdx) - Effect for click outside of target [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useclickoutsideeffect)\n- [`useEventListenerEffect`](docs/useEventListenerEffect.mdx) - `EventListener` effect that clean up automatically [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useeventlistenereffect)\n- [`useFetchEffect`](docs/useFetchEffect.mdx) - Effect for `fetch` API that abort automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usefetcheffect)\n- [`useIdleCallbackEffect`](docs/useIdleCallbackEffect.mdx) - Effect for `requestIdleCallback` with fallback that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidlecallbackeffect)\n- [`useIdleEffect`](docs/useIdleEffect.mdx) - Effect for track whether the user is being inactive [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useidleeffect)\n- [`useIntersectionObserverEffect`](docs/useIntersectionObserverEffect.mdx) - Effect for `IntersectionObserver` that disconnect automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintersectionobservereffect)\n- [`useIntervalEffect`](docs/useIntervalEffect.mdx) - Effect for `setInterval` that clear automatically when unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useintervaleffect)\n- [`usePermissionQueryEffect`](docs/usePermissionQueryEffect.mdx) - Effect for `navigator.permissions.query` with declarative [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usepermissionqueryeffect)\n- [`useShortcutEffect`](docs/useShortcutEffect.mdx) - Effect for `keydown` as shortcut [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-useshortcuteffect)\n- [`useTransitionEffect`](docs/useTransitionEffect.mdx) - Effect for transition [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetransitioneffect)\n- [`useTimeoutEffect`](docs/useTimeoutEffect.mdx) - `Timeout` effect what timer clear automatically on unmount [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usetimeouteffect)\n- [`useWebSocket`](docs/useWebSocket.mdx) - Effect for WebSocket with automatically close connection when unmounted [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effect-usewebsocket)\n\n## Effect State\n\nEffect State is a hook to handle side effects with reactive state. Effect is an extension of `useEffect` with a conditional execution.\nThe return value is a set of reactive states and their dispatches.\n\nAll functions contain side effects. ![side-effect](https://img.shields.io/badge/side%20effect-%F0%9F%92%A5-black)\n\n### Interface\n\n```tsx\nconst [states, dispatches] = useEffectState(options, deps, condition)\n```\n\n- [`useSwipeEffectState`](docs/useSwipeEffectState.mdx) - Reactive swipe detection based on `TouchEvents` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-useswipeeffectstate)\n- [`useWindowScrollEffectState`](docs/useWindowScrollEffectState.mdx) - Reactive `window` scroll state [![tag][demo]](https://react-hookable.vercel.app/?path=/story/effectstate-usewindowscrolleffectstate)\n\n## Ref\n\nRef is a utility for `useRef`. The return value of all hooks is a key value object, containing the original `_ref`.\n\n### Interface\n\n```tsx\nconst { ..., _ref: MutableObject | RefObject } = useMyRef()\n```\n\n- [`useIsFirstMountRef`](docs/useIsFirstMountRef.mdx) - Ref of first mount or not. [![tag][demo]](https://react-hookable.vercel.app/?path=/story/ref-useidfirstmountref)\n\n## Enhancement\n\nThese are highly abstract hooks that enhance the standard hooks in `react` or `preact`.\n\n- [`useAsyncEffect`](docs/useAsyncEffect.mdx) - Hooks for asynchronous `useEffect` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasynceffect)\n- [`useAsyncMemo`](docs/useAsyncMemo.mdx) - Only recompute the memoized `async` value when one of the deps has changed [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useasyncmemo)\n- [`useUpdateEffect`](docs/useUpdateEffect.mdx) - Hooks for effect on update dependency [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useupdateeffect)\n- [`useConditionalEffect`](docs/useConditionalEffect.mdx) - `useEffect` with conditional function [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-useconditionaleffect)\n- [`useSafeState`](docs/useSafeState.mdx) - Update the state only while mounted `useState` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/enhancement-usesafestate)\n\n## Lifecycle\n\nComponent lifecycle\n\n- [`useIsUnmounted`](docs/useIsUnmounted.mdx) - Ref of isUnmounted or not [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useisunmounted)\n- [`useUnmount`](docs/useUnmount.mdx) - Register unmount callback [![tag][demo]](https://react-hookable.vercel.app/?path=/story/lifecycle-useunmount)\n\n## Components\n\n- [`UseSwipe`](docs/components/UseSwipe.mdx) - Reactive swipe state wrapper [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useswipe)\n- [`UseClickOutside`](docs/components/UseClickOutside.mdx) - Click outside for component [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-useclickoutside)\n- [`Portal`](docs/components/Portal.mdx) - Portal is used to transport any component or element to the end of `document.body` [![tag][demo]](https://react-hookable.vercel.app/?path=/story/component-portal)\n\n## Contributing\n\nContributions, issues and feature requests are welcome!<br />Feel free to check\n[issues](https://github.com/TomokiMiyauci/utterances-component/issues).\n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n<a href=\"https://www.patreon.com/tomoki_miyauci\">\n  <img src=\"https://c5.patreon.com/external/logo/become_a_patron_button@2x.png\" width=\"160\">\n</a>\n\n## License\n\nCopyright © 2021-present [TomokiMiyauci](https://github.com/TomokiMiyauci).\n\nReleased under the [MIT](./LICENSE) license\n\n[demo]: https://img.shields.io/badge/demo-%F0%9F%9A%80-green\n","readmeFilename":"README.md","gitHead":"9b2c5bda2889ad59e2b71a0112676ce112987384","_id":"react-hookable@1.0.0-beta.60","_nodeVersion":"16.13.0","_npmVersion":"7.24.1","dist":{"integrity":"sha512-Gl1WveisTBbdHw4TAvVXgydzmGBO3+8fUX0lGyxWwge4EFavaajTUycDqdLxZBJ+caPYsZ6qce75t+kdsDsSgw==","shasum":"614c7f21a03c779ea9e5dd1a0b6cd091e8448fc0","tarball":"https://registry.npmjs.org/react-hookable/-/react-hookable-1.0.0-beta.60.tgz","fileCount":89,"unpackedSize":277174,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPm8O4P+ga+WdvcNo98OFaUZmksCwxuKBZRVytL6vW/wIhANetrSNXW1vDIVwtgr2YCmIqZvaxuMfuHGSCJatIoXl/"}]},"_npmUser":{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"},"directories":{},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-hookable_1.0.0-beta.60_1636422256990_0.8117225651191058"},"_hasShrinkwrap":false}},"time":{"created":"2021-10-02T16:26:17.358Z","1.0.0-beta.1":"2021-10-02T16:26:17.535Z","modified":"2022-05-14T12:12:45.164Z","1.0.0-beta.2":"2021-10-03T02:28:44.103Z","1.0.0-beta.3":"2021-10-03T05:46:48.296Z","1.0.0-beta.4":"2021-10-03T11:20:55.565Z","1.0.0-beta.5":"2021-10-03T11:28:45.047Z","1.0.0-beta.6":"2021-10-03T11:54:00.442Z","1.0.0-beta.7":"2021-10-03T12:14:09.166Z","1.0.0-beta.8":"2021-10-03T15:37:20.370Z","1.0.0-beta.9":"2021-10-04T00:44:30.060Z","1.0.0-beta.10":"2021-10-04T01:13:59.904Z","1.0.0-beta.11":"2021-10-04T09:13:47.376Z","1.0.0-beta.12":"2021-10-05T02:18:43.655Z","1.0.0-beta.13":"2021-10-05T08:49:27.722Z","1.0.0-beta.14":"2021-10-05T16:53:01.032Z","1.0.0-beta.15":"2021-10-06T01:07:29.586Z","1.0.0-beta.16":"2021-10-07T08:21:11.880Z","1.0.0-beta.17":"2021-10-08T09:00:33.959Z","1.0.0-beta.18":"2021-10-08T16:17:09.422Z","1.0.0-beta.19":"2021-10-10T05:07:29.382Z","1.0.0-beta.20":"2021-10-10T11:01:24.708Z","1.0.0-beta.21":"2021-10-10T15:25:10.509Z","1.0.0-beta.22":"2021-10-11T04:21:42.676Z","1.0.0-beta.23":"2021-10-11T06:21:56.174Z","1.0.0-beta.24":"2021-10-11T17:06:31.821Z","1.0.0-beta.25":"2021-10-13T06:40:32.820Z","1.0.0-beta.26":"2021-10-15T06:27:15.118Z","1.0.0-beta.27":"2021-10-15T15:52:56.469Z","1.0.0-beta.28":"2021-10-16T03:06:06.884Z","1.0.0-beta.29":"2021-10-16T06:56:19.376Z","1.0.0-beta.30":"2021-10-16T14:17:29.894Z","1.0.0-beta.31":"2021-10-17T05:49:06.296Z","1.0.0-beta.32":"2021-10-17T15:56:32.353Z","1.0.0-beta.33":"2021-10-17T16:27:01.644Z","1.0.0-beta.34":"2021-10-18T02:06:09.310Z","1.0.0-beta.35":"2021-10-18T04:24:51.227Z","1.0.0-beta.36":"2021-10-18T04:46:05.922Z","1.0.0-beta.37":"2021-10-18T09:04:30.287Z","1.0.0-beta.38":"2021-10-19T01:08:40.547Z","1.0.0-beta.39":"2021-10-19T13:20:53.885Z","1.0.0-beta.40":"2021-10-19T15:16:02.107Z","1.0.0-beta.41":"2021-10-19T16:33:06.951Z","1.0.0-beta.42":"2021-10-20T07:53:14.568Z","1.0.0-beta.43":"2021-10-21T07:42:37.272Z","1.0.0-beta.44":"2021-10-22T00:29:14.921Z","1.0.0-beta.45":"2021-10-22T02:48:02.269Z","1.0.0-beta.46":"2021-10-22T11:23:51.679Z","1.0.0-beta.47":"2021-10-22T15:38:28.596Z","1.0.0-beta.48":"2021-10-25T09:22:17.300Z","1.0.0-beta.49":"2021-10-26T05:52:34.841Z","1.0.0-beta.50":"2021-10-27T00:47:21.687Z","1.0.0-beta.51":"2021-10-27T07:57:58.199Z","1.0.0-beta.52":"2021-10-28T17:31:07.571Z","1.0.0-beta.53":"2021-10-29T02:22:35.271Z","1.0.0-beta.54":"2021-10-29T05:03:06.894Z","1.0.0-beta.55":"2021-10-29T05:21:29.890Z","1.0.0-beta.56":"2021-10-29T08:19:49.396Z","1.0.0-beta.57":"2021-10-31T13:46:28.934Z","1.0.0-beta.58":"2021-10-31T15:03:43.806Z","1.0.0-beta.59":"2021-11-01T05:12:16.282Z","1.0.0-beta.60":"2021-11-09T01:44:17.166Z"},"maintainers":[{"name":"miyauci","email":"development.operation.6.6.6@gmail.com"}],"description":"Collection of essential React Composition Utilities","homepage":"https://github.com/TomokiMiyauci/react-hookable#readme","keywords":["react","hook","hooks","use","collection","utility"],"repository":{"type":"git","url":"git+https://github.com/TomokiMiyauci/react-hookable.git"},"author":{"name":"TomokiMiyauci","email":"contact@miyauchi.dev","url":"https://miyauchi.dev/"},"bugs":{"url":"https://github.com/TomokiMiyauci/react-hookable/issues"},"license":"MIT","readme":"","readmeFilename":""}