{"_id":"@amcinox/utils","_rev":"3-87f2ec41e0ebf8432de700edf5314391","name":"@amcinox/utils","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.0":{"name":"@amcinox/utils","version":"1.0.0","description":"","main":"./build/index.js","types":"./build/index.d.ts","scripts":{"clean":"del ./build/*","build":"tsc","test":"npm link && cd ../test  && npm link @opentech/utils","pub":"git add . && git commit -m \"Updates\" && npm version patch && npm run build && npm publish","pub2":"tsc && git add . && git commit -m \"Updates\" && npm version patch && npm run build && npm publish && git push"},"keywords":[],"author":{"name":"Amcinox"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/opentickio/utils.git"},"devDependencies":{"del-cli":"^3.0.0","typescript":"^3.8.3"},"dependencies":{},"gitHead":"d99f38de42510abdd348976a8787a2d79b93ab95","bugs":{"url":"https://github.com/opentickio/utils/issues"},"homepage":"https://github.com/opentickio/utils#readme","_id":"@amcinox/utils@1.0.0","_nodeVersion":"16.18.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-LlKOXyHXYlkSoF+d4PlDooCkcuXRnz00itoBRMoCBOABcQ1T1WZ5FjSJrCC43uevJCQukQA7u0nFYONYXzLPoQ==","shasum":"9baf7fc43b21cb5cb5ef92a7b4ed8edb1c473291","tarball":"https://registry.npmjs.org/@amcinox/utils/-/utils-1.0.0.tgz","fileCount":16,"unpackedSize":90649,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDeOW6qTwgOTPFgcF/D8PSrec8PXdtqT/YCMEabUyz2MAIgeVgzBsVtvOVgOtgfguoA7rrZMUDVsLwGvhDa6Jgs8ss="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjrbumACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp/uQ//Tbi7jgA8MOg+ARk4MXFoa3b0n/k8pk5FlqN8Jk/E55On4eSD\r\nClvwSd3fK/tNOIyV2tdSYLMBVmJdfQG+7BMRVGIoVU3v390ZBVfyWY3jZuNh\r\no3Qfne/S8uod8jBMyxHpzspD6YGhh6Q7XcNFuPQ7XP6K+8cz2jq0e5ne2Wv5\r\nQ6C8WAg1mPDflCxviJ+a+QQhFNsGttlBj9Rx/shDrP6kg8bj2wBYNoltsn0Y\r\neU868mQOHqesNpwa0TvbcWQRB7gvyI6gf6mY06wOAaZsXOtEErKgbHZxJ5UE\r\nZU1GYNilW8n7+kgEVWNKSkdzZmrK2C5K6t7IjRsVhK3ZlQiZCIOH9vL7yEJu\r\nvQVaZF1puckJus/Tj8Ex2DI4nHLWVTBPhahch5wb4hZGpR7Tc7TcEwFCcnXQ\r\n34YUplR/agYVBQZE9IElDBsSfYTqPcj9O63ID+k+lLYTsb2sgDqQmaq/SF92\r\n+CaYwkcxRJiodNZZqZOQtNug/2Cvj/5Xn0jRFAUf2Pv86LH7ht4aCOigOweu\r\nUpLoYf9Ti2KHTiVPcGGsevgcnWRAwwgN3qQvD2S7LwUpbCbh8I2F4BYDIRoi\r\nIXbNlDLqlvVPbfBT8odgPFJCpBoMn9dS3OucOaO9nJuFiIzbVHPoaaZU360D\r\nWj3NqwtiSAYQ7WpSJyXGvzGqN8eLx+qQGXQ=\r\n=r8Ht\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"amcinox","email":"amcinox@gmail.com"},"directories":{},"maintainers":[{"name":"amcinox","email":"amcinox@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/utils_1.0.0_1672330150232_0.37269284598263486"},"_hasShrinkwrap":false},"1.0.3":{"name":"@amcinox/utils","version":"1.0.3","description":"# tools","main":"./build/index.js","types":"./build/index.d.ts","scripts":{"clean":"del ./build/*","build":"tsc","test":"tsc && npm link && cd ../test  && npm link opentecc","pub":"git add . && git commit -m \"Updates\" && npm version patch && npm run build && npm publish","pub2":"tsc && git add . && git commit -m \"Updates\" && npm version patch && npm run build && npm publish && git push"},"keywords":[],"author":{"name":"Amcinox"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/opentickio/opentecc.git"},"devDependencies":{"@types/react":"^18.0.26","del-cli":"^3.0.0","typescript":"^3.8.3"},"dependencies":{"react":"^18.2.0","react-dom":"^18.2.0"},"gitHead":"ecfd4f0150bfd1649edfea70b93b62b582026ef2","bugs":{"url":"https://github.com/opentickio/opentecc/issues"},"homepage":"https://github.com/opentickio/opentecc#readme","_id":"@amcinox/utils@1.0.3","_nodeVersion":"16.18.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-9ivQTsDgeMLu/A4Mi44Bby45an6Eq4ANekIZ4wYddbmeFhI8+JtOF//3Gvo5JLxidJxwAyrwzKAuhbFCLStKJw==","shasum":"afce34f1d4e8e66dec445ee27b3cc454e9ce60df","tarball":"https://registry.npmjs.org/@amcinox/utils/-/utils-1.0.3.tgz","fileCount":273,"unpackedSize":343003,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICrHbg/O6ygDZScqCpsKP1l9vfCfrH0QvWlJOJRrQ+quAiEApe0wCey3NOi+CvXLaIy4IJ+3eJUfA98kt84q3AbplfU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjrfeeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmonhA/+Omw9xihJDbZEQkUFYXm0tdw+RqjZ0YDRq/HJh53uEgXuXpzw\r\nCVHqrF5U5NoHeb9RW0tNj+mQGdgWChRK7G4jrk88F5u4Fw3FbPdzpe575DhM\r\nM/c+z4qU+tMUgsDFaW1euf5q3f/q9DDSmuLvGs13sFDxwWso2e/czsn88flo\r\nbfDqTu5oVCLhDu7K3AOwTCguaI/fqG+Kak2DyrxNvwHAQVjrxs570FJgeiiU\r\nIV1khcPng7LkMslg/wWpBMpUWEGXGCyYwYZ3hUDJH6OiZov+IIV67HRrT2r6\r\nCUTDXkSkINhNk4SvbqH+pj4OZTNSu4CojxgnC+VdY+GqYOFGiWtT/MESihuV\r\nzajO3ODYYr/hqETtxeDHFAtxnnc0PxP7uTKYm2tYvBRk1rDN1VHdjRBUUVj/\r\n6V6M7NdnodeTrouUkirONcHl42W2oqxnSv7Wp4x4b6vKRCQNCk+ns5h4TxKv\r\nXtrHhiwlGBKRaqGcnd0nkDy32+tf5k019xDw0j85zuYgY5WjCuqzloyJ2uap\r\nZJLEKi+YPLcWlEeQHJrB90NdIpenCoRxaiLfswoPJqxQDdt/t8r3e/NrgCDi\r\nNjMi4urbpj18ondsO7GZIP8gUfWzjWKB0CPnStAkAl7zOYPtzSxuW8OUaMA4\r\niqUQpGkAABLizVgozRrZuZuAo3A8E/R8p90=\r\n=/wIm\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"amcinox","email":"amcinox@gmail.com"},"directories":{},"maintainers":[{"name":"amcinox","email":"amcinox@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/utils_1.0.3_1672345502558_0.4943189925109259"},"_hasShrinkwrap":false},"1.0.4":{"name":"@amcinox/utils","version":"1.0.4","description":"# tools","main":"./build/index.js","types":"./build/index.d.ts","scripts":{"clean":"del ./build/*","build":"tsc","test":"npm link && cd ../test  && npm link opentecc","pub":"git add . && git commit -m \"Updates\" && npm version patch && npm run build && npm publish","pub2":"tsc && git add . && git commit -m \"Updates\" && npm version patch && npm run build && npm publish && git push"},"keywords":[],"author":{"name":"Amcinox"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/opentickio/opentecc.git"},"devDependencies":{"@types/react":"^18.0.26","del-cli":"^3.0.0","typescript":"^3.8.3"},"dependencies":{"axios":"^1.2.2","react":"^18.2.0","react-dom":"^18.2.0"},"gitHead":"ecfd4f0150bfd1649edfea70b93b62b582026ef2","bugs":{"url":"https://github.com/opentickio/opentecc/issues"},"homepage":"https://github.com/opentickio/opentecc#readme","_id":"@amcinox/utils@1.0.4","_nodeVersion":"16.18.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-CTQDLiEXTSwXG6E+ikYlCFaYmBiIC0+QSF8z91iW8eVaWITAoGwnJOc+7JC9ELK18hkCosg0x86ssAa2QwApDQ==","shasum":"4d92f6e217cca341623e29a455e86471307cdcb5","tarball":"https://registry.npmjs.org/@amcinox/utils/-/utils-1.0.4.tgz","fileCount":277,"unpackedSize":351882,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBe0Npcs8weyo9VaLxnOiY9nzD+u50RUm9jbWgHIXn/rAiAuI5nLFqteaTK1WmnEYTIx2ZaVuiZkujqLFe7UacFrbA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjrjUqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpINA//XNqvvSRjK8sYOquFyX4Zl7MCCvRWCd8yGpPuN4mxtWWPrIDM\r\nkNJ9bD/lrODtWUlIwhuMB4QH2QV+kvzcCbU9HMWvIerI8gJBUGoxcPMrQ10w\r\n1IyE1B1Tm0nHksBu8i8RkAtyNTWDPmkLYFNwlRLLQDn+vW2dPiOxzG0mvRKY\r\nG6fxHhg1if6KYJUyStIOR782MmBZIhRjMYnVs+pTCgGyTWMN0RR96o2uBn1p\r\n6Y8OJbZmHmgR88idNUEyrC0YHJDa1jVqy5oZTc2QvUbQqALkfzEqHhr/hOWx\r\nLFt5zLXJT1d6vX/YjPm4UxLaYzlJGF83HC9bfpzCvAjpEfuXC6Qorl3lLNwA\r\nfkBxPkP1qmFJHnJ4ioKfvCAY4myIPxys69tQwUbNlRN4QSSWp4d7wHettP6j\r\nANIXKH8bxOILtjqLWYfkIeKtzqgIx+dTTf5ntMya0QWR8Icbi8H+xZEoHDUp\r\nIwBGrr7/iqzq8B/ZHrLMEu30kTDnmP5mgBp4WcCSwx28riepR37iNTuXlM0H\r\nOrIBYsk4xu7zfvFoFSCXxTCDzg4iS8whUHFSO+BMqnmGr+Ny2O1boHTSB2LE\r\nul/x2RNWWAv6WnqiAx0NlK1Nm5zA3T0JRWt8KFeeVtppFHzAFyoSe+dA6UNW\r\npHMdMt8jrYcQzHDMPlSfulUdQxwMrXWhdFM=\r\n=++gT\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"amcinox","email":"amcinox@gmail.com"},"directories":{},"maintainers":[{"name":"amcinox","email":"amcinox@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/utils_1.0.4_1672361258088_0.5861720918467426"},"_hasShrinkwrap":false},"1.0.5":{"name":"@amcinox/utils","version":"1.0.5","description":"# tools","main":"./build/index.js","types":"./build/index.d.ts","scripts":{"clean":"del ./build/*","build":"tsc","client":"npm link && cd ../client  && npm link opentecc","server":"npm link && cd ../server  && npm link opentecc","pub":"git add . && git commit -m \"Updates\" && npm version patch && npm run build && npm publish","pub2":"tsc && git add . && git commit -m \"Updates\" && npm version patch && npm run build && npm publish && git push"},"keywords":[],"author":{"name":"Amcinox"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/opentickio/opentecc.git"},"devDependencies":{"@types/react":"^18.0.26","del-cli":"^3.0.0","typescript":"^3.8.3"},"dependencies":{"axios":"^1.2.2","react":"^18.2.0","react-dom":"^18.2.0","socket.io":"^4.5.4","socket.io-client":"^4.5.4"},"gitHead":"14cbe10f60ef37f5a57edc9cca0f32992e5191f2","bugs":{"url":"https://github.com/opentickio/opentecc/issues"},"homepage":"https://github.com/opentickio/opentecc#readme","_id":"@amcinox/utils@1.0.5","_nodeVersion":"16.18.0","_npmVersion":"8.19.2","dist":{"integrity":"sha512-44tPgcDG3J1AN+zhfSMQaW8E4l9+kSqpgkm2bMA0Q7sLHs5aAQyXoPvGgdaDM+Z+FZ3uXPlmuNKH7hVGF+F+Ug==","shasum":"daf8c8ca9b9bd57f5784aeacf6ad711c89e04893","tarball":"https://registry.npmjs.org/@amcinox/utils/-/utils-1.0.5.tgz","fileCount":279,"unpackedSize":353601,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD54HagzPMA5OnenuZm9OIrc7ESrRJe/uQ+cDWAWUzRLAIhALC7ew9u36mL3TpS8Zv+O+6ImiHi9edHTJbbKqmVF6Jz"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjruYiACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpgLw/+Py23df+e7Zq6zSAQAz0JCwi+AWsw695ynxPKDMp8v1uOujXT\r\nfMBdIkBGbtNU8J3wfaWrhHpu8MICAj1vXD75a+2BVpGbOp2JIpt0ZPRq1Y6d\r\nLmmqzHWmydFzLYgifKwvsgubV7qz5zF4tiHiJQWQ6Nmpt47ni1f6coc+clYf\r\nclZX+dn+N6A9N0EDRX+vMVohuqJNKdF0lDeWOq7ub9PBro7VWnnZZedGgJlx\r\nXrKyQpoucMsJ4WqJWCXmdOb4Xx5IniMSrh18nUyduB/KdcPgmDmZHl3nPCKv\r\nEYK3JR3OwwaBGNVAsLwMk5hUPSU56sNEoL7Dy89vV5wKmWggqPOSUzWaiVO7\r\nyBianVX/yRhYMiJUt2QLyGJHsmP4quUuxdhK9FDU65gaXOnIB1ardkVLe8f6\r\nlhEyPJ4ivCnepXiHkrskgKS4fWWlxbBodMbzWxqDZE4xuuYIPBW2juBrg7vn\r\nCTHfcTDbYiX/COIWUk3NwZvF55hdf+yOTaEKZkT8a+caV+KBmqMuRlwd5MWi\r\nPzSeAWrNHIuTMsUo2H5VNB82WwyPSB19wSIq0Wvn8cS6a1HTQf59EKBwZJvr\r\nBQ7/bTpdN28Eh7EpCg6UGbP9SnIMOvDibL5wft6wsDzBviW7q/NjYyQay3c/\r\nLpqGrlP/wCBqf5wOrkzw+N6j5+px1kzsFlE=\r\n=DUR2\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"amcinox","email":"amcinox@gmail.com"},"directories":{},"maintainers":[{"name":"amcinox","email":"amcinox@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/utils_1.0.5_1672406562298_0.23701051925941496"},"_hasShrinkwrap":false}},"time":{"created":"2022-12-29T16:09:10.174Z","1.0.0":"2022-12-29T16:09:10.444Z","modified":"2022-12-30T13:22:42.615Z","1.0.3":"2022-12-29T20:25:02.788Z","1.0.4":"2022-12-30T00:47:38.267Z","1.0.5":"2022-12-30T13:22:42.484Z"},"maintainers":[{"name":"amcinox","email":"amcinox@gmail.com"}],"homepage":"https://github.com/opentickio/opentecc#readme","keywords":[],"repository":{"type":"git","url":"git+https://github.com/opentickio/opentecc.git"},"author":{"name":"Amcinox"},"bugs":{"url":"https://github.com/opentickio/opentecc/issues"},"license":"ISC","readme":"# Opentecc\n\n# tools\n\n...\n\n# Hooks\n\n- ## Sensors\n\n* `useBattery` — tracks device battery state.\n* `useGeolocation` — tracks geo location state of user's device.\n* `useHover` and `useHoverDirty` — tracks mouse hover state of some element.\n* `useHash` — tracks location hash value.\n* `useIdle` — tracks whether user is being inactive.\n* `useIntersection` — tracks an HTML element's intersection.\n* `useKey`, `useKeyPress`, useKeyboardJs, and useKeyPressEvent — track keys.\n* `useLocation` and `useSearchParam` — tracks page navigation bar location state.\n* `useLongPress` — tracks long press gesture of some element.\n* `useMedia` — tracks state of a CSS media query.\n* `useMediaDevices` — tracks state of connected hardware devices.\n* `useMotion` — tracks state of device's motion sensor.\n* `useMouse` and `useMouseHovered` — tracks state of mouse position.\n* `useMouseWheel` — tracks deltaY of scrolled mouse wheel.\n* `useNetworkState` — tracks the state of browser's network connection.\n* `useOrientation` — tracks state of device's screen orientation.\n* `usePageLeave` — triggers when mouse leaves page boundaries.\n* `useScratch` — tracks mouse click-and-scrub state.\n* `useScroll` — tracks an HTML element's scroll position.\n* `useScrolling` — tracks whether HTML element is scrolling.\n* `useStartTyping` — detects when user starts typing.\n* `useWindowScroll` — tracks Window scroll position.\n* `useWindowSize` — tracks Window dimensions.\n* `useMeasure` and `useSize` — tracks an HTML element's dimensions.\n* `createBreakpoint` — tracks innerWidth\n* `useScrollbarWidth` — detects browser's native scrollbars width.\n* `usePinchZoom` — tracks pointer events to detect pinch zoom in and out status.\n\n- ## UI\n\n* `useAudio` — plays audio and exposes its controls.\n* `useClickAway` — triggers callback when user clicks outside target area.\n* `useCss` — dynamically adjusts CSS.\n* `useDrop` and `useDropArea` — tracks file, link and copy-paste drops.\n* `useFullscreen` — display an element or video full-screen.\n* `useSlider` — provides slide behavior over any HTML element.\n* `useSpeech` — synthesizes speech from a text string.\n* `useVibrate` — provide physical feedback using the Vibration API.\n* `useVideo` — plays video, tracks its state, and exposes playback controls.\n\n- ## Animations\n\n* `useRaf` — re-renders component on each requestAnimationFrame.\n* `useInterval` and `useHarmonicIntervalFn` — re-renders component on a set interval using setInterval.\n* `useSpring` — interpolates number over time according to spring dynamics.\n* `useTimeout` — re-renders component after a timeout.\n* `useTimeoutFn` — calls given function after a timeout.\n* `useTween` — re-renders component, while tweening a number from 0 to 1.\n* `useUpdate` — returns a callback, which re-renders component when called.\n\n- ## Side-effects\n\n* `useAsync`, `useAsyncFn`, and `useAsyncRetry` — resolves an async function.\n* `useBeforeUnload` — shows browser alert when user try to reload or close the page.\n* `useCookie` — provides way to read, update and delete a cookie.\n* `useCopyToClipboard` — copies text to clipboard.\n* `useDebounce` — debounces a function.\n* `useError` — error dispatcher.\n* `useFavicon` — sets favicon of the page.\n* `useLocalStorage` — manages a value in localStorage.\n* `useLockBodyScroll` — lock scrolling of the body element.\n* `useRafLoop` — calls given function inside the RAF loop.\n* `useSessionStorage` — manages a value in sessionStorage.\n* `useThrottle` and useThrottleFn — throttles a function.\n* `useTitle` — sets title of the page.\n* `usePermission` — query permission status for browser APIs.\n\n- ## Lifecycles\n\n* `useEffectOnce` — a modified `useEffect` hook that only runs once.\n* `useEvent` — subscribe to events.\n* `useLifecycles` — calls mount and unmount callbacks.\n* `useMountedState` and `useUnmountPromise` — track if component is mounted.\n* `usePromise` — resolves promise only while component is mounted.\n* `useLogger` — logs in console as component goes through life-cycles.\n* `useMount` — calls mount callbacks.\n* `useUnmount` — calls unmount callbacks.\n* `useUpdateEffect` — run an effect only on updates.\n* `useIsomorphicLayoutEffect` — `useLayoutEffect` that that works on server.\n* `useDeepCompareEffect`, `useShallowCompareEffect`, and `useCustomCompareEffect`\n\n- ## State\n\n* `createMemo` — factory of memoized hooks.\n* `createReducer` — factory of reducer hooks with custom middleware.\n* `createReducerContext` and createStateContext — factory of hooks for a sharing state between components.\n* `useDefault` — returns the default value when state is null or undefined.\n* `useGetSet` — returns state getter get() instead of raw state.\n* `useGetSetState` — as if useGetSet and useSetState had a baby.\n* `useLatest` — returns the latest state or props\n* `usePrevious` — returns the previous state or props.\n* `usePreviousDistinct` — like usePrevious but with a predicate to determine if previous should update.\n* `useObservable` — tracks latest value of an Observable.\n* `useRafState` — creates setState method which only updates after requestAnimationFrame.\n* `useSetState` — creates setState method which works like this.setState.\n* `useStateList` — circularly iterates over an array.\n* `useToggle` and `useBoolean` — tracks state of a boolean.\n* `useCounter` and `useNumber` — tracks state of a number.\n* `useList` and useUpsert — tracks state of an array.\n* `useMap` — tracks state of an object.\n* `useSet` — tracks state of a Set.\n* `useQueue` — implements simple queue.\n* `useStateValidator` — tracks state of an object.\n* `useStateWithHistory` — stores previous state values and provides handles to travel through them.\n* `useMultiStateValidator` — alike the useStateValidator, but tracks multiple states at a time.\n* `useMediatedState` — like the regular useState but with mediation by custom function.\n* `useFirstMountState` — check if current render is first.\n* `useRendersCount` — count component renders.\n* `createGlobalState` — cross component shared state.\n* `useMethods` — neat alternative to useReducer.\n\n- ## Miscellaneous\n\n* `useEnsuredForwardedRef` and `ensuredForwardRef` — use a React.forwardedRef safely.\n","readmeFilename":"README.md","description":"# tools"}