@zayne-labs/toolkit-react 0.12.30 → 0.12.32

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.
@@ -1,4 +1,4 @@
1
- import { L as createCustomContext, f as useStore } from "./hooks-B3E5VMjd.js";
1
+ import { L as createCustomContext, f as useStore } from "./hooks-COKx4mtj.js";
2
2
  import { createElement } from "react";
3
3
 
4
4
  //#region src/zustand/createReactStoreContext.ts
@@ -16,4 +16,4 @@ const createReactStoreContext = (options) => {
16
16
 
17
17
  //#endregion
18
18
  export { createReactStoreContext as t };
19
- //# sourceMappingURL=createReactStoreContext-BNG_DigC.js.map
19
+ //# sourceMappingURL=createReactStoreContext-DJySeQQW.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createReactStoreContext-BNG_DigC.js","names":[],"sources":["../../src/zustand/createReactStoreContext.ts"],"sourcesContent":["import type { StoreApi } from \"@zayne-labs/toolkit-core\";\nimport type { SelectorFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { createElement } from \"react\";\nimport { createCustomContext, useStore, type CustomContextOptions } from \"../hooks\";\n\nconst createReactStoreContext = <\n\tTState extends Record<string, unknown>,\n\tTStore extends StoreApi<TState> = StoreApi<TState>,\n>(\n\toptions?: CustomContextOptions<TStore, true>\n) => {\n\tconst [Provider, useCustomContext] = createCustomContext(options);\n\n\ttype ZustandStoreContextProviderProps = {\n\t\tchildren: React.ReactNode;\n\t\tstore: TStore;\n\t};\n\n\tfunction ZustandStoreContextProvider(props: ZustandStoreContextProviderProps) {\n\t\tconst { children, store } = props;\n\n\t\treturn createElement(Provider, { value: store }, children);\n\t}\n\n\tconst useZustandStoreContext = <TResult = TState>(selector?: SelectorFn<TState, TResult>): TResult => {\n\t\tconst zustandStore = useCustomContext();\n\n\t\treturn useStore(zustandStore, selector as never);\n\t};\n\n\treturn [ZustandStoreContextProvider, useZustandStoreContext] as [\n\t\tZustandStoreContextProvider: typeof ZustandStoreContextProvider,\n\t\tuseZustandStoreContext: typeof useZustandStoreContext,\n\t];\n};\n\nexport { createReactStoreContext };\n"],"mappings":";;;;AAKA,MAAM,2BAIL,YACI;CACJ,MAAM,CAAC,UAAU,oBAAoB,oBAAoB,QAAQ;CAOjE,SAAS,4BAA4B,OAAyC;EAC7E,MAAM,EAAE,UAAU,UAAU;AAE5B,SAAO,cAAc,UAAU,EAAE,OAAO,OAAO,EAAE,SAAS;;CAG3D,MAAM,0BAA4C,aAAoD;AAGrG,SAAO,SAFc,kBAAkB,EAET,SAAkB;;AAGjD,QAAO,CAAC,6BAA6B,uBAAuB"}
1
+ {"version":3,"file":"createReactStoreContext-DJySeQQW.js","names":[],"sources":["../../src/zustand/createReactStoreContext.ts"],"sourcesContent":["import type { StoreApi } from \"@zayne-labs/toolkit-core\";\nimport type { SelectorFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { createElement } from \"react\";\nimport { createCustomContext, useStore, type CustomContextOptions } from \"../hooks\";\n\nconst createReactStoreContext = <\n\tTState extends Record<string, unknown>,\n\tTStore extends StoreApi<TState> = StoreApi<TState>,\n>(\n\toptions?: CustomContextOptions<TStore, true>\n) => {\n\tconst [Provider, useCustomContext] = createCustomContext(options);\n\n\ttype ZustandStoreContextProviderProps = {\n\t\tchildren: React.ReactNode;\n\t\tstore: TStore;\n\t};\n\n\tfunction ZustandStoreContextProvider(props: ZustandStoreContextProviderProps) {\n\t\tconst { children, store } = props;\n\n\t\treturn createElement(Provider, { value: store }, children);\n\t}\n\n\tconst useZustandStoreContext = <TResult = TState>(selector?: SelectorFn<TState, TResult>): TResult => {\n\t\tconst zustandStore = useCustomContext();\n\n\t\treturn useStore(zustandStore, selector as never);\n\t};\n\n\treturn [ZustandStoreContextProvider, useZustandStoreContext] as [\n\t\tZustandStoreContextProvider: typeof ZustandStoreContextProvider,\n\t\tuseZustandStoreContext: typeof useZustandStoreContext,\n\t];\n};\n\nexport { createReactStoreContext };\n"],"mappings":";;;;AAKA,MAAM,2BAIL,YACI;CACJ,MAAM,CAAC,UAAU,oBAAoB,oBAAoB,QAAQ;CAOjE,SAAS,4BAA4B,OAAyC;EAC7E,MAAM,EAAE,UAAU,UAAU;AAE5B,SAAO,cAAc,UAAU,EAAE,OAAO,OAAO,EAAE,SAAS;;CAG3D,MAAM,0BAA4C,aAAoD;AAGrG,SAAO,SAFc,kBAAkB,EAET,SAAkB;;AAGjD,QAAO,CAAC,6BAA6B,uBAAuB"}
@@ -1,3 +1,3 @@
1
- import { A as useUnmountEffect, B as getErrorMessage, C as useConstant, D as useCallbackRef, E as useClickOutside, F as useAfterMountEffect, I as ContextError, L as CustomContextOptions, M as useLifeCycle, N as useEffectOnce, O as useAnimationInterval, P as useAsyncEffect, R as UseCustomContext, S as useControllableState, T as useComposeRefs, _ as useDisclosure, a as useStore, b as useCopyToClipboard, c as useCompareSelector, d as useSearchParamsObject, f as useSearch, g as useIsHydrated, h as useLocationState, i as useThrottleByTimer, j as useMountEffect, k as useAnimateElementRefs, l as useCompareValue, m as createUseLocationState, n as useThrottleByFrame, o as createUseStorageState, p as useScrollObserver, r as useThrottleByTimeout, s as useStorageState, t as useToggle, u as useSearchParams, v as useDebouncedFn, w as useLazyRef, x as useControllableProp, y as useDebouncedState, z as createCustomContext } from "../index-CBZbggjy.js";
2
- import "../index-B39cWF3H.js";
1
+ import { A as useUnmountEffect, B as getErrorMessage, C as useConstant, D as useCallbackRef, E as useClickOutside, F as useAfterMountEffect, I as ContextError, L as CustomContextOptions, M as useLifeCycle, N as useEffectOnce, O as useAnimationInterval, P as useAsyncEffect, R as UseCustomContext, S as useControllableState, T as useComposeRefs, _ as useDisclosure, a as useStore, b as useCopyToClipboard, c as useCompareSelector, d as useSearchParamsObject, f as useSearch, g as useIsHydrated, h as useLocationState, i as useThrottleByTimer, j as useMountEffect, k as useAnimateElementRefs, l as useCompareValue, m as createUseLocationState, n as useThrottleByFrame, o as createUseStorageState, p as useScrollObserver, r as useThrottleByTimeout, s as useStorageState, t as useToggle, u as useSearchParams, v as useDebouncedFn, w as useLazyRef, x as useControllableProp, y as useDebouncedState, z as createCustomContext } from "../index-Dwh8D1ki.js";
2
+ import "../index-B08DS8-6.js";
3
3
  export { ContextError, CustomContextOptions, UseCustomContext, createCustomContext, createUseLocationState, createUseStorageState, getErrorMessage, useAfterMountEffect, useAnimateElementRefs, useAnimationInterval, useAsyncEffect, useCallbackRef, useClickOutside, useCompareSelector, useCompareValue, useComposeRefs, useConstant, useControllableProp, useControllableState, useCopyToClipboard, useDebouncedFn, useDebouncedState, useDisclosure, useEffectOnce, useIsHydrated, useLazyRef, useLifeCycle, useLocationState, useMountEffect, useScrollObserver, useSearch, useSearchParams, useSearchParamsObject, useStorageState, useStore, useThrottleByFrame, useThrottleByTimeout, useThrottleByTimer, useToggle, useUnmountEffect };
@@ -1,3 +1,3 @@
1
- import { A as useMountEffect, C as useConstant, D as useAnimationInterval, E as useClickOutside, F as useCallbackRef, I as ContextError, L as createCustomContext, M as useEffectOnce, N as useAsyncEffect, O as useAnimateElementRefs, P as useAfterMountEffect, R as getErrorMessage, S as useControllableState, T as useComposeRefs, _ as useDebouncedFn, a as useStorageState, b as useToggle, c as useSearch, d as useLocationState, f as useStore, g as useDisclosure, h as useIsHydrated, i as createUseStorageState, j as useLifeCycle, k as useUnmountEffect, l as useScrollObserver, m as useCompareValue, n as useThrottleByTimeout, o as useSearchParams, p as useCompareSelector, r as useThrottleByTimer, s as useSearchParamsObject, t as useThrottleByFrame, u as createUseLocationState, v as useDebouncedState, w as useLazyRef, x as useControllableProp, y as useCopyToClipboard } from "../hooks-B3E5VMjd.js";
1
+ import { A as useMountEffect, C as useConstant, D as useAnimationInterval, E as useClickOutside, F as useCallbackRef, I as ContextError, L as createCustomContext, M as useEffectOnce, N as useAsyncEffect, O as useAnimateElementRefs, P as useAfterMountEffect, R as getErrorMessage, S as useControllableState, T as useComposeRefs, _ as useDebouncedFn, a as useStorageState, b as useToggle, c as useSearch, d as useLocationState, f as useStore, g as useDisclosure, h as useIsHydrated, i as createUseStorageState, j as useLifeCycle, k as useUnmountEffect, l as useScrollObserver, m as useCompareValue, n as useThrottleByTimeout, o as useSearchParams, p as useCompareSelector, r as useThrottleByTimer, s as useSearchParamsObject, t as useThrottleByFrame, u as createUseLocationState, v as useDebouncedState, w as useLazyRef, x as useControllableProp, y as useCopyToClipboard } from "../hooks-COKx4mtj.js";
2
2
 
3
3
  export { ContextError, createCustomContext, createUseLocationState, createUseStorageState, getErrorMessage, useAfterMountEffect, useAnimateElementRefs, useAnimationInterval, useAsyncEffect, useCallbackRef, useClickOutside, useCompareSelector, useCompareValue, useComposeRefs, useConstant, useControllableProp, useControllableState, useCopyToClipboard, useDebouncedFn, useDebouncedState, useDisclosure, useEffectOnce, useIsHydrated, useLazyRef, useLifeCycle, useLocationState, useMountEffect, useScrollObserver, useSearch, useSearchParams, useSearchParamsObject, useStorageState, useStore, useThrottleByFrame, useThrottleByTimeout, useThrottleByTimer, useToggle, useUnmountEffect };
@@ -1,4 +1,4 @@
1
- import { f as composeRefs } from "./utils-DAG-7fTH.js";
1
+ import { f as composeRefs } from "./utils-CwFvwtye.js";
2
2
  import { createContext, use, useCallback, useDebugValue, useDeferredValue, useEffect, useInsertionEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
3
3
  import { copyToClipboard, createExternalStorageStore, createLocationStore, createScrollObserver, createSearchParams, debounce, deepCompare, lockScroll, on, onClickOutside, setAnimationInterval, shallowCompare, throttleByFrame, throttleByTime, throttleByTimeout, toArray } from "@zayne-labs/toolkit-core";
4
4
  import { isArray, isBoolean, isFunction, isPlainObject } from "@zayne-labs/toolkit-type-helpers";
@@ -650,4 +650,4 @@ const useThrottleByFrame = (callbackFn) => {
650
650
 
651
651
  //#endregion
652
652
  export { useMountEffect as A, useConstant as C, useAnimationInterval as D, useClickOutside as E, useCallbackRef as F, ContextError as I, createCustomContext as L, useEffectOnce as M, useAsyncEffect as N, useAnimateElementRefs as O, useAfterMountEffect as P, getErrorMessage as R, useControllableState as S, useComposeRefs as T, useDebouncedFn as _, useStorageState as a, useToggle as b, useSearch as c, useLocationState as d, useStore as f, useDisclosure as g, useIsHydrated as h, createUseStorageState as i, useLifeCycle as j, useUnmountEffect as k, useScrollObserver as l, useCompareValue as m, useThrottleByTimeout as n, useSearchParams as o, useCompareSelector as p, useThrottleByTimer as r, useSearchParamsObject as s, useThrottleByFrame as t, createUseLocationState as u, useDebouncedState as v, useLazyRef as w, useControllableProp as x, useCopyToClipboard as y };
653
- //# sourceMappingURL=hooks-B3E5VMjd.js.map
653
+ //# sourceMappingURL=hooks-COKx4mtj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks-B3E5VMjd.js","names":[],"sources":["../../src/hooks/createCustomContext.ts","../../src/hooks/useCallbackRef.ts","../../src/hooks/effects/useAfterMountEffect.ts","../../src/hooks/effects/useAsyncEffect.ts","../../src/hooks/effects/useEffectOnce.ts","../../src/hooks/effects/useLifeCycle.ts","../../src/hooks/effects/useMountEffect.ts","../../src/hooks/effects/useUnMountEffect.ts","../../src/hooks/useAnimateElementRefs.ts","../../src/hooks/useAnimationInterval.ts","../../src/hooks/useClickOutside.ts","../../src/hooks/useComposeRefs.ts","../../src/hooks/useConstant.ts","../../src/hooks/useControllable.ts","../../src/hooks/useToggle.ts","../../src/hooks/useCopyToClipboard.ts","../../src/hooks/useDebounce.ts","../../src/hooks/useDisclosure.ts","../../src/hooks/useIsHydrated.ts","../../src/hooks/useCompare.ts","../../src/hooks/useStore.ts","../../src/hooks/useLocationState.ts","../../src/hooks/useScrollObserver.ts","../../src/hooks/useSearch.ts","../../src/hooks/useSearchParams.ts","../../src/hooks/useStorageState.ts","../../src/hooks/useThrottle.ts"],"sourcesContent":["import { createContext, use } from \"react\";\n\nexport type CustomContextOptions<TContextValue, TStrict extends boolean> = {\n\tdefaultValue?: TContextValue | null;\n\terrorMessage?: string;\n\textendValue?: (contextValue: NoInfer<TContextValue> | null) => TContextValue | null;\n\thookName?: string;\n\tname?: string;\n\tproviderName?: string;\n\tstrict?: TStrict;\n};\n\nexport type UseCustomContext<TContextValue, TStrict extends boolean> = () => TStrict extends true ?\n\tTContextValue\n:\tTContextValue | null;\n\nexport const createCustomContext = <TContextValue = null, TStrict extends boolean = true>(\n\toptions: CustomContextOptions<TContextValue, TStrict> = {}\n) => {\n\tconst {\n\t\tdefaultValue = null,\n\t\terrorMessage,\n\t\textendValue,\n\t\thookName = \"useUnnamedContext\",\n\t\tproviderName = \"UnnamedContextProvider\",\n\t\tname = providerName.endsWith(\"Provider\") ? providerName.slice(0, -8) : \"UnnamedContext\",\n\t\tstrict = true,\n\t} = options;\n\n\tconst Context = createContext<TContextValue>(defaultValue as TContextValue);\n\n\tContext.displayName = name;\n\n\tconst useCustomContext: UseCustomContext<TContextValue, TStrict> = () => {\n\t\tconst contextValue = use(Context);\n\n\t\tconst extendedContextValue = extendValue?.(contextValue) ?? contextValue;\n\n\t\tif (strict && extendedContextValue === null) {\n\t\t\tthrow new ContextError(errorMessage ?? getErrorMessage(hookName, providerName));\n\t\t}\n\n\t\treturn extendedContextValue as NonNullable<typeof extendedContextValue>;\n\t};\n\n\treturn [Context, useCustomContext] as [\n\t\tProvider: typeof Context,\n\t\tuseCustomContext: typeof useCustomContext,\n\t];\n};\n\nexport class ContextError extends Error {\n\toverride name = \"ContextError\";\n}\n\nexport const getErrorMessage = (hook: string, provider: string) => {\n\treturn `${hook} returned \"null\". Did you forget to wrap the necessary components within ${provider}?`;\n};\n","import type { AnyFunction } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useCallback, useInsertionEffect, useRef } from \"react\";\n\n/**\n * @description\n * - Returns a stable function that always points to the latest version of the callback function.\n * - This is only is the callback passed is not null or undefined.\n */\n\n// eslint-disable-next-line ts-eslint/no-invalid-void-type -- Ignore\nconst useCallbackRef = <TCallback extends AnyFunction | null | undefined | void = AnyFunction>(\n\tcallbackFn: TCallback\n): TCallback => {\n\tconst callbackRef = useRef(callbackFn);\n\n\tuseInsertionEffect(() => {\n\t\t// == Doing this instead updating it during render cuz according to Dan Abramov, render should be pure\n\t\tcallbackRef.current = callbackFn;\n\t}, [callbackFn]);\n\n\tconst savedCallback = useCallback(\n\t\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- callbackRef.current can be null in some cases\n\t\t(...params: unknown[]) => (callbackRef.current as AnyFunction)?.(...params) as unknown,\n\t\t[]\n\t);\n\n\tconst callbackOrSavedCallback = callbackFn ? (savedCallback as TCallback) : callbackFn;\n\n\treturn callbackOrSavedCallback;\n};\n\nexport { useCallbackRef };\n","import { useEffect, useRef } from \"react\";\nimport { useCallbackRef } from \"../useCallbackRef\";\n\nconst useAfterMountEffect: typeof useEffect = (callBackFn, deps) => {\n\tconst isFirstMountRef = useRef(true);\n\tconst stableCallback = useCallbackRef(callBackFn);\n\n\tuseEffect(() => {\n\t\tif (isFirstMountRef.current) {\n\t\t\tisFirstMountRef.current = false;\n\t\t\treturn;\n\t\t}\n\n\t\tstableCallback();\n\t\t// eslint-disable-next-line react-hooks/rule-suppression -- Ignore\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps -- Ignore\n\t}, [stableCallback, ...(deps ?? [])]);\n};\nexport { useAfterMountEffect };\n","import { useEffect, useState } from \"react\";\nimport { useCallbackRef } from \"../useCallbackRef\";\n\nexport function useAsyncEffect(\n\teffect: () => Promise<ReturnType<React.EffectCallback>>,\n\tdeps?: React.DependencyList\n) {\n\tconst stableEffectCallback = useCallbackRef(effect);\n\tconst [destroy, setDestroy] = useState<ReturnType<React.EffectCallback>>();\n\n\tuseEffect(() => {\n\t\tconst effectResult = stableEffectCallback();\n\n\t\tasync function execute() {\n\t\t\tsetDestroy(await effectResult);\n\t\t}\n\n\t\tvoid execute();\n\n\t\treturn () => void destroy?.();\n\t\t// eslint-disable-next-line react-hooks/rule-suppression -- Ignore\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps -- Ignore\n\t}, [destroy, stableEffectCallback, ...(deps ?? [])]);\n}\n","import { useEffect, useRef } from \"react\";\nimport { useCallbackRef } from \"../useCallbackRef\";\n\nconst useEffectOnce = (callBackFn: React.EffectCallback) => {\n\tconst stableCallback = useCallbackRef(callBackFn);\n\n\tconst effectGuardRef = useRef(false);\n\n\tuseEffect(() => {\n\t\tif (effectGuardRef.current) return;\n\n\t\teffectGuardRef.current = true;\n\n\t\treturn stableCallback();\n\t}, [stableCallback]);\n};\n\nexport { useEffectOnce };\n","import { useEffect } from \"react\";\nimport { useCallbackRef } from \"../useCallbackRef\";\n\nexport type Destructor = ReturnType<React.EffectCallback>;\n\ntype LifeCycleOptions = {\n\tonMount?: () => void;\n\tonUnmount?: Destructor;\n};\n\nconst useLifeCycle = ({ onMount, onUnmount }: LifeCycleOptions) => {\n\tconst stableOnMount = useCallbackRef(onMount);\n\tconst stableOnUnmount = useCallbackRef(onUnmount);\n\n\tuseEffect(() => {\n\t\tstableOnMount?.();\n\n\t\treturn stableOnUnmount;\n\t}, [stableOnMount, stableOnUnmount]);\n};\n\nexport { useLifeCycle };\n","import { useLifeCycle } from \"./useLifeCycle\";\n\nconst useMountEffect = (callBackFn: () => void) => {\n\tuseLifeCycle({ onMount: callBackFn });\n};\n\nexport { useMountEffect };\n","import { useLifeCycle, type Destructor } from \"./useLifeCycle\";\n\nconst useUnmountEffect = (cleanUpFn: Destructor) => useLifeCycle({ onUnmount: cleanUpFn });\n\nexport { useUnmountEffect };\n","import { on } from \"@zayne-labs/toolkit-core\";\nimport { isArray, type NonEmptyArray } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useCallback, useRef } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\ntype ElementsInfoArray<TTargetElement extends string> = NonEmptyArray<{\n\tanimationClass: string;\n\ttargetElement: TTargetElement;\n}>;\n\nconst removeClass = (target: HTMLElement, className: string) => () => target.classList.remove(className);\n\n/**\n * This is a custom React hook that adds and removes animation classes to specified HTML elements.\n * @param elementsInfoArray - An array of objects that contain information about the animation class and the target HTML element.\n * @returns - An object containing the refs of the animated elements and a function to handle the initiation and removal animation.\n */\n\nconst useAnimateElementRefs = <TTargetElement extends string>(\n\telementsInfoArray: ElementsInfoArray<TTargetElement>\n) => {\n\tconst elementsRef = useRef<Record<TTargetElement, HTMLElement | null>>({} as never);\n\n\tconst addAnimationClasses = useCallbackRef(() => {\n\t\tif (!isArray(elementsInfoArray)) {\n\t\t\tconsole.error(\"elementsInfo is not an Array\");\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const { animationClass, targetElement } of elementsInfoArray) {\n\t\t\tif (!elementsRef.current[targetElement]) {\n\t\t\t\tconsole.error(\"ElementError\", `\"${targetElement}\" element does not exist`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\telementsRef.current[targetElement].classList.add(animationClass);\n\t\t}\n\t});\n\n\tconst removeAnimationClasses = useCallbackRef(() => {\n\t\tif (!isArray(elementsInfoArray)) {\n\t\t\tconsole.error(\"elementsInfo is not an Array\");\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const { animationClass, targetElement } of elementsInfoArray) {\n\t\t\tif (!elementsRef.current[targetElement]) {\n\t\t\t\tconsole.error(\"ElementError\", `\"${targetElement}\" element does not exist`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ton(\n\t\t\t\t\"transitionend\",\n\t\t\t\telementsRef.current[targetElement],\n\t\t\t\tremoveClass(elementsRef.current[targetElement], animationClass)\n\t\t\t);\n\n\t\t\ton(\n\t\t\t\t\"animationend\",\n\t\t\t\telementsRef.current[targetElement],\n\t\t\t\tremoveClass(elementsRef.current[targetElement], animationClass)\n\t\t\t);\n\t\t}\n\t});\n\n\t// Add animation classes to elements and remove them after the animation ends\n\tconst handleElementsAnimation = useCallback(() => {\n\t\taddAnimationClasses();\n\n\t\tremoveAnimationClasses();\n\t}, [addAnimationClasses, removeAnimationClasses]);\n\n\t// eslint-disable-next-line react-hooks/refs -- Allow this for convenience\n\treturn { animatedElements: elementsRef.current, handleElementsAnimation };\n};\n\nexport { useAnimateElementRefs };\n","import { setAnimationInterval, type AnimationIntervalOptions } from \"@zayne-labs/toolkit-core\";\nimport type { Prettify } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useEffect, useMemo } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\ntype AnimationOptions = Prettify<\n\tAnimationIntervalOptions & {\n\t\tintervalDuration: number | null;\n\t\tonAnimation: () => void;\n\t}\n>;\n\nconst useAnimationInterval = (options: AnimationOptions) => {\n\tconst { intervalDuration, onAnimation, once } = options;\n\n\tconst stableCallback = useCallbackRef(onAnimation);\n\n\tconst { start, stop } = useMemo(\n\t\t() => setAnimationInterval(stableCallback, intervalDuration, { once }),\n\t\t[intervalDuration, stableCallback, once]\n\t);\n\n\tuseEffect(() => {\n\t\tif (intervalDuration === null) return;\n\n\t\tstart();\n\n\t\treturn stop;\n\t}, [intervalDuration, start, stop]);\n\n\treturn { start, stop };\n};\n\nexport { useAnimationInterval };\n","import { onClickOutside, toArray } from \"@zayne-labs/toolkit-core\";\nimport { useEffect, useRef } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\ntype UseClickOutsideOptions<TElement extends HTMLElement> = {\n\tenabled?: boolean;\n\tonClick: (event: MouseEvent | TouchEvent) => void;\n\tref?: Array<React.RefObject<TElement>> | React.RefObject<TElement>;\n};\n\nconst useClickOutside = <TElement extends HTMLElement>(options: UseClickOutsideOptions<TElement>) => {\n\tconst innerRef = useRef<TElement>(null);\n\n\tconst { enabled = true, onClick, ref: refOrRefArray = innerRef } = options;\n\n\tconst savedOnClick = useCallbackRef(onClick);\n\n\tuseEffect(() => {\n\t\tif (!enabled) return;\n\n\t\tconst elementArray = toArray(refOrRefArray).map((ref) => ref.current);\n\n\t\tconst cleanup = onClickOutside(elementArray, savedOnClick);\n\n\t\treturn () => cleanup();\n\t}, [enabled, refOrRefArray, savedOnClick]);\n\n\treturn {\n\t\tref: innerRef,\n\t};\n};\n\nexport { useClickOutside };\n","import { useMemo } from \"react\";\nimport { composeRefs, type PossibleRef } from \"@/utils\";\n\nconst useComposeRefs = <TRef extends HTMLElement>(...refs: Array<PossibleRef<TRef>>) => {\n\t// eslint-disable-next-line react-hooks/rule-suppression -- Allow\n\t// eslint-disable-next-line react-hooks/exhaustive-deps -- Allow\n\tconst mergedRef = useMemo(() => composeRefs(...refs), refs);\n\n\treturn mergedRef;\n};\n\nexport { useComposeRefs };\n","import { useRef } from \"react\";\n\nexport const useConstant = <TResult>(initFn: () => TResult): TResult => {\n\tconst resultRef = useRef<TResult | null>(null);\n\n\t// eslint-disable-next-line ts-eslint/prefer-nullish-coalescing -- The current case is justified since it's optimizable by the react compiler\n\tif (resultRef.current === null) {\n\t\tresultRef.current = initFn();\n\t}\n\n\t// eslint-disable-next-line react-hooks/refs -- Allow this for convenience\n\treturn resultRef.current;\n};\n\nexport const useLazyRef = <TResult>(initFn: () => TResult): React.RefObject<TResult> => {\n\tconst resultRef = useRef<TResult>(null as never);\n\n\t// eslint-disable-next-line ts-eslint/prefer-nullish-coalescing -- The current case is justified since it's optimizable by the react compiler\n\tif (resultRef.current === null) {\n\t\tresultRef.current = initFn();\n\t}\n\n\treturn resultRef;\n};\n","\"use client\";\n\nimport { isFunction } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport type { StateSetter } from \"@/utils\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\ntype UseControllablePropOptions<TProp> = {\n\tprop: TProp | undefined;\n\tstate: TProp;\n};\n\n/**\n * @description Given a prop value and state value, the useControllableProp hook is used to determine whether a component is controlled or uncontrolled, and also returns the computed value.\n */\nexport const useControllableProp = <TProp>(options: UseControllablePropOptions<TProp>) => {\n\tconst { prop, state } = options;\n\n\tconst isControlled = prop !== undefined;\n\n\tconst value = isControlled ? prop : state;\n\n\tconst result = useMemo<[isControlled: typeof isControlled, value: typeof value]>(\n\t\t() => [isControlled, value],\n\t\t[isControlled, value]\n\t);\n\n\treturn result;\n};\n\ntype UseControllableStateOptions<TProp> = {\n\tdefaultProp?: TProp | (() => TProp);\n\tisControlled?: boolean;\n\tonChange?: (prop: TProp) => void;\n\tprop?: TProp;\n};\n\n/**\n * @description React hook to manage state that can be either controlled or uncontrolled.\n * - When `options.prop` is provided, the hook operates in controlled mode.\n * In this mode, `value` always equals `options.prop` and `setState` will\n * invoke `options.onChange(next)` without mutating internal state.\n * - When `options.prop` is not provided, the hook operates in uncontrolled\n * mode, initializing internal state from `options.defaultProp` and updating\n * it via `setState`.\n *\n * @param options - Configuration options for the hook.\n * @param options.prop - Controlled value. If defined, the state is controlled.\n * @param options.defaultProp - Initial value for the uncontrolled state. Can be a\n * function for lazy initialization or a direct value.\n * @param options.onChange - Callback fired when a new value is requested. In\n * controlled mode, this is invoked instead of updating internal state. In\n * uncontrolled mode, it is called after the internal state updates.\n * @returns A tuple `[state, setState]` just like React.useState.\n *\n * @example\n * // Uncontrolled usage\n * const [state, setState] = useControllableState({ defaultProp: 0 });\n *\n * @example\n * // Controlled usage\n * const [state, setState] = useControllableState({\n * prop: props.value,\n * onChange: props.onChange,\n * });\n */\nexport const useControllableState = <TProp>(options: UseControllableStateOptions<TProp>) => {\n\tconst { defaultProp, onChange, prop } = options;\n\n\tconst isControlled = options.isControlled ?? prop !== undefined;\n\n\tconst stableOnPropChange = useCallbackRef(onChange);\n\n\tconst [unControlledState, setUncontrolledState] = useState(defaultProp as TProp);\n\n\tconst state = (isControlled ? prop : unControlledState) as TProp;\n\n\tconst setState: StateSetter<TProp> = useCallback(\n\t\t(newValue) => {\n\t\t\tconst nextValue = isFunction(newValue) ? newValue(state) : newValue;\n\n\t\t\tif (isControlled) {\n\t\t\t\tstableOnPropChange?.(nextValue);\n\t\t\t} else {\n\t\t\t\tsetUncontrolledState(nextValue);\n\t\t\t\tstableOnPropChange?.(nextValue);\n\t\t\t}\n\t\t},\n\t\t[state, isControlled, stableOnPropChange]\n\t);\n\n\treturn [state, setState] as [state: typeof state, setState: typeof setState];\n};\n","import { useCallback, useState } from \"react\";\n\ntype InitialState = boolean | (() => boolean);\n\nconst useToggle = (initialValue: InitialState = false) => {\n\tconst [value, setValue] = useState(initialValue);\n\n\tconst toggleValue = useCallback(<TValue>(newValue?: TValue) => {\n\t\tif (typeof newValue === \"boolean\") {\n\t\t\tsetValue(newValue);\n\t\t\treturn;\n\t\t}\n\n\t\tsetValue((prev) => !prev);\n\t}, []);\n\n\treturn [value, toggleValue] as [value: typeof value, toggleValue: typeof toggleValue];\n};\n\nexport { useToggle };\n","import {\n\tcopyToClipboard,\n\ttype AllowedClipboardItems,\n\ttype CopyToClipboardOptions,\n} from \"@zayne-labs/toolkit-core\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\nimport { useToggle } from \"./useToggle\";\n\nconst useCopyToClipboard = (options: CopyToClipboardOptions & { timeout?: number } = {}) => {\n\tconst { mimeType, onCopied, onError, onSuccess, timeout = 1500 } = options;\n\n\tconst [value, setValue] = useState<AllowedClipboardItems>(\"\");\n\n\tconst [hasCopied, toggleHasCopied] = useToggle(false);\n\tconst timeoutRef = useRef<number | null>(null);\n\n\tconst savedOnError = useCallbackRef(onError);\n\tconst savedOnSuccess = useCallbackRef(onSuccess);\n\tconst savedOnCopied = useCallbackRef(onCopied);\n\n\tconst handleHasCopied = useCallback(() => {\n\t\ttoggleHasCopied(true);\n\n\t\ttimeoutRef.current && clearTimeout(timeoutRef.current);\n\n\t\ttimeoutRef.current = setTimeout(() => {\n\t\t\ttoggleHasCopied(false);\n\t\t}, timeout) as never;\n\t}, [toggleHasCopied, timeout]);\n\n\tconst handleCopy = useCallback(\n\t\t(valueToCopy: AllowedClipboardItems) => {\n\t\t\tsetValue(valueToCopy);\n\n\t\t\tvoid copyToClipboard(valueToCopy, {\n\t\t\t\tmimeType,\n\t\t\t\tonCopied: () => {\n\t\t\t\t\tsavedOnCopied?.();\n\t\t\t\t\thandleHasCopied();\n\t\t\t\t},\n\t\t\t\tonError: savedOnError,\n\t\t\t\tonSuccess: savedOnSuccess,\n\t\t\t});\n\t\t},\n\t\t[handleHasCopied, mimeType, savedOnCopied, savedOnError, savedOnSuccess]\n\t);\n\n\treturn { handleCopy, hasCopied, setValue, value };\n};\n\nexport { useCopyToClipboard };\n","import { debounce } from \"@zayne-labs/toolkit-core\";\nimport type { CallbackFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useMemo, useState } from \"react\";\nimport { useUnmountEffect } from \"./effects/useUnMountEffect\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\nexport const useDebouncedFn = <TParams>(callBackFn: CallbackFn<TParams>, delay: number | undefined) => {\n\tconst latestCallback = useCallbackRef(callBackFn);\n\n\tconst debouncedFn = useMemo(() => debounce(latestCallback, delay), [delay, latestCallback]);\n\n\tuseUnmountEffect(() => {\n\t\tdebouncedFn.cancel();\n\t\tdebouncedFn.cancelMaxWait();\n\t});\n\n\treturn debouncedFn;\n};\n\nexport const useDebouncedState = <TValue>(defaultValue: TValue, delay: number | undefined) => {\n\tconst [value, setValue] = useState(defaultValue);\n\n\tconst setDebouncedValue = useMemo(() => debounce(setValue, delay), [delay]);\n\n\tuseUnmountEffect(() => {\n\t\tsetDebouncedValue.cancel();\n\t\tsetDebouncedValue.cancelMaxWait();\n\t});\n\n\treturn [value, setDebouncedValue, setValue] as const;\n};\n","import { lockScroll } from \"@zayne-labs/toolkit-core\";\nimport { isBoolean } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useMemo } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\nimport { useToggle } from \"./useToggle\";\n\ntype DisclosureOptions = {\n\thasScrollControl?: boolean;\n\tinitialState?: boolean | (() => boolean);\n};\n\nconst useDisclosure = (options: DisclosureOptions = {}) => {\n\tconst { hasScrollControl = false, initialState = false } = options;\n\tconst [isOpen, toggleIsOpen] = useToggle(initialState);\n\n\tconst onOpen = useCallbackRef(() => {\n\t\ttoggleIsOpen(true);\n\t\thasScrollControl && lockScroll({ lock: true });\n\t});\n\n\tconst onClose = useCallbackRef(() => {\n\t\ttoggleIsOpen(false);\n\t\thasScrollControl && lockScroll({ lock: false });\n\t});\n\n\tconst onToggle = useCallbackRef(<TValue>(value?: TValue) => {\n\t\tif (isBoolean(value)) {\n\t\t\ttoggleIsOpen(value);\n\t\t\thasScrollControl && lockScroll({ lock: value });\n\t\t\treturn;\n\t\t}\n\n\t\tisOpen ? onClose() : onOpen();\n\t});\n\n\tconst api = useMemo(() => ({ isOpen, onClose, onOpen, onToggle }), [isOpen, onClose, onOpen, onToggle]);\n\n\treturn api;\n};\nexport { useDisclosure };\n","import { useDeferredValue, useSyncExternalStore } from \"react\";\n\nconst noopStore = {\n\tgetServerSnapshot: () => false,\n\tgetSnapshot: () => true,\n\t// eslint-disable-next-line unicorn/consistent-function-scoping -- Ignore\n\tsubscribe: () => () => {},\n};\n\n/**\n * @description Return a boolean indicating if the JS has been hydrated already.\n * When doing Server-Side Rendering, the result will always be false.\n * When doing Client-Side Rendering, the result will always be false on the\n * first render and true from then on. Even if a new component renders it will\n * always start with true.\n *\n * @see https://github.com/sergiodxa/remix-utils/blob/main/src/react/use-hydrated.ts\n *\n * @see https://github.com/sergiodxa/remix-utils/blob/main/src/react/use-hydrated.ts\n *\n * @example\n * **Example: Disable a button that needs JS to work.**\n * ```tsx\n * const isHydrated = useIsHydrated();\n *\n * return (\n * <button type=\"button\" disabled={!isHydrated} onClick={doSomethingCustom}>\n * Click me\n * </button>\n * );\n * ```\n */\nconst useIsHydrated = () => {\n\tconst isHydrated = useSyncExternalStore(\n\t\tnoopStore.subscribe,\n\t\tnoopStore.getSnapshot,\n\t\tnoopStore.getServerSnapshot\n\t);\n\n\t// == Using useDeferredValue to make the returned value for uSES play nicely with React's concurrent mode.\n\t// LINK - https://kurtextrem.de/posts/react-uses-hydration#-concurrent-usesyncexternalstore\n\t// TODO - Switch concurrent react stores once it's officially released - https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#concurrent-stores\n\tconst deferredIsHydrated = useDeferredValue(isHydrated);\n\n\treturn deferredIsHydrated;\n};\n\nexport { useIsHydrated };\n","import { deepCompare, shallowCompare, type CompareFnOptions } from \"@zayne-labs/toolkit-core\";\nimport type { SelectorFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useInsertionEffect, useRef } from \"react\";\n\ntype UseCompareSelectorOptions = {\n\tcompareFnOptions?: CompareFnOptions;\n\ttype?: \"deep\" | \"shallow\";\n};\n\nexport const useCompareSelector = <TState, TResult>(\n\tselector: SelectorFn<TState, TResult> | undefined,\n\toptions: UseCompareSelectorOptions = {}\n) => {\n\tconst { compareFnOptions, type = \"shallow\" } = options;\n\n\tconst prevStateRef = useRef<TResult>(undefined as never);\n\n\tconst compareFn = type === \"shallow\" ? shallowCompare : deepCompare;\n\n\tconst compareSelector = (state: TState): TResult => {\n\t\tconst nextState = selector?.(state);\n\n\t\tif (!nextState) {\n\t\t\treturn prevStateRef.current;\n\t\t}\n\n\t\tif (compareFn(prevStateRef.current, nextState, compareFnOptions)) {\n\t\t\treturn prevStateRef.current;\n\t\t}\n\n\t\treturn (prevStateRef.current = nextState);\n\t};\n\n\treturn compareSelector;\n};\n\nexport const useCompareValue = <TValue>(value: TValue, options: UseCompareSelectorOptions = {}) => {\n\tconst { compareFnOptions, type = \"shallow\" } = options;\n\n\tconst prevValueRef = useRef<TValue>(value);\n\n\tconst compareFn = type === \"shallow\" ? shallowCompare : deepCompare;\n\n\tuseInsertionEffect(() => {\n\t\tif (compareFn(prevValueRef.current, value, compareFnOptions)) return;\n\n\t\tprevValueRef.current = value;\n\t});\n\n\t// eslint-disable-next-line react-hooks/refs -- Allow this for convenience\n\treturn prevValueRef.current;\n};\n","import type { StoreApi } from \"@zayne-labs/toolkit-core\";\nimport type { SelectorFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useCallback, useDebugValue, useDeferredValue, useSyncExternalStore } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\nconst identity = <TState>(value: TState) => value;\n\nconst useStore = <TState, TSlice = TState>(\n\tstore: StoreApi<TState>,\n\tselector: SelectorFn<TState, TSlice> = identity as never\n) => {\n\tconst stableSelector = useCallbackRef(selector);\n\n\tconst stableGetState = useCallback(() => stableSelector(store.getState()), [stableSelector, store]);\n\n\tconst stableGetInitialState = useCallback(\n\t\t() => stableSelector(store.getInitialState()),\n\t\t[stableSelector, store]\n\t);\n\n\tconst slice = useSyncExternalStore(store.subscribe, stableGetState, stableGetInitialState);\n\n\tuseDebugValue(slice);\n\n\t// == Using useDeferredValue to make the returned value for uSES play nicely with React's concurrent mode.\n\t// LINK - https://kurtextrem.de/posts/react-uses-hydration#-concurrent-usesyncexternalstore\n\t// TODO - Switch concurrent react stores once it's officially released - https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#concurrent-stores\n\tconst deferredSlice = useDeferredValue(slice);\n\n\treturn deferredSlice;\n};\n\nexport { useStore };\n","import {\n\tcreateLocationStore,\n\ttype LocationStoreApi,\n\ttype LocationStoreInfo,\n\ttype LocationStoreOptions,\n} from \"@zayne-labs/toolkit-core\";\nimport type { SelectorFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useMemo } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\nimport { useCompareValue } from \"./useCompare\";\nimport { useStore } from \"./useStore\";\n\ntype UseLocationResult<TSlice> = [state: TSlice, actions: LocationStoreApi];\n\nexport const createUseLocationState = (options?: LocationStoreOptions) => {\n\tconst locationStore = createLocationStore(options);\n\n\ttype UseBoundLocationState = LocationStoreApi\n\t\t& (<TSlice = LocationStoreInfo>(\n\t\t\tselector?: SelectorFn<LocationStoreInfo, TSlice>\n\t\t) => UseLocationResult<TSlice>);\n\n\tconst useLocationState = <TSlice = LocationStoreInfo>(\n\t\tselector?: SelectorFn<LocationStoreInfo, TSlice>\n\t): UseLocationResult<TSlice> => {\n\t\tconst stateSlice = useStore(locationStore as never, selector);\n\n\t\treturn [stateSlice, locationStore];\n\t};\n\n\tObject.assign(useLocationState, locationStore);\n\n\treturn useLocationState as UseBoundLocationState;\n};\n\nexport const useLocationState = <TSlice = LocationStoreInfo>(\n\tselector?: SelectorFn<LocationStoreInfo, TSlice>,\n\toptions: LocationStoreOptions = {}\n): UseLocationResult<TSlice> => {\n\tconst { defaultValues, equalityFn } = options;\n\n\tconst stableEqualityFn = useCallbackRef(equalityFn);\n\tconst stableDefaultValues = useCompareValue(defaultValues, { compareFnOptions: { maxDepth: 2 } });\n\n\tconst locationStore = useMemo(\n\t\t() => createLocationStore({ defaultValues: stableDefaultValues, equalityFn: stableEqualityFn }),\n\t\t[stableEqualityFn, stableDefaultValues]\n\t);\n\n\tconst stateSlice = useStore(locationStore as never, selector);\n\n\treturn [stateSlice, locationStore];\n};\n","import { createScrollObserver, type ScrollObserverOptions } from \"@zayne-labs/toolkit-core\";\nimport { useMemo, useState, type RefCallback } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\nconst useScrollObserver = <TElement extends HTMLElement>(options: ScrollObserverOptions = {}) => {\n\tconst { onIntersectionChange, root, rootMargin = \"10px 0px 0px 0px\", threshold } = options;\n\n\tconst [isScrolled, setIsScrolled] = useState(false);\n\n\tconst savedOnIntersectionChange = useCallbackRef(onIntersectionChange);\n\n\tconst { elementObserver, handleElementObservation } = useMemo(() => {\n\t\treturn createScrollObserver({\n\t\t\tonIntersectionChange: (entry, observer) => {\n\t\t\t\tconst newIsScrolledState = !entry.isIntersecting;\n\n\t\t\t\tsetIsScrolled(newIsScrolledState);\n\n\t\t\t\t// eslint-disable-next-line no-param-reassign -- Mutation is fine here\n\t\t\t\t(entry.target as HTMLElement).dataset.scrolled = String(newIsScrolledState);\n\n\t\t\t\tsavedOnIntersectionChange?.(entry, observer);\n\t\t\t},\n\t\t\troot,\n\t\t\trootMargin,\n\t\t\tthreshold,\n\t\t});\n\t}, [root, rootMargin, savedOnIntersectionChange, threshold]);\n\n\tconst observedElementRef: RefCallback<TElement> = useCallbackRef((element) => {\n\t\tconst cleanupFn = handleElementObservation(element);\n\n\t\t// == React 18 may not call the cleanup function so we need to call it manually on element unmount\n\t\tif (!element) {\n\t\t\tcleanupFn?.();\n\t\t\treturn;\n\t\t}\n\n\t\treturn cleanupFn;\n\t});\n\n\treturn { elementObserver, isScrolled, observedElementRef };\n};\n\nexport { useScrollObserver };\n","import { isPlainObject } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useState } from \"react\";\nimport { useAfterMountEffect } from \"./effects/useAfterMountEffect\";\nimport { useDebouncedFn } from \"./useDebounce\";\n\nconst isSerializable = (item: unknown): item is boolean | number | string =>\n\ttypeof item === \"string\" || typeof item === \"number\" || typeof item === \"boolean\";\n\nconst checkObjectPropsForQuery = (item: Record<string, unknown>, query: string): boolean => {\n\tfor (const value of Object.values(item)) {\n\t\tif (isSerializable(value) && value.toString().toLowerCase().includes(query)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\nconst useSearch = <TData>(initialData: TData[], delay?: number) => {\n\tconst [searchQuery, setSearchQuery] = useState(\"\");\n\tconst [filteredData, setFilteredData] = useState(initialData);\n\tconst [isLoading, setIsLoading] = useState(false);\n\n\tconst handleDebouncedSearch = useDebouncedFn(() => {\n\t\tconst query = searchQuery.toLowerCase();\n\n\t\tconst filteredResults = initialData.filter((item) => {\n\t\t\tif (isSerializable(item)) {\n\t\t\t\treturn item.toString().toLowerCase().includes(query);\n\t\t\t}\n\n\t\t\tif (isPlainObject(item)) {\n\t\t\t\treturn checkObjectPropsForQuery(item, query);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t});\n\n\t\tsetFilteredData(filteredResults);\n\t\tsetIsLoading(false);\n\t}, delay);\n\n\tuseAfterMountEffect(() => {\n\t\tsetIsLoading(true);\n\t\thandleDebouncedSearch();\n\t}, [searchQuery]);\n\n\treturn { data: filteredData, isLoading, query: searchQuery, setQuery: setSearchQuery };\n};\n\nexport { useSearch };\n","import {\n\tcreateSearchParams,\n\ttype LocationStoreOptions,\n\ttype URLSearchParamsInit,\n} from \"@zayne-labs/toolkit-core\";\nimport { isFunction } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useLocationState } from \"./useLocationState\";\n\ntype UseSearchParamsOptions<TSearchParams extends URLSearchParamsInit> = Omit<\n\tLocationStoreOptions,\n\t\"defaultValues\"\n> & {\n\taction?: \"push\" | \"replace\";\n\tdefaultValues?: TSearchParams;\n};\n\nexport const useSearchParams = <TSearchParams extends URLSearchParamsInit>(\n\toptions?: UseSearchParamsOptions<TSearchParams>\n) => {\n\tconst { action = \"push\", defaultValues, ...restOfOptions } = options ?? {};\n\n\tconst [searchParams, actions] = useLocationState((state) => state.search, {\n\t\t...restOfOptions,\n\t\tdefaultValues: { search: defaultValues },\n\t});\n\n\tconst setSearchParams = (\n\t\tnewQueryParams: TSearchParams | ((prev: URLSearchParams) => TSearchParams)\n\t) => {\n\t\tconst params = isFunction(newQueryParams) ? newQueryParams(searchParams) : newQueryParams;\n\n\t\tconst nextSearchParams = createSearchParams(params);\n\n\t\tactions[action]({ search: nextSearchParams });\n\t};\n\n\treturn [searchParams, setSearchParams, actions.triggerPopstateEvent] as [\n\t\tsearchParams: typeof searchParams,\n\t\tsetSearchParams: typeof setSearchParams,\n\t\ttriggerPopstateEvent: typeof actions.triggerPopstateEvent,\n\t];\n};\n\nexport const useSearchParamsObject = <\n\tTSearchParams extends Extract<URLSearchParamsInit, Record<string, string | string[]>>,\n>(\n\toptions?: UseSearchParamsOptions<TSearchParams>\n) => {\n\tconst [searchParams, setSearchParams, triggerPopstateEvent] = useSearchParams(options);\n\n\tconst searchParamsObject = Object.fromEntries(searchParams) as TSearchParams;\n\n\tconst setSearchParamsObject = (\n\t\tnewQueryParams: TSearchParams | ((prev: TSearchParams) => TSearchParams)\n\t) => {\n\t\tconst params = isFunction(newQueryParams) ? newQueryParams(searchParamsObject) : newQueryParams;\n\n\t\tsetSearchParams(params);\n\t};\n\n\treturn [searchParamsObject, setSearchParamsObject, triggerPopstateEvent] as [\n\t\tsearchParamsObject: typeof searchParamsObject,\n\t\tsetSearchParamsObject: typeof setSearchParamsObject,\n\t\ttriggerPopstateEvent: typeof triggerPopstateEvent,\n\t];\n};\n","import {\n\tcreateExternalStorageStore,\n\ttype StorageOptions,\n\ttype StorageStoreApi,\n} from \"@zayne-labs/toolkit-core\";\nimport type { SelectorFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useMemo } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\nimport { useCompareValue } from \"./useCompare\";\nimport { useStore } from \"./useStore\";\n\ntype UseStorageResult<TState, TSlice = TState> = [state: TSlice, actions: StorageStoreApi<TState>];\n\n/**\n * @description Creates a custom hook that returns a storage state and actions to modify it. You can use this if you need shared options.\n * @note You must use this if you want to be able to prevent syncing state across tabs.\n */\nexport const createUseStorageState = <TState>(baseOptions: StorageOptions<TState>) => {\n\tconst externalStore = createExternalStorageStore(baseOptions);\n\n\ttype UseBoundStorageState = StorageStoreApi<TState>\n\t\t& (<TSlice = TState>(selector?: SelectorFn<TState, TSlice>) => UseStorageResult<TState, TSlice>);\n\n\tconst useStorageState = <TSlice = TState>(\n\t\tselector?: SelectorFn<TState, TSlice>\n\t): UseStorageResult<TState, TSlice> => {\n\t\tconst stateInStorage = useStore(externalStore, selector);\n\n\t\treturn [stateInStorage, externalStore];\n\t};\n\n\tObject.assign(useStorageState, externalStore);\n\n\treturn useStorageState as UseBoundStorageState;\n};\n\ntype UseStorageStateOptions<TValue> = Omit<StorageOptions<TValue>, \"initialValue\" | \"key\">;\n\nexport const useStorageState = <TValue, TSlice = TValue>(\n\tkey: string,\n\tdefaultValue?: TValue,\n\toptions: UseStorageStateOptions<TValue> & { select?: SelectorFn<TValue, TSlice> } = {}\n): UseStorageResult<TValue, TSlice> => {\n\tconst { equalityFn, logger, parser, partialize, select, serializer, storageArea, syncStateAcrossTabs } =\n\t\toptions;\n\n\tconst shallowComparedDefaultValue = useCompareValue(defaultValue);\n\tconst stableEqualityFn = useCallbackRef(equalityFn);\n\tconst stableLogger = useCallbackRef(logger);\n\tconst stableParser = useCallbackRef(parser);\n\tconst stablePartialize = useCallbackRef(partialize);\n\tconst stableSerializer = useCallbackRef(serializer);\n\n\tconst externalStore = useMemo(() => {\n\t\treturn createExternalStorageStore({\n\t\t\tdefaultValue: shallowComparedDefaultValue,\n\t\t\tequalityFn: stableEqualityFn,\n\t\t\tkey,\n\t\t\tlogger: stableLogger,\n\t\t\tparser: stableParser,\n\t\t\tpartialize: stablePartialize,\n\t\t\tserializer: stableSerializer,\n\t\t\tstorageArea,\n\t\t\tsyncStateAcrossTabs,\n\t\t});\n\t}, [\n\t\tshallowComparedDefaultValue,\n\t\tkey,\n\t\tstableEqualityFn,\n\t\tstableLogger,\n\t\tstableParser,\n\t\tstablePartialize,\n\t\tstableSerializer,\n\t\tstorageArea,\n\t\tsyncStateAcrossTabs,\n\t]);\n\n\tconst stateInStorage = useStore(externalStore as never, select as never);\n\n\treturn [stateInStorage as never, externalStore];\n};\n","import { throttleByFrame, throttleByTime, throttleByTimeout } from \"@zayne-labs/toolkit-core\";\nimport type { CallbackFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useMemo } from \"react\";\nimport { useUnmountEffect } from \"./effects\";\nimport { useCallbackRef } from \"./useCallbackRef\";\nimport { useConstant } from \"./useConstant\";\n\nexport const useThrottleByTimeout = <TParams>(callbackFn: CallbackFn<TParams>, delay: number) => {\n\tconst latestCallback = useCallbackRef(callbackFn);\n\n\tconst throttledCallback = useMemo(\n\t\t() => throttleByTimeout(latestCallback, delay),\n\t\t[delay, latestCallback]\n\t);\n\n\tuseUnmountEffect(() => throttledCallback.cancelTimeout());\n\n\treturn throttledCallback;\n};\n\nexport const useThrottleByTimer = <TParams>(callbackFn: CallbackFn<TParams>, delay: number) => {\n\tconst latestCallback = useCallbackRef(callbackFn);\n\n\tconst throttledCallback = useMemo(() => throttleByTime(latestCallback, delay), [delay, latestCallback]);\n\n\treturn throttledCallback;\n};\n\nexport const useThrottleByFrame = <TParams>(callbackFn: CallbackFn<TParams>) => {\n\tconst latestCallback = useCallbackRef(callbackFn);\n\n\tconst throttledCallback = useConstant(() => throttleByFrame(latestCallback));\n\n\tuseUnmountEffect(() => throttledCallback.cancelAnimation());\n\n\treturn throttledCallback;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"hooks-COKx4mtj.js","names":[],"sources":["../../src/hooks/createCustomContext.ts","../../src/hooks/useCallbackRef.ts","../../src/hooks/effects/useAfterMountEffect.ts","../../src/hooks/effects/useAsyncEffect.ts","../../src/hooks/effects/useEffectOnce.ts","../../src/hooks/effects/useLifeCycle.ts","../../src/hooks/effects/useMountEffect.ts","../../src/hooks/effects/useUnMountEffect.ts","../../src/hooks/useAnimateElementRefs.ts","../../src/hooks/useAnimationInterval.ts","../../src/hooks/useClickOutside.ts","../../src/hooks/useComposeRefs.ts","../../src/hooks/useConstant.ts","../../src/hooks/useControllable.ts","../../src/hooks/useToggle.ts","../../src/hooks/useCopyToClipboard.ts","../../src/hooks/useDebounce.ts","../../src/hooks/useDisclosure.ts","../../src/hooks/useIsHydrated.ts","../../src/hooks/useCompare.ts","../../src/hooks/useStore.ts","../../src/hooks/useLocationState.ts","../../src/hooks/useScrollObserver.ts","../../src/hooks/useSearch.ts","../../src/hooks/useSearchParams.ts","../../src/hooks/useStorageState.ts","../../src/hooks/useThrottle.ts"],"sourcesContent":["import { createContext, use } from \"react\";\n\nexport type CustomContextOptions<TContextValue, TStrict extends boolean> = {\n\tdefaultValue?: TContextValue | null;\n\terrorMessage?: string;\n\textendValue?: (contextValue: NoInfer<TContextValue> | null) => TContextValue | null;\n\thookName?: string;\n\tname?: string;\n\tproviderName?: string;\n\tstrict?: TStrict;\n};\n\nexport type UseCustomContext<TContextValue, TStrict extends boolean> = () => TStrict extends true ?\n\tTContextValue\n:\tTContextValue | null;\n\nexport const createCustomContext = <TContextValue = null, TStrict extends boolean = true>(\n\toptions: CustomContextOptions<TContextValue, TStrict> = {}\n) => {\n\tconst {\n\t\tdefaultValue = null,\n\t\terrorMessage,\n\t\textendValue,\n\t\thookName = \"useUnnamedContext\",\n\t\tproviderName = \"UnnamedContextProvider\",\n\t\tname = providerName.endsWith(\"Provider\") ? providerName.slice(0, -8) : \"UnnamedContext\",\n\t\tstrict = true,\n\t} = options;\n\n\tconst Context = createContext<TContextValue>(defaultValue as TContextValue);\n\n\tContext.displayName = name;\n\n\tconst useCustomContext: UseCustomContext<TContextValue, TStrict> = () => {\n\t\tconst contextValue = use(Context);\n\n\t\tconst extendedContextValue = extendValue?.(contextValue) ?? contextValue;\n\n\t\tif (strict && extendedContextValue === null) {\n\t\t\tthrow new ContextError(errorMessage ?? getErrorMessage(hookName, providerName));\n\t\t}\n\n\t\treturn extendedContextValue as NonNullable<typeof extendedContextValue>;\n\t};\n\n\treturn [Context, useCustomContext] as [\n\t\tProvider: typeof Context,\n\t\tuseCustomContext: typeof useCustomContext,\n\t];\n};\n\nexport class ContextError extends Error {\n\toverride name = \"ContextError\";\n}\n\nexport const getErrorMessage = (hook: string, provider: string) => {\n\treturn `${hook} returned \"null\". Did you forget to wrap the necessary components within ${provider}?`;\n};\n","import type { AnyFunction } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useCallback, useInsertionEffect, useRef } from \"react\";\n\n/**\n * @description\n * - Returns a stable function that always points to the latest version of the callback function.\n * - This is only is the callback passed is not null or undefined.\n */\n\n// eslint-disable-next-line ts-eslint/no-invalid-void-type -- Ignore\nconst useCallbackRef = <TCallback extends AnyFunction | null | undefined | void = AnyFunction>(\n\tcallbackFn: TCallback\n): TCallback => {\n\tconst callbackRef = useRef(callbackFn);\n\n\tuseInsertionEffect(() => {\n\t\t// == Doing this instead updating it during render cuz according to Dan Abramov, render should be pure\n\t\tcallbackRef.current = callbackFn;\n\t}, [callbackFn]);\n\n\tconst savedCallback = useCallback(\n\t\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- callbackRef.current can be null in some cases\n\t\t(...params: unknown[]) => (callbackRef.current as AnyFunction)?.(...params) as unknown,\n\t\t[]\n\t);\n\n\tconst callbackOrSavedCallback = callbackFn ? (savedCallback as TCallback) : callbackFn;\n\n\treturn callbackOrSavedCallback;\n};\n\nexport { useCallbackRef };\n","import { useEffect, useRef } from \"react\";\nimport { useCallbackRef } from \"../useCallbackRef\";\n\nconst useAfterMountEffect: typeof useEffect = (callBackFn, deps) => {\n\tconst isFirstMountRef = useRef(true);\n\tconst stableCallback = useCallbackRef(callBackFn);\n\n\tuseEffect(() => {\n\t\tif (isFirstMountRef.current) {\n\t\t\tisFirstMountRef.current = false;\n\t\t\treturn;\n\t\t}\n\n\t\tstableCallback();\n\t\t// eslint-disable-next-line react-hooks/rule-suppression -- Ignore\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps -- Ignore\n\t}, [stableCallback, ...(deps ?? [])]);\n};\nexport { useAfterMountEffect };\n","import { useEffect, useState } from \"react\";\nimport { useCallbackRef } from \"../useCallbackRef\";\n\nexport function useAsyncEffect(\n\teffect: () => Promise<ReturnType<React.EffectCallback>>,\n\tdeps?: React.DependencyList\n) {\n\tconst stableEffectCallback = useCallbackRef(effect);\n\tconst [destroy, setDestroy] = useState<ReturnType<React.EffectCallback>>();\n\n\tuseEffect(() => {\n\t\tconst effectResult = stableEffectCallback();\n\n\t\tasync function execute() {\n\t\t\tsetDestroy(await effectResult);\n\t\t}\n\n\t\tvoid execute();\n\n\t\treturn () => void destroy?.();\n\t\t// eslint-disable-next-line react-hooks/rule-suppression -- Ignore\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps -- Ignore\n\t}, [destroy, stableEffectCallback, ...(deps ?? [])]);\n}\n","import { useEffect, useRef } from \"react\";\nimport { useCallbackRef } from \"../useCallbackRef\";\n\nconst useEffectOnce = (callBackFn: React.EffectCallback) => {\n\tconst stableCallback = useCallbackRef(callBackFn);\n\n\tconst effectGuardRef = useRef(false);\n\n\tuseEffect(() => {\n\t\tif (effectGuardRef.current) return;\n\n\t\teffectGuardRef.current = true;\n\n\t\treturn stableCallback();\n\t}, [stableCallback]);\n};\n\nexport { useEffectOnce };\n","import { useEffect } from \"react\";\nimport { useCallbackRef } from \"../useCallbackRef\";\n\nexport type Destructor = ReturnType<React.EffectCallback>;\n\ntype LifeCycleOptions = {\n\tonMount?: () => void;\n\tonUnmount?: Destructor;\n};\n\nconst useLifeCycle = ({ onMount, onUnmount }: LifeCycleOptions) => {\n\tconst stableOnMount = useCallbackRef(onMount);\n\tconst stableOnUnmount = useCallbackRef(onUnmount);\n\n\tuseEffect(() => {\n\t\tstableOnMount?.();\n\n\t\treturn stableOnUnmount;\n\t}, [stableOnMount, stableOnUnmount]);\n};\n\nexport { useLifeCycle };\n","import { useLifeCycle } from \"./useLifeCycle\";\n\nconst useMountEffect = (callBackFn: () => void) => {\n\tuseLifeCycle({ onMount: callBackFn });\n};\n\nexport { useMountEffect };\n","import { useLifeCycle, type Destructor } from \"./useLifeCycle\";\n\nconst useUnmountEffect = (cleanUpFn: Destructor) => useLifeCycle({ onUnmount: cleanUpFn });\n\nexport { useUnmountEffect };\n","import { on } from \"@zayne-labs/toolkit-core\";\nimport { isArray, type NonEmptyArray } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useCallback, useRef } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\ntype ElementsInfoArray<TTargetElement extends string> = NonEmptyArray<{\n\tanimationClass: string;\n\ttargetElement: TTargetElement;\n}>;\n\nconst removeClass = (target: HTMLElement, className: string) => () => target.classList.remove(className);\n\n/**\n * This is a custom React hook that adds and removes animation classes to specified HTML elements.\n * @param elementsInfoArray - An array of objects that contain information about the animation class and the target HTML element.\n * @returns - An object containing the refs of the animated elements and a function to handle the initiation and removal animation.\n */\n\nconst useAnimateElementRefs = <TTargetElement extends string>(\n\telementsInfoArray: ElementsInfoArray<TTargetElement>\n) => {\n\tconst elementsRef = useRef<Record<TTargetElement, HTMLElement | null>>({} as never);\n\n\tconst addAnimationClasses = useCallbackRef(() => {\n\t\tif (!isArray(elementsInfoArray)) {\n\t\t\tconsole.error(\"elementsInfo is not an Array\");\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const { animationClass, targetElement } of elementsInfoArray) {\n\t\t\tif (!elementsRef.current[targetElement]) {\n\t\t\t\tconsole.error(\"ElementError\", `\"${targetElement}\" element does not exist`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\telementsRef.current[targetElement].classList.add(animationClass);\n\t\t}\n\t});\n\n\tconst removeAnimationClasses = useCallbackRef(() => {\n\t\tif (!isArray(elementsInfoArray)) {\n\t\t\tconsole.error(\"elementsInfo is not an Array\");\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const { animationClass, targetElement } of elementsInfoArray) {\n\t\t\tif (!elementsRef.current[targetElement]) {\n\t\t\t\tconsole.error(\"ElementError\", `\"${targetElement}\" element does not exist`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ton(\n\t\t\t\t\"transitionend\",\n\t\t\t\telementsRef.current[targetElement],\n\t\t\t\tremoveClass(elementsRef.current[targetElement], animationClass)\n\t\t\t);\n\n\t\t\ton(\n\t\t\t\t\"animationend\",\n\t\t\t\telementsRef.current[targetElement],\n\t\t\t\tremoveClass(elementsRef.current[targetElement], animationClass)\n\t\t\t);\n\t\t}\n\t});\n\n\t// Add animation classes to elements and remove them after the animation ends\n\tconst handleElementsAnimation = useCallback(() => {\n\t\taddAnimationClasses();\n\n\t\tremoveAnimationClasses();\n\t}, [addAnimationClasses, removeAnimationClasses]);\n\n\t// eslint-disable-next-line react-hooks/refs -- Allow this for convenience\n\treturn { animatedElements: elementsRef.current, handleElementsAnimation };\n};\n\nexport { useAnimateElementRefs };\n","import { setAnimationInterval, type AnimationIntervalOptions } from \"@zayne-labs/toolkit-core\";\nimport type { Prettify } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useEffect, useMemo } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\ntype AnimationOptions = Prettify<\n\tAnimationIntervalOptions & {\n\t\tintervalDuration: number | null;\n\t\tonAnimation: () => void;\n\t}\n>;\n\nconst useAnimationInterval = (options: AnimationOptions) => {\n\tconst { intervalDuration, onAnimation, once } = options;\n\n\tconst stableCallback = useCallbackRef(onAnimation);\n\n\tconst { start, stop } = useMemo(\n\t\t() => setAnimationInterval(stableCallback, intervalDuration, { once }),\n\t\t[intervalDuration, stableCallback, once]\n\t);\n\n\tuseEffect(() => {\n\t\tif (intervalDuration === null) return;\n\n\t\tstart();\n\n\t\treturn stop;\n\t}, [intervalDuration, start, stop]);\n\n\treturn { start, stop };\n};\n\nexport { useAnimationInterval };\n","import { onClickOutside, toArray } from \"@zayne-labs/toolkit-core\";\nimport { useEffect, useRef } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\ntype UseClickOutsideOptions<TElement extends HTMLElement> = {\n\tenabled?: boolean;\n\tonClick: (event: MouseEvent | TouchEvent) => void;\n\tref?: Array<React.RefObject<TElement>> | React.RefObject<TElement>;\n};\n\nconst useClickOutside = <TElement extends HTMLElement>(options: UseClickOutsideOptions<TElement>) => {\n\tconst innerRef = useRef<TElement>(null);\n\n\tconst { enabled = true, onClick, ref: refOrRefArray = innerRef } = options;\n\n\tconst savedOnClick = useCallbackRef(onClick);\n\n\tuseEffect(() => {\n\t\tif (!enabled) return;\n\n\t\tconst elementArray = toArray(refOrRefArray).map((ref) => ref.current);\n\n\t\tconst cleanup = onClickOutside(elementArray, savedOnClick);\n\n\t\treturn () => cleanup();\n\t}, [enabled, refOrRefArray, savedOnClick]);\n\n\treturn {\n\t\tref: innerRef,\n\t};\n};\n\nexport { useClickOutside };\n","import { useMemo } from \"react\";\nimport { composeRefs, type PossibleRef } from \"@/utils\";\n\nconst useComposeRefs = <TRef extends HTMLElement>(...refs: Array<PossibleRef<TRef>>) => {\n\t// eslint-disable-next-line react-hooks/rule-suppression -- Allow\n\t// eslint-disable-next-line react-hooks/exhaustive-deps -- Allow\n\tconst mergedRef = useMemo(() => composeRefs(...refs), refs);\n\n\treturn mergedRef;\n};\n\nexport { useComposeRefs };\n","import { useRef } from \"react\";\n\nexport const useConstant = <TResult>(initFn: () => TResult): TResult => {\n\tconst resultRef = useRef<TResult | null>(null);\n\n\t// eslint-disable-next-line ts-eslint/prefer-nullish-coalescing -- The current case is justified since it's optimizable by the react compiler\n\tif (resultRef.current === null) {\n\t\tresultRef.current = initFn();\n\t}\n\n\t// eslint-disable-next-line react-hooks/refs -- Allow this for convenience\n\treturn resultRef.current;\n};\n\nexport const useLazyRef = <TResult>(initFn: () => TResult): React.RefObject<TResult> => {\n\tconst resultRef = useRef<TResult>(null as never);\n\n\t// eslint-disable-next-line ts-eslint/prefer-nullish-coalescing -- The current case is justified since it's optimizable by the react compiler\n\tif (resultRef.current === null) {\n\t\tresultRef.current = initFn();\n\t}\n\n\treturn resultRef;\n};\n","\"use client\";\n\nimport { isFunction } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport type { StateSetter } from \"@/utils\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\ntype UseControllablePropOptions<TProp> = {\n\tprop: TProp | undefined;\n\tstate: TProp;\n};\n\n/**\n * @description Given a prop value and state value, the useControllableProp hook is used to determine whether a component is controlled or uncontrolled, and also returns the computed value.\n */\nexport const useControllableProp = <TProp>(options: UseControllablePropOptions<TProp>) => {\n\tconst { prop, state } = options;\n\n\tconst isControlled = prop !== undefined;\n\n\tconst value = isControlled ? prop : state;\n\n\tconst result = useMemo<[isControlled: typeof isControlled, value: typeof value]>(\n\t\t() => [isControlled, value],\n\t\t[isControlled, value]\n\t);\n\n\treturn result;\n};\n\ntype UseControllableStateOptions<TProp> = {\n\tdefaultProp?: TProp | (() => TProp);\n\tisControlled?: boolean;\n\tonChange?: (prop: TProp) => void;\n\tprop?: TProp;\n};\n\n/**\n * @description React hook to manage state that can be either controlled or uncontrolled.\n * - When `options.prop` is provided, the hook operates in controlled mode.\n * In this mode, `value` always equals `options.prop` and `setState` will\n * invoke `options.onChange(next)` without mutating internal state.\n * - When `options.prop` is not provided, the hook operates in uncontrolled\n * mode, initializing internal state from `options.defaultProp` and updating\n * it via `setState`.\n *\n * @param options - Configuration options for the hook.\n * @param options.prop - Controlled value. If defined, the state is controlled.\n * @param options.defaultProp - Initial value for the uncontrolled state. Can be a\n * function for lazy initialization or a direct value.\n * @param options.onChange - Callback fired when a new value is requested. In\n * controlled mode, this is invoked instead of updating internal state. In\n * uncontrolled mode, it is called after the internal state updates.\n * @returns A tuple `[state, setState]` just like React.useState.\n *\n * @example\n * // Uncontrolled usage\n * const [state, setState] = useControllableState({ defaultProp: 0 });\n *\n * @example\n * // Controlled usage\n * const [state, setState] = useControllableState({\n * prop: props.value,\n * onChange: props.onChange,\n * });\n */\nexport const useControllableState = <TProp>(options: UseControllableStateOptions<TProp>) => {\n\tconst { defaultProp, onChange, prop } = options;\n\n\tconst isControlled = options.isControlled ?? prop !== undefined;\n\n\tconst stableOnPropChange = useCallbackRef(onChange);\n\n\tconst [unControlledState, setUncontrolledState] = useState(defaultProp as TProp);\n\n\tconst state = (isControlled ? prop : unControlledState) as TProp;\n\n\tconst setState: StateSetter<TProp> = useCallback(\n\t\t(newValue) => {\n\t\t\tconst nextValue = isFunction(newValue) ? newValue(state) : newValue;\n\n\t\t\tif (isControlled) {\n\t\t\t\tstableOnPropChange?.(nextValue);\n\t\t\t} else {\n\t\t\t\tsetUncontrolledState(nextValue);\n\t\t\t\tstableOnPropChange?.(nextValue);\n\t\t\t}\n\t\t},\n\t\t[state, isControlled, stableOnPropChange]\n\t);\n\n\treturn [state, setState] as [state: typeof state, setState: typeof setState];\n};\n","import { useCallback, useState } from \"react\";\n\ntype InitialState = boolean | (() => boolean);\n\nconst useToggle = (initialValue: InitialState = false) => {\n\tconst [value, setValue] = useState(initialValue);\n\n\tconst toggleValue = useCallback(<TValue>(newValue?: TValue) => {\n\t\tif (typeof newValue === \"boolean\") {\n\t\t\tsetValue(newValue);\n\t\t\treturn;\n\t\t}\n\n\t\tsetValue((prev) => !prev);\n\t}, []);\n\n\treturn [value, toggleValue] as [value: typeof value, toggleValue: typeof toggleValue];\n};\n\nexport { useToggle };\n","import {\n\tcopyToClipboard,\n\ttype AllowedClipboardItems,\n\ttype CopyToClipboardOptions,\n} from \"@zayne-labs/toolkit-core\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\nimport { useToggle } from \"./useToggle\";\n\nconst useCopyToClipboard = (options: CopyToClipboardOptions & { timeout?: number } = {}) => {\n\tconst { mimeType, onCopied, onError, onSuccess, timeout = 1500 } = options;\n\n\tconst [value, setValue] = useState<AllowedClipboardItems>(\"\");\n\n\tconst [hasCopied, toggleHasCopied] = useToggle(false);\n\tconst timeoutRef = useRef<number | null>(null);\n\n\tconst savedOnError = useCallbackRef(onError);\n\tconst savedOnSuccess = useCallbackRef(onSuccess);\n\tconst savedOnCopied = useCallbackRef(onCopied);\n\n\tconst handleHasCopied = useCallback(() => {\n\t\ttoggleHasCopied(true);\n\n\t\ttimeoutRef.current && clearTimeout(timeoutRef.current);\n\n\t\ttimeoutRef.current = setTimeout(() => {\n\t\t\ttoggleHasCopied(false);\n\t\t}, timeout) as never;\n\t}, [toggleHasCopied, timeout]);\n\n\tconst handleCopy = useCallback(\n\t\t(valueToCopy: AllowedClipboardItems) => {\n\t\t\tsetValue(valueToCopy);\n\n\t\t\tvoid copyToClipboard(valueToCopy, {\n\t\t\t\tmimeType,\n\t\t\t\tonCopied: () => {\n\t\t\t\t\tsavedOnCopied?.();\n\t\t\t\t\thandleHasCopied();\n\t\t\t\t},\n\t\t\t\tonError: savedOnError,\n\t\t\t\tonSuccess: savedOnSuccess,\n\t\t\t});\n\t\t},\n\t\t[handleHasCopied, mimeType, savedOnCopied, savedOnError, savedOnSuccess]\n\t);\n\n\treturn { handleCopy, hasCopied, setValue, value };\n};\n\nexport { useCopyToClipboard };\n","import { debounce } from \"@zayne-labs/toolkit-core\";\nimport type { CallbackFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useMemo, useState } from \"react\";\nimport { useUnmountEffect } from \"./effects/useUnMountEffect\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\nexport const useDebouncedFn = <TParams>(callBackFn: CallbackFn<TParams>, delay: number | undefined) => {\n\tconst latestCallback = useCallbackRef(callBackFn);\n\n\tconst debouncedFn = useMemo(() => debounce(latestCallback, delay), [delay, latestCallback]);\n\n\tuseUnmountEffect(() => {\n\t\tdebouncedFn.cancel();\n\t\tdebouncedFn.cancelMaxWait();\n\t});\n\n\treturn debouncedFn;\n};\n\nexport const useDebouncedState = <TValue>(defaultValue: TValue, delay: number | undefined) => {\n\tconst [value, setValue] = useState(defaultValue);\n\n\tconst setDebouncedValue = useMemo(() => debounce(setValue, delay), [delay]);\n\n\tuseUnmountEffect(() => {\n\t\tsetDebouncedValue.cancel();\n\t\tsetDebouncedValue.cancelMaxWait();\n\t});\n\n\treturn [value, setDebouncedValue, setValue] as const;\n};\n","import { lockScroll } from \"@zayne-labs/toolkit-core\";\nimport { isBoolean } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useMemo } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\nimport { useToggle } from \"./useToggle\";\n\ntype DisclosureOptions = {\n\thasScrollControl?: boolean;\n\tinitialState?: boolean | (() => boolean);\n};\n\nconst useDisclosure = (options: DisclosureOptions = {}) => {\n\tconst { hasScrollControl = false, initialState = false } = options;\n\tconst [isOpen, toggleIsOpen] = useToggle(initialState);\n\n\tconst onOpen = useCallbackRef(() => {\n\t\ttoggleIsOpen(true);\n\t\thasScrollControl && lockScroll({ lock: true });\n\t});\n\n\tconst onClose = useCallbackRef(() => {\n\t\ttoggleIsOpen(false);\n\t\thasScrollControl && lockScroll({ lock: false });\n\t});\n\n\tconst onToggle = useCallbackRef(<TValue>(value?: TValue) => {\n\t\tif (isBoolean(value)) {\n\t\t\ttoggleIsOpen(value);\n\t\t\thasScrollControl && lockScroll({ lock: value });\n\t\t\treturn;\n\t\t}\n\n\t\tisOpen ? onClose() : onOpen();\n\t});\n\n\tconst api = useMemo(() => ({ isOpen, onClose, onOpen, onToggle }), [isOpen, onClose, onOpen, onToggle]);\n\n\treturn api;\n};\nexport { useDisclosure };\n","import { useDeferredValue, useSyncExternalStore } from \"react\";\n\nconst noopStore = {\n\tgetServerSnapshot: () => false,\n\tgetSnapshot: () => true,\n\t// eslint-disable-next-line unicorn/consistent-function-scoping -- Ignore\n\tsubscribe: () => () => {},\n};\n\n/**\n * @description Return a boolean indicating if the JS has been hydrated already.\n * When doing Server-Side Rendering, the result will always be false.\n * When doing Client-Side Rendering, the result will always be false on the\n * first render and true from then on. Even if a new component renders it will\n * always start with true.\n *\n * @see https://github.com/sergiodxa/remix-utils/blob/main/src/react/use-hydrated.ts\n *\n * @see https://github.com/sergiodxa/remix-utils/blob/main/src/react/use-hydrated.ts\n *\n * @example\n * **Example: Disable a button that needs JS to work.**\n * ```tsx\n * const isHydrated = useIsHydrated();\n *\n * return (\n * <button type=\"button\" disabled={!isHydrated} onClick={doSomethingCustom}>\n * Click me\n * </button>\n * );\n * ```\n */\nconst useIsHydrated = () => {\n\tconst isHydrated = useSyncExternalStore(\n\t\tnoopStore.subscribe,\n\t\tnoopStore.getSnapshot,\n\t\tnoopStore.getServerSnapshot\n\t);\n\n\t// == Using useDeferredValue to make the returned value for uSES play nicely with React's concurrent mode.\n\t// LINK - https://kurtextrem.de/posts/react-uses-hydration#-concurrent-usesyncexternalstore\n\t// TODO - Switch concurrent react stores once it's officially released - https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#concurrent-stores\n\tconst deferredIsHydrated = useDeferredValue(isHydrated);\n\n\treturn deferredIsHydrated;\n};\n\nexport { useIsHydrated };\n","import { deepCompare, shallowCompare, type CompareFnOptions } from \"@zayne-labs/toolkit-core\";\nimport type { SelectorFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useInsertionEffect, useRef } from \"react\";\n\ntype UseCompareSelectorOptions = {\n\tcompareFnOptions?: CompareFnOptions;\n\ttype?: \"deep\" | \"shallow\";\n};\n\nexport const useCompareSelector = <TState, TResult>(\n\tselector: SelectorFn<TState, TResult> | undefined,\n\toptions: UseCompareSelectorOptions = {}\n) => {\n\tconst { compareFnOptions, type = \"shallow\" } = options;\n\n\tconst prevStateRef = useRef<TResult>(undefined as never);\n\n\tconst compareFn = type === \"shallow\" ? shallowCompare : deepCompare;\n\n\tconst compareSelector = (state: TState): TResult => {\n\t\tconst nextState = selector?.(state);\n\n\t\tif (!nextState) {\n\t\t\treturn prevStateRef.current;\n\t\t}\n\n\t\tif (compareFn(prevStateRef.current, nextState, compareFnOptions)) {\n\t\t\treturn prevStateRef.current;\n\t\t}\n\n\t\treturn (prevStateRef.current = nextState);\n\t};\n\n\treturn compareSelector;\n};\n\nexport const useCompareValue = <TValue>(value: TValue, options: UseCompareSelectorOptions = {}) => {\n\tconst { compareFnOptions, type = \"shallow\" } = options;\n\n\tconst prevValueRef = useRef<TValue>(value);\n\n\tconst compareFn = type === \"shallow\" ? shallowCompare : deepCompare;\n\n\tuseInsertionEffect(() => {\n\t\tif (compareFn(prevValueRef.current, value, compareFnOptions)) return;\n\n\t\tprevValueRef.current = value;\n\t});\n\n\t// eslint-disable-next-line react-hooks/refs -- Allow this for convenience\n\treturn prevValueRef.current;\n};\n","import type { StoreApi } from \"@zayne-labs/toolkit-core\";\nimport type { SelectorFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useCallback, useDebugValue, useDeferredValue, useSyncExternalStore } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\nconst identity = <TState>(value: TState) => value;\n\nconst useStore = <TState, TSlice = TState>(\n\tstore: StoreApi<TState>,\n\tselector: SelectorFn<TState, TSlice> = identity as never\n) => {\n\tconst stableSelector = useCallbackRef(selector);\n\n\tconst stableGetState = useCallback(() => stableSelector(store.getState()), [stableSelector, store]);\n\n\tconst stableGetInitialState = useCallback(\n\t\t() => stableSelector(store.getInitialState()),\n\t\t[stableSelector, store]\n\t);\n\n\tconst slice = useSyncExternalStore(store.subscribe, stableGetState, stableGetInitialState);\n\n\tuseDebugValue(slice);\n\n\t// == Using useDeferredValue to make the returned value for uSES play nicely with React's concurrent mode.\n\t// LINK - https://kurtextrem.de/posts/react-uses-hydration#-concurrent-usesyncexternalstore\n\t// TODO - Switch concurrent react stores once it's officially released - https://react.dev/blog/2025/04/23/react-labs-view-transitions-activity-and-more#concurrent-stores\n\tconst deferredSlice = useDeferredValue(slice);\n\n\treturn deferredSlice;\n};\n\nexport { useStore };\n","import {\n\tcreateLocationStore,\n\ttype LocationStoreApi,\n\ttype LocationStoreInfo,\n\ttype LocationStoreOptions,\n} from \"@zayne-labs/toolkit-core\";\nimport type { SelectorFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useMemo } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\nimport { useCompareValue } from \"./useCompare\";\nimport { useStore } from \"./useStore\";\n\ntype UseLocationResult<TSlice> = [state: TSlice, actions: LocationStoreApi];\n\nexport const createUseLocationState = (options?: LocationStoreOptions) => {\n\tconst locationStore = createLocationStore(options);\n\n\ttype UseBoundLocationState = LocationStoreApi\n\t\t& (<TSlice = LocationStoreInfo>(\n\t\t\tselector?: SelectorFn<LocationStoreInfo, TSlice>\n\t\t) => UseLocationResult<TSlice>);\n\n\tconst useLocationState = <TSlice = LocationStoreInfo>(\n\t\tselector?: SelectorFn<LocationStoreInfo, TSlice>\n\t): UseLocationResult<TSlice> => {\n\t\tconst stateSlice = useStore(locationStore as never, selector);\n\n\t\treturn [stateSlice, locationStore];\n\t};\n\n\tObject.assign(useLocationState, locationStore);\n\n\treturn useLocationState as UseBoundLocationState;\n};\n\nexport const useLocationState = <TSlice = LocationStoreInfo>(\n\tselector?: SelectorFn<LocationStoreInfo, TSlice>,\n\toptions: LocationStoreOptions = {}\n): UseLocationResult<TSlice> => {\n\tconst { defaultValues, equalityFn } = options;\n\n\tconst stableEqualityFn = useCallbackRef(equalityFn);\n\tconst stableDefaultValues = useCompareValue(defaultValues, { compareFnOptions: { maxDepth: 2 } });\n\n\tconst locationStore = useMemo(\n\t\t() => createLocationStore({ defaultValues: stableDefaultValues, equalityFn: stableEqualityFn }),\n\t\t[stableEqualityFn, stableDefaultValues]\n\t);\n\n\tconst stateSlice = useStore(locationStore as never, selector);\n\n\treturn [stateSlice, locationStore];\n};\n","import { createScrollObserver, type ScrollObserverOptions } from \"@zayne-labs/toolkit-core\";\nimport { useMemo, useState, type RefCallback } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\n\nconst useScrollObserver = <TElement extends HTMLElement>(options: ScrollObserverOptions = {}) => {\n\tconst { onIntersectionChange, root, rootMargin = \"10px 0px 0px 0px\", threshold } = options;\n\n\tconst [isScrolled, setIsScrolled] = useState(false);\n\n\tconst savedOnIntersectionChange = useCallbackRef(onIntersectionChange);\n\n\tconst { elementObserver, handleElementObservation } = useMemo(() => {\n\t\treturn createScrollObserver({\n\t\t\tonIntersectionChange: (entry, observer) => {\n\t\t\t\tconst newIsScrolledState = !entry.isIntersecting;\n\n\t\t\t\tsetIsScrolled(newIsScrolledState);\n\n\t\t\t\t// eslint-disable-next-line no-param-reassign -- Mutation is fine here\n\t\t\t\t(entry.target as HTMLElement).dataset.scrolled = String(newIsScrolledState);\n\n\t\t\t\tsavedOnIntersectionChange?.(entry, observer);\n\t\t\t},\n\t\t\troot,\n\t\t\trootMargin,\n\t\t\tthreshold,\n\t\t});\n\t}, [root, rootMargin, savedOnIntersectionChange, threshold]);\n\n\tconst observedElementRef: RefCallback<TElement> = useCallbackRef((element) => {\n\t\tconst cleanupFn = handleElementObservation(element);\n\n\t\t// == React 18 may not call the cleanup function so we need to call it manually on element unmount\n\t\tif (!element) {\n\t\t\tcleanupFn?.();\n\t\t\treturn;\n\t\t}\n\n\t\treturn cleanupFn;\n\t});\n\n\treturn { elementObserver, isScrolled, observedElementRef };\n};\n\nexport { useScrollObserver };\n","import { isPlainObject } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useState } from \"react\";\nimport { useAfterMountEffect } from \"./effects/useAfterMountEffect\";\nimport { useDebouncedFn } from \"./useDebounce\";\n\nconst isSerializable = (item: unknown): item is boolean | number | string =>\n\ttypeof item === \"string\" || typeof item === \"number\" || typeof item === \"boolean\";\n\nconst checkObjectPropsForQuery = (item: Record<string, unknown>, query: string): boolean => {\n\tfor (const value of Object.values(item)) {\n\t\tif (isSerializable(value) && value.toString().toLowerCase().includes(query)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\nconst useSearch = <TData>(initialData: TData[], delay?: number) => {\n\tconst [searchQuery, setSearchQuery] = useState(\"\");\n\tconst [filteredData, setFilteredData] = useState(initialData);\n\tconst [isLoading, setIsLoading] = useState(false);\n\n\tconst handleDebouncedSearch = useDebouncedFn(() => {\n\t\tconst query = searchQuery.toLowerCase();\n\n\t\tconst filteredResults = initialData.filter((item) => {\n\t\t\tif (isSerializable(item)) {\n\t\t\t\treturn item.toString().toLowerCase().includes(query);\n\t\t\t}\n\n\t\t\tif (isPlainObject(item)) {\n\t\t\t\treturn checkObjectPropsForQuery(item, query);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t});\n\n\t\tsetFilteredData(filteredResults);\n\t\tsetIsLoading(false);\n\t}, delay);\n\n\tuseAfterMountEffect(() => {\n\t\tsetIsLoading(true);\n\t\thandleDebouncedSearch();\n\t}, [searchQuery]);\n\n\treturn { data: filteredData, isLoading, query: searchQuery, setQuery: setSearchQuery };\n};\n\nexport { useSearch };\n","import {\n\tcreateSearchParams,\n\ttype LocationStoreOptions,\n\ttype URLSearchParamsInit,\n} from \"@zayne-labs/toolkit-core\";\nimport { isFunction } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useLocationState } from \"./useLocationState\";\n\ntype UseSearchParamsOptions<TSearchParams extends URLSearchParamsInit> = Omit<\n\tLocationStoreOptions,\n\t\"defaultValues\"\n> & {\n\taction?: \"push\" | \"replace\";\n\tdefaultValues?: TSearchParams;\n};\n\nexport const useSearchParams = <TSearchParams extends URLSearchParamsInit>(\n\toptions?: UseSearchParamsOptions<TSearchParams>\n) => {\n\tconst { action = \"push\", defaultValues, ...restOfOptions } = options ?? {};\n\n\tconst [searchParams, actions] = useLocationState((state) => state.search, {\n\t\t...restOfOptions,\n\t\tdefaultValues: { search: defaultValues },\n\t});\n\n\tconst setSearchParams = (\n\t\tnewQueryParams: TSearchParams | ((prev: URLSearchParams) => TSearchParams)\n\t) => {\n\t\tconst params = isFunction(newQueryParams) ? newQueryParams(searchParams) : newQueryParams;\n\n\t\tconst nextSearchParams = createSearchParams(params);\n\n\t\tactions[action]({ search: nextSearchParams });\n\t};\n\n\treturn [searchParams, setSearchParams, actions.triggerPopstateEvent] as [\n\t\tsearchParams: typeof searchParams,\n\t\tsetSearchParams: typeof setSearchParams,\n\t\ttriggerPopstateEvent: typeof actions.triggerPopstateEvent,\n\t];\n};\n\nexport const useSearchParamsObject = <\n\tTSearchParams extends Extract<URLSearchParamsInit, Record<string, string | string[]>>,\n>(\n\toptions?: UseSearchParamsOptions<TSearchParams>\n) => {\n\tconst [searchParams, setSearchParams, triggerPopstateEvent] = useSearchParams(options);\n\n\tconst searchParamsObject = Object.fromEntries(searchParams) as TSearchParams;\n\n\tconst setSearchParamsObject = (\n\t\tnewQueryParams: TSearchParams | ((prev: TSearchParams) => TSearchParams)\n\t) => {\n\t\tconst params = isFunction(newQueryParams) ? newQueryParams(searchParamsObject) : newQueryParams;\n\n\t\tsetSearchParams(params);\n\t};\n\n\treturn [searchParamsObject, setSearchParamsObject, triggerPopstateEvent] as [\n\t\tsearchParamsObject: typeof searchParamsObject,\n\t\tsetSearchParamsObject: typeof setSearchParamsObject,\n\t\ttriggerPopstateEvent: typeof triggerPopstateEvent,\n\t];\n};\n","import {\n\tcreateExternalStorageStore,\n\ttype StorageOptions,\n\ttype StorageStoreApi,\n} from \"@zayne-labs/toolkit-core\";\nimport type { SelectorFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useMemo } from \"react\";\nimport { useCallbackRef } from \"./useCallbackRef\";\nimport { useCompareValue } from \"./useCompare\";\nimport { useStore } from \"./useStore\";\n\ntype UseStorageResult<TState, TSlice = TState> = [state: TSlice, actions: StorageStoreApi<TState>];\n\n/**\n * @description Creates a custom hook that returns a storage state and actions to modify it. You can use this if you need shared options.\n * @note You must use this if you want to be able to prevent syncing state across tabs.\n */\nexport const createUseStorageState = <TState>(baseOptions: StorageOptions<TState>) => {\n\tconst externalStore = createExternalStorageStore(baseOptions);\n\n\ttype UseBoundStorageState = StorageStoreApi<TState>\n\t\t& (<TSlice = TState>(selector?: SelectorFn<TState, TSlice>) => UseStorageResult<TState, TSlice>);\n\n\tconst useStorageState = <TSlice = TState>(\n\t\tselector?: SelectorFn<TState, TSlice>\n\t): UseStorageResult<TState, TSlice> => {\n\t\tconst stateInStorage = useStore(externalStore, selector);\n\n\t\treturn [stateInStorage, externalStore];\n\t};\n\n\tObject.assign(useStorageState, externalStore);\n\n\treturn useStorageState as UseBoundStorageState;\n};\n\ntype UseStorageStateOptions<TValue> = Omit<StorageOptions<TValue>, \"initialValue\" | \"key\">;\n\nexport const useStorageState = <TValue, TSlice = TValue>(\n\tkey: string,\n\tdefaultValue?: TValue,\n\toptions: UseStorageStateOptions<TValue> & { select?: SelectorFn<TValue, TSlice> } = {}\n): UseStorageResult<TValue, TSlice> => {\n\tconst { equalityFn, logger, parser, partialize, select, serializer, storageArea, syncStateAcrossTabs } =\n\t\toptions;\n\n\tconst shallowComparedDefaultValue = useCompareValue(defaultValue);\n\tconst stableEqualityFn = useCallbackRef(equalityFn);\n\tconst stableLogger = useCallbackRef(logger);\n\tconst stableParser = useCallbackRef(parser);\n\tconst stablePartialize = useCallbackRef(partialize);\n\tconst stableSerializer = useCallbackRef(serializer);\n\n\tconst externalStore = useMemo(() => {\n\t\treturn createExternalStorageStore({\n\t\t\tdefaultValue: shallowComparedDefaultValue,\n\t\t\tequalityFn: stableEqualityFn,\n\t\t\tkey,\n\t\t\tlogger: stableLogger,\n\t\t\tparser: stableParser,\n\t\t\tpartialize: stablePartialize,\n\t\t\tserializer: stableSerializer,\n\t\t\tstorageArea,\n\t\t\tsyncStateAcrossTabs,\n\t\t});\n\t}, [\n\t\tshallowComparedDefaultValue,\n\t\tkey,\n\t\tstableEqualityFn,\n\t\tstableLogger,\n\t\tstableParser,\n\t\tstablePartialize,\n\t\tstableSerializer,\n\t\tstorageArea,\n\t\tsyncStateAcrossTabs,\n\t]);\n\n\tconst stateInStorage = useStore(externalStore as never, select as never);\n\n\treturn [stateInStorage as never, externalStore];\n};\n","import { throttleByFrame, throttleByTime, throttleByTimeout } from \"@zayne-labs/toolkit-core\";\nimport type { CallbackFn } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useMemo } from \"react\";\nimport { useUnmountEffect } from \"./effects\";\nimport { useCallbackRef } from \"./useCallbackRef\";\nimport { useConstant } from \"./useConstant\";\n\nexport const useThrottleByTimeout = <TParams>(callbackFn: CallbackFn<TParams>, delay: number) => {\n\tconst latestCallback = useCallbackRef(callbackFn);\n\n\tconst throttledCallback = useMemo(\n\t\t() => throttleByTimeout(latestCallback, delay),\n\t\t[delay, latestCallback]\n\t);\n\n\tuseUnmountEffect(() => throttledCallback.cancelTimeout());\n\n\treturn throttledCallback;\n};\n\nexport const useThrottleByTimer = <TParams>(callbackFn: CallbackFn<TParams>, delay: number) => {\n\tconst latestCallback = useCallbackRef(callbackFn);\n\n\tconst throttledCallback = useMemo(() => throttleByTime(latestCallback, delay), [delay, latestCallback]);\n\n\treturn throttledCallback;\n};\n\nexport const useThrottleByFrame = <TParams>(callbackFn: CallbackFn<TParams>) => {\n\tconst latestCallback = useCallbackRef(callbackFn);\n\n\tconst throttledCallback = useConstant(() => throttleByFrame(latestCallback));\n\n\tuseUnmountEffect(() => throttledCallback.cancelAnimation());\n\n\treturn throttledCallback;\n};\n"],"mappings":"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"}
@@ -225,4 +225,4 @@ type PolymorphicProps<TElement extends React.ElementType, TProps extends AnyObje
225
225
  type PolymorphicPropsStrict<TElement extends React.ElementType, TProps extends AnyObject = NonNullable<unknown>> = MergedGivenPropsWithAs<TElement, TProps> & Omit<InferPropsStrict<TElement>, keyof TProps>;
226
226
  //#endregion
227
227
  export { composeEventHandlers as A, getRegularChildren as C, PossibleRef as D, matchesSlotComponent as E, composeRefs as O, getMultipleSlots as S, matchesAnySlotComponent as T, createSlotComponent as _, DefaultRenderErrorMessages as a, withSlotNameAndSymbol as b, DiscriminatedRenderProps as c, InferPropsStrict as d, StateSetter as f, GetSlotMapResult as g, GetSlotComponentProps as h, CssWithCustomProperties as i, composeTwoEventHandlers as j, setRef as k, ForwardedRefType as l, mergeProps as m, PolymorphicProps as n, DefaultRenderItemErrorMessages as o, mergeTwoProps as p, PolymorphicPropsStrict as r, DiscriminatedRenderItemProps as s, AsProp as t, InferProps as u, getSlotMap as v, getSingleSlot as w, FunctionalComponent as x, slotComponentSymbol as y };
228
- //# sourceMappingURL=index-B39cWF3H.d.ts.map
228
+ //# sourceMappingURL=index-B08DS8-6.d.ts.map
@@ -1,7 +1,7 @@
1
- import { D as PossibleRef, f as StateSetter } from "./index-B39cWF3H.js";
1
+ import { D as PossibleRef, f as StateSetter } from "./index-B08DS8-6.js";
2
2
  import * as react1 from "react";
3
3
  import { RefCallback, useEffect } from "react";
4
- import * as _zayne_labs_toolkit_core0 from "@zayne-labs/toolkit-core";
4
+ import * as _zayne_labs_toolkit_core2 from "@zayne-labs/toolkit-core";
5
5
  import { AllowedClipboardItems, AnimationIntervalOptions, CompareFnOptions, CopyToClipboardOptions, LocationStoreApi, LocationStoreInfo, LocationStoreOptions, ScrollObserverOptions, StorageOptions, StorageStoreApi, StoreApi, URLSearchParamsInit } from "@zayne-labs/toolkit-core";
6
6
  import { AnyFunction, CallbackFn, NonEmptyArray, Prettify, SelectorFn } from "@zayne-labs/toolkit-type-helpers";
7
7
 
@@ -213,35 +213,35 @@ declare const useIsHydrated: () => boolean;
213
213
  //#region src/hooks/useLocationState.d.ts
214
214
  type UseLocationResult<TSlice> = [state: TSlice, actions: LocationStoreApi];
215
215
  declare const createUseLocationState: (options?: LocationStoreOptions) => Omit<{
216
- getInitialState: () => _zayne_labs_toolkit_core0.URLInfoObject;
217
- getListeners: () => Set<(state: _zayne_labs_toolkit_core0.URLInfoObject, prevState: _zayne_labs_toolkit_core0.URLInfoObject) => void>;
218
- getState: () => _zayne_labs_toolkit_core0.URLInfoObject;
216
+ getInitialState: () => _zayne_labs_toolkit_core2.URLInfoObject;
217
+ getListeners: () => Set<(state: _zayne_labs_toolkit_core2.URLInfoObject, prevState: _zayne_labs_toolkit_core2.URLInfoObject) => void>;
218
+ getState: () => _zayne_labs_toolkit_core2.URLInfoObject;
219
219
  resetState: () => void;
220
220
  setState: {
221
- (stateUpdate: Partial<_zayne_labs_toolkit_core0.URLInfoObject> | ((prevState: _zayne_labs_toolkit_core0.URLInfoObject) => Partial<_zayne_labs_toolkit_core0.URLInfoObject>), options?: ({
222
- onNotifySync?: ((previousState: _zayne_labs_toolkit_core0.URLInfoObject) => void) | undefined;
223
- onNotifyViaBatch?: ((previousStateSnapshot: _zayne_labs_toolkit_core0.URLInfoObject) => void) | undefined;
221
+ (stateUpdate: Partial<_zayne_labs_toolkit_core2.URLInfoObject> | ((prevState: _zayne_labs_toolkit_core2.URLInfoObject) => Partial<_zayne_labs_toolkit_core2.URLInfoObject>), options?: ({
222
+ onNotifySync?: ((previousState: _zayne_labs_toolkit_core2.URLInfoObject) => void) | undefined;
223
+ onNotifyViaBatch?: ((previousStateSnapshot: _zayne_labs_toolkit_core2.URLInfoObject) => void) | undefined;
224
224
  shouldNotifySync?: boolean | undefined;
225
225
  } & {
226
226
  shouldReplace?: false;
227
227
  }) | undefined): void;
228
- (stateUpdate: _zayne_labs_toolkit_core0.URLInfoObject | ((prevState: _zayne_labs_toolkit_core0.URLInfoObject) => _zayne_labs_toolkit_core0.URLInfoObject), options?: ({
229
- onNotifySync?: ((previousState: _zayne_labs_toolkit_core0.URLInfoObject) => void) | undefined;
230
- onNotifyViaBatch?: ((previousStateSnapshot: _zayne_labs_toolkit_core0.URLInfoObject) => void) | undefined;
228
+ (stateUpdate: _zayne_labs_toolkit_core2.URLInfoObject | ((prevState: _zayne_labs_toolkit_core2.URLInfoObject) => _zayne_labs_toolkit_core2.URLInfoObject), options?: ({
229
+ onNotifySync?: ((previousState: _zayne_labs_toolkit_core2.URLInfoObject) => void) | undefined;
230
+ onNotifyViaBatch?: ((previousStateSnapshot: _zayne_labs_toolkit_core2.URLInfoObject) => void) | undefined;
231
231
  shouldNotifySync?: boolean | undefined;
232
232
  } & {
233
233
  shouldReplace: true;
234
234
  }) | undefined): void;
235
235
  };
236
- subscribe: _zayne_labs_toolkit_core0.SubscribeFn<_zayne_labs_toolkit_core0.URLInfoObject>;
236
+ subscribe: _zayne_labs_toolkit_core2.SubscribeFn<_zayne_labs_toolkit_core2.URLInfoObject>;
237
237
  }, "resetState" | "setState"> & {
238
- push: (newURL: string | _zayne_labs_toolkit_core0.PartialURLInfo, options?: {
238
+ push: (newURL: string | _zayne_labs_toolkit_core2.PartialURLInfo, options?: {
239
239
  shouldNotifySync?: boolean;
240
- state?: _zayne_labs_toolkit_core0.PartialURLInfo["state"];
240
+ state?: _zayne_labs_toolkit_core2.PartialURLInfo["state"];
241
241
  }) => void;
242
242
  replace: LocationStoreApi["push"];
243
243
  triggerPopstateEvent: (nextLocationState?: LocationStoreInfo["state"]) => void;
244
- } & (<TSlice = _zayne_labs_toolkit_core0.URLInfoObject>(selector?: SelectorFn<LocationStoreInfo, TSlice>) => UseLocationResult<TSlice>);
244
+ } & (<TSlice = _zayne_labs_toolkit_core2.URLInfoObject>(selector?: SelectorFn<LocationStoreInfo, TSlice>) => UseLocationResult<TSlice>);
245
245
  declare const useLocationState: <TSlice = LocationStoreInfo>(selector?: SelectorFn<LocationStoreInfo, TSlice>, options?: LocationStoreOptions) => UseLocationResult<TSlice>;
246
246
  //#endregion
247
247
  //#region src/hooks/useScrollObserver.d.ts
@@ -264,8 +264,8 @@ type UseSearchParamsOptions<TSearchParams extends URLSearchParamsInit> = Omit<Lo
264
264
  action?: "push" | "replace";
265
265
  defaultValues?: TSearchParams;
266
266
  };
267
- declare const useSearchParams: <TSearchParams extends URLSearchParamsInit>(options?: UseSearchParamsOptions<TSearchParams>) => [searchParams: URLSearchParams, setSearchParams: (newQueryParams: TSearchParams | ((prev: URLSearchParams) => TSearchParams)) => void, triggerPopstateEvent: (nextLocationState?: _zayne_labs_toolkit_core0.LocationStoreInfo["state"]) => void];
268
- declare const useSearchParamsObject: <TSearchParams extends Extract<URLSearchParamsInit, Record<string, string | string[]>>>(options?: UseSearchParamsOptions<TSearchParams>) => [searchParamsObject: TSearchParams, setSearchParamsObject: (newQueryParams: TSearchParams | ((prev: TSearchParams) => TSearchParams)) => void, triggerPopstateEvent: (nextLocationState?: _zayne_labs_toolkit_core0.LocationStoreInfo["state"]) => void];
267
+ declare const useSearchParams: <TSearchParams extends URLSearchParamsInit>(options?: UseSearchParamsOptions<TSearchParams>) => [searchParams: URLSearchParams, setSearchParams: (newQueryParams: TSearchParams | ((prev: URLSearchParams) => TSearchParams)) => void, triggerPopstateEvent: (nextLocationState?: _zayne_labs_toolkit_core2.LocationStoreInfo["state"]) => void];
268
+ declare const useSearchParamsObject: <TSearchParams extends Extract<URLSearchParamsInit, Record<string, string | string[]>>>(options?: UseSearchParamsOptions<TSearchParams>) => [searchParamsObject: TSearchParams, setSearchParamsObject: (newQueryParams: TSearchParams | ((prev: TSearchParams) => TSearchParams)) => void, triggerPopstateEvent: (nextLocationState?: _zayne_labs_toolkit_core2.LocationStoreInfo["state"]) => void];
269
269
  //#endregion
270
270
  //#region src/hooks/useCompare.d.ts
271
271
  type UseCompareSelectorOptions = {
@@ -302,7 +302,7 @@ declare const createUseStorageState: <TState>(baseOptions: StorageOptions<TState
302
302
  shouldReplace: true;
303
303
  }) | undefined): void;
304
304
  };
305
- subscribe: _zayne_labs_toolkit_core0.SubscribeFn<TState>;
305
+ subscribe: _zayne_labs_toolkit_core2.SubscribeFn<TState>;
306
306
  }, "setState"> & {
307
307
  removeState: () => void;
308
308
  setState: {
@@ -350,4 +350,4 @@ type InitialState = boolean | (() => boolean);
350
350
  declare const useToggle: (initialValue?: InitialState) => [value: boolean, toggleValue: <TValue>(newValue?: TValue) => void];
351
351
  //#endregion
352
352
  export { useUnmountEffect as A, getErrorMessage as B, useConstant as C, useCallbackRef as D, useClickOutside as E, useAfterMountEffect as F, ContextError as I, CustomContextOptions as L, useLifeCycle as M, useEffectOnce as N, useAnimationInterval as O, useAsyncEffect as P, UseCustomContext as R, useControllableState as S, useComposeRefs as T, useDisclosure as _, useStore as a, useCopyToClipboard as b, useCompareSelector as c, useSearchParamsObject as d, useSearch as f, useIsHydrated as g, useLocationState as h, useThrottleByTimer as i, useMountEffect as j, useAnimateElementRefs as k, useCompareValue as l, createUseLocationState as m, useThrottleByFrame as n, createUseStorageState as o, useScrollObserver as p, useThrottleByTimeout as r, useStorageState as s, useToggle as t, useSearchParams as u, useDebouncedFn as v, useLazyRef as w, useControllableProp as x, useDebouncedState as y, createCustomContext as z };
353
- //# sourceMappingURL=index-CBZbggjy.d.ts.map
353
+ //# sourceMappingURL=index-Dwh8D1ki.d.ts.map
@@ -1,4 +1,4 @@
1
- import { L as CustomContextOptions } from "./index-CBZbggjy.js";
1
+ import { L as CustomContextOptions } from "./index-Dwh8D1ki.js";
2
2
  import * as react0 from "react";
3
3
  import { StoreApi } from "@zayne-labs/toolkit-core";
4
4
  import { SelectorFn } from "@zayne-labs/toolkit-type-helpers";
@@ -21,4 +21,4 @@ type UseBoundStore<TStoreApi extends ReadonlyStoreApi<unknown>> = TStoreApi & {
21
21
  };
22
22
  //#endregion
23
23
  export { UseBoundStore as n, createReactStoreContext as r, Get as t };
24
- //# sourceMappingURL=types-Dr73xYZP.d.ts.map
24
+ //# sourceMappingURL=types-B0fDLu1b.d.ts.map
@@ -1,2 +1,2 @@
1
- import { A as composeEventHandlers, C as getRegularChildren, D as PossibleRef, E as matchesSlotComponent, O as composeRefs, S as getMultipleSlots, T as matchesAnySlotComponent, _ as createSlotComponent, a as DefaultRenderErrorMessages, b as withSlotNameAndSymbol, c as DiscriminatedRenderProps, d as InferPropsStrict, f as StateSetter, g as GetSlotMapResult, h as GetSlotComponentProps, i as CssWithCustomProperties, j as composeTwoEventHandlers, k as setRef, l as ForwardedRefType, m as mergeProps, n as PolymorphicProps, o as DefaultRenderItemErrorMessages, p as mergeTwoProps, r as PolymorphicPropsStrict, s as DiscriminatedRenderItemProps, t as AsProp, u as InferProps, v as getSlotMap, w as getSingleSlot, x as FunctionalComponent, y as slotComponentSymbol } from "../index-B39cWF3H.js";
1
+ import { A as composeEventHandlers, C as getRegularChildren, D as PossibleRef, E as matchesSlotComponent, O as composeRefs, S as getMultipleSlots, T as matchesAnySlotComponent, _ as createSlotComponent, a as DefaultRenderErrorMessages, b as withSlotNameAndSymbol, c as DiscriminatedRenderProps, d as InferPropsStrict, f as StateSetter, g as GetSlotMapResult, h as GetSlotComponentProps, i as CssWithCustomProperties, j as composeTwoEventHandlers, k as setRef, l as ForwardedRefType, m as mergeProps, n as PolymorphicProps, o as DefaultRenderItemErrorMessages, p as mergeTwoProps, r as PolymorphicPropsStrict, s as DiscriminatedRenderItemProps, t as AsProp, u as InferProps, v as getSlotMap, w as getSingleSlot, x as FunctionalComponent, y as slotComponentSymbol } from "../index-B08DS8-6.js";
2
2
  export { AsProp, CssWithCustomProperties, DefaultRenderErrorMessages, DefaultRenderItemErrorMessages, DiscriminatedRenderItemProps, DiscriminatedRenderProps, ForwardedRefType, FunctionalComponent, GetSlotComponentProps, GetSlotMapResult, InferProps, InferPropsStrict, PolymorphicProps, PolymorphicPropsStrict, PossibleRef, StateSetter, composeEventHandlers, composeRefs, composeTwoEventHandlers, createSlotComponent, getMultipleSlots, getRegularChildren, getSingleSlot, getSlotMap, matchesAnySlotComponent, matchesSlotComponent, mergeProps, mergeTwoProps, setRef, slotComponentSymbol, withSlotNameAndSymbol };
@@ -1,3 +1,3 @@
1
- import { a as slotComponentSymbol, c as getRegularChildren, d as matchesSlotComponent, f as composeRefs, h as composeTwoEventHandlers, i as getSlotMap, l as getSingleSlot, m as composeEventHandlers, n as mergeTwoProps, o as withSlotNameAndSymbol, p as setRef, r as createSlotComponent, s as getMultipleSlots, t as mergeProps, u as matchesAnySlotComponent } from "../utils-DAG-7fTH.js";
1
+ import { a as slotComponentSymbol, c as getRegularChildren, d as matchesSlotComponent, f as composeRefs, h as composeTwoEventHandlers, i as getSlotMap, l as getSingleSlot, m as composeEventHandlers, n as mergeTwoProps, o as withSlotNameAndSymbol, p as setRef, r as createSlotComponent, s as getMultipleSlots, t as mergeProps, u as matchesAnySlotComponent } from "../utils-CwFvwtye.js";
2
2
 
3
3
  export { composeEventHandlers, composeRefs, composeTwoEventHandlers, createSlotComponent, getMultipleSlots, getRegularChildren, getSingleSlot, getSlotMap, matchesAnySlotComponent, matchesSlotComponent, mergeProps, mergeTwoProps, setRef, slotComponentSymbol, withSlotNameAndSymbol };
@@ -10,9 +10,9 @@ const isSyntheticEvent = (event) => {
10
10
  const composeTwoEventHandlers = (formerHandler, latterHandler) => {
11
11
  const mergedEventHandler = (event) => {
12
12
  if (isSyntheticEvent(event)) {
13
- const result$1 = latterHandler?.(event);
13
+ const result = latterHandler?.(event);
14
14
  if (!event.defaultPrevented) formerHandler?.(event);
15
- return result$1;
15
+ return result;
16
16
  }
17
17
  const result = latterHandler?.(event);
18
18
  formerHandler?.(event);
@@ -276,4 +276,4 @@ const mergeProps = (...propsObjectArray) => {
276
276
 
277
277
  //#endregion
278
278
  export { slotComponentSymbol as a, getRegularChildren as c, matchesSlotComponent as d, composeRefs as f, composeTwoEventHandlers as h, getSlotMap as i, getSingleSlot as l, composeEventHandlers as m, mergeTwoProps as n, withSlotNameAndSymbol as o, setRef as p, createSlotComponent as r, getMultipleSlots as s, mergeProps as t, matchesAnySlotComponent as u };
279
- //# sourceMappingURL=utils-DAG-7fTH.js.map
279
+ //# sourceMappingURL=utils-CwFvwtye.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-CwFvwtye.js","names":["ReactFragment","ReactFragment"],"sources":["../../src/utils/composeEventHandlers.ts","../../src/utils/composeRefs.ts","../../src/utils/getSlot/getSlot.ts","../../src/utils/getSlotMap/getSlotMap.ts","../../src/lib/utils/cn.ts","../../src/utils/mergeProps/utils.ts","../../src/utils/mergeProps/mergeTwoProps.ts","../../src/utils/mergeProps/mergeProps.ts"],"sourcesContent":["import { isObject, type AnyFunction } from \"@zayne-labs/toolkit-type-helpers\";\n\nconst isSyntheticEvent = (event: unknown): event is React.SyntheticEvent => {\n\treturn isObject(event) && Object.hasOwn(event, \"nativeEvent\");\n};\n\nexport const composeTwoEventHandlers = (\n\tformerHandler: AnyFunction | undefined,\n\tlatterHandler: AnyFunction | undefined\n) => {\n\tconst mergedEventHandler = (event: unknown) => {\n\t\tif (isSyntheticEvent(event)) {\n\t\t\tconst result = latterHandler?.(event) as unknown;\n\n\t\t\tif (!event.defaultPrevented) {\n\t\t\t\tformerHandler?.(event);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\tconst result = latterHandler?.(event) as unknown;\n\t\tformerHandler?.(event);\n\t\treturn result;\n\t};\n\n\treturn mergedEventHandler;\n};\n\nexport const composeEventHandlers = (...eventHandlerArray: Array<AnyFunction | undefined>) => {\n\tconst mergedEventHandler = (event: unknown) => {\n\t\tif (eventHandlerArray.length === 0) return;\n\n\t\tif (eventHandlerArray.length === 1) {\n\t\t\treturn eventHandlerArray[0]?.(event) as unknown;\n\t\t}\n\n\t\tlet accumulatedHandlers: AnyFunction | undefined;\n\n\t\tfor (const eventHandler of eventHandlerArray) {\n\t\t\tif (!eventHandler) continue;\n\n\t\t\taccumulatedHandlers = composeTwoEventHandlers(accumulatedHandlers, eventHandler);\n\t\t}\n\n\t\treturn accumulatedHandlers?.(event) as unknown;\n\t};\n\n\treturn mergedEventHandler;\n};\n","import { isFunction } from \"@zayne-labs/toolkit-type-helpers\";\nimport type { RefCallback } from \"react\";\n\nexport type PossibleRef<TRef extends HTMLElement> = React.Ref<TRef> | undefined;\n\n/**\n * @description Set a given ref to a given value.\n *\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nexport const setRef = <TRef extends HTMLElement>(\n\tref: PossibleRef<TRef>,\n\tnode: TRef | null\n): ReturnType<RefCallback<TRef>> => {\n\tif (!ref) return;\n\n\tif (isFunction(ref)) {\n\t\treturn ref(node);\n\t}\n\n\t// eslint-disable-next-line no-param-reassign -- Mutation is needed here\n\tref.current = node;\n};\n\n/**\n * @description A utility to combine refs. Accepts callback refs and RefObject(s)\n */\nexport const composeRefs = <TRef extends HTMLElement>(\n\t...refs: Array<PossibleRef<TRef>>\n): RefCallback<TRef> => {\n\tconst mergedRefCallBack: RefCallback<TRef> = (node) => {\n\t\tconst cleanupFnArray = refs.map((ref) => setRef(ref, node));\n\n\t\tconst cleanupFn = () => cleanupFnArray.forEach((cleanup) => cleanup?.());\n\n\t\treturn cleanupFn;\n\t};\n\n\treturn mergedRefCallBack;\n};\n","import { toArray } from \"@zayne-labs/toolkit-core\";\nimport {\n\tAssertionError,\n\tisArray,\n\tisFunction,\n\ttype AnyFunction,\n\ttype Prettify,\n\ttype UnknownObject,\n} from \"@zayne-labs/toolkit-type-helpers\";\nimport { isValidElement, Fragment as ReactFragment } from \"react\";\nimport type { InferProps } from \"../types\";\n\nexport type FunctionalComponent<TProps extends UnknownObject = never> = React.FunctionComponent<TProps>;\n\nconst isWithSlotSymbol = <TFunction extends AnyFunction>(\n\tcomponent: TFunction\n): component is Record<\"slotSymbol\", unknown> & TFunction => {\n\treturn \"slotSymbol\" in component && Boolean(component.slotSymbol);\n};\n\nconst isWithSlotReference = <TFunction extends AnyFunction>(\n\tcomponent: TFunction\n): component is Record<\"slotReference\", unknown> & TFunction => {\n\treturn \"slotReference\" in component && Boolean(component.slotReference);\n};\n/**\n * @description Checks if a react child (within the children array) matches the provided SlotComponent using multiple matching strategies:\n * 1. Matches by slot symbol property\n * 2. Matches by component name\n */\n\nexport const matchesSlotComponent = (child: React.ReactNode, SlotComponent: FunctionalComponent) => {\n\tif (!isValidElement(child) || !isFunction(child.type)) {\n\t\treturn false;\n\t}\n\n\tconst resolvedChildType =\n\t\tisWithSlotReference(child.type) ? (child.type.slotReference as FunctionalComponent) : child.type;\n\n\tconst hasMatchingSlotSymbol =\n\t\tisWithSlotSymbol(resolvedChildType)\n\t\t&& isWithSlotSymbol(SlotComponent)\n\t\t&& resolvedChildType.slotSymbol === SlotComponent.slotSymbol;\n\n\tif (hasMatchingSlotSymbol) {\n\t\treturn true;\n\t}\n\n\tif (child.type.name === SlotComponent.name) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n/**\n * @description Checks if a react child (within the children array) matches any of the provided SlotComponents.\n */\nexport const matchesAnySlotComponent = (child: React.ReactNode, SlotComponents: FunctionalComponent[]) => {\n\tconst matchesSlot = SlotComponents.some((SlotComponent) => matchesSlotComponent(child, SlotComponent));\n\n\treturn matchesSlot;\n};\n\ntype SlotOptions = {\n\t/**\n\t * @description The error message to throw when multiple slots are found for a given slot component\n\t */\n\terrorMessage?: string;\n\t/**\n\t * @description When true, an AssertionError will be thrown if multiple slots are found for a given slot component\n\t */\n\tthrowOnMultipleSlotMatch?: boolean;\n};\n\n/**\n * @description Counts how many times a given slot component appears in an array of children\n * @internal\n */\nconst calculateSlotOccurrences = (\n\tchildrenArray: React.ReactNode[],\n\tSlotComponent: FunctionalComponent\n) => {\n\tlet count = 0;\n\n\tfor (const child of childrenArray) {\n\t\tif (!matchesSlotComponent(child, SlotComponent)) continue;\n\n\t\tcount += 1;\n\t}\n\n\treturn count;\n};\n\n/**\n * @description Retrieves a single slot element from a collection of React children that matches the provided SlotComponent component.\n *\n * @throws { AssertionError } when throwOnMultipleSlotMatch is true and multiple slots are found\n */\nexport const getSingleSlot = (\n\tchildren: React.ReactNode,\n\tSlotComponent: FunctionalComponent,\n\toptions: SlotOptions = {}\n) => {\n\tconst {\n\t\terrorMessage = \"Only one instance of the SlotComponent is allowed\",\n\t\tthrowOnMultipleSlotMatch = false,\n\t} = options;\n\n\tconst actualChildren =\n\t\tisValidElement<InferProps<typeof ReactFragment>>(children) && children.type === ReactFragment ?\n\t\t\tchildren.props.children\n\t\t:\tchildren;\n\n\tconst childrenArray = toArray<React.ReactNode>(actualChildren);\n\n\tconst shouldThrow =\n\t\tthrowOnMultipleSlotMatch && calculateSlotOccurrences(childrenArray, SlotComponent) > 1;\n\n\tif (shouldThrow) {\n\t\tthrow new AssertionError(errorMessage);\n\t}\n\n\tconst slotElement = childrenArray.find((child) => matchesSlotComponent(child, SlotComponent));\n\n\treturn slotElement;\n};\n\n// NOTE - You can imitate const type parameter by extending readonly[] | []\n\ntype MultipleSlotsOptions = {\n\t/**\n\t * @description The error message to throw when multiple slots are found for a given slot component\n\t * If a string is provided, the same message will be used for all slot components\n\t * If an array is provided, each string in the array will be used as the errorMessage for the corresponding slot component\n\t */\n\terrorMessage?: string | string[];\n\t/**\n\t * @description When true, an AssertionError will be thrown if multiple slots are found for a given slot component\n\t * If a boolean is provided, the same value will be used for all slot components\n\t * If an array is provided, each boolean in the array will be used as the throwOnMultipleSlotMatch value for the corresponding slot component\n\t */\n\tthrowOnMultipleSlotMatch?: boolean | boolean[];\n};\n\ntype GetMultipleSlotsResult<TSlotComponents extends FunctionalComponent[]> = {\n\tregularChildren: React.ReactNode[];\n\tslots: { [Key in keyof TSlotComponents]: ReturnType<TSlotComponents[Key]> };\n};\n\n/**\n * @description The same as getSingleSlot, but for multiple slot components\n */\nexport const getMultipleSlots = <const TSlotComponents extends FunctionalComponent[]>(\n\tchildren: React.ReactNode,\n\tSlotComponents: TSlotComponents,\n\toptions?: MultipleSlotsOptions\n): Prettify<GetMultipleSlotsResult<TSlotComponents>> => {\n\tconst { errorMessage, throwOnMultipleSlotMatch } = options ?? {};\n\n\tconst slots = SlotComponents.map((SlotComponent, index) =>\n\t\tgetSingleSlot(children, SlotComponent, {\n\t\t\terrorMessage: isArray(errorMessage) ? errorMessage[index] : errorMessage,\n\t\t\tthrowOnMultipleSlotMatch:\n\t\t\t\tisArray(throwOnMultipleSlotMatch) ? throwOnMultipleSlotMatch[index] : throwOnMultipleSlotMatch,\n\t\t})\n\t);\n\n\tconst regularChildren = getRegularChildren(children, SlotComponents);\n\n\treturn { regularChildren, slots } as GetMultipleSlotsResult<TSlotComponents>;\n};\n\n/**\n * @description Returns all children that are not slot elements (i.e., don't match any of the provided slot components)\n */\nexport const getRegularChildren = (\n\tchildren: React.ReactNode,\n\tSlotComponentOrComponents: FunctionalComponent | FunctionalComponent[]\n) => {\n\tconst actualChildren =\n\t\tisValidElement<InferProps<typeof ReactFragment>>(children) && children.type === ReactFragment ?\n\t\t\tchildren.props.children\n\t\t:\tchildren;\n\n\tconst childrenArray = toArray<React.ReactNode>(actualChildren);\n\n\tconst regularChildren = childrenArray.filter(\n\t\t(child) => !matchesAnySlotComponent(child, toArray(SlotComponentOrComponents))\n\t);\n\n\treturn regularChildren;\n};\n","import { toArray } from \"@zayne-labs/toolkit-core\";\nimport {\n\tisFunction,\n\ttype CallbackFn,\n\ttype EmptyObject,\n\ttype Prettify,\n\ttype UnionToIntersection,\n\ttype UnknownObject,\n} from \"@zayne-labs/toolkit-type-helpers\";\nimport { isValidElement, Fragment as ReactFragment } from \"react\";\nimport type { InferProps } from \"../types\";\n\ntype GetSlotName<TSlotComponentProps extends GetSlotComponentProps> =\n\tstring extends TSlotComponentProps[\"name\"] ? never\n\t: \"default\" extends TSlotComponentProps[\"name\"] ? never\n\t: TSlotComponentProps[\"name\"];\n\ntype GetSpecificSlotsType<TSlotComponentProps extends GetSlotComponentProps> = {\n\t// This conditional before the remapping will prevent an Indexed Record type from showing up if the props are not passed, enhancing type safety\n\t[TName in keyof TSlotComponentProps as GetSlotName<TSlotComponentProps>]: Extract<\n\t\tTSlotComponentProps[\"children\"],\n\t\tReact.ReactNode\n\t>;\n};\n\n/**\n * Maps slot names to their corresponding children types\n */\nexport type GetSlotMapResult<TSlotComponentProps extends GetSlotComponentProps> = UnionToIntersection<\n\tGetSpecificSlotsType<TSlotComponentProps>\n> & { default: React.ReactNode[] };\n\n/**\n * Symbol used to identify SlotComponent instances\n */\nexport const slotComponentSymbol = Symbol(\"slot-component\");\n\n/**\n * @description Creates a map of named slots from React children. Returns an object mapping slot names to their children,\n * with a default slot for unmatched children.\n *\n * @example\n * ```tsx\n * import { type GetSlotComponentProps, SlotComponent } from \"@zayne-labs/toolkit-react/utils\"\n *\n * type SlotProps = GetSlotComponentProps<\"header\" | \"footer\">;\n *\n * function Parent({ children }: { children: React.ReactNode }) {\n * const slots = getSlotMap<SlotProps>(children);\n *\n * return (\n * <div>\n * <header>{slots.header}</header>\n * <main>{slots.default}</main>\n * <footer>{slots.footer}</footer>\n * </div>\n * );\n * }\n * ```\n *\n * Usage:\n * ```tsx\n * <Parent>\n * <SlotComponent name=\"header\">Header Content</SlotComponent>\n * <div>Random stuff</div>\n * <SlotComponent name=\"footer\">Footer Content</SlotComponent>\n * </Parent>\n * ```\n */\nexport const getSlotMap = <TSlotComponentProps extends GetSlotComponentProps>(\n\tchildren: React.ReactNode\n): Prettify<GetSlotMapResult<TSlotComponentProps>> => {\n\tconst slots: Record<string, TSlotComponentProps[\"children\"]> & { default: React.ReactNode[] } = {\n\t\tdefault: [],\n\t};\n\n\tconst isFragment = isValidElement<InferProps<HTMLElement>>(children) && children.type === ReactFragment;\n\n\tconst actualChildren = isFragment ? children.props.children : children;\n\n\tconst childrenArray = toArray<React.ReactNode>(actualChildren);\n\n\tfor (const child of childrenArray) {\n\t\tif (!isValidElement<TSlotComponentProps>(child) || !isFunction(child.type)) {\n\t\t\tslots.default.push(child);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst childType = child.type as SlotWithNameAndSymbol;\n\n\t\tconst isSlotElement =\n\t\t\tchildType.slotSymbol === slotComponentSymbol && Boolean(childType.slotName ?? child.props.name);\n\n\t\tif (!isSlotElement) {\n\t\t\tslots.default.push(child);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst slotName = childType.slotName ?? child.props.name;\n\n\t\tif (slotName === \"default\") {\n\t\t\tslots.default.push(child);\n\t\t\tcontinue;\n\t\t}\n\n\t\tslots[slotName] = child;\n\t}\n\n\treturn slots as GetSlotMapResult<TSlotComponentProps>;\n};\n\n/**\n * @description Produce props for the SlotComponent\n *\n * @example\n * ```ts\n * // Pattern One (slot or slots have same children type, which is just React.ReactNode by default)\n * type SlotProps = GetSlotComponentProps<\"header\" | \"content\" | \"footer\">;\n *\n * // Pattern Two (some slots can have different children type)\n * type SlotProps = GetSlotComponentProps<\"header\", React.ReactNode> | GetSlotComponentProps<\"header\", (renderProp: RenderProp) => React.ReactNode>;\n * ```\n */\nexport type GetSlotComponentProps<\n\tTName extends string = string,\n\tTChildren extends CallbackFn<never, React.ReactNode> | React.ReactNode =\n\t\t| CallbackFn<never, React.ReactNode>\n\t\t| React.ReactNode,\n> = {\n\tchildren: TChildren;\n\t/**\n\t * Name of the slot where content should be rendered\n\t */\n\tname: TName;\n};\n\n/**\n * @description Creates a slot component\n */\nexport const createSlotComponent = <TSlotComponentProps extends GetSlotComponentProps>() => {\n\tconst SlotComponent = (props: TSlotComponentProps) => props.children as React.ReactNode;\n\n\tSlotComponent.slotSymbol = slotComponentSymbol;\n\n\treturn SlotComponent;\n};\n\ntype SlotWithNameAndSymbol<\n\tTSlotComponentProps extends GetSlotComponentProps = GetSlotComponentProps,\n\tTOtherProps extends UnknownObject = EmptyObject,\n> = {\n\t(props: Pick<TSlotComponentProps, \"children\"> & TOtherProps): React.ReactNode;\n\treadonly slotName?: TSlotComponentProps[\"name\"];\n\treadonly slotSymbol?: symbol;\n};\n\nfunction DefaultSlotComponent(props: Pick<GetSlotComponentProps, \"children\">): React.ReactNode {\n\treturn props.children as React.ReactNode;\n}\n\n/**\n * @description Adds a slot symbol and name to a slot component passed in\n */\nexport const withSlotNameAndSymbol = <\n\tTSlotComponentProps extends GetSlotComponentProps,\n\tTOtherProps extends UnknownObject = EmptyObject,\n>(\n\tname: TSlotComponentProps[\"name\"],\n\tSlotComponent: SlotWithNameAndSymbol<TSlotComponentProps, TOtherProps> = DefaultSlotComponent\n) => {\n\t/* eslint-disable no-param-reassign -- This is necessary */\n\t// @ts-expect-error -- This is necessary for the time being, to prevent type errors and accidental overrides on consumer side\n\tSlotComponent.slotSymbol = slotComponentSymbol;\n\t// @ts-expect-error -- This is necessary for the time being, to prevent type errors and accidental overrides on consumer side\n\tSlotComponent.slotName = name;\n\n\t/* eslint-enable no-param-reassign -- This is necessary */\n\n\treturn SlotComponent;\n};\n","import { twJoin, twMerge } from \"tailwind-merge\";\n\nexport const cnMerge: typeof twMerge = (...classNames) => twMerge(classNames);\n\nexport const cnJoin: typeof twJoin = (...classNames) => twJoin(classNames);\n","// == This approach is more efficient than using a regex.\nexport const isEventHandler = (key: string) => {\n\tconst thirdCharCode = key.codePointAt(2);\n\n\tif (thirdCharCode === undefined) {\n\t\treturn false;\n\t}\n\n\tconst isHandler =\n\t\t// eslint-disable-next-line ts-eslint/prefer-string-starts-ends-with -- Ignore\n\t\tkey[0] === \"o\" && key[1] === \"n\" && thirdCharCode >= 65 /* A */ && thirdCharCode <= 90; /* Z */\n\n\treturn isHandler;\n};\n\n// const mergeTwoClassNames = (formerClassName: string | undefined, latterClassName: string | undefined) => {\n// \tif (!latterClassName || !formerClassName) {\n// \t\t// eslint-disable-next-line ts-eslint/prefer-nullish-coalescing -- Logical OR is fit for this case\n// \t\treturn latterClassName || formerClassName;\n// \t}\n\n// \t// eslint-disable-next-line prefer-template -- String concatenation is more performant than template literals in this case\n// \treturn formerClassName + \" \" + latterClassName;\n// };\n","import { isFunction, isObject, isString } from \"@zayne-labs/toolkit-type-helpers\";\nimport { cnMerge } from \"@/lib/utils/cn\";\nimport { composeTwoEventHandlers } from \"../composeEventHandlers\";\nimport { isEventHandler } from \"./utils\";\n\nexport const mergeTwoProps = <TProps extends Record<never, never>>(\n\tformerProps: TProps | undefined,\n\tlatterProps: TProps | undefined\n): TProps => {\n\t// == If no props are provided, return an empty object\n\tif (!latterProps || !formerProps) {\n\t\treturn latterProps ?? formerProps ?? ({} as TProps);\n\t}\n\n\tconst propsAccumulator: Record<string, unknown> = {\n\t\t...formerProps,\n\t};\n\n\tfor (const [latterPropName, latterPropValue] of Object.entries(latterProps)) {\n\t\tconst accumulatedPropValue = propsAccumulator[latterPropName];\n\n\t\tif (\n\t\t\t(latterPropName === \"className\" || latterPropName === \"class\")\n\t\t\t&& isString(latterPropValue)\n\t\t\t&& isString(accumulatedPropValue)\n\t\t) {\n\t\t\tpropsAccumulator[latterPropName] = cnMerge(accumulatedPropValue, latterPropValue);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (latterPropName === \"style\" && isObject(latterPropValue) && isObject(accumulatedPropValue)) {\n\t\t\tpropsAccumulator[latterPropName] = {\n\t\t\t\t...accumulatedPropValue,\n\t\t\t\t...latterPropValue,\n\t\t\t};\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (\n\t\t\tisFunction(latterPropValue)\n\t\t\t&& isFunction(accumulatedPropValue)\n\t\t\t&& isEventHandler(latterPropName)\n\t\t) {\n\t\t\tpropsAccumulator[latterPropName] = composeTwoEventHandlers(accumulatedPropValue, latterPropValue);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\t// == latterProps override by default\n\t\tpropsAccumulator[latterPropName] =\n\t\t\tlatterPropValue !== undefined ? latterPropValue : accumulatedPropValue;\n\t}\n\n\treturn propsAccumulator as TProps;\n};\n","import { mergeTwoProps } from \"./mergeTwoProps\";\n\ntype UnionToIntersection<TUnion> =\n\t(TUnion extends unknown ? (param: TUnion) => void : \"\") extends (param: infer TParam) => void ? TParam\n\t:\t\"\";\n\n/**\n * Merges multiple sets of React props.\n *\n * - It follows the Object.assign pattern where the rightmost object's fields overwrite\n * the conflicting ones from others. This doesn't apply to event handlers, `className` and `style` props.\n * - Event handlers are merged such that they are called in sequence (the rightmost one being called first),\n * and allows the user to prevent the previous event handlers from being executed by calling the `preventDefault` method.\n * - It also merges the `className` and `style` props, whereby the classes are concatenated\n * and the rightmost styles overwrite the previous ones.\n *\n * @important **`ref` is not merged.**\n * @param props props to merge.\n * @returns the merged props.\n */\n\nconst mergeProps = <TProps extends Record<never, never>>(\n\t...propsObjectArray: Array<TProps | undefined>\n): UnionToIntersection<TProps> => {\n\tif (propsObjectArray.length === 0) {\n\t\treturn {} as never;\n\t}\n\n\tif (propsObjectArray.length === 1) {\n\t\treturn propsObjectArray[0] as never;\n\t}\n\n\tlet accumulatedProps: Record<string, unknown> = {};\n\n\tfor (const propsObject of propsObjectArray) {\n\t\tif (!propsObject) continue;\n\n\t\taccumulatedProps = mergeTwoProps(accumulatedProps, propsObject);\n\t}\n\n\treturn accumulatedProps as never;\n};\n\nexport { mergeProps };\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import "../../index-CBZbggjy.js";
2
- import "../../index-B39cWF3H.js";
3
- import { n as UseBoundStore, r as createReactStoreContext, t as Get } from "../../types-Dr73xYZP.js";
1
+ import "../../index-Dwh8D1ki.js";
2
+ import "../../index-B08DS8-6.js";
3
+ import { n as UseBoundStore, r as createReactStoreContext, t as Get } from "../../types-B0fDLu1b.js";
4
4
  import { StoreApi } from "@zayne-labs/toolkit-core";
5
5
  import { Mutate, StoreMutatorIdentifier } from "zustand";
6
6
 
@@ -1,5 +1,5 @@
1
- import { f as useStore } from "../../hooks-B3E5VMjd.js";
2
- import { t as createReactStoreContext } from "../../createReactStoreContext-BNG_DigC.js";
1
+ import { f as useStore } from "../../hooks-COKx4mtj.js";
2
+ import { t as createReactStoreContext } from "../../createReactStoreContext-DJySeQQW.js";
3
3
  import { createStore } from "@zayne-labs/toolkit-core";
4
4
 
5
5
  //#region src/zustand/compatible/createReactStore.ts
@@ -1,6 +1,6 @@
1
- import "../index-CBZbggjy.js";
2
- import "../index-B39cWF3H.js";
3
- import { n as UseBoundStore, r as createReactStoreContext } from "../types-Dr73xYZP.js";
1
+ import "../index-Dwh8D1ki.js";
2
+ import "../index-B08DS8-6.js";
3
+ import { n as UseBoundStore, r as createReactStoreContext } from "../types-B0fDLu1b.js";
4
4
  import { StoreApi, StoreStateInitializer } from "@zayne-labs/toolkit-core";
5
5
 
6
6
  //#region src/zustand/createReactStore.d.ts
@@ -1,5 +1,5 @@
1
- import { f as useStore } from "../hooks-B3E5VMjd.js";
2
- import { t as createReactStoreContext } from "../createReactStoreContext-BNG_DigC.js";
1
+ import { f as useStore } from "../hooks-COKx4mtj.js";
2
+ import { t as createReactStoreContext } from "../createReactStoreContext-DJySeQQW.js";
3
3
  import { createStore } from "@zayne-labs/toolkit-core";
4
4
 
5
5
  //#region src/zustand/createReactStore.ts
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zayne-labs/toolkit-react",
3
3
  "type": "module",
4
- "version": "0.12.30",
4
+ "version": "0.12.32",
5
5
  "description": "A collection of utility functions, types and composables used by my other projects. Nothing too fancy but can be useful.",
6
6
  "author": "Ryan Zayne",
7
7
  "license": "MIT",
@@ -49,8 +49,8 @@
49
49
  }
50
50
  },
51
51
  "dependencies": {
52
- "@zayne-labs/toolkit-core": "0.12.30",
53
- "@zayne-labs/toolkit-type-helpers": "0.12.30"
52
+ "@zayne-labs/toolkit-core": "0.12.32",
53
+ "@zayne-labs/toolkit-type-helpers": "0.12.32"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@arethetypeswrong/cli": "^0.18.2",
@@ -58,18 +58,18 @@
58
58
  "@size-limit/esbuild-why": "^12.0.0",
59
59
  "@size-limit/preset-small-lib": "^12.0.0",
60
60
  "@total-typescript/ts-reset": "^0.6.1",
61
- "@types/node": "^25.0.9",
62
- "@types/react": "^19.2.9",
63
- "@zayne-labs/tsconfig": "0.11.21",
61
+ "@types/node": "^25.2.0",
62
+ "@types/react": "^19.2.10",
63
+ "@zayne-labs/tsconfig": "0.11.23",
64
64
  "concurrently": "^9.2.1",
65
65
  "cross-env": "^10.1.0",
66
- "publint": "^0.3.16",
67
- "react": "^19.2.3",
66
+ "publint": "^0.3.17",
67
+ "react": "^19.2.4",
68
68
  "size-limit": "^12.0.0",
69
69
  "tailwind-merge": "3.4.0",
70
- "tsdown": "0.20.0-beta.4",
70
+ "tsdown": "0.20.1",
71
71
  "typescript": "5.9.3",
72
- "zustand": "^5.0.10"
72
+ "zustand": "^5.0.11"
73
73
  },
74
74
  "publishConfig": {
75
75
  "access": "public",
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils-DAG-7fTH.js","names":["result","ReactFragment","ReactFragment"],"sources":["../../src/utils/composeEventHandlers.ts","../../src/utils/composeRefs.ts","../../src/utils/getSlot/getSlot.ts","../../src/utils/getSlotMap/getSlotMap.ts","../../src/lib/utils/cn.ts","../../src/utils/mergeProps/utils.ts","../../src/utils/mergeProps/mergeTwoProps.ts","../../src/utils/mergeProps/mergeProps.ts"],"sourcesContent":["import { isObject, type AnyFunction } from \"@zayne-labs/toolkit-type-helpers\";\n\nconst isSyntheticEvent = (event: unknown): event is React.SyntheticEvent => {\n\treturn isObject(event) && Object.hasOwn(event, \"nativeEvent\");\n};\n\nexport const composeTwoEventHandlers = (\n\tformerHandler: AnyFunction | undefined,\n\tlatterHandler: AnyFunction | undefined\n) => {\n\tconst mergedEventHandler = (event: unknown) => {\n\t\tif (isSyntheticEvent(event)) {\n\t\t\tconst result = latterHandler?.(event) as unknown;\n\n\t\t\tif (!event.defaultPrevented) {\n\t\t\t\tformerHandler?.(event);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\tconst result = latterHandler?.(event) as unknown;\n\t\tformerHandler?.(event);\n\t\treturn result;\n\t};\n\n\treturn mergedEventHandler;\n};\n\nexport const composeEventHandlers = (...eventHandlerArray: Array<AnyFunction | undefined>) => {\n\tconst mergedEventHandler = (event: unknown) => {\n\t\tif (eventHandlerArray.length === 0) return;\n\n\t\tif (eventHandlerArray.length === 1) {\n\t\t\treturn eventHandlerArray[0]?.(event) as unknown;\n\t\t}\n\n\t\tlet accumulatedHandlers: AnyFunction | undefined;\n\n\t\tfor (const eventHandler of eventHandlerArray) {\n\t\t\tif (!eventHandler) continue;\n\n\t\t\taccumulatedHandlers = composeTwoEventHandlers(accumulatedHandlers, eventHandler);\n\t\t}\n\n\t\treturn accumulatedHandlers?.(event) as unknown;\n\t};\n\n\treturn mergedEventHandler;\n};\n","import { isFunction } from \"@zayne-labs/toolkit-type-helpers\";\nimport type { RefCallback } from \"react\";\n\nexport type PossibleRef<TRef extends HTMLElement> = React.Ref<TRef> | undefined;\n\n/**\n * @description Set a given ref to a given value.\n *\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nexport const setRef = <TRef extends HTMLElement>(\n\tref: PossibleRef<TRef>,\n\tnode: TRef | null\n): ReturnType<RefCallback<TRef>> => {\n\tif (!ref) return;\n\n\tif (isFunction(ref)) {\n\t\treturn ref(node);\n\t}\n\n\t// eslint-disable-next-line no-param-reassign -- Mutation is needed here\n\tref.current = node;\n};\n\n/**\n * @description A utility to combine refs. Accepts callback refs and RefObject(s)\n */\nexport const composeRefs = <TRef extends HTMLElement>(\n\t...refs: Array<PossibleRef<TRef>>\n): RefCallback<TRef> => {\n\tconst mergedRefCallBack: RefCallback<TRef> = (node) => {\n\t\tconst cleanupFnArray = refs.map((ref) => setRef(ref, node));\n\n\t\tconst cleanupFn = () => cleanupFnArray.forEach((cleanup) => cleanup?.());\n\n\t\treturn cleanupFn;\n\t};\n\n\treturn mergedRefCallBack;\n};\n","import { toArray } from \"@zayne-labs/toolkit-core\";\nimport {\n\tAssertionError,\n\tisArray,\n\tisFunction,\n\ttype AnyFunction,\n\ttype Prettify,\n\ttype UnknownObject,\n} from \"@zayne-labs/toolkit-type-helpers\";\nimport { isValidElement, Fragment as ReactFragment } from \"react\";\nimport type { InferProps } from \"../types\";\n\nexport type FunctionalComponent<TProps extends UnknownObject = never> = React.FunctionComponent<TProps>;\n\nconst isWithSlotSymbol = <TFunction extends AnyFunction>(\n\tcomponent: TFunction\n): component is Record<\"slotSymbol\", unknown> & TFunction => {\n\treturn \"slotSymbol\" in component && Boolean(component.slotSymbol);\n};\n\nconst isWithSlotReference = <TFunction extends AnyFunction>(\n\tcomponent: TFunction\n): component is Record<\"slotReference\", unknown> & TFunction => {\n\treturn \"slotReference\" in component && Boolean(component.slotReference);\n};\n/**\n * @description Checks if a react child (within the children array) matches the provided SlotComponent using multiple matching strategies:\n * 1. Matches by slot symbol property\n * 2. Matches by component name\n */\n\nexport const matchesSlotComponent = (child: React.ReactNode, SlotComponent: FunctionalComponent) => {\n\tif (!isValidElement(child) || !isFunction(child.type)) {\n\t\treturn false;\n\t}\n\n\tconst resolvedChildType =\n\t\tisWithSlotReference(child.type) ? (child.type.slotReference as FunctionalComponent) : child.type;\n\n\tconst hasMatchingSlotSymbol =\n\t\tisWithSlotSymbol(resolvedChildType)\n\t\t&& isWithSlotSymbol(SlotComponent)\n\t\t&& resolvedChildType.slotSymbol === SlotComponent.slotSymbol;\n\n\tif (hasMatchingSlotSymbol) {\n\t\treturn true;\n\t}\n\n\tif (child.type.name === SlotComponent.name) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n/**\n * @description Checks if a react child (within the children array) matches any of the provided SlotComponents.\n */\nexport const matchesAnySlotComponent = (child: React.ReactNode, SlotComponents: FunctionalComponent[]) => {\n\tconst matchesSlot = SlotComponents.some((SlotComponent) => matchesSlotComponent(child, SlotComponent));\n\n\treturn matchesSlot;\n};\n\ntype SlotOptions = {\n\t/**\n\t * @description The error message to throw when multiple slots are found for a given slot component\n\t */\n\terrorMessage?: string;\n\t/**\n\t * @description When true, an AssertionError will be thrown if multiple slots are found for a given slot component\n\t */\n\tthrowOnMultipleSlotMatch?: boolean;\n};\n\n/**\n * @description Counts how many times a given slot component appears in an array of children\n * @internal\n */\nconst calculateSlotOccurrences = (\n\tchildrenArray: React.ReactNode[],\n\tSlotComponent: FunctionalComponent\n) => {\n\tlet count = 0;\n\n\tfor (const child of childrenArray) {\n\t\tif (!matchesSlotComponent(child, SlotComponent)) continue;\n\n\t\tcount += 1;\n\t}\n\n\treturn count;\n};\n\n/**\n * @description Retrieves a single slot element from a collection of React children that matches the provided SlotComponent component.\n *\n * @throws { AssertionError } when throwOnMultipleSlotMatch is true and multiple slots are found\n */\nexport const getSingleSlot = (\n\tchildren: React.ReactNode,\n\tSlotComponent: FunctionalComponent,\n\toptions: SlotOptions = {}\n) => {\n\tconst {\n\t\terrorMessage = \"Only one instance of the SlotComponent is allowed\",\n\t\tthrowOnMultipleSlotMatch = false,\n\t} = options;\n\n\tconst actualChildren =\n\t\tisValidElement<InferProps<typeof ReactFragment>>(children) && children.type === ReactFragment ?\n\t\t\tchildren.props.children\n\t\t:\tchildren;\n\n\tconst childrenArray = toArray<React.ReactNode>(actualChildren);\n\n\tconst shouldThrow =\n\t\tthrowOnMultipleSlotMatch && calculateSlotOccurrences(childrenArray, SlotComponent) > 1;\n\n\tif (shouldThrow) {\n\t\tthrow new AssertionError(errorMessage);\n\t}\n\n\tconst slotElement = childrenArray.find((child) => matchesSlotComponent(child, SlotComponent));\n\n\treturn slotElement;\n};\n\n// NOTE - You can imitate const type parameter by extending readonly[] | []\n\ntype MultipleSlotsOptions = {\n\t/**\n\t * @description The error message to throw when multiple slots are found for a given slot component\n\t * If a string is provided, the same message will be used for all slot components\n\t * If an array is provided, each string in the array will be used as the errorMessage for the corresponding slot component\n\t */\n\terrorMessage?: string | string[];\n\t/**\n\t * @description When true, an AssertionError will be thrown if multiple slots are found for a given slot component\n\t * If a boolean is provided, the same value will be used for all slot components\n\t * If an array is provided, each boolean in the array will be used as the throwOnMultipleSlotMatch value for the corresponding slot component\n\t */\n\tthrowOnMultipleSlotMatch?: boolean | boolean[];\n};\n\ntype GetMultipleSlotsResult<TSlotComponents extends FunctionalComponent[]> = {\n\tregularChildren: React.ReactNode[];\n\tslots: { [Key in keyof TSlotComponents]: ReturnType<TSlotComponents[Key]> };\n};\n\n/**\n * @description The same as getSingleSlot, but for multiple slot components\n */\nexport const getMultipleSlots = <const TSlotComponents extends FunctionalComponent[]>(\n\tchildren: React.ReactNode,\n\tSlotComponents: TSlotComponents,\n\toptions?: MultipleSlotsOptions\n): Prettify<GetMultipleSlotsResult<TSlotComponents>> => {\n\tconst { errorMessage, throwOnMultipleSlotMatch } = options ?? {};\n\n\tconst slots = SlotComponents.map((SlotComponent, index) =>\n\t\tgetSingleSlot(children, SlotComponent, {\n\t\t\terrorMessage: isArray(errorMessage) ? errorMessage[index] : errorMessage,\n\t\t\tthrowOnMultipleSlotMatch:\n\t\t\t\tisArray(throwOnMultipleSlotMatch) ? throwOnMultipleSlotMatch[index] : throwOnMultipleSlotMatch,\n\t\t})\n\t);\n\n\tconst regularChildren = getRegularChildren(children, SlotComponents);\n\n\treturn { regularChildren, slots } as GetMultipleSlotsResult<TSlotComponents>;\n};\n\n/**\n * @description Returns all children that are not slot elements (i.e., don't match any of the provided slot components)\n */\nexport const getRegularChildren = (\n\tchildren: React.ReactNode,\n\tSlotComponentOrComponents: FunctionalComponent | FunctionalComponent[]\n) => {\n\tconst actualChildren =\n\t\tisValidElement<InferProps<typeof ReactFragment>>(children) && children.type === ReactFragment ?\n\t\t\tchildren.props.children\n\t\t:\tchildren;\n\n\tconst childrenArray = toArray<React.ReactNode>(actualChildren);\n\n\tconst regularChildren = childrenArray.filter(\n\t\t(child) => !matchesAnySlotComponent(child, toArray(SlotComponentOrComponents))\n\t);\n\n\treturn regularChildren;\n};\n","import { toArray } from \"@zayne-labs/toolkit-core\";\nimport {\n\tisFunction,\n\ttype CallbackFn,\n\ttype EmptyObject,\n\ttype Prettify,\n\ttype UnionToIntersection,\n\ttype UnknownObject,\n} from \"@zayne-labs/toolkit-type-helpers\";\nimport { isValidElement, Fragment as ReactFragment } from \"react\";\nimport type { InferProps } from \"../types\";\n\ntype GetSlotName<TSlotComponentProps extends GetSlotComponentProps> =\n\tstring extends TSlotComponentProps[\"name\"] ? never\n\t: \"default\" extends TSlotComponentProps[\"name\"] ? never\n\t: TSlotComponentProps[\"name\"];\n\ntype GetSpecificSlotsType<TSlotComponentProps extends GetSlotComponentProps> = {\n\t// This conditional before the remapping will prevent an Indexed Record type from showing up if the props are not passed, enhancing type safety\n\t[TName in keyof TSlotComponentProps as GetSlotName<TSlotComponentProps>]: Extract<\n\t\tTSlotComponentProps[\"children\"],\n\t\tReact.ReactNode\n\t>;\n};\n\n/**\n * Maps slot names to their corresponding children types\n */\nexport type GetSlotMapResult<TSlotComponentProps extends GetSlotComponentProps> = UnionToIntersection<\n\tGetSpecificSlotsType<TSlotComponentProps>\n> & { default: React.ReactNode[] };\n\n/**\n * Symbol used to identify SlotComponent instances\n */\nexport const slotComponentSymbol = Symbol(\"slot-component\");\n\n/**\n * @description Creates a map of named slots from React children. Returns an object mapping slot names to their children,\n * with a default slot for unmatched children.\n *\n * @example\n * ```tsx\n * import { type GetSlotComponentProps, SlotComponent } from \"@zayne-labs/toolkit-react/utils\"\n *\n * type SlotProps = GetSlotComponentProps<\"header\" | \"footer\">;\n *\n * function Parent({ children }: { children: React.ReactNode }) {\n * const slots = getSlotMap<SlotProps>(children);\n *\n * return (\n * <div>\n * <header>{slots.header}</header>\n * <main>{slots.default}</main>\n * <footer>{slots.footer}</footer>\n * </div>\n * );\n * }\n * ```\n *\n * Usage:\n * ```tsx\n * <Parent>\n * <SlotComponent name=\"header\">Header Content</SlotComponent>\n * <div>Random stuff</div>\n * <SlotComponent name=\"footer\">Footer Content</SlotComponent>\n * </Parent>\n * ```\n */\nexport const getSlotMap = <TSlotComponentProps extends GetSlotComponentProps>(\n\tchildren: React.ReactNode\n): Prettify<GetSlotMapResult<TSlotComponentProps>> => {\n\tconst slots: Record<string, TSlotComponentProps[\"children\"]> & { default: React.ReactNode[] } = {\n\t\tdefault: [],\n\t};\n\n\tconst isFragment = isValidElement<InferProps<HTMLElement>>(children) && children.type === ReactFragment;\n\n\tconst actualChildren = isFragment ? children.props.children : children;\n\n\tconst childrenArray = toArray<React.ReactNode>(actualChildren);\n\n\tfor (const child of childrenArray) {\n\t\tif (!isValidElement<TSlotComponentProps>(child) || !isFunction(child.type)) {\n\t\t\tslots.default.push(child);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst childType = child.type as SlotWithNameAndSymbol;\n\n\t\tconst isSlotElement =\n\t\t\tchildType.slotSymbol === slotComponentSymbol && Boolean(childType.slotName ?? child.props.name);\n\n\t\tif (!isSlotElement) {\n\t\t\tslots.default.push(child);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst slotName = childType.slotName ?? child.props.name;\n\n\t\tif (slotName === \"default\") {\n\t\t\tslots.default.push(child);\n\t\t\tcontinue;\n\t\t}\n\n\t\tslots[slotName] = child;\n\t}\n\n\treturn slots as GetSlotMapResult<TSlotComponentProps>;\n};\n\n/**\n * @description Produce props for the SlotComponent\n *\n * @example\n * ```ts\n * // Pattern One (slot or slots have same children type, which is just React.ReactNode by default)\n * type SlotProps = GetSlotComponentProps<\"header\" | \"content\" | \"footer\">;\n *\n * // Pattern Two (some slots can have different children type)\n * type SlotProps = GetSlotComponentProps<\"header\", React.ReactNode> | GetSlotComponentProps<\"header\", (renderProp: RenderProp) => React.ReactNode>;\n * ```\n */\nexport type GetSlotComponentProps<\n\tTName extends string = string,\n\tTChildren extends CallbackFn<never, React.ReactNode> | React.ReactNode =\n\t\t| CallbackFn<never, React.ReactNode>\n\t\t| React.ReactNode,\n> = {\n\tchildren: TChildren;\n\t/**\n\t * Name of the slot where content should be rendered\n\t */\n\tname: TName;\n};\n\n/**\n * @description Creates a slot component\n */\nexport const createSlotComponent = <TSlotComponentProps extends GetSlotComponentProps>() => {\n\tconst SlotComponent = (props: TSlotComponentProps) => props.children as React.ReactNode;\n\n\tSlotComponent.slotSymbol = slotComponentSymbol;\n\n\treturn SlotComponent;\n};\n\ntype SlotWithNameAndSymbol<\n\tTSlotComponentProps extends GetSlotComponentProps = GetSlotComponentProps,\n\tTOtherProps extends UnknownObject = EmptyObject,\n> = {\n\t(props: Pick<TSlotComponentProps, \"children\"> & TOtherProps): React.ReactNode;\n\treadonly slotName?: TSlotComponentProps[\"name\"];\n\treadonly slotSymbol?: symbol;\n};\n\nfunction DefaultSlotComponent(props: Pick<GetSlotComponentProps, \"children\">): React.ReactNode {\n\treturn props.children as React.ReactNode;\n}\n\n/**\n * @description Adds a slot symbol and name to a slot component passed in\n */\nexport const withSlotNameAndSymbol = <\n\tTSlotComponentProps extends GetSlotComponentProps,\n\tTOtherProps extends UnknownObject = EmptyObject,\n>(\n\tname: TSlotComponentProps[\"name\"],\n\tSlotComponent: SlotWithNameAndSymbol<TSlotComponentProps, TOtherProps> = DefaultSlotComponent\n) => {\n\t/* eslint-disable no-param-reassign -- This is necessary */\n\t// @ts-expect-error -- This is necessary for the time being, to prevent type errors and accidental overrides on consumer side\n\tSlotComponent.slotSymbol = slotComponentSymbol;\n\t// @ts-expect-error -- This is necessary for the time being, to prevent type errors and accidental overrides on consumer side\n\tSlotComponent.slotName = name;\n\n\t/* eslint-enable no-param-reassign -- This is necessary */\n\n\treturn SlotComponent;\n};\n","import { twJoin, twMerge } from \"tailwind-merge\";\n\nexport const cnMerge: typeof twMerge = (...classNames) => twMerge(classNames);\n\nexport const cnJoin: typeof twJoin = (...classNames) => twJoin(classNames);\n","// == This approach is more efficient than using a regex.\nexport const isEventHandler = (key: string) => {\n\tconst thirdCharCode = key.codePointAt(2);\n\n\tif (thirdCharCode === undefined) {\n\t\treturn false;\n\t}\n\n\tconst isHandler =\n\t\t// eslint-disable-next-line ts-eslint/prefer-string-starts-ends-with -- Ignore\n\t\tkey[0] === \"o\" && key[1] === \"n\" && thirdCharCode >= 65 /* A */ && thirdCharCode <= 90; /* Z */\n\n\treturn isHandler;\n};\n\n// const mergeTwoClassNames = (formerClassName: string | undefined, latterClassName: string | undefined) => {\n// \tif (!latterClassName || !formerClassName) {\n// \t\t// eslint-disable-next-line ts-eslint/prefer-nullish-coalescing -- Logical OR is fit for this case\n// \t\treturn latterClassName || formerClassName;\n// \t}\n\n// \t// eslint-disable-next-line prefer-template -- String concatenation is more performant than template literals in this case\n// \treturn formerClassName + \" \" + latterClassName;\n// };\n","import { isFunction, isObject, isString } from \"@zayne-labs/toolkit-type-helpers\";\nimport { cnMerge } from \"@/lib/utils/cn\";\nimport { composeTwoEventHandlers } from \"../composeEventHandlers\";\nimport { isEventHandler } from \"./utils\";\n\nexport const mergeTwoProps = <TProps extends Record<never, never>>(\n\tformerProps: TProps | undefined,\n\tlatterProps: TProps | undefined\n): TProps => {\n\t// == If no props are provided, return an empty object\n\tif (!latterProps || !formerProps) {\n\t\treturn latterProps ?? formerProps ?? ({} as TProps);\n\t}\n\n\tconst propsAccumulator: Record<string, unknown> = {\n\t\t...formerProps,\n\t};\n\n\tfor (const [latterPropName, latterPropValue] of Object.entries(latterProps)) {\n\t\tconst accumulatedPropValue = propsAccumulator[latterPropName];\n\n\t\tif (\n\t\t\t(latterPropName === \"className\" || latterPropName === \"class\")\n\t\t\t&& isString(latterPropValue)\n\t\t\t&& isString(accumulatedPropValue)\n\t\t) {\n\t\t\tpropsAccumulator[latterPropName] = cnMerge(accumulatedPropValue, latterPropValue);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (latterPropName === \"style\" && isObject(latterPropValue) && isObject(accumulatedPropValue)) {\n\t\t\tpropsAccumulator[latterPropName] = {\n\t\t\t\t...accumulatedPropValue,\n\t\t\t\t...latterPropValue,\n\t\t\t};\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (\n\t\t\tisFunction(latterPropValue)\n\t\t\t&& isFunction(accumulatedPropValue)\n\t\t\t&& isEventHandler(latterPropName)\n\t\t) {\n\t\t\tpropsAccumulator[latterPropName] = composeTwoEventHandlers(accumulatedPropValue, latterPropValue);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\t// == latterProps override by default\n\t\tpropsAccumulator[latterPropName] =\n\t\t\tlatterPropValue !== undefined ? latterPropValue : accumulatedPropValue;\n\t}\n\n\treturn propsAccumulator as TProps;\n};\n","import { mergeTwoProps } from \"./mergeTwoProps\";\n\ntype UnionToIntersection<TUnion> =\n\t(TUnion extends unknown ? (param: TUnion) => void : \"\") extends (param: infer TParam) => void ? TParam\n\t:\t\"\";\n\n/**\n * Merges multiple sets of React props.\n *\n * - It follows the Object.assign pattern where the rightmost object's fields overwrite\n * the conflicting ones from others. This doesn't apply to event handlers, `className` and `style` props.\n * - Event handlers are merged such that they are called in sequence (the rightmost one being called first),\n * and allows the user to prevent the previous event handlers from being executed by calling the `preventDefault` method.\n * - It also merges the `className` and `style` props, whereby the classes are concatenated\n * and the rightmost styles overwrite the previous ones.\n *\n * @important **`ref` is not merged.**\n * @param props props to merge.\n * @returns the merged props.\n */\n\nconst mergeProps = <TProps extends Record<never, never>>(\n\t...propsObjectArray: Array<TProps | undefined>\n): UnionToIntersection<TProps> => {\n\tif (propsObjectArray.length === 0) {\n\t\treturn {} as never;\n\t}\n\n\tif (propsObjectArray.length === 1) {\n\t\treturn propsObjectArray[0] as never;\n\t}\n\n\tlet accumulatedProps: Record<string, unknown> = {};\n\n\tfor (const propsObject of propsObjectArray) {\n\t\tif (!propsObject) continue;\n\n\t\taccumulatedProps = mergeTwoProps(accumulatedProps, propsObject);\n\t}\n\n\treturn accumulatedProps as never;\n};\n\nexport { mergeProps };\n"],"mappings":"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"}