reactives-hooks 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +111 -0
- package/dist/index.cjs +832 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +221 -0
- package/dist/index.d.ts +221 -0
- package/dist/index.mjs +792 -0
- package/dist/index.mjs.map +1 -0
- package/dist/next/index.cjs +106 -0
- package/dist/next/index.cjs.map +1 -0
- package/dist/next/index.d.cts +25 -0
- package/dist/next/index.d.ts +25 -0
- package/dist/next/index.mjs +101 -0
- package/dist/next/index.mjs.map +1 -0
- package/dist/utils/index.cjs +26 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.mjs +22 -0
- package/dist/utils/index.mjs.map +1 -0
- package/package.json +123 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/state/useToggle.ts","../src/hooks/state/useBoolean.ts","../src/hooks/state/useCounter.ts","../src/hooks/state/useMap.ts","../src/hooks/state/useSet.ts","../src/hooks/state/usePrevious.ts","../src/hooks/state/useStateHistory.ts","../src/hooks/storage/useLocalStorage.ts","../src/hooks/storage/useSessionStorage.ts","../src/hooks/dom/useEventListener.ts","../src/hooks/dom/useClickOutside.ts","../src/hooks/dom/useHover.ts","../src/hooks/dom/useIntersectionObserver.ts","../src/hooks/dom/useResizeObserver.ts","../src/hooks/dom/useMutationObserver.ts","../src/hooks/sensor/useMediaQuery.ts","../src/hooks/sensor/useWindowSize.ts","../src/hooks/sensor/useScroll.ts","../src/hooks/sensor/useMouse.ts","../src/hooks/sensor/useNetwork.ts","../src/hooks/performance/useDebounceValue.ts","../src/hooks/performance/useDebounceCallback.ts","../src/hooks/performance/useThrottleValue.ts","../src/hooks/performance/useThrottleCallback.ts","../src/hooks/lifecycle/useMount.ts","../src/hooks/lifecycle/useUnmount.ts","../src/hooks/lifecycle/useUpdateEffect.ts","../src/hooks/lifecycle/useIsMounted.ts","../src/hooks/lifecycle/useIsomorphicLayoutEffect.ts","../src/hooks/lifecycle/useDeepCompareEffect.ts","../src/hooks/ui/useScrollLock.ts","../src/hooks/ui/useDarkMode.ts","../src/hooks/ui/useFullscreen.ts","../src/hooks/ui/useCopyToClipboard.ts","../src/hooks/ui/useHotkeys.ts","../src/hooks/data/useAsync.ts","../src/hooks/data/useFetch.ts","../src/hooks/data/useInfiniteScroll.ts","../src/hooks/data/usePagination.ts"],"names":["useState","useCallback","useRef","useEffect","getStoredValue"],"mappings":";;AAEO,SAAS,SAAA,CAAU,eAAe,KAAA,EAA6C;AACpF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,YAAY,CAAA;AAE/C,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,CAAC,QAAA,KAAuB;AACjD,IAAA,QAAA,CAAS,CAAC,IAAA,KAAU,OAAO,aAAa,SAAA,GAAY,QAAA,GAAW,CAAC,IAAK,CAAA;AAAA,EACvE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,CAAC,OAAO,MAAM,CAAA;AACvB;ACAO,SAAS,UAAA,CAAW,eAAe,KAAA,EAAyB;AACjE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,YAAY,CAAA;AAE/C,EAAA,MAAM,UAAUC,WAAAA,CAAY,MAAM,SAAS,IAAI,CAAA,EAAG,EAAE,CAAA;AACpD,EAAA,MAAM,WAAWA,WAAAA,CAAY,MAAM,SAAS,KAAK,CAAA,EAAG,EAAE,CAAA;AACtD,EAAA,MAAM,MAAA,GAASA,WAAAA,CAAY,MAAM,QAAA,CAAS,CAAC,SAAS,CAAC,IAAI,CAAA,EAAG,EAAE,CAAA;AAE9D,EAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,QAAQ,QAAA,EAAS;AACtD;ACJO,SAAS,UAAA,CACd,YAAA,GAAe,CAAA,EACf,OAAA,GAA6B,EAAC,EACD;AAC7B,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,OAAA;AACrB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,SAAS,YAAY,CAAA;AAE/C,EAAA,MAAM,KAAA,GAAQC,WAAAA;AAAA,IACZ,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,IAAI,QAAQ,MAAA,EAAW,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAK,OAAO,CAAA;AACtD,MAAA,IAAI,QAAQ,MAAA,EAAW,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAK,OAAO,CAAA;AACtD,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,KAAK,GAAG;AAAA,GACX;AAEA,EAAA,MAAM,SAAA,GAAYA,WAAAA,CAAY,CAAC,KAAA,GAAQ,MAAM,QAAA,CAAS,CAAC,IAAA,KAAS,KAAA,CAAM,OAAO,KAAK,CAAC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAC7F,EAAA,MAAM,SAAA,GAAYA,WAAAA,CAAY,CAAC,KAAA,GAAQ,MAAM,QAAA,CAAS,CAAC,IAAA,KAAS,KAAA,CAAM,OAAO,KAAK,CAAC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAC7F,EAAA,MAAM,GAAA,GAAMA,WAAAA,CAAY,CAAC,KAAA,KAAkB,QAAA,CAAS,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAC1E,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM,QAAA,CAAS,YAAY,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEtE,EAAA,OAAO,CAAC,KAAA,EAAO,EAAE,WAAW,SAAA,EAAW,GAAA,EAAK,OAAO,CAAA;AACrD;AC3BO,SAAS,MAAA,CACd,YAAA,GAAiC,EAAC,EACA;AAClC,EAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAID,SAAS,MAAM,IAAI,GAAA,CAAI,YAAY,CAAC,CAAA;AAE1D,EAAA,MAAM,OAAA,GAA+B;AAAA,IACnC,GAAA,EAAKC,WAAAA,CAAY,CAAC,GAAA,EAAQ,KAAA,KAAa;AACrC,MAAA,MAAA,CAAO,CAAC,IAAA,KAAS;AACf,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,QAAA,IAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAA;AACnB,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,EAAE,CAAA;AAAA,IAEL,MAAA,EAAQA,WAAAA,CAAY,CAAC,OAAA,KAA8B;AACjD,MAAA,MAAA,CAAO,CAAC,IAAA,KAAS;AACf,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,OAAA,EAAS;AAClC,UAAA,IAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,QACrB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,EAAE,CAAA;AAAA,IAEL,MAAA,EAAQA,WAAAA,CAAY,CAAC,GAAA,KAAW;AAC9B,MAAA,MAAA,CAAO,CAAC,IAAA,KAAS;AACf,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,QAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,EAAE,CAAA;AAAA,IAEL,KAAA,EAAOA,YAAY,MAAM;AACvB,MAAA,MAAA,iBAAO,IAAI,KAAK,CAAA;AAAA,IAClB,CAAA,EAAG,EAAE,CAAA;AAAA,IAEL,KAAA,EAAOA,YAAY,MAAM;AACvB,MAAA,MAAA,CAAO,IAAI,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,IAC9B,CAAA,EAAG,EAAE;AAAA,GACP;AAEA,EAAA,OAAO,CAAC,KAAK,OAAO,CAAA;AACtB;AC1CO,SAAS,MAAA,CAAU,YAAA,GAA4B,EAAC,EAA+B;AACpF,EAAA,MAAM,CAAC,KAAK,MAAM,CAAA,GAAID,SAAS,MAAM,IAAI,GAAA,CAAI,YAAY,CAAC,CAAA;AAE1D,EAAA,MAAM,OAAA,GAA4B;AAAA,IAChC,GAAA,EAAKC,WAAAA,CAAY,CAAC,KAAA,KAAa;AAC7B,MAAA,MAAA,CAAO,CAAC,yBAAS,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,KAAK,CAAC,CAAC,CAAA;AAAA,IAC5C,CAAA,EAAG,EAAE,CAAA;AAAA,IAEL,MAAA,EAAQA,WAAAA,CAAY,CAAC,KAAA,KAAa;AAChC,MAAA,MAAA,CAAO,CAAC,IAAA,KAAS;AACf,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,QAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AACjB,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,EAAE,CAAA;AAAA,IAEL,KAAA,EAAOA,YAAY,MAAM;AACvB,MAAA,MAAA,iBAAO,IAAI,KAAK,CAAA;AAAA,IAClB,CAAA,EAAG,EAAE,CAAA;AAAA,IAEL,KAAA,EAAOA,YAAY,MAAM;AACvB,MAAA,MAAA,CAAO,IAAI,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,IAC9B,CAAA,EAAG,EAAE,CAAA;AAAA,IAEL,MAAA,EAAQA,WAAAA,CAAY,CAAC,KAAA,KAAa;AAChC,MAAA,MAAA,CAAO,CAAC,IAAA,KAAS;AACf,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACnB,UAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,QACnB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,QAChB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,EAAE;AAAA,GACP;AAEA,EAAA,OAAO,CAAC,KAAK,OAAO,CAAA;AACtB;AC9CO,SAAS,YAAe,KAAA,EAAyB;AACtD,EAAA,MAAM,GAAA,GAAM,OAAsB,MAAS,CAAA;AAE3C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,GAAA,CAAI,OAAA,GAAU,KAAA;AAAA,EAChB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO,GAAA,CAAI,OAAA;AACb;ACEO,SAAS,gBAAmB,YAAA,EAA2C;AAC5E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,SAAS,YAAY,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAaE,MAAAA,CAAY,CAAC,YAAY,CAAC,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAaA,OAAO,CAAC,CAAA;AAE3B,EAAA,MAAM,GAAA,GAAMD,WAAAA,CAAY,CAAC,QAAA,KAAgB;AACvC,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,IAAA,MAAM,aAAa,UAAA,CAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,UAAU,CAAC,CAAA;AAC1D,IAAA,UAAA,CAAW,KAAK,QAAQ,CAAA;AACxB,IAAA,UAAA,CAAW,OAAA,GAAU,UAAA;AACrB,IAAA,UAAA,CAAW,OAAA,GAAU,WAAW,MAAA,GAAS,CAAA;AACzC,IAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,EACnB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAOA,YAAY,MAAM;AAC7B,IAAA,IAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC1B,MAAA,UAAA,CAAW,OAAA,IAAW,CAAA;AACtB,MAAA,QAAA,CAAS,UAAA,CAAW,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAE,CAAA;AAAA,IAClD;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAOA,YAAY,MAAM;AAC7B,IAAA,IAAI,UAAA,CAAW,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtD,MAAA,UAAA,CAAW,OAAA,IAAW,CAAA;AACtB,MAAA,QAAA,CAAS,UAAA,CAAW,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAE,CAAA;AAAA,IAClD;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,GAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA,EAAS,WAAW,OAAA,GAAU,CAAA;AAAA,IAC9B,OAAA,EAAS,UAAA,CAAW,OAAA,GAAU,UAAA,CAAW,QAAQ,MAAA,GAAS,CAAA;AAAA,IAC1D,SAAS,UAAA,CAAW;AAAA,GACtB;AACF;AC/CA,SAAS,cAAA,CAAkB,KAAa,YAAA,EAAoB;AAC1D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,YAAA;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAC5C,IAAA,OAAO,IAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAU,YAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,YAAA;AAAA,EACT;AACF;AAEO,SAAS,eAAA,CACd,KACA,YAAA,EACwD;AACxD,EAAA,MAAM,CAAC,aAAa,cAAc,CAAA,GAAID,SAAY,MAAM,cAAA,CAAe,GAAA,EAAK,YAAY,CAAC,CAAA;AAEzF,EAAA,MAAM,QAAA,GAAWC,WAAAA;AAAA,IACf,CAAC,KAAA,KAAgC;AAC/B,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AACvB,QAAA,MAAM,SAAA,GAAY,KAAA,YAAiB,QAAA,GAAW,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AAC5D,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,UAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,QAC5D;AACA,QAAA,OAAO,SAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACN;AAEA,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,cAAA,CAAe,YAAY,CAAA;AAC3B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,YAAA,CAAa,WAAW,GAAG,CAAA;AAAA,IACpC;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,YAAY,CAAC,CAAA;AAEtB,EAAAE,UAAU,MAAM;AACd,IAAA,MAAM,mBAAA,GAAsB,CAAC,CAAA,KAAoB;AAC/C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,aAAa,IAAA,EAAM;AACxC,QAAA,IAAI;AACF,UAAA,cAAA,CAAe,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAM,CAAA;AAAA,QAC5C,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,mBAAmB,CAAA;AACtD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,mBAAmB,CAAA;AAAA,EACxE,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,OAAO,CAAC,WAAA,EAAa,QAAA,EAAU,WAAW,CAAA;AAC5C;ACnDA,SAASC,eAAAA,CAAkB,KAAa,YAAA,EAAoB;AAC1D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,YAAA;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,GAAG,CAAA;AAC9C,IAAA,OAAO,IAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAU,YAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,YAAA;AAAA,EACT;AACF;AAEO,SAAS,iBAAA,CACd,KACA,YAAA,EACwD;AACxD,EAAA,MAAM,CAAC,aAAa,cAAc,CAAA,GAAIJ,SAAY,MAAMI,eAAAA,CAAe,GAAA,EAAK,YAAY,CAAC,CAAA;AAEzF,EAAA,MAAM,QAAA,GAAWH,WAAAA;AAAA,IACf,CAAC,KAAA,KAAgC;AAC/B,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AACvB,QAAA,MAAM,SAAA,GAAY,KAAA,YAAiB,QAAA,GAAW,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AAC5D,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,UAAA,MAAA,CAAO,eAAe,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,QAC9D;AACA,QAAA,OAAO,SAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACN;AAEA,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,cAAA,CAAe,YAAY,CAAA;AAC3B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,cAAA,CAAe,WAAW,GAAG,CAAA;AAAA,IACtC;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,YAAY,CAAC,CAAA;AAEtB,EAAA,OAAO,CAAC,WAAA,EAAa,QAAA,EAAU,WAAW,CAAA;AAC5C;AClCO,SAAS,gBAAA,CACd,SAAA,EACA,OAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,YAAA,GAAeC,OAAO,OAAO,CAAA;AAEnC,EAAAC,UAAU,MAAM;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,OAAA;AAAA,EACzB,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,SAAS,OAAA,IAAW,MAAA;AACnC,IAAA,IAAI,CAAC,QAAQ,gBAAA,EAAkB;AAE/B,IAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAiB,YAAA,CAAa,QAAQ,KAAoB,CAAA;AAC5E,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,QAAA,EAAU,OAAO,CAAA;AACpD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,UAAU,OAAO,CAAA;AAAA,EACtE,CAAA,EAAG,CAAC,SAAA,EAAW,OAAA,EAAS,OAAO,CAAC,CAAA;AAClC;ACtBO,SAAS,gBACd,OAAA,EACqB;AACrB,EAAA,MAAM,GAAA,GAAMD,OAAiB,IAAI,CAAA;AACjC,EAAA,MAAM,YAAA,GAAeA,OAAO,OAAO,CAAA;AAEnC,EAAAC,UAAU,MAAM;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,OAAA;AAAA,EACzB,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAmC;AACnD,MAAA,IAAI,CAAC,IAAI,OAAA,IAAW,GAAA,CAAI,QAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EAAG;AAChE,MAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAAA,IAC5B,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,QAAQ,CAAA;AAC/C,IAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,QAAQ,CAAA;AAChD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,QAAQ,CAAA;AAClD,MAAA,QAAA,CAAS,mBAAA,CAAoB,cAAc,QAAQ,CAAA;AAAA,IACrD,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,GAAA;AACT;ACzBO,SAAS,QAAA,GAGd;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIH,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,GAAA,GAAME,OAAiB,IAAI,CAAA;AAEjC,EAAA,MAAM,mBAAmBD,WAAAA,CAAY,MAAM,aAAa,IAAI,CAAA,EAAG,EAAE,CAAA;AACjE,EAAA,MAAM,mBAAmBA,WAAAA,CAAY,MAAM,aAAa,KAAK,CAAA,EAAG,EAAE,CAAA;AAElE,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,CAAC,IAAA,KAAmB;AAClB,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,GAAA,CAAI,OAAA,CAAQ,mBAAA,CAAoB,YAAA,EAAc,gBAAgB,CAAA;AAC9D,QAAA,GAAA,CAAI,OAAA,CAAQ,mBAAA,CAAoB,YAAA,EAAc,gBAAgB,CAAA;AAAA,MAChE;AACA,MAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AACd,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,gBAAA,CAAiB,cAAc,gBAAgB,CAAA;AACpD,QAAA,IAAA,CAAK,gBAAA,CAAiB,cAAc,gBAAgB,CAAA;AAAA,MACtD;AAAA,IACF,CAAA;AAAA,IACA,CAAC,kBAAkB,gBAAgB;AAAA,GACrC;AAEA,EAAA,OAAO,CAAC,aAAa,SAAS,CAAA;AAChC;ACZO,SAAS,uBAAA,CACd,OAAA,GAA0C,EAAC,EACZ;AAC/B,EAAA,MAAM,EAAE,YAAY,CAAA,EAAG,IAAA,GAAO,MAAM,UAAA,GAAa,KAAA,EAAO,iBAAA,GAAoB,KAAA,EAAM,GAAI,OAAA;AACtF,EAAA,MAAM,GAAA,GAAMC,OAA2B,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIF,SAA2C,IAAI,CAAA;AAEzE,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,IAAkB,iBAAA;AAExC,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AAErB,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,CAAC,aAAa,CAAA,KAAM;AACnB,QAAA,IAAI,aAAA,WAAwB,aAAa,CAAA;AAAA,MAC3C,CAAA;AAAA,MACA,EAAE,SAAA,EAAW,IAAA,EAAM,UAAA;AAAW,KAChC;AAEA,IAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACrB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,GAAG,CAAC,SAAA,EAAW,IAAA,EAAM,UAAA,EAAY,MAAM,CAAC,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,cAAA,EAAgB,OAAO,cAAA,IAAkB,KAAA;AAAA,IACzC;AAAA,GACF;AACF;ACrCO,SAAS,iBAAA,GAAwE;AACtF,EAAA,MAAM,GAAA,GAAMD,OAAiB,IAAI,CAAA;AACjC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIF,QAAAA,CAAe,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,CAAA;AAE9D,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,WAAW,IAAI,cAAA,CAAe,CAAC,CAAC,WAAW,CAAA,KAAM;AACrD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,WAAA,CAAY,WAAA;AACtC,QAAA,OAAA,CAAQ,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,MAC3B;AAAA,IACF,CAAC,CAAA;AAED,IAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACrB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,CAAC,KAAK,IAAI,CAAA;AACnB;ACzBO,SAAS,mBAAA,CACd,UACA,OAAA,GAAgC,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,MAAK,EAClC;AAC/B,EAAA,MAAM,GAAA,GAAMD,OAA2B,IAAI,CAAA;AAC3C,EAAA,MAAM,aAAA,GAAgBA,OAAO,QAAQ,CAAA;AAErC,EAAAC,UAAU,MAAM;AACd,IAAA,aAAA,CAAc,OAAA,GAAU,QAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,CAAA,GAAI,SAAS,aAAA,CAAc,OAAA,CAAQ,GAAG,IAAI,CAAC,CAAA;AACjF,IAAA,QAAA,CAAS,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC9B,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,GAAA;AACT;ACtBO,SAAS,cAAc,KAAA,EAAwB;AACpD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIH,SAAS,MAAM;AAC3C,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,IAAA,OAAO,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,CAAE,OAAA;AAAA,EAClC,CAAC,CAAA;AAED,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACnC,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAA2B,UAAA,CAAW,EAAE,OAAO,CAAA;AAEhE,IAAA,UAAA,CAAW,IAAI,OAAO,CAAA;AACtB,IAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,OAAO,CAAA;AACtC,IAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,QAAA,EAAU,OAAO,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO,OAAA;AACT;ACXO,SAAS,aAAA,GAA4B;AAC1C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIH,SAAqB,OAAO;AAAA,IAClD,KAAA,EAAO,OAAO,MAAA,KAAW,WAAA,GAAc,OAAO,UAAA,GAAa,CAAA;AAAA,IAC3D,MAAA,EAAQ,OAAO,MAAA,KAAW,WAAA,GAAc,OAAO,WAAA,GAAc;AAAA,GAC/D,CAAE,CAAA;AAEF,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,OAAA,CAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,YAAY,MAAA,EAAQ,MAAA,CAAO,aAAa,CAAA;AAAA,IAClE,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAC9C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,IAAA;AACT;ACdO,SAAS,UAAU,OAAA,EAAyD;AACjF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIH,QAAAA,CAAyB,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAEvE,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,SAAS,OAAA,IAAW,MAAA;AAEnC,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,QAAA,WAAA,CAAY,EAAE,GAAI,MAAA,CAAkB,OAAA,IAAW,GAAG,CAAA,EAAI,MAAA,CAAkB,OAAA,IAAW,CAAA,EAAG,CAAA;AAAA,MACxF,CAAA,MAAA,IAAW,kBAAkB,WAAA,EAAa;AACxC,QAAA,WAAA,CAAY,EAAE,CAAA,EAAG,MAAA,CAAO,YAAY,CAAA,EAAG,MAAA,CAAO,WAAW,CAAA;AAAA,MAC3D;AAAA,IACF,CAAA;AAEA,IAAA,YAAA,EAAa;AACb,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,YAAA,EAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AACjE,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,QAAA;AACT;ACrBO,SAAS,QAAA,GAA0B;AACxC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIH,QAAAA,CAAwB,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AAEtE,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAkB;AACzC,MAAA,WAAA,CAAY,EAAE,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA;AAAA,IAC5C,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,eAAe,CAAA;AACpD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,WAAA,EAAa,eAAe,CAAA;AAAA,EACtE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,QAAA;AACT;ACFO,SAAS,UAAA,GAA2B;AACzC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,SAAuB,OAAO;AAAA,IACtD,MAAA,EAAQ,OAAO,SAAA,KAAc,WAAA,GAAc,UAAU,MAAA,GAAS;AAAA,GAChE,CAAE,CAAA;AAEF,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,aAAc,SAAA,CAA6D,UAAA;AAEjF,IAAA,MAAM,oBAAoB,MAAM;AAC9B,MAAA,QAAA,CAAS;AAAA,QACP,QAAQ,SAAA,CAAU,MAAA;AAAA,QAClB,UAAU,UAAA,EAAY,QAAA;AAAA,QACtB,eAAe,UAAA,EAAY,aAAA;AAAA,QAC3B,KAAK,UAAA,EAAY,GAAA;AAAA,QACjB,UAAU,UAAA,EAAY;AAAA,OACvB,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,iBAAA,EAAkB;AAClB,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,iBAAiB,CAAA;AACnD,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,iBAAiB,CAAA;AACpD,IAAA,UAAA,EAAY,gBAAA,GAAmB,UAAU,iBAAiB,CAAA;AAE1D,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,iBAAiB,CAAA;AACtD,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,iBAAiB,CAAA;AACvD,MAAA,UAAA,EAAY,mBAAA,GAAsB,UAAU,iBAAiB,CAAA;AAAA,IAC/D,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,KAAA;AACT;AC9CO,SAAS,gBAAA,CAAoB,OAAU,KAAA,EAAkB;AAC9D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIH,SAAS,KAAK,CAAA;AAE1D,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,iBAAA,CAAkB,KAAK,GAAG,KAAK,CAAA;AAC9D,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AAEjB,EAAA,OAAO,cAAA;AACT;ACRO,SAAS,mBAAA,CACd,UACA,KAAA,EACkC;AAClC,EAAA,MAAM,WAAA,GAAcD,OAAO,QAAQ,CAAA;AACnC,EAAA,MAAM,QAAA,GAAWA,OAA6C,IAAI,CAAA;AAElE,EAAAC,UAAU,MAAM;AACd,IAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAAA,EACxB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAA,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AAAA,IACrD,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAOF,WAAAA;AAAA,IACL,IAAI,IAAA,KAAwB;AAC1B,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AACnD,MAAA,QAAA,CAAS,OAAA,GAAU,WAAW,MAAM,WAAA,CAAY,QAAQ,GAAG,IAAI,GAAG,KAAK,CAAA;AAAA,IACzE,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AACF;ACzBO,SAAS,gBAAA,CAAoB,OAAU,QAAA,EAAqB;AACjE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAID,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,WAAA,GAAcE,MAAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAErC,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,OAAA;AAElC,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,WAAA,CAAY,OAAA,GAAU,GAAA;AACtB,MAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,WAAA,CAAY,OAAA,GAAU,KAAK,GAAA,EAAI;AAC/B,QAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,MACzB,CAAA,EAAG,WAAW,OAAO,CAAA;AACrB,MAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,IACjC;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAEpB,EAAA,OAAO,cAAA;AACT;ACpBO,SAAS,mBAAA,CACd,UACA,QAAA,EACkC;AAClC,EAAA,MAAM,WAAA,GAAcD,OAAO,QAAQ,CAAA;AACnC,EAAA,MAAM,aAAA,GAAgBA,OAAO,CAAC,CAAA;AAC9B,EAAA,MAAM,QAAA,GAAWA,OAA6C,IAAI,CAAA;AAElE,EAAAC,UAAU,MAAM;AACd,IAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAAA,EACxB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAA,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AAAA,IACrD,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAOF,WAAAA;AAAA,IACL,IAAI,IAAA,KAAwB;AAC1B,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,OAAA;AAEpC,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,aAAA,CAAc,OAAA,GAAU,GAAA;AACxB,QAAA,WAAA,CAAY,OAAA,CAAQ,GAAG,IAAI,CAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,CAAC,QAAA,CAAS,OAAA,EAAS;AAC5B,QAAA,QAAA,CAAS,OAAA,GAAU,WAAW,MAAM;AAClC,UAAA,aAAA,CAAc,OAAA,GAAU,KAAK,GAAA,EAAI;AACjC,UAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,UAAA,WAAA,CAAY,OAAA,CAAQ,GAAG,IAAI,CAAA;AAAA,QAC7B,CAAA,EAAG,WAAW,OAAO,CAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AACF;ACrCO,SAAS,SAAS,QAAA,EAA4B;AACnD,EAAAE,UAAU,MAAM;AACd,IAAA,QAAA,EAAS;AAAA,EAEX,CAAA,EAAG,EAAE,CAAA;AACP;ACLO,SAAS,WAAW,QAAA,EAA4B;AACrD,EAAA,MAAM,WAAA,GAAcD,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAAC,UAAU,MAAM;AACd,IAAA,OAAO,MAAM,YAAY,OAAA,EAAQ;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AACP;ACNO,SAAS,eAAA,CAAgB,QAAwB,IAAA,EAA6B;AACnF,EAAA,MAAM,OAAA,GAAUD,OAAO,IAAI,CAAA;AAE3B,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,OAAA,GAAU,KAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,OAAO,MAAA,EAAO;AAAA,EAEhB,GAAG,IAAI,CAAA;AACT;ACZO,SAAS,YAAA,GAA8B;AAC5C,EAAA,MAAM,SAAA,GAAYD,OAAO,KAAK,CAAA;AAE9B,EAAAC,UAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAOF,WAAAA,CAAY,MAAM,SAAA,CAAU,OAAA,EAAS,EAAE,CAAA;AAChD;ACXO,IAAM,yBAAA,GACX,OAAO,MAAA,KAAW,WAAA,GAAc,eAAA,GAAkBE;ACApD,SAAS,SAAA,CAAU,GAAY,CAAA,EAAqB;AAClD,EAAA,IAAI,MAAA,CAAO,EAAA,CAAG,CAAA,EAAG,CAAC,GAAG,OAAO,IAAA;AAC5B,EAAA,IAAI,OAAO,CAAA,KAAM,OAAO,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM,OAAO,KAAA;AACrC,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,KAAA;AAElC,EAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,KAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AACxC,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,IAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,IAAA,EAAM,KAAA,KAAU,UAAU,IAAA,EAAM,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,KAAA,CAAM,QAAQ,CAAC,CAAA,KAAM,MAAM,OAAA,CAAQ,CAAC,GAAG,OAAO,KAAA;AAElD,EAAA,MAAM,IAAA,GAAO,CAAA;AACb,EAAA,MAAM,IAAA,GAAO,CAAA;AAEb,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAE9B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAE1C,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,IAAI,CAAC,OAAO,SAAA,CAAU,cAAA,CAAe,KAAK,IAAA,EAAM,GAAG,GAAG,OAAO,KAAA;AAC7D,IAAA,IAAI,CAAC,UAAU,IAAA,CAAK,GAAG,GAAG,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,OAAO,KAAA;AAAA,EAC/C;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,sBAAsB,IAAA,EAAsC;AACnE,EAAA,MAAM,GAAA,GAAMD,OAAuB,IAAI,CAAA;AAEvC,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,EAAM,GAAA,CAAI,OAAO,CAAA,EAAG;AACjC,IAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AAAA,EAChB;AAEA,EAAA,OAAO,GAAA,CAAI,OAAA;AACb;AAEO,SAAS,oBAAA,CAAqB,QAAwB,IAAA,EAA4B;AAEvF,EAAAC,SAAAA,CAAU,MAAA,EAAQ,qBAAA,CAAsB,IAAI,CAAC,CAAA;AAC/C;AC3CO,SAAS,cAAc,MAAA,EAAuB;AACnD,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA;AAC7C,IAAA,MAAM,oBAAA,GAAuB,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,YAAA;AACjD,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,UAAA,GAAa,QAAA,CAAS,eAAA,CAAgB,WAAA;AAEpE,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAC/B,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,CAAA,EAAG,cAAc,CAAA,EAAA,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,gBAAA;AAC/B,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,YAAA,GAAe,oBAAA;AAAA,IACrC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACb;ACTO,SAAS,WAAA,CAAY,eAAsB,QAAA,EAA6B;AAC7E,EAAA,MAAM,CAAC,KAAA,EAAO,aAAa,CAAA,GAAIH,SAAgB,MAAM;AACnD,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,YAAA;AAC1C,IAAA,OAAQ,YAAA,CAAa,OAAA,CAAQ,OAAO,CAAA,IAAe,YAAA;AAAA,EACrD,CAAC,CAAA;AAED,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,MAAM;AACjD,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,IAAA,OAAO,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AAAA,EAC3D,CAAC,CAAA;AAED,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAA2B,aAAA,CAAc,EAAE,OAAO,CAAA;AACnE,IAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,OAAO,CAAA;AACtC,IAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,QAAA,EAAU,OAAO,CAAA;AAAA,EACxD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAAS,KAAA,KAAU,QAAA,GAAW,UAAA,GAAa,KAAA,KAAU,MAAA;AAE3D,EAAA,MAAM,QAAA,GAAWF,WAAAA,CAAY,CAAC,QAAA,KAAoB;AAChD,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,YAAA,CAAa,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAAA,EACxC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,QAAA,CAAS,MAAA,GAAS,UAAU,MAAM,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAErB,EAAAE,UAAU,MAAM;AACd,IAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,MAAA,EAAO;AAC3C;AClCO,SAAS,aAAA,GAAqC;AACnD,EAAA,MAAM,GAAA,GAAMD,OAA2B,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIF,SAAS,KAAK,CAAA;AAEtD,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,UAAU,MAAM,eAAA,CAAgB,CAAC,CAAC,SAAS,iBAAiB,CAAA;AAClE,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,OAAO,CAAA;AACrD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,OAAO,CAAA;AAAA,EACvE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQF,YAAY,YAAY;AACpC,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,IAAA,IAAI,OAAA,EAAS,MAAM,OAAA,CAAQ,iBAAA,EAAkB;AAAA,EAC/C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAOA,YAAY,YAAY;AACnC,IAAA,IAAI,QAAA,CAAS,iBAAA,EAAmB,MAAM,QAAA,CAAS,cAAA,EAAe;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,YAAY,YAAY;AACrC,IAAA,IAAI,YAAA,QAAoB,IAAA,EAAK;AAAA,eAClB,KAAA,EAAM;AAAA,EACnB,CAAA,EAAG,CAAC,YAAA,EAAc,KAAA,EAAO,IAAI,CAAC,CAAA;AAE9B,EAAA,OAAO,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,MAAM,MAAA,EAAO;AAClD;AC7BO,SAAS,kBAAA,GAA+C;AAC7D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAID,SAAwB,IAAI,CAAA;AAEhE,EAAA,MAAM,IAAA,GAAOC,WAAAA,CAAY,OAAO,IAAA,KAAmC;AACjE,IAAA,IAAI,CAAC,WAAW,SAAA,EAAW;AACzB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,YAAY,IAAA,EAAK;AAC5B;ACvBA,SAAS,cAAc,KAAA,EAMrB;AACA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,WAAA,EAAY,CAAE,MAAM,GAAG,CAAA;AAC3C,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAAA,IAC3B,MAAM,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IAAK,KAAA,CAAM,SAAS,SAAS,CAAA;AAAA,IACxD,KAAA,EAAO,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA;AAAA,IAC7B,GAAA,EAAK,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA;AAAA,IACzB,MAAM,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IAAK,KAAA,CAAM,SAAS,KAAK;AAAA,GACtD;AACF;AAEO,SAAS,UAAA,CACd,QAAA,EACA,QAAA,EACA,OAAA,GAAU,IAAA,EACJ;AACN,EAAA,MAAM,WAAA,GAAcC,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AAErC,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAyB;AACxC,MAAA,MAAM,OAAA,GACJ,MAAM,GAAA,CAAI,WAAA,OAAkB,MAAA,CAAO,GAAA,IACnC,MAAM,OAAA,KAAY,MAAA,CAAO,QACzB,KAAA,CAAM,QAAA,KAAa,OAAO,KAAA,IAC1B,KAAA,CAAM,WAAW,MAAA,CAAO,GAAA,IACxB,KAAA,CAAM,OAAA,KAAY,MAAA,CAAO,IAAA;AAE3B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,WAAA,CAAY,QAAQ,KAAK,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,OAAO,CAAA;AAC1C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,OAAO,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AACxB;ACrCO,SAAS,QAAA,CACd,aAAA,EACA,SAAA,GAAY,IAAA,EACO;AACnB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,QAAAA,CAAwB;AAAA,IAChD,IAAA,EAAM,IAAA;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,MAAM,OAAA,GAAUC,YAAY,YAAY;AACtC,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,IAAA,EAAM,SAAS,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACnD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,aAAA,EAAc;AACjC,MAAA,QAAA,CAAS,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACd,MAAA,QAAA,CAAS,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,OAAuB,CAAA;AAAA,IAChE;AAAA,EACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvB,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ;AAC7B;AC1BO,SAAS,QAAA,CAAY,GAAA,EAAa,OAAA,GAA2B,EAAC,EAAsB;AACzF,EAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAM,GAAG,cAAa,GAAI,OAAA;AAC5C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIH,SAAmB,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,OAAO,CAAA;AAC9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,kBAAA,GAAqBE,OAA+B,IAAI,CAAA;AAE9D,EAAA,MAAM,SAAA,GAAYD,YAAY,YAAY;AACxC,IAAA,kBAAA,CAAmB,SAAS,KAAA,EAAM;AAClC,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,eAAA,EAAgB;AAEjD,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,GAAG,YAAA;AAAA,QACH,MAAA,EAAQ,mBAAmB,OAAA,CAAQ;AAAA,OACpC,CAAA;AACD,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MACnE;AACA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,SAAS,GAAA,EAAK;AACZ,MAAA,IAAK,GAAA,CAAc,SAAS,YAAA,EAAc;AACxC,QAAA,QAAA,CAAS,GAAY,CAAA;AAAA,MACvB;AAAA,IACF,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EAEF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,SAAA,EAAU;AACV,IAAA,OAAO,MAAM,kBAAA,CAAmB,OAAA,EAAS,KAAA,EAAM;AAAA,EACjD,CAAA,EAAG,CAAC,SAAA,EAAW,OAAO,CAAC,CAAA;AAEvB,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,SAAS,SAAA,EAAU;AACpD;ACxCO,SAAS,iBAAA,CACd,QAAA,EACA,OAAA,EACA,OAAA,GAAoC,EAAC,EACZ;AACzB,EAAA,MAAM,EAAE,SAAA,GAAY,CAAA,EAAG,UAAA,GAAa,SAAQ,GAAI,OAAA;AAChD,EAAA,MAAM,WAAA,GAAcD,OAA2B,IAAI,CAAA;AACnD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIF,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAaE,OAAO,KAAK,CAAA;AAE/B,EAAA,MAAM,cAAA,GAAiBD,YAAY,YAAY;AAC7C,IAAA,IAAI,UAAA,CAAW,OAAA,IAAW,CAAC,OAAA,EAAS;AACpC,IAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,EAAS;AAAA,IACjB,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AACrB,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAEtB,EAAAE,UAAU,MAAM;AACd,IAAA,MAAM,OAAO,WAAA,CAAY,OAAA;AACzB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,OAAA,EAAS;AAEvB,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,CAAC,KAAK,CAAA,KAAM;AACX,QAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,UAAA,cAAA,EAAe;AAAA,QACjB;AAAA,MACF,CAAA;AAAA,MACA,EAAE,WAAW,UAAA;AAAW,KAC1B;AAEA,IAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACrB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,GAAG,CAAC,cAAA,EAAgB,OAAA,EAAS,SAAA,EAAW,UAAU,CAAC,CAAA;AAEnD,EAAA,MAAM,KAAA,GAAQF,YAAY,MAAM;AAC9B,IAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AACrB,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,WAAA,EAAa,OAAA,EAAS,KAAA,EAAM;AACvC;ACrCO,SAAS,cAAc,OAAA,EAAoD;AAChF,EAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAU,kBAAkB,EAAA,EAAI,WAAA,GAAc,GAAE,GAAI,OAAA;AACxE,EAAA,MAAM,CAAC,IAAA,EAAM,YAAY,CAAA,GAAID,SAAS,WAAW,CAAA;AACjD,EAAA,MAAM,CAAC,QAAA,EAAU,gBAAgB,CAAA,GAAIA,SAAS,eAAe,CAAA;AAE7D,EAAA,MAAM,UAAA,GAAa,OAAA;AAAA,IACjB,MAAM,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,UAAA,GAAa,QAAQ,CAAC,CAAA;AAAA,IAClD,CAAC,YAAY,QAAQ;AAAA,GACvB;AAEA,EAAA,MAAM,OAAA,GAAUC,WAAAA;AAAA,IACd,CAAC,OAAA,KAAoB;AACnB,MAAA,YAAA,CAAa,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA,EAAG,UAAU,CAAC,CAAA;AAAA,IACzD,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,WAAA,GAAcA,WAAAA,CAAY,CAAC,OAAA,KAAoB;AACnD,IAAA,gBAAA,CAAiB,OAAO,CAAA;AACxB,IAAA,YAAA,CAAa,CAAC,CAAA;AAAA,EAChB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAOA,WAAAA,CAAY,MAAM,OAAA,CAAQ,IAAA,GAAO,CAAC,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AACjE,EAAA,MAAM,IAAA,GAAOA,WAAAA,CAAY,MAAM,OAAA,CAAQ,IAAA,GAAO,CAAC,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAEjE,EAAA,MAAM,UAAA,GAAA,CAAc,OAAO,CAAA,IAAK,QAAA;AAChC,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,aAAa,QAAA,GAAW,CAAA,EAAG,aAAa,CAAC,CAAA;AAEnE,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAS,IAAA,GAAO,UAAA;AAAA,IAChB,SAAS,IAAA,GAAO,CAAA;AAAA,IAChB,IAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF","file":"index.mjs","sourcesContent":["import { useCallback, useState } from 'react'\n\nexport function useToggle(initialValue = false): [boolean, (value?: boolean) => void] {\n const [value, setValue] = useState(initialValue)\n\n const toggle = useCallback((newValue?: boolean) => {\n setValue((prev) => (typeof newValue === 'boolean' ? newValue : !prev))\n }, [])\n\n return [value, toggle]\n}\n","import { useCallback, useState } from 'react'\n\ninterface UseBooleanReturn {\n value: boolean\n setTrue: () => void\n setFalse: () => void\n toggle: () => void\n setValue: (value: boolean) => void\n}\n\nexport function useBoolean(initialValue = false): UseBooleanReturn {\n const [value, setValue] = useState(initialValue)\n\n const setTrue = useCallback(() => setValue(true), [])\n const setFalse = useCallback(() => setValue(false), [])\n const toggle = useCallback(() => setValue((prev) => !prev), [])\n\n return { value, setTrue, setFalse, toggle, setValue }\n}\n","import { useCallback, useState } from 'react'\n\ninterface UseCounterOptions {\n min?: number\n max?: number\n}\n\ninterface UseCounterActions {\n increment: (delta?: number) => void\n decrement: (delta?: number) => void\n set: (value: number) => void\n reset: () => void\n}\n\nexport function useCounter(\n initialValue = 0,\n options: UseCounterOptions = {},\n): [number, UseCounterActions] {\n const { min, max } = options\n const [count, setCount] = useState(initialValue)\n\n const clamp = useCallback(\n (value: number) => {\n let clamped = value\n if (min !== undefined) clamped = Math.max(min, clamped)\n if (max !== undefined) clamped = Math.min(max, clamped)\n return clamped\n },\n [min, max],\n )\n\n const increment = useCallback((delta = 1) => setCount((prev) => clamp(prev + delta)), [clamp])\n const decrement = useCallback((delta = 1) => setCount((prev) => clamp(prev - delta)), [clamp])\n const set = useCallback((value: number) => setCount(clamp(value)), [clamp])\n const reset = useCallback(() => setCount(initialValue), [initialValue])\n\n return [count, { increment, decrement, set, reset }]\n}\n","import { useCallback, useState } from 'react'\n\ninterface UseMapActions<K, V> {\n set: (key: K, value: V) => void\n setAll: (entries: Iterable<[K, V]>) => void\n delete: (key: K) => void\n clear: () => void\n reset: () => void\n}\n\nexport function useMap<K, V>(\n initialValue: Iterable<[K, V]> = [],\n): [Map<K, V>, UseMapActions<K, V>] {\n const [map, setMap] = useState(() => new Map(initialValue))\n\n const actions: UseMapActions<K, V> = {\n set: useCallback((key: K, value: V) => {\n setMap((prev) => {\n const next = new Map(prev)\n next.set(key, value)\n return next\n })\n }, []),\n\n setAll: useCallback((entries: Iterable<[K, V]>) => {\n setMap((prev) => {\n const next = new Map(prev)\n for (const [key, value] of entries) {\n next.set(key, value)\n }\n return next\n })\n }, []),\n\n delete: useCallback((key: K) => {\n setMap((prev) => {\n const next = new Map(prev)\n next.delete(key)\n return next\n })\n }, []),\n\n clear: useCallback(() => {\n setMap(new Map())\n }, []),\n\n reset: useCallback(() => {\n setMap(new Map(initialValue))\n }, []),\n }\n\n return [map, actions]\n}\n","import { useCallback, useState } from 'react'\n\ninterface UseSetActions<T> {\n add: (value: T) => void\n delete: (value: T) => void\n clear: () => void\n reset: () => void\n toggle: (value: T) => void\n}\n\nexport function useSet<T>(initialValue: Iterable<T> = []): [Set<T>, UseSetActions<T>] {\n const [set, setSet] = useState(() => new Set(initialValue))\n\n const actions: UseSetActions<T> = {\n add: useCallback((value: T) => {\n setSet((prev) => new Set([...prev, value]))\n }, []),\n\n delete: useCallback((value: T) => {\n setSet((prev) => {\n const next = new Set(prev)\n next.delete(value)\n return next\n })\n }, []),\n\n clear: useCallback(() => {\n setSet(new Set())\n }, []),\n\n reset: useCallback(() => {\n setSet(new Set(initialValue))\n }, []),\n\n toggle: useCallback((value: T) => {\n setSet((prev) => {\n const next = new Set(prev)\n if (next.has(value)) {\n next.delete(value)\n } else {\n next.add(value)\n }\n return next\n })\n }, []),\n }\n\n return [set, actions]\n}\n","import { useEffect, useRef } from 'react'\n\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T | undefined>(undefined)\n\n useEffect(() => {\n ref.current = value\n }, [value])\n\n return ref.current\n}\n","import { useCallback, useRef, useState } from 'react'\n\ninterface UseStateHistoryReturn<T> {\n value: T\n set: (value: T) => void\n undo: () => void\n redo: () => void\n canUndo: boolean\n canRedo: boolean\n history: T[]\n}\n\nexport function useStateHistory<T>(initialValue: T): UseStateHistoryReturn<T> {\n const [value, setValue] = useState(initialValue)\n const historyRef = useRef<T[]>([initialValue])\n const pointerRef = useRef(0)\n\n const set = useCallback((newValue: T) => {\n const pointer = pointerRef.current\n const newHistory = historyRef.current.slice(0, pointer + 1)\n newHistory.push(newValue)\n historyRef.current = newHistory\n pointerRef.current = newHistory.length - 1\n setValue(newValue)\n }, [])\n\n const undo = useCallback(() => {\n if (pointerRef.current > 0) {\n pointerRef.current -= 1\n setValue(historyRef.current[pointerRef.current]!)\n }\n }, [])\n\n const redo = useCallback(() => {\n if (pointerRef.current < historyRef.current.length - 1) {\n pointerRef.current += 1\n setValue(historyRef.current[pointerRef.current]!)\n }\n }, [])\n\n return {\n value,\n set,\n undo,\n redo,\n canUndo: pointerRef.current > 0,\n canRedo: pointerRef.current < historyRef.current.length - 1,\n history: historyRef.current,\n }\n}\n","import { useCallback, useEffect, useState } from 'react'\n\nfunction getStoredValue<T>(key: string, initialValue: T): T {\n if (typeof window === 'undefined') return initialValue\n try {\n const item = window.localStorage.getItem(key)\n return item ? (JSON.parse(item) as T) : initialValue\n } catch {\n return initialValue\n }\n}\n\nexport function useLocalStorage<T>(\n key: string,\n initialValue: T,\n): [T, (value: T | ((prev: T) => T)) => void, () => void] {\n const [storedValue, setStoredValue] = useState<T>(() => getStoredValue(key, initialValue))\n\n const setValue = useCallback(\n (value: T | ((prev: T) => T)) => {\n setStoredValue((prev) => {\n const nextValue = value instanceof Function ? value(prev) : value\n if (typeof window !== 'undefined') {\n window.localStorage.setItem(key, JSON.stringify(nextValue))\n }\n return nextValue\n })\n },\n [key],\n )\n\n const removeValue = useCallback(() => {\n setStoredValue(initialValue)\n if (typeof window !== 'undefined') {\n window.localStorage.removeItem(key)\n }\n }, [key, initialValue])\n\n useEffect(() => {\n const handleStorageChange = (e: StorageEvent) => {\n if (e.key === key && e.newValue !== null) {\n try {\n setStoredValue(JSON.parse(e.newValue) as T)\n } catch {\n // ignore parse errors\n }\n }\n }\n window.addEventListener('storage', handleStorageChange)\n return () => window.removeEventListener('storage', handleStorageChange)\n }, [key])\n\n return [storedValue, setValue, removeValue]\n}\n","import { useCallback, useState } from 'react'\n\nfunction getStoredValue<T>(key: string, initialValue: T): T {\n if (typeof window === 'undefined') return initialValue\n try {\n const item = window.sessionStorage.getItem(key)\n return item ? (JSON.parse(item) as T) : initialValue\n } catch {\n return initialValue\n }\n}\n\nexport function useSessionStorage<T>(\n key: string,\n initialValue: T,\n): [T, (value: T | ((prev: T) => T)) => void, () => void] {\n const [storedValue, setStoredValue] = useState<T>(() => getStoredValue(key, initialValue))\n\n const setValue = useCallback(\n (value: T | ((prev: T) => T)) => {\n setStoredValue((prev) => {\n const nextValue = value instanceof Function ? value(prev) : value\n if (typeof window !== 'undefined') {\n window.sessionStorage.setItem(key, JSON.stringify(nextValue))\n }\n return nextValue\n })\n },\n [key],\n )\n\n const removeValue = useCallback(() => {\n setStoredValue(initialValue)\n if (typeof window !== 'undefined') {\n window.sessionStorage.removeItem(key)\n }\n }, [key, initialValue])\n\n return [storedValue, setValue, removeValue]\n}\n","import { useEffect, useRef } from 'react'\nimport type { RefObject } from 'react'\n\ntype EventMap = WindowEventMap & DocumentEventMap & HTMLElementEventMap\n\nexport function useEventListener<K extends keyof EventMap>(\n eventName: K,\n handler: (event: EventMap[K]) => void,\n element?: RefObject<HTMLElement | null> | null,\n options?: boolean | AddEventListenerOptions,\n): void {\n const savedHandler = useRef(handler)\n\n useEffect(() => {\n savedHandler.current = handler\n }, [handler])\n\n useEffect(() => {\n const target = element?.current ?? window\n if (!target?.addEventListener) return\n\n const listener = (event: Event) => savedHandler.current(event as EventMap[K])\n target.addEventListener(eventName, listener, options)\n return () => target.removeEventListener(eventName, listener, options)\n }, [eventName, element, options])\n}\n","import { useEffect, useRef } from 'react'\nimport type { RefObject } from 'react'\n\nexport function useClickOutside<T extends HTMLElement>(\n handler: (event: MouseEvent | TouchEvent) => void,\n): RefObject<T | null> {\n const ref = useRef<T | null>(null)\n const savedHandler = useRef(handler)\n\n useEffect(() => {\n savedHandler.current = handler\n }, [handler])\n\n useEffect(() => {\n const listener = (event: MouseEvent | TouchEvent) => {\n if (!ref.current || ref.current.contains(event.target as Node)) return\n savedHandler.current(event)\n }\n document.addEventListener('mousedown', listener)\n document.addEventListener('touchstart', listener)\n return () => {\n document.removeEventListener('mousedown', listener)\n document.removeEventListener('touchstart', listener)\n }\n }, [])\n\n return ref\n}\n","import { useCallback, useRef, useState } from 'react'\n\nexport function useHover<T extends HTMLElement>(): [\n (node: T | null) => void,\n boolean,\n] {\n const [isHovered, setIsHovered] = useState(false)\n const ref = useRef<T | null>(null)\n\n const handleMouseEnter = useCallback(() => setIsHovered(true), [])\n const handleMouseLeave = useCallback(() => setIsHovered(false), [])\n\n const callbackRef = useCallback(\n (node: T | null) => {\n if (ref.current) {\n ref.current.removeEventListener('mouseenter', handleMouseEnter)\n ref.current.removeEventListener('mouseleave', handleMouseLeave)\n }\n ref.current = node\n if (node) {\n node.addEventListener('mouseenter', handleMouseEnter)\n node.addEventListener('mouseleave', handleMouseLeave)\n }\n },\n [handleMouseEnter, handleMouseLeave],\n )\n\n return [callbackRef, isHovered]\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { RefObject } from 'react'\n\ninterface UseIntersectionObserverOptions {\n threshold?: number | number[]\n root?: Element | null\n rootMargin?: string\n freezeOnceVisible?: boolean\n}\n\ninterface UseIntersectionObserverReturn {\n ref: RefObject<HTMLElement | null>\n isIntersecting: boolean\n entry: IntersectionObserverEntry | null\n}\n\nexport function useIntersectionObserver(\n options: UseIntersectionObserverOptions = {},\n): UseIntersectionObserverReturn {\n const { threshold = 0, root = null, rootMargin = '0px', freezeOnceVisible = false } = options\n const ref = useRef<HTMLElement | null>(null)\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null)\n\n const frozen = entry?.isIntersecting && freezeOnceVisible\n\n useEffect(() => {\n const node = ref.current\n if (!node || frozen) return\n\n const observer = new IntersectionObserver(\n ([observerEntry]) => {\n if (observerEntry) setEntry(observerEntry)\n },\n { threshold, root, rootMargin },\n )\n\n observer.observe(node)\n return () => observer.disconnect()\n }, [threshold, root, rootMargin, frozen])\n\n return {\n ref,\n isIntersecting: entry?.isIntersecting ?? false,\n entry,\n }\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { RefObject } from 'react'\n\ninterface Size {\n width: number\n height: number\n}\n\nexport function useResizeObserver<T extends HTMLElement>(): [RefObject<T | null>, Size] {\n const ref = useRef<T | null>(null)\n const [size, setSize] = useState<Size>({ width: 0, height: 0 })\n\n useEffect(() => {\n const node = ref.current\n if (!node) return\n\n const observer = new ResizeObserver(([resizeEntry]) => {\n if (resizeEntry) {\n const { width, height } = resizeEntry.contentRect\n setSize({ width, height })\n }\n })\n\n observer.observe(node)\n return () => observer.disconnect()\n }, [])\n\n return [ref, size]\n}\n","import { useEffect, useRef } from 'react'\nimport type { RefObject } from 'react'\n\nexport function useMutationObserver(\n callback: MutationCallback,\n options: MutationObserverInit = { childList: true, subtree: true },\n): RefObject<HTMLElement | null> {\n const ref = useRef<HTMLElement | null>(null)\n const savedCallback = useRef(callback)\n\n useEffect(() => {\n savedCallback.current = callback\n }, [callback])\n\n useEffect(() => {\n const node = ref.current\n if (!node) return\n\n const observer = new MutationObserver((...args) => savedCallback.current(...args))\n observer.observe(node, options)\n return () => observer.disconnect()\n }, [options])\n\n return ref\n}\n","import { useEffect, useState } from 'react'\n\nexport function useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState(() => {\n if (typeof window === 'undefined') return false\n return window.matchMedia(query).matches\n })\n\n useEffect(() => {\n const mql = window.matchMedia(query)\n const handler = (e: MediaQueryListEvent) => setMatches(e.matches)\n\n setMatches(mql.matches)\n mql.addEventListener('change', handler)\n return () => mql.removeEventListener('change', handler)\n }, [query])\n\n return matches\n}\n","import { useEffect, useState } from 'react'\n\ninterface WindowSize {\n width: number\n height: number\n}\n\nexport function useWindowSize(): WindowSize {\n const [size, setSize] = useState<WindowSize>(() => ({\n width: typeof window !== 'undefined' ? window.innerWidth : 0,\n height: typeof window !== 'undefined' ? window.innerHeight : 0,\n }))\n\n useEffect(() => {\n const handleResize = () => {\n setSize({ width: window.innerWidth, height: window.innerHeight })\n }\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [])\n\n return size\n}\n","import { useEffect, useState } from 'react'\nimport type { RefObject } from 'react'\n\ninterface ScrollPosition {\n x: number\n y: number\n}\n\nexport function useScroll(element?: RefObject<HTMLElement | null>): ScrollPosition {\n const [position, setPosition] = useState<ScrollPosition>({ x: 0, y: 0 })\n\n useEffect(() => {\n const target = element?.current ?? window\n\n const handleScroll = () => {\n if ('scrollX' in target) {\n setPosition({ x: (target as Window).scrollX ?? 0, y: (target as Window).scrollY ?? 0 })\n } else if (target instanceof HTMLElement) {\n setPosition({ x: target.scrollLeft, y: target.scrollTop })\n }\n }\n\n handleScroll()\n target.addEventListener('scroll', handleScroll, { passive: true })\n return () => target.removeEventListener('scroll', handleScroll)\n }, [element])\n\n return position\n}\n","import { useEffect, useState } from 'react'\n\ninterface MousePosition {\n x: number\n y: number\n}\n\nexport function useMouse(): MousePosition {\n const [position, setPosition] = useState<MousePosition>({ x: 0, y: 0 })\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n setPosition({ x: e.clientX, y: e.clientY })\n }\n window.addEventListener('mousemove', handleMouseMove)\n return () => window.removeEventListener('mousemove', handleMouseMove)\n }, [])\n\n return position\n}\n","import { useEffect, useState } from 'react'\n\ninterface NetworkState {\n online: boolean\n downlink?: number\n effectiveType?: string\n rtt?: number\n saveData?: boolean\n}\n\ninterface NetworkInformation extends EventTarget {\n downlink?: number\n effectiveType?: string\n rtt?: number\n saveData?: boolean\n}\n\nexport function useNetwork(): NetworkState {\n const [state, setState] = useState<NetworkState>(() => ({\n online: typeof navigator !== 'undefined' ? navigator.onLine : true,\n }))\n\n useEffect(() => {\n const connection = (navigator as unknown as { connection?: NetworkInformation }).connection\n\n const updateNetworkInfo = () => {\n setState({\n online: navigator.onLine,\n downlink: connection?.downlink,\n effectiveType: connection?.effectiveType,\n rtt: connection?.rtt,\n saveData: connection?.saveData,\n })\n }\n\n updateNetworkInfo()\n window.addEventListener('online', updateNetworkInfo)\n window.addEventListener('offline', updateNetworkInfo)\n connection?.addEventListener?.('change', updateNetworkInfo)\n\n return () => {\n window.removeEventListener('online', updateNetworkInfo)\n window.removeEventListener('offline', updateNetworkInfo)\n connection?.removeEventListener?.('change', updateNetworkInfo)\n }\n }, [])\n\n return state\n}\n","import { useEffect, useState } from 'react'\n\nexport function useDebounceValue<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState(value)\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay)\n return () => clearTimeout(timer)\n }, [value, delay])\n\n return debouncedValue\n}\n","import { useCallback, useEffect, useRef } from 'react'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useDebounceCallback<T extends (...args: any[]) => any>(\n callback: T,\n delay: number,\n): (...args: Parameters<T>) => void {\n const callbackRef = useRef(callback)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => {\n callbackRef.current = callback\n }, [callback])\n\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n }, [])\n\n return useCallback(\n (...args: Parameters<T>) => {\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => callbackRef.current(...args), delay)\n },\n [delay],\n )\n}\n","import { useEffect, useRef, useState } from 'react'\n\nexport function useThrottleValue<T>(value: T, interval: number): T {\n const [throttledValue, setThrottledValue] = useState(value)\n const lastUpdated = useRef(Date.now())\n\n useEffect(() => {\n const now = Date.now()\n const elapsed = now - lastUpdated.current\n\n if (elapsed >= interval) {\n lastUpdated.current = now\n setThrottledValue(value)\n } else {\n const timer = setTimeout(() => {\n lastUpdated.current = Date.now()\n setThrottledValue(value)\n }, interval - elapsed)\n return () => clearTimeout(timer)\n }\n }, [value, interval])\n\n return throttledValue\n}\n","import { useCallback, useEffect, useRef } from 'react'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useThrottleCallback<T extends (...args: any[]) => any>(\n callback: T,\n interval: number,\n): (...args: Parameters<T>) => void {\n const callbackRef = useRef(callback)\n const lastCalledRef = useRef(0)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => {\n callbackRef.current = callback\n }, [callback])\n\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n }, [])\n\n return useCallback(\n (...args: Parameters<T>) => {\n const now = Date.now()\n const elapsed = now - lastCalledRef.current\n\n if (elapsed >= interval) {\n lastCalledRef.current = now\n callbackRef.current(...args)\n } else if (!timerRef.current) {\n timerRef.current = setTimeout(() => {\n lastCalledRef.current = Date.now()\n timerRef.current = null\n callbackRef.current(...args)\n }, interval - elapsed)\n }\n },\n [interval],\n )\n}\n","import { useEffect } from 'react'\n\nexport function useMount(callback: () => void): void {\n useEffect(() => {\n callback()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n}\n","import { useEffect, useRef } from 'react'\n\nexport function useUnmount(callback: () => void): void {\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n\n useEffect(() => {\n return () => callbackRef.current()\n }, [])\n}\n","import { useEffect, useRef } from 'react'\nimport type { DependencyList, EffectCallback } from 'react'\n\nexport function useUpdateEffect(effect: EffectCallback, deps?: DependencyList): void {\n const isFirst = useRef(true)\n\n useEffect(() => {\n if (isFirst.current) {\n isFirst.current = false\n return\n }\n return effect()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps)\n}\n","import { useCallback, useEffect, useRef } from 'react'\n\nexport function useIsMounted(): () => boolean {\n const isMounted = useRef(false)\n\n useEffect(() => {\n isMounted.current = true\n return () => {\n isMounted.current = false\n }\n }, [])\n\n return useCallback(() => isMounted.current, [])\n}\n","import { useEffect, useLayoutEffect } from 'react'\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? useLayoutEffect : useEffect\n","import { useEffect, useRef } from 'react'\nimport type { DependencyList, EffectCallback } from 'react'\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true\n if (typeof a !== typeof b) return false\n if (a === null || b === null) return false\n if (typeof a !== 'object') return false\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n return a.every((item, index) => deepEqual(item, b[index]))\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false\n\n const objA = a as Record<string, unknown>\n const objB = b as Record<string, unknown>\n\n const keysA = Object.keys(objA)\n const keysB = Object.keys(objB)\n\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(objB, key)) return false\n if (!deepEqual(objA[key], objB[key])) return false\n }\n\n return true\n}\n\nfunction useDeepCompareMemoize(deps: DependencyList): DependencyList {\n const ref = useRef<DependencyList>(deps)\n\n if (!deepEqual(deps, ref.current)) {\n ref.current = deps\n }\n\n return ref.current\n}\n\nexport function useDeepCompareEffect(effect: EffectCallback, deps: DependencyList): void {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(effect, useDeepCompareMemoize(deps))\n}\n","import { useEffect } from 'react'\n\nexport function useScrollLock(locked: boolean): void {\n useEffect(() => {\n if (!locked) return\n\n const originalOverflow = document.body.style.overflow\n const originalPaddingRight = document.body.style.paddingRight\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n\n document.body.style.overflow = 'hidden'\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`\n }\n\n return () => {\n document.body.style.overflow = originalOverflow\n document.body.style.paddingRight = originalPaddingRight\n }\n }, [locked])\n}\n","import { useCallback, useEffect, useState } from 'react'\n\ntype Theme = 'light' | 'dark' | 'system'\n\ninterface UseDarkModeReturn {\n isDark: boolean\n theme: Theme\n setTheme: (theme: Theme) => void\n toggle: () => void\n}\n\nexport function useDarkMode(defaultTheme: Theme = 'system'): UseDarkModeReturn {\n const [theme, setThemeState] = useState<Theme>(() => {\n if (typeof window === 'undefined') return defaultTheme\n return (localStorage.getItem('theme') as Theme) ?? defaultTheme\n })\n\n const [systemDark, setSystemDark] = useState(() => {\n if (typeof window === 'undefined') return false\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n })\n\n useEffect(() => {\n const mql = window.matchMedia('(prefers-color-scheme: dark)')\n const handler = (e: MediaQueryListEvent) => setSystemDark(e.matches)\n mql.addEventListener('change', handler)\n return () => mql.removeEventListener('change', handler)\n }, [])\n\n const isDark = theme === 'system' ? systemDark : theme === 'dark'\n\n const setTheme = useCallback((newTheme: Theme) => {\n setThemeState(newTheme)\n localStorage.setItem('theme', newTheme)\n }, [])\n\n const toggle = useCallback(() => {\n setTheme(isDark ? 'light' : 'dark')\n }, [isDark, setTheme])\n\n useEffect(() => {\n document.documentElement.classList.toggle('dark', isDark)\n }, [isDark])\n\n return { isDark, theme, setTheme, toggle }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { RefObject } from 'react'\n\ninterface UseFullscreenReturn {\n ref: RefObject<HTMLElement | null>\n isFullscreen: boolean\n enter: () => Promise<void>\n exit: () => Promise<void>\n toggle: () => Promise<void>\n}\n\nexport function useFullscreen(): UseFullscreenReturn {\n const ref = useRef<HTMLElement | null>(null)\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n useEffect(() => {\n const handler = () => setIsFullscreen(!!document.fullscreenElement)\n document.addEventListener('fullscreenchange', handler)\n return () => document.removeEventListener('fullscreenchange', handler)\n }, [])\n\n const enter = useCallback(async () => {\n const element = ref.current\n if (element) await element.requestFullscreen()\n }, [])\n\n const exit = useCallback(async () => {\n if (document.fullscreenElement) await document.exitFullscreen()\n }, [])\n\n const toggle = useCallback(async () => {\n if (isFullscreen) await exit()\n else await enter()\n }, [isFullscreen, enter, exit])\n\n return { ref, isFullscreen, enter, exit, toggle }\n}\n","import { useCallback, useState } from 'react'\n\ninterface UseCopyToClipboardReturn {\n copiedText: string | null\n copy: (text: string) => Promise<boolean>\n}\n\nexport function useCopyToClipboard(): UseCopyToClipboardReturn {\n const [copiedText, setCopiedText] = useState<string | null>(null)\n\n const copy = useCallback(async (text: string): Promise<boolean> => {\n if (!navigator?.clipboard) {\n return false\n }\n try {\n await navigator.clipboard.writeText(text)\n setCopiedText(text)\n return true\n } catch {\n setCopiedText(null)\n return false\n }\n }, [])\n\n return { copiedText, copy }\n}\n","import { useEffect, useRef } from 'react'\n\nfunction parseKeyCombo(combo: string): {\n key: string\n ctrl: boolean\n shift: boolean\n alt: boolean\n meta: boolean\n} {\n const parts = combo.toLowerCase().split('+')\n return {\n key: parts[parts.length - 1]!,\n ctrl: parts.includes('ctrl') || parts.includes('control'),\n shift: parts.includes('shift'),\n alt: parts.includes('alt'),\n meta: parts.includes('meta') || parts.includes('cmd'),\n }\n}\n\nexport function useHotkeys(\n keyCombo: string,\n callback: (event: KeyboardEvent) => void,\n enabled = true,\n): void {\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n\n useEffect(() => {\n if (!enabled) return\n\n const parsed = parseKeyCombo(keyCombo)\n\n const handler = (event: KeyboardEvent) => {\n const matches =\n event.key.toLowerCase() === parsed.key &&\n event.ctrlKey === parsed.ctrl &&\n event.shiftKey === parsed.shift &&\n event.altKey === parsed.alt &&\n event.metaKey === parsed.meta\n\n if (matches) {\n event.preventDefault()\n callbackRef.current(event)\n }\n }\n\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [keyCombo, enabled])\n}\n","import { useCallback, useEffect, useState } from 'react'\n\ninterface AsyncState<T> {\n data: T | null\n loading: boolean\n error: Error | null\n}\n\ninterface UseAsyncReturn<T> extends AsyncState<T> {\n execute: () => Promise<void>\n}\n\nexport function useAsync<T>(\n asyncFunction: () => Promise<T>,\n immediate = true,\n): UseAsyncReturn<T> {\n const [state, setState] = useState<AsyncState<T>>({\n data: null,\n loading: immediate,\n error: null,\n })\n\n const execute = useCallback(async () => {\n setState({ data: null, loading: true, error: null })\n try {\n const data = await asyncFunction()\n setState({ data, loading: false, error: null })\n } catch (error) {\n setState({ data: null, loading: false, error: error as Error })\n }\n }, [asyncFunction])\n\n useEffect(() => {\n if (immediate) {\n execute()\n }\n }, [execute, immediate])\n\n return { ...state, execute }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\n\ninterface UseFetchOptions extends RequestInit {\n enabled?: boolean\n}\n\ninterface UseFetchReturn<T> {\n data: T | null\n loading: boolean\n error: Error | null\n refetch: () => Promise<void>\n}\n\nexport function useFetch<T>(url: string, options: UseFetchOptions = {}): UseFetchReturn<T> {\n const { enabled = true, ...fetchOptions } = options\n const [data, setData] = useState<T | null>(null)\n const [loading, setLoading] = useState(enabled)\n const [error, setError] = useState<Error | null>(null)\n const abortControllerRef = useRef<AbortController | null>(null)\n\n const fetchData = useCallback(async () => {\n abortControllerRef.current?.abort()\n abortControllerRef.current = new AbortController()\n\n setLoading(true)\n setError(null)\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n signal: abortControllerRef.current.signal,\n })\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n const json = (await response.json()) as T\n setData(json)\n } catch (err) {\n if ((err as Error).name !== 'AbortError') {\n setError(err as Error)\n }\n } finally {\n setLoading(false)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url])\n\n useEffect(() => {\n if (!enabled) return\n fetchData()\n return () => abortControllerRef.current?.abort()\n }, [fetchData, enabled])\n\n return { data, loading, error, refetch: fetchData }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { RefObject } from 'react'\n\ninterface UseInfiniteScrollOptions {\n threshold?: number\n rootMargin?: string\n}\n\ninterface UseInfiniteScrollReturn {\n sentinelRef: RefObject<HTMLElement | null>\n loading: boolean\n reset: () => void\n}\n\nexport function useInfiniteScroll(\n loadMore: () => Promise<void>,\n hasMore: boolean,\n options: UseInfiniteScrollOptions = {},\n): UseInfiniteScrollReturn {\n const { threshold = 0, rootMargin = '100px' } = options\n const sentinelRef = useRef<HTMLElement | null>(null)\n const [loading, setLoading] = useState(false)\n const loadingRef = useRef(false)\n\n const handleLoadMore = useCallback(async () => {\n if (loadingRef.current || !hasMore) return\n loadingRef.current = true\n setLoading(true)\n try {\n await loadMore()\n } finally {\n loadingRef.current = false\n setLoading(false)\n }\n }, [loadMore, hasMore])\n\n useEffect(() => {\n const node = sentinelRef.current\n if (!node || !hasMore) return\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry?.isIntersecting) {\n handleLoadMore()\n }\n },\n { threshold, rootMargin },\n )\n\n observer.observe(node)\n return () => observer.disconnect()\n }, [handleLoadMore, hasMore, threshold, rootMargin])\n\n const reset = useCallback(() => {\n loadingRef.current = false\n setLoading(false)\n }, [])\n\n return { sentinelRef, loading, reset }\n}\n","import { useCallback, useMemo, useState } from 'react'\n\ninterface UsePaginationOptions {\n totalItems: number\n pageSize?: number\n initialPage?: number\n}\n\ninterface UsePaginationReturn {\n page: number\n pageSize: number\n totalPages: number\n hasNext: boolean\n hasPrev: boolean\n next: () => void\n prev: () => void\n setPage: (page: number) => void\n setPageSize: (size: number) => void\n startIndex: number\n endIndex: number\n}\n\nexport function usePagination(options: UsePaginationOptions): UsePaginationReturn {\n const { totalItems, pageSize: initialPageSize = 10, initialPage = 1 } = options\n const [page, setPageState] = useState(initialPage)\n const [pageSize, setPageSizeState] = useState(initialPageSize)\n\n const totalPages = useMemo(\n () => Math.max(1, Math.ceil(totalItems / pageSize)),\n [totalItems, pageSize],\n )\n\n const setPage = useCallback(\n (newPage: number) => {\n setPageState(Math.min(Math.max(1, newPage), totalPages))\n },\n [totalPages],\n )\n\n const setPageSize = useCallback((newSize: number) => {\n setPageSizeState(newSize)\n setPageState(1)\n }, [])\n\n const next = useCallback(() => setPage(page + 1), [page, setPage])\n const prev = useCallback(() => setPage(page - 1), [page, setPage])\n\n const startIndex = (page - 1) * pageSize\n const endIndex = Math.min(startIndex + pageSize - 1, totalItems - 1)\n\n return {\n page,\n pageSize,\n totalPages,\n hasNext: page < totalPages,\n hasPrev: page > 1,\n next,\n prev,\n setPage,\n setPageSize,\n startIndex,\n endIndex,\n }\n}\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var navigation = require('next/navigation');
|
|
5
|
+
|
|
6
|
+
function useQueryParams() {
|
|
7
|
+
const searchParams = navigation.useSearchParams();
|
|
8
|
+
const router = navigation.useRouter();
|
|
9
|
+
const pathname = navigation.usePathname();
|
|
10
|
+
const params = Object.fromEntries(searchParams.entries());
|
|
11
|
+
const updateParams = react.useCallback(
|
|
12
|
+
(updater) => {
|
|
13
|
+
const newParams = updater(new URLSearchParams(searchParams.toString()));
|
|
14
|
+
const query = newParams.toString();
|
|
15
|
+
router.push(query ? `${pathname}?${query}` : pathname);
|
|
16
|
+
},
|
|
17
|
+
[searchParams, router, pathname]
|
|
18
|
+
);
|
|
19
|
+
const set = react.useCallback(
|
|
20
|
+
(key, value) => {
|
|
21
|
+
updateParams((p) => {
|
|
22
|
+
p.set(key, value);
|
|
23
|
+
return p;
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
[updateParams]
|
|
27
|
+
);
|
|
28
|
+
const setAll = react.useCallback(
|
|
29
|
+
(newParams) => {
|
|
30
|
+
updateParams((p) => {
|
|
31
|
+
Object.entries(newParams).forEach(([key, value]) => {
|
|
32
|
+
if (value !== void 0) p.set(key, value);
|
|
33
|
+
});
|
|
34
|
+
return p;
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
[updateParams]
|
|
38
|
+
);
|
|
39
|
+
const deleteParam = react.useCallback(
|
|
40
|
+
(key) => {
|
|
41
|
+
updateParams((p) => {
|
|
42
|
+
p.delete(key);
|
|
43
|
+
return p;
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
[updateParams]
|
|
47
|
+
);
|
|
48
|
+
const clear = react.useCallback(() => {
|
|
49
|
+
router.push(pathname);
|
|
50
|
+
}, [router, pathname]);
|
|
51
|
+
return { params, set, setAll, delete: deleteParam, clear };
|
|
52
|
+
}
|
|
53
|
+
function useRouteChange(callbacks) {
|
|
54
|
+
const pathname = navigation.usePathname();
|
|
55
|
+
const searchParams = navigation.useSearchParams();
|
|
56
|
+
const savedCallbacks = react.useRef(callbacks);
|
|
57
|
+
const prevUrl = react.useRef(`${pathname}?${searchParams.toString()}`);
|
|
58
|
+
react.useEffect(() => {
|
|
59
|
+
savedCallbacks.current = callbacks;
|
|
60
|
+
}, [callbacks]);
|
|
61
|
+
react.useEffect(() => {
|
|
62
|
+
const currentUrl = `${pathname}?${searchParams.toString()}`;
|
|
63
|
+
if (currentUrl !== prevUrl.current) {
|
|
64
|
+
savedCallbacks.current.onComplete?.(currentUrl);
|
|
65
|
+
prevUrl.current = currentUrl;
|
|
66
|
+
}
|
|
67
|
+
}, [pathname, searchParams]);
|
|
68
|
+
}
|
|
69
|
+
function useSafeAction(action) {
|
|
70
|
+
const [data, setData] = react.useState(null);
|
|
71
|
+
const [error, setError] = react.useState(null);
|
|
72
|
+
const [isPending, startTransition] = react.useTransition();
|
|
73
|
+
const execute = react.useCallback(
|
|
74
|
+
(input) => {
|
|
75
|
+
startTransition(async () => {
|
|
76
|
+
setError(null);
|
|
77
|
+
try {
|
|
78
|
+
const result = await action(input);
|
|
79
|
+
setData(result);
|
|
80
|
+
} catch (err) {
|
|
81
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
[action]
|
|
86
|
+
);
|
|
87
|
+
const reset = react.useCallback(() => {
|
|
88
|
+
setData(null);
|
|
89
|
+
setError(null);
|
|
90
|
+
}, []);
|
|
91
|
+
return { execute, data, error, loading: isPending, reset };
|
|
92
|
+
}
|
|
93
|
+
var subscribe = () => () => {
|
|
94
|
+
};
|
|
95
|
+
var getSnapshot = () => false;
|
|
96
|
+
var getServerSnapshot = () => true;
|
|
97
|
+
function useIsServer() {
|
|
98
|
+
return react.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
exports.useIsServer = useIsServer;
|
|
102
|
+
exports.useQueryParams = useQueryParams;
|
|
103
|
+
exports.useRouteChange = useRouteChange;
|
|
104
|
+
exports.useSafeAction = useSafeAction;
|
|
105
|
+
//# sourceMappingURL=index.cjs.map
|
|
106
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/next/useQueryParams.ts","../../src/next/useRouteChange.ts","../../src/next/useSafeAction.ts","../../src/next/useIsServer.ts"],"names":["useSearchParams","useRouter","usePathname","useCallback","useRef","useEffect","useState","useTransition","useSyncExternalStore"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client'\n\nimport { useCallback } from 'react'\nimport { useSearchParams, useRouter, usePathname } from 'next/navigation'\n\nexport function useQueryParams<T extends Record<string, string>>(): {\n params: Partial<T>\n set: (key: keyof T, value: string) => void\n setAll: (params: Partial<T>) => void\n delete: (key: keyof T) => void\n clear: () => void\n} {\n const searchParams = useSearchParams()\n const router = useRouter()\n const pathname = usePathname()\n\n const params = Object.fromEntries(searchParams.entries()) as Partial<T>\n\n const updateParams = useCallback(\n (updater: (params: URLSearchParams) => URLSearchParams) => {\n const newParams = updater(new URLSearchParams(searchParams.toString()))\n const query = newParams.toString()\n router.push(query ? `${pathname}?${query}` : pathname)\n },\n [searchParams, router, pathname],\n )\n\n const set = useCallback(\n (key: keyof T, value: string) => {\n updateParams((p) => {\n p.set(key as string, value)\n return p\n })\n },\n [updateParams],\n )\n\n const setAll = useCallback(\n (newParams: Partial<T>) => {\n updateParams((p) => {\n Object.entries(newParams).forEach(([key, value]) => {\n if (value !== undefined) p.set(key, value as string)\n })\n return p\n })\n },\n [updateParams],\n )\n\n const deleteParam = useCallback(\n (key: keyof T) => {\n updateParams((p) => {\n p.delete(key as string)\n return p\n })\n },\n [updateParams],\n )\n\n const clear = useCallback(() => {\n router.push(pathname)\n }, [router, pathname])\n\n return { params, set, setAll, delete: deleteParam, clear }\n}\n","'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { usePathname, useSearchParams } from 'next/navigation'\n\ninterface UseRouteChangeCallbacks {\n onComplete?: (url: string) => void\n}\n\nexport function useRouteChange(callbacks: UseRouteChangeCallbacks): void {\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const savedCallbacks = useRef(callbacks)\n const prevUrl = useRef(`${pathname}?${searchParams.toString()}`)\n\n useEffect(() => {\n savedCallbacks.current = callbacks\n }, [callbacks])\n\n useEffect(() => {\n const currentUrl = `${pathname}?${searchParams.toString()}`\n if (currentUrl !== prevUrl.current) {\n savedCallbacks.current.onComplete?.(currentUrl)\n prevUrl.current = currentUrl\n }\n }, [pathname, searchParams])\n}\n","'use client'\n\nimport { useCallback, useState, useTransition } from 'react'\n\ninterface UseSafeActionReturn<TInput, TOutput> {\n execute: (input: TInput) => void\n data: TOutput | null\n error: Error | null\n loading: boolean\n reset: () => void\n}\n\nexport function useSafeAction<TInput, TOutput>(\n action: (input: TInput) => Promise<TOutput>,\n): UseSafeActionReturn<TInput, TOutput> {\n const [data, setData] = useState<TOutput | null>(null)\n const [error, setError] = useState<Error | null>(null)\n const [isPending, startTransition] = useTransition()\n\n const execute = useCallback(\n (input: TInput) => {\n startTransition(async () => {\n setError(null)\n try {\n const result = await action(input)\n setData(result)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n }\n })\n },\n [action],\n )\n\n const reset = useCallback(() => {\n setData(null)\n setError(null)\n }, [])\n\n return { execute, data, error, loading: isPending, reset }\n}\n","import { useSyncExternalStore } from 'react'\n\nconst subscribe = (): (() => void) => () => {}\nconst getSnapshot = (): boolean => false\nconst getServerSnapshot = (): boolean => true\n\nexport function useIsServer(): boolean {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
declare function useQueryParams<T extends Record<string, string>>(): {
|
|
2
|
+
params: Partial<T>;
|
|
3
|
+
set: (key: keyof T, value: string) => void;
|
|
4
|
+
setAll: (params: Partial<T>) => void;
|
|
5
|
+
delete: (key: keyof T) => void;
|
|
6
|
+
clear: () => void;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
interface UseRouteChangeCallbacks {
|
|
10
|
+
onComplete?: (url: string) => void;
|
|
11
|
+
}
|
|
12
|
+
declare function useRouteChange(callbacks: UseRouteChangeCallbacks): void;
|
|
13
|
+
|
|
14
|
+
interface UseSafeActionReturn<TInput, TOutput> {
|
|
15
|
+
execute: (input: TInput) => void;
|
|
16
|
+
data: TOutput | null;
|
|
17
|
+
error: Error | null;
|
|
18
|
+
loading: boolean;
|
|
19
|
+
reset: () => void;
|
|
20
|
+
}
|
|
21
|
+
declare function useSafeAction<TInput, TOutput>(action: (input: TInput) => Promise<TOutput>): UseSafeActionReturn<TInput, TOutput>;
|
|
22
|
+
|
|
23
|
+
declare function useIsServer(): boolean;
|
|
24
|
+
|
|
25
|
+
export { useIsServer, useQueryParams, useRouteChange, useSafeAction };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
declare function useQueryParams<T extends Record<string, string>>(): {
|
|
2
|
+
params: Partial<T>;
|
|
3
|
+
set: (key: keyof T, value: string) => void;
|
|
4
|
+
setAll: (params: Partial<T>) => void;
|
|
5
|
+
delete: (key: keyof T) => void;
|
|
6
|
+
clear: () => void;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
interface UseRouteChangeCallbacks {
|
|
10
|
+
onComplete?: (url: string) => void;
|
|
11
|
+
}
|
|
12
|
+
declare function useRouteChange(callbacks: UseRouteChangeCallbacks): void;
|
|
13
|
+
|
|
14
|
+
interface UseSafeActionReturn<TInput, TOutput> {
|
|
15
|
+
execute: (input: TInput) => void;
|
|
16
|
+
data: TOutput | null;
|
|
17
|
+
error: Error | null;
|
|
18
|
+
loading: boolean;
|
|
19
|
+
reset: () => void;
|
|
20
|
+
}
|
|
21
|
+
declare function useSafeAction<TInput, TOutput>(action: (input: TInput) => Promise<TOutput>): UseSafeActionReturn<TInput, TOutput>;
|
|
22
|
+
|
|
23
|
+
declare function useIsServer(): boolean;
|
|
24
|
+
|
|
25
|
+
export { useIsServer, useQueryParams, useRouteChange, useSafeAction };
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { useCallback, useRef, useEffect, useState, useTransition, useSyncExternalStore } from 'react';
|
|
2
|
+
import { useSearchParams, useRouter, usePathname } from 'next/navigation';
|
|
3
|
+
|
|
4
|
+
function useQueryParams() {
|
|
5
|
+
const searchParams = useSearchParams();
|
|
6
|
+
const router = useRouter();
|
|
7
|
+
const pathname = usePathname();
|
|
8
|
+
const params = Object.fromEntries(searchParams.entries());
|
|
9
|
+
const updateParams = useCallback(
|
|
10
|
+
(updater) => {
|
|
11
|
+
const newParams = updater(new URLSearchParams(searchParams.toString()));
|
|
12
|
+
const query = newParams.toString();
|
|
13
|
+
router.push(query ? `${pathname}?${query}` : pathname);
|
|
14
|
+
},
|
|
15
|
+
[searchParams, router, pathname]
|
|
16
|
+
);
|
|
17
|
+
const set = useCallback(
|
|
18
|
+
(key, value) => {
|
|
19
|
+
updateParams((p) => {
|
|
20
|
+
p.set(key, value);
|
|
21
|
+
return p;
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
[updateParams]
|
|
25
|
+
);
|
|
26
|
+
const setAll = useCallback(
|
|
27
|
+
(newParams) => {
|
|
28
|
+
updateParams((p) => {
|
|
29
|
+
Object.entries(newParams).forEach(([key, value]) => {
|
|
30
|
+
if (value !== void 0) p.set(key, value);
|
|
31
|
+
});
|
|
32
|
+
return p;
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
[updateParams]
|
|
36
|
+
);
|
|
37
|
+
const deleteParam = useCallback(
|
|
38
|
+
(key) => {
|
|
39
|
+
updateParams((p) => {
|
|
40
|
+
p.delete(key);
|
|
41
|
+
return p;
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
[updateParams]
|
|
45
|
+
);
|
|
46
|
+
const clear = useCallback(() => {
|
|
47
|
+
router.push(pathname);
|
|
48
|
+
}, [router, pathname]);
|
|
49
|
+
return { params, set, setAll, delete: deleteParam, clear };
|
|
50
|
+
}
|
|
51
|
+
function useRouteChange(callbacks) {
|
|
52
|
+
const pathname = usePathname();
|
|
53
|
+
const searchParams = useSearchParams();
|
|
54
|
+
const savedCallbacks = useRef(callbacks);
|
|
55
|
+
const prevUrl = useRef(`${pathname}?${searchParams.toString()}`);
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
savedCallbacks.current = callbacks;
|
|
58
|
+
}, [callbacks]);
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
const currentUrl = `${pathname}?${searchParams.toString()}`;
|
|
61
|
+
if (currentUrl !== prevUrl.current) {
|
|
62
|
+
savedCallbacks.current.onComplete?.(currentUrl);
|
|
63
|
+
prevUrl.current = currentUrl;
|
|
64
|
+
}
|
|
65
|
+
}, [pathname, searchParams]);
|
|
66
|
+
}
|
|
67
|
+
function useSafeAction(action) {
|
|
68
|
+
const [data, setData] = useState(null);
|
|
69
|
+
const [error, setError] = useState(null);
|
|
70
|
+
const [isPending, startTransition] = useTransition();
|
|
71
|
+
const execute = useCallback(
|
|
72
|
+
(input) => {
|
|
73
|
+
startTransition(async () => {
|
|
74
|
+
setError(null);
|
|
75
|
+
try {
|
|
76
|
+
const result = await action(input);
|
|
77
|
+
setData(result);
|
|
78
|
+
} catch (err) {
|
|
79
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
},
|
|
83
|
+
[action]
|
|
84
|
+
);
|
|
85
|
+
const reset = useCallback(() => {
|
|
86
|
+
setData(null);
|
|
87
|
+
setError(null);
|
|
88
|
+
}, []);
|
|
89
|
+
return { execute, data, error, loading: isPending, reset };
|
|
90
|
+
}
|
|
91
|
+
var subscribe = () => () => {
|
|
92
|
+
};
|
|
93
|
+
var getSnapshot = () => false;
|
|
94
|
+
var getServerSnapshot = () => true;
|
|
95
|
+
function useIsServer() {
|
|
96
|
+
return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export { useIsServer, useQueryParams, useRouteChange, useSafeAction };
|
|
100
|
+
//# sourceMappingURL=index.mjs.map
|
|
101
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/next/useQueryParams.ts","../../src/next/useRouteChange.ts","../../src/next/useSafeAction.ts","../../src/next/useIsServer.ts"],"names":["usePathname","useSearchParams","useCallback"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client'\n\nimport { useCallback } from 'react'\nimport { useSearchParams, useRouter, usePathname } from 'next/navigation'\n\nexport function useQueryParams<T extends Record<string, string>>(): {\n params: Partial<T>\n set: (key: keyof T, value: string) => void\n setAll: (params: Partial<T>) => void\n delete: (key: keyof T) => void\n clear: () => void\n} {\n const searchParams = useSearchParams()\n const router = useRouter()\n const pathname = usePathname()\n\n const params = Object.fromEntries(searchParams.entries()) as Partial<T>\n\n const updateParams = useCallback(\n (updater: (params: URLSearchParams) => URLSearchParams) => {\n const newParams = updater(new URLSearchParams(searchParams.toString()))\n const query = newParams.toString()\n router.push(query ? `${pathname}?${query}` : pathname)\n },\n [searchParams, router, pathname],\n )\n\n const set = useCallback(\n (key: keyof T, value: string) => {\n updateParams((p) => {\n p.set(key as string, value)\n return p\n })\n },\n [updateParams],\n )\n\n const setAll = useCallback(\n (newParams: Partial<T>) => {\n updateParams((p) => {\n Object.entries(newParams).forEach(([key, value]) => {\n if (value !== undefined) p.set(key, value as string)\n })\n return p\n })\n },\n [updateParams],\n )\n\n const deleteParam = useCallback(\n (key: keyof T) => {\n updateParams((p) => {\n p.delete(key as string)\n return p\n })\n },\n [updateParams],\n )\n\n const clear = useCallback(() => {\n router.push(pathname)\n }, [router, pathname])\n\n return { params, set, setAll, delete: deleteParam, clear }\n}\n","'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { usePathname, useSearchParams } from 'next/navigation'\n\ninterface UseRouteChangeCallbacks {\n onComplete?: (url: string) => void\n}\n\nexport function useRouteChange(callbacks: UseRouteChangeCallbacks): void {\n const pathname = usePathname()\n const searchParams = useSearchParams()\n const savedCallbacks = useRef(callbacks)\n const prevUrl = useRef(`${pathname}?${searchParams.toString()}`)\n\n useEffect(() => {\n savedCallbacks.current = callbacks\n }, [callbacks])\n\n useEffect(() => {\n const currentUrl = `${pathname}?${searchParams.toString()}`\n if (currentUrl !== prevUrl.current) {\n savedCallbacks.current.onComplete?.(currentUrl)\n prevUrl.current = currentUrl\n }\n }, [pathname, searchParams])\n}\n","'use client'\n\nimport { useCallback, useState, useTransition } from 'react'\n\ninterface UseSafeActionReturn<TInput, TOutput> {\n execute: (input: TInput) => void\n data: TOutput | null\n error: Error | null\n loading: boolean\n reset: () => void\n}\n\nexport function useSafeAction<TInput, TOutput>(\n action: (input: TInput) => Promise<TOutput>,\n): UseSafeActionReturn<TInput, TOutput> {\n const [data, setData] = useState<TOutput | null>(null)\n const [error, setError] = useState<Error | null>(null)\n const [isPending, startTransition] = useTransition()\n\n const execute = useCallback(\n (input: TInput) => {\n startTransition(async () => {\n setError(null)\n try {\n const result = await action(input)\n setData(result)\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)))\n }\n })\n },\n [action],\n )\n\n const reset = useCallback(() => {\n setData(null)\n setError(null)\n }, [])\n\n return { execute, data, error, loading: isPending, reset }\n}\n","import { useSyncExternalStore } from 'react'\n\nconst subscribe = (): (() => void) => () => {}\nconst getSnapshot = (): boolean => false\nconst getServerSnapshot = (): boolean => true\n\nexport function useIsServer(): boolean {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var clsx = require('clsx');
|
|
4
|
+
var tailwindMerge = require('tailwind-merge');
|
|
5
|
+
|
|
6
|
+
// src/utils/cn.ts
|
|
7
|
+
function cn(...inputs) {
|
|
8
|
+
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// src/utils/formatDate.ts
|
|
12
|
+
function formatDate(date, options = {}, locale = "en-US") {
|
|
13
|
+
const d = date instanceof Date ? date : new Date(date);
|
|
14
|
+
return new Intl.DateTimeFormat(locale, options).format(d);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// src/utils/sleep.ts
|
|
18
|
+
function sleep(ms) {
|
|
19
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
exports.cn = cn;
|
|
23
|
+
exports.formatDate = formatDate;
|
|
24
|
+
exports.sleep = sleep;
|
|
25
|
+
//# sourceMappingURL=index.cjs.map
|
|
26
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/cn.ts","../../src/utils/formatDate.ts","../../src/utils/sleep.ts"],"names":["twMerge","clsx"],"mappings":";;;;;;AAIO,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;;;ACJO,SAAS,WACd,IAAA,EACA,OAAA,GAAsC,EAAC,EACvC,SAAS,OAAA,EACD;AACR,EAAA,MAAM,IAAI,IAAA,YAAgB,IAAA,GAAO,IAAA,GAAO,IAAI,KAAK,IAAI,CAAA;AACrD,EAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,QAAQ,OAAO,CAAA,CAAE,OAAO,CAAC,CAAA;AAC1D;;;ACTO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD","file":"index.cjs","sourcesContent":["import { clsx } from 'clsx'\nimport type { ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","type DateInput = Date | string | number\n\nexport function formatDate(\n date: DateInput,\n options: Intl.DateTimeFormatOptions = {},\n locale = 'en-US',\n): string {\n const d = date instanceof Date ? date : new Date(date)\n return new Intl.DateTimeFormat(locale, options).format(d)\n}\n","export function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { clsx } from 'clsx';
|
|
2
|
+
import { twMerge } from 'tailwind-merge';
|
|
3
|
+
|
|
4
|
+
// src/utils/cn.ts
|
|
5
|
+
function cn(...inputs) {
|
|
6
|
+
return twMerge(clsx(inputs));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// src/utils/formatDate.ts
|
|
10
|
+
function formatDate(date, options = {}, locale = "en-US") {
|
|
11
|
+
const d = date instanceof Date ? date : new Date(date);
|
|
12
|
+
return new Intl.DateTimeFormat(locale, options).format(d);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// src/utils/sleep.ts
|
|
16
|
+
function sleep(ms) {
|
|
17
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { cn, formatDate, sleep };
|
|
21
|
+
//# sourceMappingURL=index.mjs.map
|
|
22
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/cn.ts","../../src/utils/formatDate.ts","../../src/utils/sleep.ts"],"names":[],"mappings":";;;;AAIO,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;;;ACJO,SAAS,WACd,IAAA,EACA,OAAA,GAAsC,EAAC,EACvC,SAAS,OAAA,EACD;AACR,EAAA,MAAM,IAAI,IAAA,YAAgB,IAAA,GAAO,IAAA,GAAO,IAAI,KAAK,IAAI,CAAA;AACrD,EAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,QAAQ,OAAO,CAAA,CAAE,OAAO,CAAC,CAAA;AAC1D;;;ACTO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD","file":"index.mjs","sourcesContent":["import { clsx } from 'clsx'\nimport type { ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","type DateInput = Date | string | number\n\nexport function formatDate(\n date: DateInput,\n options: Intl.DateTimeFormatOptions = {},\n locale = 'en-US',\n): string {\n const d = date instanceof Date ? date : new Date(date)\n return new Intl.DateTimeFormat(locale, options).format(d)\n}\n","export function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "reactives-hooks",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A collection of useful React hooks and utilities for React and Next.js",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
|
+
"module": "./dist/index.mjs",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"import": {
|
|
18
|
+
"types": "./dist/index.d.mts",
|
|
19
|
+
"default": "./dist/index.mjs"
|
|
20
|
+
},
|
|
21
|
+
"require": {
|
|
22
|
+
"types": "./dist/index.d.cts",
|
|
23
|
+
"default": "./dist/index.cjs"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"./next": {
|
|
27
|
+
"import": {
|
|
28
|
+
"types": "./dist/next/index.d.mts",
|
|
29
|
+
"default": "./dist/next/index.mjs"
|
|
30
|
+
},
|
|
31
|
+
"require": {
|
|
32
|
+
"types": "./dist/next/index.d.cts",
|
|
33
|
+
"default": "./dist/next/index.cjs"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"./utils": {
|
|
37
|
+
"import": {
|
|
38
|
+
"types": "./dist/utils/index.d.mts",
|
|
39
|
+
"default": "./dist/utils/index.mjs"
|
|
40
|
+
},
|
|
41
|
+
"require": {
|
|
42
|
+
"types": "./dist/utils/index.d.cts",
|
|
43
|
+
"default": "./dist/utils/index.cjs"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"./package.json": "./package.json"
|
|
47
|
+
},
|
|
48
|
+
"typesVersions": {
|
|
49
|
+
"*": {
|
|
50
|
+
"next": [
|
|
51
|
+
"./dist/next/index.d.ts"
|
|
52
|
+
],
|
|
53
|
+
"utils": [
|
|
54
|
+
"./dist/utils/index.d.ts"
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"scripts": {
|
|
59
|
+
"build": "tsup",
|
|
60
|
+
"dev": "tsup --watch",
|
|
61
|
+
"test": "vitest",
|
|
62
|
+
"test:run": "vitest run",
|
|
63
|
+
"test:coverage": "vitest run --coverage",
|
|
64
|
+
"lint": "eslint .",
|
|
65
|
+
"lint:fix": "eslint . --fix",
|
|
66
|
+
"format": "prettier --write .",
|
|
67
|
+
"typecheck": "tsc --noEmit",
|
|
68
|
+
"prepublishOnly": "pnpm run build",
|
|
69
|
+
"clean": "rm -rf dist",
|
|
70
|
+
"release": "pnpm build && changeset publish"
|
|
71
|
+
},
|
|
72
|
+
"peerDependencies": {
|
|
73
|
+
"react": ">=18.0.0",
|
|
74
|
+
"react-dom": ">=18.0.0"
|
|
75
|
+
},
|
|
76
|
+
"peerDependenciesMeta": {
|
|
77
|
+
"react-dom": {
|
|
78
|
+
"optional": true
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"keywords": [
|
|
82
|
+
"react",
|
|
83
|
+
"hooks",
|
|
84
|
+
"nextjs",
|
|
85
|
+
"typescript",
|
|
86
|
+
"utilities"
|
|
87
|
+
],
|
|
88
|
+
"license": "MIT",
|
|
89
|
+
"repository": {
|
|
90
|
+
"type": "git",
|
|
91
|
+
"url": "https://github.com/trustspirit/reactives.git"
|
|
92
|
+
},
|
|
93
|
+
"publishConfig": {
|
|
94
|
+
"access": "public",
|
|
95
|
+
"provenance": true
|
|
96
|
+
},
|
|
97
|
+
"devDependencies": {
|
|
98
|
+
"@changesets/cli": "^2.29.8",
|
|
99
|
+
"@eslint/js": "^9.39.2",
|
|
100
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
101
|
+
"@testing-library/react": "^16.3.2",
|
|
102
|
+
"@testing-library/user-event": "^14.6.1",
|
|
103
|
+
"@types/react": "^19.2.14",
|
|
104
|
+
"@types/react-dom": "^19.2.3",
|
|
105
|
+
"@vitejs/plugin-react": "^5.1.4",
|
|
106
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
107
|
+
"eslint": "^9.39.2",
|
|
108
|
+
"eslint-plugin-react-hooks": "^5.2.0",
|
|
109
|
+
"jsdom": "^28.0.0",
|
|
110
|
+
"next": "^16.1.6",
|
|
111
|
+
"prettier": "^3.8.1",
|
|
112
|
+
"react": "^19.2.4",
|
|
113
|
+
"react-dom": "^19.2.4",
|
|
114
|
+
"tsup": "^8.5.1",
|
|
115
|
+
"typescript": "^5.9.3",
|
|
116
|
+
"typescript-eslint": "^8.55.0",
|
|
117
|
+
"vitest": "^4.0.18"
|
|
118
|
+
},
|
|
119
|
+
"dependencies": {
|
|
120
|
+
"clsx": "^2.1.1",
|
|
121
|
+
"tailwind-merge": "^3.4.0"
|
|
122
|
+
}
|
|
123
|
+
}
|