hookery 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -26
- package/dist/index.d.ts +147 -1
- package/dist/index.js +10 -4304
- package/dist/index.mjs +10 -4164
- package/package.json +10 -81
- package/dist/bridges/auth0.d.mts +0 -16
- package/dist/bridges/auth0.d.ts +0 -16
- package/dist/bridges/auth0.js +0 -3015
- package/dist/bridges/auth0.js.map +0 -1
- package/dist/bridges/auth0.mjs +0 -2977
- package/dist/bridges/auth0.mjs.map +0 -1
- package/dist/bridges/axios.d.mts +0 -17
- package/dist/bridges/axios.d.ts +0 -17
- package/dist/bridges/axios.js +0 -15351
- package/dist/bridges/axios.js.map +0 -1
- package/dist/bridges/axios.mjs +0 -15347
- package/dist/bridges/axios.mjs.map +0 -1
- package/dist/bridges/clerk.d.mts +0 -1
- package/dist/bridges/clerk.d.ts +0 -1
- package/dist/bridges/clerk.js +0 -5991
- package/dist/bridges/clerk.js.map +0 -1
- package/dist/bridges/clerk.mjs +0 -5985
- package/dist/bridges/clerk.mjs.map +0 -1
- package/dist/bridges/firebase.d.mts +0 -14
- package/dist/bridges/firebase.d.ts +0 -14
- package/dist/bridges/firebase.js +0 -52
- package/dist/bridges/firebase.js.map +0 -1
- package/dist/bridges/firebase.mjs +0 -25
- package/dist/bridges/firebase.mjs.map +0 -1
- package/dist/bridges/jotai.d.mts +0 -11
- package/dist/bridges/jotai.d.ts +0 -11
- package/dist/bridges/jotai.js +0 -870
- package/dist/bridges/jotai.js.map +0 -1
- package/dist/bridges/jotai.mjs +0 -827
- package/dist/bridges/jotai.mjs.map +0 -1
- package/dist/bridges/motion.d.mts +0 -6
- package/dist/bridges/motion.d.ts +0 -6
- package/dist/bridges/motion.js +0 -3752
- package/dist/bridges/motion.js.map +0 -1
- package/dist/bridges/motion.mjs +0 -3721
- package/dist/bridges/motion.mjs.map +0 -1
- package/dist/bridges/next.d.mts +0 -10
- package/dist/bridges/next.d.ts +0 -10
- package/dist/bridges/next.js +0 -2588
- package/dist/bridges/next.js.map +0 -1
- package/dist/bridges/next.mjs +0 -2582
- package/dist/bridges/next.mjs.map +0 -1
- package/dist/bridges/redux.d.mts +0 -15
- package/dist/bridges/redux.d.ts +0 -15
- package/dist/bridges/redux.js +0 -410
- package/dist/bridges/redux.js.map +0 -1
- package/dist/bridges/redux.mjs +0 -402
- package/dist/bridges/redux.mjs.map +0 -1
- package/dist/bridges/remix.d.mts +0 -1
- package/dist/bridges/remix.d.ts +0 -1
- package/dist/bridges/remix.js +0 -2215
- package/dist/bridges/remix.js.map +0 -1
- package/dist/bridges/remix.mjs +0 -2174
- package/dist/bridges/remix.mjs.map +0 -1
- package/dist/bridges/stripe.d.mts +0 -15
- package/dist/bridges/stripe.d.ts +0 -15
- package/dist/bridges/stripe.js +0 -1572
- package/dist/bridges/stripe.js.map +0 -1
- package/dist/bridges/stripe.mjs +0 -1556
- package/dist/bridges/stripe.mjs.map +0 -1
- package/dist/bridges/supabase.d.mts +0 -13
- package/dist/bridges/supabase.d.ts +0 -13
- package/dist/bridges/supabase.js +0 -51
- package/dist/bridges/supabase.js.map +0 -1
- package/dist/bridges/supabase.mjs +0 -24
- package/dist/bridges/supabase.mjs.map +0 -1
- package/dist/bridges/tanstack.d.mts +0 -3
- package/dist/bridges/tanstack.d.ts +0 -3
- package/dist/bridges/tanstack.js +0 -1319
- package/dist/bridges/tanstack.js.map +0 -1
- package/dist/bridges/tanstack.mjs +0 -1281
- package/dist/bridges/tanstack.mjs.map +0 -1
- package/dist/bridges/yup.d.mts +0 -16
- package/dist/bridges/yup.d.ts +0 -16
- package/dist/bridges/yup.js +0 -80
- package/dist/bridges/yup.js.map +0 -1
- package/dist/bridges/yup.mjs +0 -43
- package/dist/bridges/yup.mjs.map +0 -1
- package/dist/bridges/zod.d.mts +0 -19
- package/dist/bridges/zod.d.ts +0 -19
- package/dist/bridges/zod.js +0 -66
- package/dist/bridges/zod.js.map +0 -1
- package/dist/bridges/zod.mjs +0 -39
- package/dist/bridges/zod.mjs.map +0 -1
- package/dist/bridges/zustand.d.mts +0 -14
- package/dist/bridges/zustand.d.ts +0 -14
- package/dist/bridges/zustand.js +0 -58
- package/dist/bridges/zustand.js.map +0 -1
- package/dist/bridges/zustand.mjs +0 -21
- package/dist/bridges/zustand.mjs.map +0 -1
- package/dist/index.d.mts +0 -3130
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.ts","../src/utils/index.ts","../src/hooks/useToggle/useToggle.ts","../src/hooks/useCounter/useCounter.ts","../src/hooks/usePrevious/usePrevious.ts","../src/hooks/useMount/useMount.ts","../src/hooks/useUnmount/useUnmount.ts","../src/hooks/useDebounce/useDebounce.ts","../src/hooks/useThrottle/useThrottle.ts","../src/hooks/useLocalStorage/useLocalStorage.ts","../src/hooks/useSessionStorage/useSessionStorage.ts","../src/hooks/useTimeout/useTimeout.ts","../src/hooks/useInterval/useInterval.ts","../src/hooks/useUpdateEffect/useUpdateEffect.ts","../src/hooks/useIsMounted/useIsMounted.ts","../src/hooks/useStableCallback/useStableCallback.ts","../src/hooks/useMediaQuery/useMediaQuery.ts","../src/hooks/useWindowSize/useWindowSize.ts","../src/hooks/useClickOutside/useClickOutside.ts","../src/hooks/useHover/useHover.ts","../src/hooks/useKeyPress/useKeyPress.ts","../src/hooks/useScroll/useScroll.ts","../src/hooks/useIntersection/useIntersection.ts","../src/hooks/useCopyToClipboard/useCopyToClipboard.ts","../src/hooks/useDocumentTitle/useDocumentTitle.ts","../src/hooks/useLockBodyScroll/useLockBodyScroll.ts","../src/hooks/useTheme/useTheme.ts","../src/hooks/useEvent/useEvent.ts","../src/hooks/useLongPress/useLongPress.ts","../src/hooks/useWindowFocus/useWindowFocus.ts","../src/hooks/useResizeObserver/useResizeObserver.ts","../src/hooks/useMutationObserver/useMutationObserver.ts","../src/hooks/usePageLeave/usePageLeave.ts","../src/hooks/useEyeDropper/useEyeDropper.ts","../src/hooks/useOnline/useOnline.ts","../src/hooks/useNetworkState/useNetworkState.ts","../src/hooks/useFullscreen/useFullscreen.ts","../src/hooks/useShare/useShare.ts","../src/hooks/usePermissions/usePermissions.ts","../src/hooks/useWakeLock/useWakeLock.ts","../src/hooks/useMediaDevices/useMediaDevices.ts","../src/hooks/useMediaRecorder/useMediaRecorder.ts","../src/hooks/useBattery/useBattery.ts","../src/hooks/useBluetooth/useBluetooth.ts","../src/hooks/useGamepad/useGamepad.ts","../src/hooks/useFileSystem/useFileSystem.ts","../src/hooks/useStorageEstimate/useStorageEstimate.ts","../src/hooks/useAsync/useAsync.ts","../src/hooks/useFetch/useFetch.ts","../src/hooks/useScript/useScript.ts","../src/hooks/useWorker/useWorker.ts","../src/hooks/useIndexedDB/useIndexedDB.ts","../src/hooks/useHistory/useHistory.ts","../src/hooks/useStep/useStep.ts","../src/hooks/usePagination/usePagination.ts","../src/hooks/useMachine/useMachine.ts","../src/hooks/useVirtualList/useVirtualList.ts","../src/hooks/useInfiniteScroll/useInfiniteScroll.ts","../src/hooks/useAnthropic/useAnthropic.ts","../src/hooks/useEmbeddings/useEmbeddings.ts","../src/hooks/useGemini/useGemini.ts","../src/hooks/useLLMStream/useLLMStream.ts","../src/hooks/useOpenAI/useOpenAI.ts","../src/hooks/useRAG/useRAG.ts","../src/hooks/useSearchHighlight/useSearchHighlight.ts","../src/hooks/useSemanticSearch/useSemanticSearch.ts","../src/hooks/useSTT/useSTT.ts","../src/hooks/useTTS/useTTS.ts","../src/hooks/useAnimate/useAnimate.ts","../src/hooks/useVideoRef/useVideoRef.ts","../src/hooks/useAudioRef/useAudioRef.ts","../src/hooks/useCanvas/useCanvas.ts","../src/hooks/useFrameRate/useFrameRate.ts","../src/hooks/useLottie/useLottie.ts","../src/hooks/useParallax/useParallax.ts","../src/hooks/useSpringCore/useSpringCore.ts","../src/hooks/useSVGAnimation/useSVGAnimation.ts","../src/hooks/useThreeJS/useThreeJS.ts","../src/hooks/useBroadcastChannel/useBroadcastChannel.ts","../src/hooks/useCalendar/useCalendar.ts","../src/hooks/useDragAndDrop/useDragAndDrop.ts","../src/hooks/useFileProcessing/useFileProcessing.ts","../src/hooks/useForm/useForm.ts","../src/hooks/useMarkdown/useMarkdown.ts","../src/hooks/usePDF/usePDF.ts","../src/hooks/usePresence/usePresence.ts","../src/hooks/useRealtimeCollab/useRealtimeCollab.ts","../src/hooks/useShortcuts/useShortcuts.ts","../src/hooks/useSortable/useSortable.ts","../src/hooks/useSpreadsheet/useSpreadsheet.ts","../src/hooks/useTable/useTable.ts","../src/hooks/useWebRTC/useWebRTC.ts","../src/hooks/useWebSocket/useWebSocket.ts","../src/hooks/useClickAnywhere/useClickAnywhere.ts","../src/hooks/useCountdown/useCountdown.ts","../src/hooks/useDebounceCallback/useDebounceCallback.ts","../src/hooks/useIsClient/useIsClient.ts","../src/hooks/useList/useList.ts","../src/hooks/useMap/useMap.ts","../src/hooks/useQueue/useQueue.ts","../src/hooks/useScreen/useScreen.ts","../src/hooks/useSet/useSet.ts"],"sourcesContent":["import { useEffect, useLayoutEffect } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\n/**\r\n * useIsomorphicLayoutEffect\r\n *\r\n * SSR-safe version of useLayoutEffect.\r\n * Uses useEffect on the server and useLayoutEffect in the browser.\r\n *\r\n * @example\r\n * ```tsx\r\n * useIsomorphicLayoutEffect(() => {\r\n * // DOM measurements or mutations\r\n * }, [dependency]);\r\n * ```\r\n */\r\nexport const useIsomorphicLayoutEffect = isServer ? useEffect : useLayoutEffect;\r\n\r\nexport default useIsomorphicLayoutEffect;\r\n","/**\r\n * Check if code is running on the server (SSR)\r\n */\r\nexport const isServer = typeof window === 'undefined';\r\n\r\n/**\r\n * Check if code is running in the browser\r\n */\r\nexport const isBrowser = !isServer;\r\n\r\n/**\r\n * No-operation function\r\n */\r\nexport const noop = (): void => {};\r\n\r\n/**\r\n * Type helper for extracting the return type of a promise\r\n */\r\nexport type Awaited<T> = T extends Promise<infer U> ? U : T;\r\n\r\n/**\r\n * Type for a function that can be debounced/throttled\r\n */\r\nexport type AnyFunction = (...args: unknown[]) => unknown;\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface UseToggleOptions {\r\n /** Initial value for the toggle (default: false) */\r\n initialValue?: boolean;\r\n}\r\n\r\nexport interface UseToggleReturn {\r\n /** Current toggle value */\r\n value: boolean;\r\n /** Toggle the value */\r\n toggle: () => void;\r\n /** Set value to true */\r\n setTrue: () => void;\r\n /** Set value to false */\r\n setFalse: () => void;\r\n /** Set to specific value */\r\n setValue: (value: boolean) => void;\r\n}\r\n\r\n/**\r\n * useToggle\r\n *\r\n * A simple hook for managing boolean state with stable action handlers.\r\n *\r\n * @param options - Configuration options\r\n * @returns Object with value and control functions\r\n *\r\n * @example\r\n * ```tsx\r\n * const { value, toggle, setTrue, setFalse } = useToggle();\r\n *\r\n * return (\r\n * <div>\r\n * <p>Value: {value ? 'ON' : 'OFF'}</p>\r\n * <button onClick={toggle}>Toggle</button>\r\n * <button onClick={setTrue}>Set ON</button>\r\n * <button onClick={setFalse}>Set OFF</button>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useToggle(options: UseToggleOptions = {}): UseToggleReturn {\r\n const { initialValue = false } = options;\r\n const [value, setValue] = useState(initialValue);\r\n\r\n const toggle = useCallback(() => setValue((prev) => !prev), []);\r\n const setTrue = useCallback(() => setValue(true), []);\r\n const setFalse = useCallback(() => setValue(false), []);\r\n\r\n return {\r\n value,\r\n toggle,\r\n setTrue,\r\n setFalse,\r\n setValue,\r\n };\r\n}\r\n\r\nexport default useToggle;\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface UseCounterOptions {\r\n /** Initial value (default: 0) */\r\n initialValue?: number;\r\n /** Minimum value (optional) */\r\n min?: number;\r\n /** Maximum value (optional) */\r\n max?: number;\r\n /** Step value for increment/decrement (default: 1) */\r\n step?: number;\r\n}\r\n\r\nexport interface UseCounterReturn {\r\n /** Current count value */\r\n count: number;\r\n /** Increment by step */\r\n increment: () => void;\r\n /** Decrement by step */\r\n decrement: () => void;\r\n /** Reset to initial value */\r\n reset: () => void;\r\n /** Set to specific value */\r\n set: (value: number) => void;\r\n}\r\n\r\n/**\r\n * useCounter\r\n *\r\n * A hook for managing numeric state with increment, decrement, and bounds.\r\n *\r\n * @param options - Configuration options\r\n * @returns Object with count value and control functions\r\n *\r\n * @example\r\n * ```tsx\r\n * const { count, increment, decrement, reset } = useCounter({\r\n * initialValue: 0,\r\n * min: 0,\r\n * max: 10,\r\n * step: 1,\r\n * });\r\n *\r\n * return (\r\n * <div>\r\n * <p>Count: {count}</p>\r\n * <button onClick={decrement}>-</button>\r\n * <button onClick={increment}>+</button>\r\n * <button onClick={reset}>Reset</button>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useCounter(options: UseCounterOptions = {}): UseCounterReturn {\r\n const { initialValue = 0, min, max, step = 1 } = options;\r\n\r\n const clamp = useCallback(\r\n (value: number): number => {\r\n let result = value;\r\n if (min !== undefined && result < min) result = min;\r\n if (max !== undefined && result > max) result = max;\r\n return result;\r\n },\r\n [min, max]\r\n );\r\n\r\n const [count, setCount] = useState(() => clamp(initialValue));\r\n\r\n const increment = useCallback(() => {\r\n setCount((prev) => clamp(prev + step));\r\n }, [clamp, step]);\r\n\r\n const decrement = useCallback(() => {\r\n setCount((prev) => clamp(prev - step));\r\n }, [clamp, step]);\r\n\r\n const reset = useCallback(() => {\r\n setCount(clamp(initialValue));\r\n }, [clamp, initialValue]);\r\n\r\n const set = useCallback(\r\n (value: number) => {\r\n setCount(clamp(value));\r\n },\r\n [clamp]\r\n );\r\n\r\n return {\r\n count,\r\n increment,\r\n decrement,\r\n reset,\r\n set,\r\n };\r\n}\r\n\r\nexport default useCounter;\r\n","import { useEffect, useRef } from 'react';\r\n\r\n/**\r\n * usePrevious\r\n *\r\n * A hook that returns the previous value of a state or prop.\r\n *\r\n * @param value - The value to track\r\n * @returns The previous value (undefined on first render)\r\n *\r\n * @example\r\n * ```tsx\r\n * const [count, setCount] = useState(0);\r\n * const previousCount = usePrevious(count);\r\n *\r\n * console.log(`Current: ${count}, Previous: ${previousCount}`);\r\n * ```\r\n */\r\nexport function usePrevious<T>(value: T): T | undefined {\r\n const ref = useRef<T | undefined>(undefined);\r\n\r\n useEffect(() => {\r\n ref.current = value;\r\n }, [value]);\r\n\r\n return ref.current;\r\n}\r\n\r\nexport default usePrevious;\r\n","import { useEffect, useRef } from 'react';\r\n\r\n/**\r\n * useMount\r\n *\r\n * A hook that runs a callback once when the component mounts.\r\n * Works correctly with React Strict Mode.\r\n *\r\n * @param callback - Function to run on mount\r\n *\r\n * @example\r\n * ```tsx\r\n * useMount(() => {\r\n * console.log('Component mounted!');\r\n * // Initialize analytics, fetch initial data, etc.\r\n * });\r\n * ```\r\n */\r\nexport function useMount(callback: () => void | (() => void)): void {\r\n const callbackRef = useRef(callback);\r\n callbackRef.current = callback;\r\n\r\n useEffect(() => {\r\n return callbackRef.current();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n}\r\n\r\nexport default useMount;\r\n","import { useEffect, useRef } from 'react';\r\n\r\n/**\r\n * useUnmount\r\n *\r\n * A hook that runs a callback when the component unmounts.\r\n * Always uses the latest callback reference.\r\n *\r\n * @param callback - Function to run on unmount\r\n *\r\n * @example\r\n * ```tsx\r\n * useUnmount(() => {\r\n * console.log('Component unmounted!');\r\n * // Cleanup subscriptions, cancel requests, etc.\r\n * });\r\n * ```\r\n */\r\nexport function useUnmount(callback: () => void): void {\r\n const callbackRef = useRef(callback);\r\n callbackRef.current = callback;\r\n\r\n useEffect(() => {\r\n return () => {\r\n callbackRef.current();\r\n };\r\n }, []);\r\n}\r\n\r\nexport default useUnmount;\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseDebounceOptions {\r\n /** Delay in milliseconds (default: 500) */\r\n delay?: number;\r\n /** Maximum wait time in milliseconds (optional) */\r\n maxWait?: number;\r\n /** Leading edge execution (default: false) */\r\n leading?: boolean;\r\n /** Trailing edge execution (default: true) */\r\n trailing?: boolean;\r\n}\r\n\r\nexport interface UseDebounceReturn<T> {\r\n /** The debounced value */\r\n debouncedValue: T;\r\n /** Whether currently in debounce period */\r\n isPending: boolean;\r\n /** Cancel pending debounce */\r\n cancel: () => void;\r\n /** Flush debounced value immediately */\r\n flush: () => void;\r\n}\r\n\r\n/**\r\n * useDebounce\r\n *\r\n * A hook that debounces a value, delaying updates until after a specified delay.\r\n *\r\n * @param value - The value to debounce\r\n * @param options - Configuration options\r\n * @returns Object with debounced value and control functions\r\n *\r\n * @example\r\n * ```tsx\r\n * const [searchTerm, setSearchTerm] = useState('');\r\n * const { debouncedValue } = useDebounce(searchTerm, { delay: 300 });\r\n *\r\n * useEffect(() => {\r\n * // API call with debounced value\r\n * fetchResults(debouncedValue);\r\n * }, [debouncedValue]);\r\n * ```\r\n */\r\nexport function useDebounce<T>(\r\n value: T,\r\n options: UseDebounceOptions = {}\r\n): UseDebounceReturn<T> {\r\n const { delay = 500, leading = false, trailing = true } = options;\r\n\r\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\r\n const [isPending, setIsPending] = useState(false);\r\n\r\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const leadingRef = useRef(true);\r\n const latestValueRef = useRef(value);\r\n\r\n latestValueRef.current = value;\r\n\r\n const cancel = useCallback(() => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = null;\r\n }\r\n setIsPending(false);\r\n }, []);\r\n\r\n const flush = useCallback(() => {\r\n cancel();\r\n setDebouncedValue(latestValueRef.current);\r\n }, [cancel]);\r\n\r\n useEffect(() => {\r\n // Handle leading edge\r\n if (leading && leadingRef.current) {\r\n leadingRef.current = false;\r\n setDebouncedValue(value);\r\n return;\r\n }\r\n\r\n setIsPending(true);\r\n\r\n // Clear existing timeout\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n\r\n // Set new timeout\r\n timeoutRef.current = setTimeout(() => {\r\n if (trailing) {\r\n setDebouncedValue(value);\r\n }\r\n setIsPending(false);\r\n timeoutRef.current = null;\r\n }, delay);\r\n\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n };\r\n }, [value, delay, leading, trailing]);\r\n\r\n // Cleanup on unmount\r\n useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n return {\r\n debouncedValue,\r\n isPending,\r\n cancel,\r\n flush,\r\n };\r\n}\r\n\r\nexport default useDebounce;\r\n","import { useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseThrottleOptions {\r\n /** Throttle interval in milliseconds (default: 500) */\r\n interval?: number;\r\n /** Execute on leading edge (default: true) */\r\n leading?: boolean;\r\n /** Execute on trailing edge (default: true) */\r\n trailing?: boolean;\r\n}\r\n\r\nexport interface UseThrottleReturn<T> {\r\n /** The throttled value */\r\n throttledValue: T;\r\n /** Whether currently in throttle period */\r\n isPending: boolean;\r\n}\r\n\r\n/**\r\n * useThrottle\r\n *\r\n * A hook that throttles a value, limiting how often it can update.\r\n *\r\n * @param value - The value to throttle\r\n * @param options - Configuration options\r\n * @returns Object with throttled value and pending state\r\n *\r\n * @example\r\n * ```tsx\r\n * const [scrollY, setScrollY] = useState(0);\r\n * const { throttledValue } = useThrottle(scrollY, { interval: 100 });\r\n *\r\n * useEffect(() => {\r\n * // Update UI with throttled scroll position\r\n * updateScrollIndicator(throttledValue);\r\n * }, [throttledValue]);\r\n * ```\r\n */\r\nexport function useThrottle<T>(\r\n value: T,\r\n options: UseThrottleOptions = {}\r\n): UseThrottleReturn<T> {\r\n const { interval = 500, leading = true, trailing = true } = options;\r\n\r\n const [throttledValue, setThrottledValue] = useState<T>(value);\r\n const [isPending, setIsPending] = useState(false);\r\n\r\n const lastExecuted = useRef<number>(0);\r\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const latestValue = useRef<T>(value);\r\n const isFirstRun = useRef(true);\r\n\r\n latestValue.current = value;\r\n\r\n useEffect(() => {\r\n const now = Date.now();\r\n const elapsed = now - lastExecuted.current;\r\n\r\n // Handle leading edge on first run\r\n if (isFirstRun.current && leading) {\r\n isFirstRun.current = false;\r\n setThrottledValue(value);\r\n lastExecuted.current = now;\r\n return;\r\n }\r\n\r\n isFirstRun.current = false;\r\n\r\n // If enough time has passed, execute immediately\r\n if (elapsed >= interval) {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = null;\r\n }\r\n setThrottledValue(value);\r\n lastExecuted.current = now;\r\n setIsPending(false);\r\n } else if (trailing) {\r\n // Schedule trailing execution\r\n setIsPending(true);\r\n\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n\r\n timeoutRef.current = setTimeout(() => {\r\n setThrottledValue(latestValue.current);\r\n lastExecuted.current = Date.now();\r\n setIsPending(false);\r\n timeoutRef.current = null;\r\n }, interval - elapsed);\r\n }\r\n\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n };\r\n }, [value, interval, leading, trailing]);\r\n\r\n // Cleanup on unmount\r\n useEffect(() => {\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n return {\r\n throttledValue,\r\n isPending,\r\n };\r\n}\r\n\r\nexport default useThrottle;\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseLocalStorageOptions<T> {\r\n /** Serializer function (default: JSON.stringify) */\r\n serializer?: (value: T) => string;\r\n /** Deserializer function (default: JSON.parse) */\r\n deserializer?: (value: string) => T;\r\n /** Sync across tabs (default: true) */\r\n syncAcrossTabs?: boolean;\r\n}\r\n\r\nexport interface UseLocalStorageReturn<T> {\r\n /** Current stored value */\r\n value: T;\r\n /** Set the value */\r\n setValue: (value: T | ((prev: T) => T)) => void;\r\n /** Remove the value from storage */\r\n remove: () => void;\r\n /** Check if value exists in storage */\r\n exists: boolean;\r\n}\r\n\r\n/**\r\n * useLocalStorage\r\n *\r\n * A hook for persisting state in localStorage with SSR support and cross-tab sync.\r\n *\r\n * @param key - Storage key\r\n * @param initialValue - Default value if key doesn't exist\r\n * @param options - Configuration options\r\n * @returns Object with value and control functions\r\n *\r\n * @example\r\n * ```tsx\r\n * interface AppSettings {\r\n * theme: 'dark' | 'light';\r\n * notifications: boolean;\r\n * }\r\n *\r\n * // Default settings\r\n * const defaults: AppSettings = { theme: 'light', notifications: true };\r\n *\r\n * export function SettingsPanel() {\r\n * const {\r\n * value: settings,\r\n * setValue: setSettings,\r\n * remove,\r\n * exists\r\n * } = useLocalStorage<AppSettings>('app-settings', defaults);\r\n *\r\n * const toggleTheme = () => {\r\n * setSettings(prev => ({\r\n * ...prev,\r\n * theme: prev.theme === 'dark' ? 'light' : 'dark'\r\n * }));\r\n * };\r\n *\r\n * return (\r\n * <div className={`panel ${settings.theme}`}>\r\n * <h2>Settings {exists ? '(Saved)' : '(Default)'}</h2>\r\n *\r\n * <div className=\"option\">\r\n * <label>Theme: {settings.theme}</label>\r\n * <button onClick={toggleTheme}>Toggle Theme</button>\r\n * </div>\r\n *\r\n * <div className=\"option\">\r\n * <label>\r\n * <input\r\n * type=\"checkbox\"\r\n * checked={settings.notifications}\r\n * onChange={e => setSettings(p => ({ ...p, notifications: e.target.checked }))}\r\n * />\r\n * Enable Notifications\r\n * </label>\r\n * </div>\r\n *\r\n * <button onClick={remove} className=\"danger\">\r\n * Reset to Defaults\r\n * </button>\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useLocalStorage<T>(\r\n key: string,\r\n initialValue: T,\r\n options: UseLocalStorageOptions<T> = {}\r\n): UseLocalStorageReturn<T> {\r\n const {\r\n serializer = JSON.stringify,\r\n deserializer = JSON.parse,\r\n syncAcrossTabs = true,\r\n } = options;\r\n\r\n // Get initial value from storage or use default\r\n const readValue = useCallback((): T => {\r\n if (isServer) {\r\n return initialValue;\r\n }\r\n\r\n try {\r\n const item = window.localStorage.getItem(key);\r\n return item !== null ? deserializer(item) : initialValue;\r\n } catch (error) {\r\n console.warn(`Error reading localStorage key \"${key}\":`, error);\r\n return initialValue;\r\n }\r\n }, [key, initialValue, deserializer]);\r\n\r\n const [storedValue, setStoredValue] = useState<T>(readValue);\r\n const [exists, setExists] = useState<boolean>(() => {\r\n if (isServer) return false;\r\n return window.localStorage.getItem(key) !== null;\r\n });\r\n\r\n // Set value to storage\r\n const setValue = useCallback(\r\n (value: T | ((prev: T) => T)) => {\r\n try {\r\n // Handle function updates\r\n const valueToStore =\r\n value instanceof Function ? value(storedValue) : value;\r\n\r\n // Save to state\r\n setStoredValue(valueToStore);\r\n setExists(true);\r\n\r\n // Save to localStorage\r\n if (!isServer) {\r\n window.localStorage.setItem(key, serializer(valueToStore));\r\n\r\n // Dispatch storage event for other tabs\r\n window.dispatchEvent(\r\n new StorageEvent('storage', {\r\n key,\r\n newValue: serializer(valueToStore),\r\n })\r\n );\r\n }\r\n } catch (error) {\r\n console.warn(`Error setting localStorage key \"${key}\":`, error);\r\n }\r\n },\r\n [key, serializer, storedValue]\r\n );\r\n\r\n // Remove from storage\r\n const remove = useCallback(() => {\r\n try {\r\n setStoredValue(initialValue);\r\n setExists(false);\r\n\r\n if (!isServer) {\r\n window.localStorage.removeItem(key);\r\n }\r\n } catch (error) {\r\n console.warn(`Error removing localStorage key \"${key}\":`, error);\r\n }\r\n }, [key, initialValue]);\r\n\r\n // Sync with other tabs\r\n useEffect(() => {\r\n if (isServer || !syncAcrossTabs) return;\r\n\r\n const handleStorageChange = (event: StorageEvent): void => {\r\n if (event.key === key && event.newValue !== null) {\r\n try {\r\n setStoredValue(deserializer(event.newValue));\r\n setExists(true);\r\n } catch {\r\n // Ignore parse errors\r\n }\r\n } else if (event.key === key && event.newValue === null) {\r\n setStoredValue(initialValue);\r\n setExists(false);\r\n }\r\n };\r\n\r\n window.addEventListener('storage', handleStorageChange);\r\n\r\n return () => {\r\n window.removeEventListener('storage', handleStorageChange);\r\n };\r\n }, [key, initialValue, deserializer, syncAcrossTabs]);\r\n\r\n return {\r\n value: storedValue,\r\n setValue,\r\n remove,\r\n exists,\r\n };\r\n}\r\n\r\nexport default useLocalStorage;\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseSessionStorageOptions<T> {\r\n /** Serializer function (default: JSON.stringify) */\r\n serializer?: (value: T) => string;\r\n /** Deserializer function (default: JSON.parse) */\r\n deserializer?: (value: string) => T;\r\n /** Initialize even if key exists (default: false) */\r\n initializeWithValue?: boolean;\r\n}\r\n\r\n/**\r\n * useSessionStorage\r\n *\r\n * A hook for managing state in sessionStorage.\r\n * Clears when the page session ends (tab close).\r\n *\r\n * @param key - Storage key\r\n * @param initialValue - Initial value\r\n * @param options - Configuration options\r\n * @returns [value, setValue, removeValue]\r\n *\r\n * @example\r\n * ```tsx\r\n * interface FormData {\r\n * step: number;\r\n * data: Record<string, any>;\r\n * }\r\n *\r\n * const initialForm: FormData = { step: 1, data: {} };\r\n *\r\n * export function MultiStepForm() {\r\n * // Persist form state even if user refreshes, but clear on close\r\n * const [formState, setFormState, clearSession] = useSessionStorage<FormData>(\r\n * 'registration_form',\r\n * initialForm\r\n * );\r\n *\r\n * const nextStep = (newData: any) => {\r\n * setFormState(prev => ({\r\n * step: prev.step + 1,\r\n * data: { ...prev.data, ...newData }\r\n * }));\r\n * };\r\n *\r\n * return (\r\n * <div>\r\n * <h1>Step {formState.step}</h1>\r\n * <FormStep\r\n * step={formState.step}\r\n * onSubmit={nextStep}\r\n * />\r\n *\r\n * <button onClick={clearSession}>\r\n * Cancel & Clear Session\r\n * </button>\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useSessionStorage<T>(\r\n key: string,\r\n initialValue: T | (() => T),\r\n options: UseSessionStorageOptions<T> = {}\r\n): [T, (value: T | ((val: T) => T)) => void, () => void] {\r\n const {\r\n serializer = JSON.stringify,\r\n deserializer = JSON.parse,\r\n initializeWithValue = false,\r\n } = options;\r\n\r\n const [storedValue, setStoredValue] = useState<T>(() => {\r\n if (isServer) {\r\n return typeof initialValue === 'function'\r\n ? (initialValue as () => T)()\r\n : initialValue;\r\n }\r\n\r\n try {\r\n const item = window.sessionStorage.getItem(key);\r\n if (item && !initializeWithValue) {\r\n return deserializer(item);\r\n }\r\n\r\n const value =\r\n typeof initialValue === 'function'\r\n ? (initialValue as () => T)()\r\n : initialValue;\r\n\r\n if (initializeWithValue) {\r\n window.sessionStorage.setItem(key, serializer(value));\r\n }\r\n return value;\r\n } catch (error) {\r\n console.error(`Error reading sessionStorage key \"${key}\":`, error);\r\n return typeof initialValue === 'function'\r\n ? (initialValue as () => T)()\r\n : initialValue;\r\n }\r\n });\r\n\r\n const setValue = useCallback(\r\n (value: T | ((val: T) => T)) => {\r\n try {\r\n const valueToStore =\r\n value instanceof Function ? value(storedValue) : value;\r\n\r\n setStoredValue(valueToStore);\r\n\r\n if (!isServer) {\r\n window.sessionStorage.setItem(key, serializer(valueToStore));\r\n window.dispatchEvent(new Event('session-storage'));\r\n }\r\n } catch (error) {\r\n console.error(`Error setting sessionStorage key \"${key}\":`, error);\r\n }\r\n },\r\n [key, storedValue, serializer]\r\n );\r\n\r\n const removeValue = useCallback(() => {\r\n try {\r\n setStoredValue(\r\n typeof initialValue === 'function'\r\n ? (initialValue as () => T)()\r\n : initialValue\r\n );\r\n if (!isServer) {\r\n window.sessionStorage.removeItem(key);\r\n window.dispatchEvent(new Event('session-storage'));\r\n }\r\n } catch (error) {\r\n console.error(`Error removing sessionStorage key \"${key}\":`, error);\r\n }\r\n }, [key, initialValue]);\r\n\r\n // Listen for changes in other tabs/windows\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n const handleStorageChange = (e: StorageEvent) => {\r\n if (e.key === key && e.storageArea === window.sessionStorage) {\r\n try {\r\n if (e.newValue === null) {\r\n setStoredValue(\r\n typeof initialValue === 'function'\r\n ? (initialValue as () => T)()\r\n : initialValue\r\n );\r\n } else {\r\n setStoredValue(deserializer(e.newValue));\r\n }\r\n } catch (error) {\r\n console.error(`Error syncing sessionStorage key \"${key}\":`, error);\r\n }\r\n }\r\n };\r\n\r\n window.addEventListener('storage', handleStorageChange);\r\n return () => window.removeEventListener('storage', handleStorageChange);\r\n }, [key, initialValue, deserializer]);\r\n\r\n return [storedValue, setValue, removeValue];\r\n}\r\n\r\nexport default useSessionStorage;\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseTimeoutOptions {\r\n /** Delay in milliseconds */\r\n delay: number;\r\n /** Auto-start the timeout (default: true) */\r\n autoStart?: boolean;\r\n}\r\n\r\nexport interface UseTimeoutReturn {\r\n /** Whether the timeout is currently running */\r\n isRunning: boolean;\r\n /** Whether the timeout has completed */\r\n isComplete: boolean;\r\n /** Start or restart the timeout */\r\n start: () => void;\r\n /** Stop/cancel the timeout */\r\n stop: () => void;\r\n /** Reset the timeout to initial state */\r\n reset: () => void;\r\n}\r\n\r\n/**\r\n * useTimeout\r\n *\r\n * A declarative hook for managing timeouts.\r\n *\r\n * @param callback - Function to call when timeout completes\r\n * @param options - Configuration options\r\n * @returns Object with timeout state and control functions\r\n *\r\n * @example\r\n * ```tsx\r\n * const { isRunning, start, stop } = useTimeout(\r\n * () => console.log('Timeout completed!'),\r\n * { delay: 3000 }\r\n * );\r\n *\r\n * return (\r\n * <div>\r\n * <p>Status: {isRunning ? 'Running' : 'Stopped'}</p>\r\n * <button onClick={start}>Start</button>\r\n * <button onClick={stop}>Stop</button>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useTimeout(\r\n callback: () => void,\r\n options: UseTimeoutOptions\r\n): UseTimeoutReturn {\r\n const { delay, autoStart = true } = options;\r\n\r\n const [isRunning, setIsRunning] = useState(autoStart);\r\n const [isComplete, setIsComplete] = useState(false);\r\n\r\n const callbackRef = useRef(callback);\r\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n callbackRef.current = callback;\r\n\r\n const stop = useCallback(() => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = null;\r\n }\r\n setIsRunning(false);\r\n }, []);\r\n\r\n const start = useCallback(() => {\r\n stop();\r\n setIsComplete(false);\r\n setIsRunning(true);\r\n\r\n timeoutRef.current = setTimeout(() => {\r\n callbackRef.current();\r\n setIsRunning(false);\r\n setIsComplete(true);\r\n timeoutRef.current = null;\r\n }, delay);\r\n }, [delay, stop]);\r\n\r\n const reset = useCallback(() => {\r\n stop();\r\n setIsComplete(false);\r\n }, [stop]);\r\n\r\n // Auto-start effect\r\n useEffect(() => {\r\n if (autoStart) {\r\n start();\r\n }\r\n\r\n return () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n };\r\n }, [delay]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n return {\r\n isRunning,\r\n isComplete,\r\n start,\r\n stop,\r\n reset,\r\n };\r\n}\r\n\r\nexport default useTimeout;\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseIntervalOptions {\r\n /** Interval delay in milliseconds */\r\n delay: number;\r\n /** Auto-start the interval (default: true) */\r\n autoStart?: boolean;\r\n /** Execute callback immediately on start (default: false) */\r\n immediate?: boolean;\r\n}\r\n\r\nexport interface UseIntervalReturn {\r\n /** Whether the interval is currently running */\r\n isRunning: boolean;\r\n /** Number of times the callback has been called */\r\n count: number;\r\n /** Start the interval */\r\n start: () => void;\r\n /** Stop/pause the interval */\r\n stop: () => void;\r\n /** Reset count to 0 */\r\n reset: () => void;\r\n}\r\n\r\n/**\r\n * useInterval\r\n *\r\n * A declarative hook for managing intervals.\r\n *\r\n * @param callback - Function to call on each interval tick\r\n * @param options - Configuration options\r\n * @returns Object with interval state and control functions\r\n *\r\n * @example\r\n * ```tsx\r\n * const { count, isRunning, start, stop } = useInterval(\r\n * () => console.log('Tick!'),\r\n * { delay: 1000 }\r\n * );\r\n *\r\n * return (\r\n * <div>\r\n * <p>Count: {count}</p>\r\n * <button onClick={isRunning ? stop : start}>\r\n * {isRunning ? 'Stop' : 'Start'}\r\n * </button>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useInterval(\r\n callback: () => void,\r\n options: UseIntervalOptions\r\n): UseIntervalReturn {\r\n const { delay, autoStart = true, immediate = false } = options;\r\n\r\n const [isRunning, setIsRunning] = useState(autoStart);\r\n const [count, setCount] = useState(0);\r\n\r\n const callbackRef = useRef(callback);\r\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\r\n\r\n callbackRef.current = callback;\r\n\r\n const stop = useCallback(() => {\r\n if (intervalRef.current) {\r\n clearInterval(intervalRef.current);\r\n intervalRef.current = null;\r\n }\r\n setIsRunning(false);\r\n }, []);\r\n\r\n const start = useCallback(() => {\r\n stop();\r\n setIsRunning(true);\r\n\r\n if (immediate) {\r\n callbackRef.current();\r\n setCount((c) => c + 1);\r\n }\r\n\r\n intervalRef.current = setInterval(() => {\r\n callbackRef.current();\r\n setCount((c) => c + 1);\r\n }, delay);\r\n }, [delay, immediate, stop]);\r\n\r\n const reset = useCallback(() => {\r\n setCount(0);\r\n }, []);\r\n\r\n // Auto-start effect\r\n useEffect(() => {\r\n if (autoStart) {\r\n start();\r\n }\r\n\r\n return () => {\r\n if (intervalRef.current) {\r\n clearInterval(intervalRef.current);\r\n }\r\n };\r\n }, [delay]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n return {\r\n isRunning,\r\n count,\r\n start,\r\n stop,\r\n reset,\r\n };\r\n}\r\n\r\nexport default useInterval;\r\n","import { DependencyList, EffectCallback, useEffect, useRef } from 'react';\r\n\r\n/**\r\n * useUpdateEffect\r\n *\r\n * A hook that works like useEffect but skips the first render.\r\n * Useful when you only want to run an effect on updates, not on mount.\r\n *\r\n * @param effect - Effect callback (same as useEffect)\r\n * @param deps - Dependency array (same as useEffect)\r\n *\r\n * @example\r\n * ```tsx\r\n * const [count, setCount] = useState(0);\r\n *\r\n * useUpdateEffect(() => {\r\n * console.log('Count updated to:', count);\r\n * // This won't run on initial mount, only on updates\r\n * }, [count]);\r\n * ```\r\n */\r\nexport function useUpdateEffect(\r\n effect: EffectCallback,\r\n deps?: DependencyList\r\n): void {\r\n const isFirstMount = useRef(true);\r\n\r\n useEffect(() => {\r\n if (isFirstMount.current) {\r\n isFirstMount.current = false;\r\n return;\r\n }\r\n\r\n return effect();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, deps);\r\n}\r\n\r\nexport default useUpdateEffect;\r\n","import { useCallback, useEffect, useRef } from 'react';\r\n\r\n/**\r\n * useIsMounted\r\n *\r\n * A hook that returns a function to check if the component is still mounted.\r\n * Useful for preventing state updates on unmounted components in async operations.\r\n *\r\n * @returns Function that returns true if component is mounted\r\n *\r\n * @example\r\n * ```tsx\r\n * const isMounted = useIsMounted();\r\n *\r\n * useEffect(() => {\r\n * fetchData().then((data) => {\r\n * if (isMounted()) {\r\n * setData(data); // Safe - only updates if mounted\r\n * }\r\n * });\r\n * }, []);\r\n * ```\r\n */\r\nexport function useIsMounted(): () => boolean {\r\n const isMountedRef = useRef(false);\r\n\r\n useEffect(() => {\r\n isMountedRef.current = true;\r\n\r\n return () => {\r\n isMountedRef.current = false;\r\n };\r\n }, []);\r\n\r\n return useCallback(() => isMountedRef.current, []);\r\n}\r\n\r\nexport default useIsMounted;\r\n","import { useCallback, useEffect, useRef } from 'react';\r\n\r\n/**\r\n * useStableCallback\r\n *\r\n * Creates a callback function that maintains a stable reference identity\r\n * while accessing the latest props/state. Useful for avoiding\r\n * unnecessary effect re-executions.\r\n *\r\n * @param callback - The function to stabilize\r\n * @returns A stable callback function\r\n *\r\n * @example\r\n * ```tsx\r\n * const stableLog = useStableCallback(() => {\r\n * console.log(count); // Alway access latest count\r\n * });\r\n *\r\n * // stableLog identity never changes, safe to use in useEffect deps\r\n * useEffect(() => {\r\n * stableLog();\r\n * }, [stableLog]);\r\n * ```\r\n */\r\nexport function useStableCallback<T extends (...args: any[]) => any>(\r\n callback: T\r\n): T {\r\n const callbackRef = useRef(callback);\r\n\r\n useEffect(() => {\r\n callbackRef.current = callback;\r\n }); // Update on every render\r\n\r\n return useCallback((...args: any[]) => {\r\n return callbackRef.current(...args);\r\n }, []) as T;\r\n}\r\n\r\nexport default useStableCallback;\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseMediaQueryOptions {\r\n /** Default value for SSR (default: false) */\r\n defaultValue?: boolean;\r\n /** Initialize on mount only (default: false) */\r\n initializeOnMount?: boolean;\r\n}\r\n\r\n/**\r\n * useMediaQuery\r\n *\r\n * A hook that tracks the state of a CSS media query.\r\n * Supports SSR with default values and hydration mismatch prevention.\r\n *\r\n * @param query - CSS media query string\r\n * @param options - Configuration options\r\n * @returns Whether the media query matches\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic Mobile Detection\r\n * const isMobile = useMediaQuery('(max-width: 768px)');\r\n *\r\n * // Advanced Usage with SSR support\r\n * const isDarkMode = useMediaQuery('(prefers-color-scheme: dark)', {\r\n * defaultValue: false, // Default value during server rendering\r\n * initializeOnMount: true // Prevent hydration mismatch by initializing on mount\r\n * });\r\n *\r\n * return (\r\n * <div style={{ background: isDarkMode ? '#333' : '#FFF' }}>\r\n * <h1>{isMobile ? 'Mobile View' : 'Desktop View'}</h1>\r\n * <p>Current Theme: {isDarkMode ? 'Dark' : 'Light'}</p>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useMediaQuery(\r\n query: string,\r\n options: UseMediaQueryOptions = {}\r\n): boolean {\r\n const { defaultValue = false, initializeOnMount = false } = options;\r\n\r\n const getMatches = useCallback((): boolean => {\r\n if (isServer) {\r\n return defaultValue;\r\n }\r\n return window.matchMedia(query).matches;\r\n }, [query, defaultValue]);\r\n\r\n const [matches, setMatches] = useState<boolean>(() => {\r\n if (initializeOnMount) {\r\n return defaultValue;\r\n }\r\n return getMatches();\r\n });\r\n\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n const mediaQueryList = window.matchMedia(query);\r\n\r\n // Set initial value\r\n setMatches(mediaQueryList.matches);\r\n\r\n // Handler function\r\n const handleChange = (event: MediaQueryListEvent): void => {\r\n setMatches(event.matches);\r\n };\r\n\r\n // Add listener (modern API)\r\n if (mediaQueryList.addEventListener) {\r\n mediaQueryList.addEventListener('change', handleChange);\r\n } else {\r\n // Fallback for older browsers\r\n mediaQueryList.addListener(handleChange);\r\n }\r\n\r\n return () => {\r\n if (mediaQueryList.removeEventListener) {\r\n mediaQueryList.removeEventListener('change', handleChange);\r\n } else {\r\n mediaQueryList.removeListener(handleChange);\r\n }\r\n };\r\n }, [query]);\r\n\r\n return matches;\r\n}\r\n\r\nexport default useMediaQuery;\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface WindowSize {\r\n /** Window inner width */\r\n width: number;\r\n /** Window inner height */\r\n height: number;\r\n}\r\n\r\nexport interface UseWindowSizeOptions {\r\n /** Debounce delay in ms (default: 0) */\r\n debounce?: number;\r\n /** Initial width for SSR (default: 0) */\r\n initialWidth?: number;\r\n /** Initial height for SSR (default: 0) */\r\n initialHeight?: number;\r\n}\r\n\r\n/**\r\n * useWindowSize\r\n *\r\n * A hook that tracks the browser window dimensions.\r\n * Handles debouncing to avoid performance issues during resize.\r\n *\r\n * @param options - Configuration options\r\n * @returns Object with width and height\r\n *\r\n * @example\r\n * ```tsx\r\n * const { width, height } = useWindowSize({\r\n * debounce: 100, // Wait 100ms after resize stops\r\n * initialWidth: 1920, // Predictable server-side width\r\n * initialHeight: 1080\r\n * });\r\n *\r\n * const isLandscape = width > height;\r\n *\r\n * return (\r\n * <div>\r\n * <h2>Viewport Info</h2>\r\n * <p>Dimensions: {width}px x {height}px</p>\r\n * <p>Orientation: {isLandscape ? 'Landscape' : 'Portrait'}</p>\r\n *\r\n * {width < 768 && (\r\n * <div className=\"mobile-warning\">\r\n * Optimized for Desktop\r\n * </div>\r\n * )}\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useWindowSize(options: UseWindowSizeOptions = {}): WindowSize {\r\n const { debounce = 0, initialWidth = 0, initialHeight = 0 } = options;\r\n\r\n const getSize = useCallback((): WindowSize => {\r\n if (isServer) {\r\n return { width: initialWidth, height: initialHeight };\r\n }\r\n return {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n };\r\n }, [initialWidth, initialHeight]);\r\n\r\n const [windowSize, setWindowSize] = useState<WindowSize>(getSize);\r\n\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n const handleResize = (): void => {\r\n if (debounce > 0) {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n setWindowSize(getSize());\r\n }, debounce);\r\n } else {\r\n setWindowSize(getSize());\r\n }\r\n };\r\n\r\n // Set initial size\r\n setWindowSize(getSize());\r\n\r\n window.addEventListener('resize', handleResize);\r\n\r\n return () => {\r\n window.removeEventListener('resize', handleResize);\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n };\r\n }, [debounce, getSize]);\r\n\r\n return windowSize;\r\n}\r\n\r\nexport default useWindowSize;\r\n","import { RefObject, useEffect, useRef } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseClickOutsideOptions {\r\n /** Events to listen for (default: ['mousedown', 'touchstart']) */\r\n events?: Array<'mousedown' | 'mouseup' | 'touchstart' | 'touchend'>;\r\n /** Whether the listener is active (default: true) */\r\n enabled?: boolean;\r\n}\r\n\r\n/**\r\n * useClickOutside\r\n *\r\n * A hook that detects clicks outside of a referenced element.\r\n * Useful for closing modals, dropdowns, or popovers.\r\n *\r\n * @param ref - React ref to the element to monitor\r\n * @param callback - Function to call when clicking outside\r\n * @param options - Configuration options\r\n *\r\n * @example\r\n * ```tsx\r\n * const [isOpen, setIsOpen] = useState(false);\r\n * const menuRef = useRef<HTMLDivElement>(null);\r\n *\r\n * useClickOutside(menuRef, () => {\r\n * console.log('Clicked outside menu, closing...');\r\n * setIsOpen(false);\r\n * }, {\r\n * enabled: isOpen, // Only listen when menu is open (performance)\r\n * events: ['mousedown', 'touchstart'] // Handle touch devices too\r\n * });\r\n *\r\n * return (\r\n * <div className=\"relative\">\r\n * <button onClick={() => setIsOpen(!isOpen)}>Toggle Menu</button>\r\n *\r\n * {isOpen && (\r\n * <div ref={menuRef} className=\"dropdown-menu\">\r\n * <p>Menu Item 1</p>\r\n * <p>Menu Item 2</p>\r\n * </div>\r\n * )}\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\r\n ref: RefObject<T | null>,\r\n callback: (event: MouseEvent | TouchEvent) => void,\r\n options: UseClickOutsideOptions = {}\r\n): void {\r\n const { events = ['mousedown', 'touchstart'], enabled = true } = options;\r\n\r\n const callbackRef = useRef(callback);\r\n callbackRef.current = callback;\r\n\r\n useEffect(() => {\r\n if (isServer || !enabled) return;\r\n\r\n const handleClick = (event: MouseEvent | TouchEvent): void => {\r\n const el = ref.current;\r\n if (!el || el.contains(event.target as Node)) {\r\n return;\r\n }\r\n callbackRef.current(event);\r\n };\r\n\r\n events.forEach((eventName) => {\r\n document.addEventListener(eventName, handleClick as EventListener);\r\n });\r\n\r\n return () => {\r\n events.forEach((eventName) => {\r\n document.removeEventListener(eventName, handleClick as EventListener);\r\n });\r\n };\r\n }, [ref, events, enabled]);\r\n}\r\n\r\nexport default useClickOutside;\r\n","import { useCallback, useRef, useState } from 'react';\r\n\r\nexport interface UseHoverReturn<T extends HTMLElement = HTMLElement> {\r\n /** Whether the element is being hovered */\r\n isHovered: boolean;\r\n /** Ref to attach to the target element */\r\n ref: React.RefCallback<T>;\r\n /** Props to spread on the target element */\r\n hoverProps: {\r\n onMouseEnter: () => void;\r\n onMouseLeave: () => void;\r\n };\r\n}\r\n\r\n/**\r\n * useHover\r\n *\r\n * A hook that tracks hover state of an element.\r\n * Provides both a ref-based and prop-based API for flexibility.\r\n *\r\n * @returns Object with hover state, ref, and event handlers\r\n *\r\n * @example\r\n * ```tsx\r\n * // pattern 1: Using Ref (Recommended for access to DOM)\r\n * const { isHovered: isCardHovered, ref: cardRef } = useHover<HTMLDivElement>();\r\n *\r\n * // pattern 2: Using Spread Props (Easier for simpler components)\r\n * const { isHovered: isBtnHovered, hoverProps } = useHover();\r\n *\r\n * return (\r\n * <div>\r\n * <div\r\n * ref={cardRef}\r\n * style={{\r\n * padding: 20,\r\n * background: isCardHovered ? '#eee' : '#fff'\r\n * }}\r\n * >\r\n * {isCardHovered ? 'Card Active!' : 'Hover Card'}\r\n * </div>\r\n *\r\n * <button\r\n * {...hoverProps}\r\n * style={{ opacity: isBtnHovered ? 1 : 0.7 }}\r\n * >\r\n * {isBtnHovered ? 'Click Me!' : 'Button'}\r\n * </button>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useHover<\r\n T extends HTMLElement = HTMLElement\r\n>(): UseHoverReturn<T> {\r\n const [isHovered, setIsHovered] = useState(false);\r\n const nodeRef = useRef<T | null>(null);\r\n\r\n const handleMouseEnter = useCallback(() => {\r\n setIsHovered(true);\r\n }, []);\r\n\r\n const handleMouseLeave = useCallback(() => {\r\n setIsHovered(false);\r\n }, []);\r\n\r\n const ref = useCallback(\r\n (node: T | null) => {\r\n // Cleanup old node listeners\r\n if (nodeRef.current) {\r\n nodeRef.current.removeEventListener('mouseenter', handleMouseEnter);\r\n nodeRef.current.removeEventListener('mouseleave', handleMouseLeave);\r\n }\r\n\r\n // Setup new node listeners\r\n if (node) {\r\n node.addEventListener('mouseenter', handleMouseEnter);\r\n node.addEventListener('mouseleave', handleMouseLeave);\r\n }\r\n\r\n nodeRef.current = node;\r\n },\r\n [handleMouseEnter, handleMouseLeave]\r\n );\r\n\r\n return {\r\n isHovered,\r\n ref,\r\n hoverProps: {\r\n onMouseEnter: handleMouseEnter,\r\n onMouseLeave: handleMouseLeave,\r\n },\r\n };\r\n}\r\n\r\nexport default useHover;\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseKeyPressOptions {\r\n /** Target element (default: window) */\r\n target?: 'window' | 'document';\r\n /** Event type (default: 'keydown') */\r\n event?: 'keydown' | 'keyup' | 'keypress';\r\n /** Whether to prevent default behavior */\r\n preventDefault?: boolean;\r\n /** Whether the listener is active (default: true) */\r\n enabled?: boolean;\r\n}\r\n\r\n/**\r\n * useKeyPress\r\n *\r\n * A hook that tracks whether a specific key is pressed.\r\n *\r\n * @param targetKey - The key to track (e.g., 'Enter', 'Escape', 'a')\r\n * @param callback - Optional callback when key is pressed\r\n * @param options - Configuration options\r\n * @returns Whether the key is currently pressed\r\n *\r\n * @example\r\n * ```tsx\r\n * // Simple usage\r\n * const isEnterPressed = useKeyPress('Enter');\r\n *\r\n * // With callback\r\n * useKeyPress('Escape', () => {\r\n * closeModal();\r\n * });\r\n *\r\n * // With modifiers (check inside callback)\r\n * useKeyPress('s', (event) => {\r\n * if (event.ctrlKey) {\r\n * event.preventDefault();\r\n * saveDocument();\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport function useKeyPress(\r\n targetKey: string,\r\n callback?: (event: KeyboardEvent) => void,\r\n options: UseKeyPressOptions = {}\r\n): boolean {\r\n const {\r\n target = 'window',\r\n event = 'keydown',\r\n preventDefault = false,\r\n enabled = true,\r\n } = options;\r\n\r\n const [isPressed, setIsPressed] = useState(false);\r\n\r\n const callbackRef = useCallback(\r\n (e: KeyboardEvent) => {\r\n callback?.(e);\r\n },\r\n [callback]\r\n );\r\n\r\n useEffect(() => {\r\n if (isServer || !enabled) return;\r\n\r\n const targetElement = target === 'document' ? document : window;\r\n\r\n const handleKeyDown = (e: Event): void => {\r\n const event = e as KeyboardEvent;\r\n if (event.key === targetKey) {\r\n if (preventDefault) {\r\n event.preventDefault();\r\n }\r\n setIsPressed(true);\r\n callbackRef(event);\r\n }\r\n };\r\n\r\n const handleKeyUp = (e: Event): void => {\r\n const event = e as KeyboardEvent;\r\n if (event.key === targetKey) {\r\n setIsPressed(false);\r\n }\r\n };\r\n\r\n targetElement.addEventListener(event, handleKeyDown);\r\n if (event === 'keydown') {\r\n targetElement.addEventListener('keyup', handleKeyUp);\r\n }\r\n\r\n return () => {\r\n targetElement.removeEventListener(event, handleKeyDown);\r\n if (event === 'keydown') {\r\n targetElement.removeEventListener('keyup', handleKeyUp);\r\n }\r\n };\r\n }, [targetKey, target, event, preventDefault, enabled, callbackRef]);\r\n\r\n return isPressed;\r\n}\r\n\r\nexport default useKeyPress;\r\n","import { RefObject, useEffect, useRef, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface ScrollPosition {\r\n /** Horizontal scroll position */\r\n x: number;\r\n /** Vertical scroll position */\r\n y: number;\r\n}\r\n\r\nexport interface UseScrollOptions {\r\n /** Throttle delay in ms (default: 0) */\r\n throttle?: number;\r\n}\r\n\r\nexport interface UseScrollReturn extends ScrollPosition {\r\n /** Whether scroll is at the top */\r\n isAtTop: boolean;\r\n /** Whether scroll is at the bottom */\r\n isAtBottom: boolean;\r\n /** Whether scroll is at the left */\r\n isAtLeft: boolean;\r\n /** Whether scroll is at the right */\r\n isAtRight: boolean;\r\n /** Scroll direction */\r\n direction: 'up' | 'down' | 'left' | 'right' | null;\r\n}\r\n\r\n/**\r\n * useScroll\r\n *\r\n * A hook that tracks scroll position of window or an element.\r\n * Provides coordinates, direction, and boundary detection (top/bottom/left/right).\r\n *\r\n * @param ref - Optional ref to track element scroll (defaults to window)\r\n * @param options - Configuration options\r\n * @returns Object with scroll position and state\r\n *\r\n * @example\r\n * ```tsx\r\n * // Track window scroll with progress bar\r\n * const { y, direction, isAtTop, isAtBottom } = useScroll();\r\n *\r\n * // Track specific element\r\n * const containerRef = useRef<HTMLDivElement>(null);\r\n * const { x } = useScroll(containerRef, { throttle: 100 });\r\n *\r\n * return (\r\n * <>\r\n * <div className=\"fixed-header\" style={{ opacity: isAtTop ? 1 : 0.8 }}>\r\n * Scrolling: {direction}\r\n * {isAtBottom && <span> (Reached Bottom!)</span>}\r\n * </div>\r\n *\r\n * <div\r\n * ref={containerRef}\r\n * style={{ width: 300, overflowX: 'scroll', whiteSpace: 'nowrap' }}\r\n * >\r\n * {items.map(item => <Item key={item.id} {...item} />)}\r\n * </div>\r\n * </>\r\n * );\r\n * ```\r\n */\r\nexport function useScroll<T extends HTMLElement = HTMLElement>(\r\n ref?: RefObject<T | null>,\r\n options: UseScrollOptions = {}\r\n): UseScrollReturn {\r\n const { throttle = 0 } = options;\r\n\r\n const [position, setPosition] = useState<ScrollPosition>({ x: 0, y: 0 });\r\n const [direction, setDirection] = useState<UseScrollReturn['direction']>(null);\r\n const [boundaries, setBoundaries] = useState({\r\n isAtTop: true,\r\n isAtBottom: false,\r\n isAtLeft: true,\r\n isAtRight: false,\r\n });\r\n\r\n const lastPositionRef = useRef<ScrollPosition>({ x: 0, y: 0 });\r\n const throttleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n const target = ref?.current ?? window;\r\n const isWindow = target === window;\r\n\r\n const getScrollPosition = (): ScrollPosition => {\r\n if (isWindow) {\r\n return {\r\n x: window.scrollX ?? window.pageXOffset,\r\n y: window.scrollY ?? window.pageYOffset,\r\n };\r\n }\r\n const element = target as HTMLElement;\r\n return {\r\n x: element.scrollLeft,\r\n y: element.scrollTop,\r\n };\r\n };\r\n\r\n const getBoundaries = () => {\r\n if (isWindow) {\r\n const scrollHeight = document.documentElement.scrollHeight;\r\n const scrollWidth = document.documentElement.scrollWidth;\r\n const clientHeight = window.innerHeight;\r\n const clientWidth = window.innerWidth;\r\n const { x, y } = getScrollPosition();\r\n\r\n return {\r\n isAtTop: y <= 0,\r\n isAtBottom: y + clientHeight >= scrollHeight - 1,\r\n isAtLeft: x <= 0,\r\n isAtRight: x + clientWidth >= scrollWidth - 1,\r\n };\r\n }\r\n\r\n const element = target as HTMLElement;\r\n return {\r\n isAtTop: element.scrollTop <= 0,\r\n isAtBottom:\r\n element.scrollTop + element.clientHeight >= element.scrollHeight - 1,\r\n isAtLeft: element.scrollLeft <= 0,\r\n isAtRight:\r\n element.scrollLeft + element.clientWidth >= element.scrollWidth - 1,\r\n };\r\n };\r\n\r\n const handleScroll = (): void => {\r\n const execute = () => {\r\n const newPosition = getScrollPosition();\r\n const lastPosition = lastPositionRef.current;\r\n\r\n // Determine direction\r\n if (newPosition.y !== lastPosition.y) {\r\n setDirection(newPosition.y > lastPosition.y ? 'down' : 'up');\r\n } else if (newPosition.x !== lastPosition.x) {\r\n setDirection(newPosition.x > lastPosition.x ? 'right' : 'left');\r\n }\r\n\r\n lastPositionRef.current = newPosition;\r\n setPosition(newPosition);\r\n setBoundaries(getBoundaries());\r\n };\r\n\r\n if (throttle > 0) {\r\n if (!throttleTimerRef.current) {\r\n throttleTimerRef.current = setTimeout(() => {\r\n execute();\r\n throttleTimerRef.current = null;\r\n }, throttle);\r\n }\r\n } else {\r\n execute();\r\n }\r\n };\r\n\r\n // Initial position\r\n setPosition(getScrollPosition());\r\n setBoundaries(getBoundaries());\r\n\r\n target.addEventListener('scroll', handleScroll, { passive: true });\r\n\r\n return () => {\r\n target.removeEventListener('scroll', handleScroll);\r\n if (throttleTimerRef.current) {\r\n clearTimeout(throttleTimerRef.current);\r\n }\r\n };\r\n }, [ref, throttle]);\r\n\r\n return {\r\n ...position,\r\n ...boundaries,\r\n direction,\r\n };\r\n}\r\n\r\nexport default useScroll;\r\n","import { RefObject, useEffect, useRef, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseIntersectionOptions {\r\n /** Root element for intersection (default: viewport) */\r\n root?: Element | null;\r\n /** Root margin (default: '0px') */\r\n rootMargin?: string;\r\n /** Threshold(s) for intersection (default: 0) */\r\n threshold?: number | number[];\r\n /** Trigger only once (default: false) */\r\n triggerOnce?: boolean;\r\n /** Whether the observer is active (default: true) */\r\n enabled?: boolean;\r\n}\r\n\r\nexport interface UseIntersectionReturn {\r\n /** Whether the element is intersecting */\r\n isIntersecting: boolean;\r\n /** The intersection entry */\r\n entry: IntersectionObserverEntry | null;\r\n /** Ref to attach to the target element */\r\n ref: RefObject<HTMLElement | null>;\r\n}\r\n\r\n/**\r\n * useIntersection\r\n *\r\n * A hook that uses IntersectionObserver to detect element visibility.\r\n * Perfect for lazy loading images, infinite scrolling, or animations.\r\n *\r\n * @param options - Configuration options\r\n * @returns Object with intersection state and ref\r\n *\r\n * @example\r\n * ```tsx\r\n * const { ref, isIntersecting, entry } = useIntersection({\r\n * threshold: 0.5, // Trigger when 50% visible\r\n * triggerOnce: true, // Only trigger once (good for animations)\r\n * rootMargin: '100px' // Pre-load before appearing on screen\r\n * });\r\n *\r\n * return (\r\n * <div\r\n * ref={ref}\r\n * className={`transition-opacity duration-500 ${\r\n * isIntersecting ? 'opacity-100' : 'opacity-0'\r\n * }`}\r\n * >\r\n * {isIntersecting ? (\r\n * <img src=\"heavy-image.jpg\" alt=\"Lazy loaded\" />\r\n * ) : (\r\n * <div className=\"placeholder\" />\r\n * )}\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useIntersection(\r\n options: UseIntersectionOptions = {}\r\n): UseIntersectionReturn {\r\n const {\r\n root = null,\r\n rootMargin = '0px',\r\n threshold = 0,\r\n triggerOnce = false,\r\n enabled = true,\r\n } = options;\r\n\r\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\r\n const [isIntersecting, setIsIntersecting] = useState(false);\r\n\r\n const ref = useRef<HTMLElement | null>(null);\r\n const hasTriggeredRef = useRef(false);\r\n\r\n useEffect(() => {\r\n if (isServer || !enabled) return;\r\n\r\n const element = ref.current;\r\n if (!element) return;\r\n\r\n // Skip if already triggered and triggerOnce is true\r\n if (triggerOnce && hasTriggeredRef.current) return;\r\n\r\n const observer = new IntersectionObserver(\r\n ([observerEntry]) => {\r\n setEntry(observerEntry);\r\n setIsIntersecting(observerEntry.isIntersecting);\r\n\r\n if (observerEntry.isIntersecting && triggerOnce) {\r\n hasTriggeredRef.current = true;\r\n observer.unobserve(element);\r\n }\r\n },\r\n {\r\n root,\r\n rootMargin,\r\n threshold,\r\n }\r\n );\r\n\r\n observer.observe(element);\r\n\r\n return () => {\r\n observer.disconnect();\r\n };\r\n }, [root, rootMargin, threshold, triggerOnce, enabled]);\r\n\r\n return {\r\n isIntersecting,\r\n entry,\r\n ref,\r\n };\r\n}\r\n\r\nexport default useIntersection;\r\n","import { useCallback, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseCopyToClipboardReturn {\r\n /** The last copied value */\r\n copiedValue: string | null;\r\n /** Whether the copy was successful */\r\n isSuccess: boolean;\r\n /** Any error that occurred */\r\n error: Error | null;\r\n /** Function to copy text to clipboard */\r\n copy: (text: string) => Promise<boolean>;\r\n /** Reset state */\r\n reset: () => void;\r\n}\r\n\r\n/**\r\n * useCopyToClipboard\r\n *\r\n * A hook for copying text to the clipboard.\r\n * Uses modern Clipboard API with fallback for legacy browsers.\r\n *\r\n * @returns Object with copy function and state\r\n *\r\n * @example\r\n * ```tsx\r\n * const { copy, copiedValue, isSuccess, error } = useCopyToClipboard();\r\n *\r\n * const handleCopy = async () => {\r\n * const success = await copy('API_KEY_12345');\r\n * if (success) {\r\n * toast.success('Copied to clipboard!');\r\n * }\r\n * };\r\n *\r\n * return (\r\n * <div className=\"api-key-box\">\r\n * <code>API_KEY_12345</code>\r\n *\r\n * <button onClick={handleCopy} disabled={isSuccess}>\r\n * {isSuccess ? 'Copied!' : 'Copy Key'}\r\n * </button>\r\n *\r\n * {error && <p className=\"error\">Failed to copy: {error.message}</p>}\r\n *\r\n * {isSuccess && (\r\n * <p className=\"hint\">\r\n * Last copied: {copiedValue}\r\n * </p>\r\n * )}\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useCopyToClipboard(): UseCopyToClipboardReturn {\r\n const [copiedValue, setCopiedValue] = useState<string | null>(null);\r\n const [isSuccess, setIsSuccess] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const copy = useCallback(async (text: string): Promise<boolean> => {\r\n if (isServer) {\r\n console.warn('Clipboard is not available on the server');\r\n return false;\r\n }\r\n\r\n // Try using modern Clipboard API\r\n if (navigator?.clipboard?.writeText) {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n setCopiedValue(text);\r\n setIsSuccess(true);\r\n setError(null);\r\n return true;\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error('Failed to copy'));\r\n setIsSuccess(false);\r\n return false;\r\n }\r\n }\r\n\r\n // Fallback for older browsers\r\n try {\r\n const textArea = document.createElement('textarea');\r\n textArea.value = text;\r\n textArea.style.position = 'fixed';\r\n textArea.style.left = '-9999px';\r\n textArea.style.top = '-9999px';\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n const successful = document.execCommand('copy');\r\n document.body.removeChild(textArea);\r\n\r\n if (successful) {\r\n setCopiedValue(text);\r\n setIsSuccess(true);\r\n setError(null);\r\n return true;\r\n } else {\r\n throw new Error('execCommand(\"copy\") failed');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error('Failed to copy'));\r\n setIsSuccess(false);\r\n return false;\r\n }\r\n }, []);\r\n\r\n const reset = useCallback(() => {\r\n setCopiedValue(null);\r\n setIsSuccess(false);\r\n setError(null);\r\n }, []);\r\n\r\n return {\r\n copiedValue,\r\n isSuccess,\r\n error,\r\n copy,\r\n reset,\r\n };\r\n}\r\n\r\nexport default useCopyToClipboard;\r\n","import { useEffect, useRef } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseDocumentTitleOptions {\r\n /** Restore previous title on unmount (default: true) */\r\n restoreOnUnmount?: boolean;\r\n}\r\n\r\n/**\r\n * useDocumentTitle\r\n *\r\n * A hook that sets the document title.\r\n *\r\n * @param title - The title to set\r\n * @param options - Configuration options\r\n *\r\n * @example\r\n * ```tsx\r\n * useDocumentTitle('Dashboard - My App');\r\n *\r\n * // With dynamic title\r\n * useDocumentTitle(`${unreadCount} new messages`);\r\n *\r\n * // Don't restore on unmount\r\n * useDocumentTitle('Settings', { restoreOnUnmount: false });\r\n * ```\r\n */\r\nexport function useDocumentTitle(\r\n title: string,\r\n options: UseDocumentTitleOptions = {}\r\n): void {\r\n const { restoreOnUnmount = true } = options;\r\n\r\n const previousTitleRef = useRef<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n // Store previous title on first run\r\n if (previousTitleRef.current === null) {\r\n previousTitleRef.current = document.title;\r\n }\r\n\r\n document.title = title;\r\n\r\n return () => {\r\n if (restoreOnUnmount && previousTitleRef.current !== null) {\r\n document.title = previousTitleRef.current;\r\n }\r\n };\r\n }, [title, restoreOnUnmount]);\r\n}\r\n\r\nexport default useDocumentTitle;\r\n","import { useEffect } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\n/**\r\n * useLockBodyScroll\r\n *\r\n * A hook that locks body scroll when active (useful for modals).\r\n *\r\n * @param lock - Whether to lock scroll (default: true)\r\n *\r\n * @example\r\n * ```tsx\r\n * const [isModalOpen, setIsModalOpen] = useState(false);\r\n *\r\n * useLockBodyScroll(isModalOpen);\r\n *\r\n * return (\r\n * <>\r\n * <button onClick={() => setIsModalOpen(true)}>Open Modal</button>\r\n * {isModalOpen && <Modal onClose={() => setIsModalOpen(false)} />}\r\n * </>\r\n * );\r\n * ```\r\n */\r\nexport function useLockBodyScroll(lock: boolean = true): void {\r\n useEffect(() => {\r\n if (isServer || !lock) return;\r\n\r\n // Get original body overflow style\r\n const originalOverflow = document.body.style.overflow;\r\n const originalPaddingRight = document.body.style.paddingRight;\r\n\r\n // Get scrollbar width to prevent layout shift\r\n const scrollbarWidth =\r\n window.innerWidth - document.documentElement.clientWidth;\r\n\r\n // Lock scroll\r\n document.body.style.overflow = 'hidden';\r\n if (scrollbarWidth > 0) {\r\n document.body.style.paddingRight = `${scrollbarWidth}px`;\r\n }\r\n\r\n return () => {\r\n // Restore original styles\r\n document.body.style.overflow = originalOverflow;\r\n document.body.style.paddingRight = originalPaddingRight;\r\n };\r\n }, [lock]);\r\n}\r\n\r\nexport default useLockBodyScroll;\r\n","import { useCallback, useMemo } from 'react';\r\nimport { isServer } from '../../utils';\r\nimport { useIsomorphicLayoutEffect } from '../useIsomorphicLayoutEffect';\r\nimport { useLocalStorage } from '../useLocalStorage';\r\nimport { useMediaQuery } from '../useMediaQuery';\r\n\r\nexport type Theme = 'light' | 'dark' | 'system';\r\n\r\nexport interface UseThemeOptions {\r\n /** Key to store theme in localStorage (default: 'theme') */\r\n storageKey?: string;\r\n /** Attribute to apply to HTML element (default: 'data-theme') */\r\n attribute?: string;\r\n /** Default theme if storage is empty (default: 'system') */\r\n defaultTheme?: Theme;\r\n /** Disable transition on theme switch to prevent flicker (default: true) */\r\n disableTransitionOnChange?: boolean;\r\n}\r\n\r\nexport interface UseThemeReturn {\r\n /** Active theme (light/dark/system) */\r\n theme: Theme;\r\n /** Resolved theme (light/dark) */\r\n resolvedTheme: 'light' | 'dark';\r\n /** Set theme */\r\n setTheme: (theme: Theme) => void;\r\n /** Toggle between light and dark */\r\n toggleTheme: () => void;\r\n}\r\n\r\n/**\r\n * useTheme\r\n *\r\n * A hook for managing light/dark mode with system preference support\r\n * and no-flash-of-unstyled-content (FOUC).\r\n *\r\n * @param options - Configuration options\r\n * @returns Theme state and controls\r\n *\r\n * @example\r\n * ```tsx\r\n * const { theme, toggleTheme } = useTheme();\r\n *\r\n * return (\r\n * <button onClick={toggleTheme}>\r\n * Current: {theme}\r\n * </button>\r\n * );\r\n * ```\r\n */\r\nexport function useTheme(options: UseThemeOptions = {}): UseThemeReturn {\r\n const {\r\n storageKey = 'theme',\r\n attribute = 'data-theme',\r\n defaultTheme = 'system',\r\n disableTransitionOnChange = true,\r\n } = options;\r\n\r\n const { value: theme, setValue: setTheme } = useLocalStorage<Theme>(\r\n storageKey,\r\n defaultTheme\r\n );\r\n const systemPrefersDark = useMediaQuery('(prefers-color-scheme: dark)');\r\n\r\n const resolvedTheme = useMemo(() => {\r\n if (theme === 'system') {\r\n return systemPrefersDark ? 'dark' : 'light';\r\n }\r\n return theme === 'dark' ? 'dark' : 'light';\r\n }, [theme, systemPrefersDark]);\r\n\r\n const applyTheme = useCallback(() => {\r\n if (isServer) return;\r\n\r\n const root = document.documentElement;\r\n\r\n if (disableTransitionOnChange) {\r\n const css = document.createElement('style');\r\n css.appendChild(\r\n document.createTextNode(\r\n `* {\r\n -webkit-transition: none !important;\r\n -moz-transition: none !important;\r\n -o-transition: none !important;\r\n -ms-transition: none !important;\r\n transition: none !important;\r\n }`\r\n )\r\n );\r\n document.head.appendChild(css);\r\n\r\n setTimeout(() => {\r\n // Force reflow\r\n (() => window.getComputedStyle(document.body))();\r\n\r\n setTimeout(() => {\r\n document.head.removeChild(css);\r\n }, 1);\r\n }, 1);\r\n }\r\n\r\n if (attribute === 'class') {\r\n root.classList.remove('light', 'dark');\r\n root.classList.add(resolvedTheme);\r\n } else {\r\n root.setAttribute(attribute, resolvedTheme);\r\n }\r\n }, [resolvedTheme, attribute, disableTransitionOnChange]);\r\n\r\n useIsomorphicLayoutEffect(() => {\r\n applyTheme();\r\n }, [applyTheme]);\r\n\r\n const toggleTheme = useCallback(() => {\r\n setTheme((prev) => {\r\n if (prev === 'system') return resolvedTheme === 'dark' ? 'light' : 'dark';\r\n return prev === 'dark' ? 'light' : 'dark';\r\n });\r\n }, [setTheme, resolvedTheme]);\r\n\r\n return {\r\n theme,\r\n resolvedTheme,\r\n setTheme,\r\n toggleTheme,\r\n };\r\n}\r\n\r\nexport default useTheme;\r\n","import { useEffect, useRef } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseEventOptions {\r\n /** Capture phase (default: false) */\r\n capture?: boolean;\r\n /** Passive listener (default: false) */\r\n passive?: boolean;\r\n /** Once listener (default: false) */\r\n once?: boolean;\r\n}\r\n\r\n/**\r\n * useEvent\r\n *\r\n * A hook that attaches an event listener to a target element.\r\n * Handles adding/removing listeners automatically on cleanup.\r\n *\r\n * @param name - Event name\r\n * @param handler - Event handler function\r\n * @param target - Target element (default: window)\r\n * @param options - Event options\r\n *\r\n * @example\r\n * ```tsx\r\n * useEvent('click', handleClick);\r\n * useEvent('scroll', handleScroll, window, { passive: true });\r\n * ```\r\n */\r\nexport function useEvent<KD extends keyof DocumentEventMap>(\r\n name: KD,\r\n handler: (this: Document, ev: DocumentEventMap[KD]) => any,\r\n target?: Document | null,\r\n options?: UseEventOptions\r\n): void;\r\nexport function useEvent<KH extends keyof HTMLElementEventMap>(\r\n name: KH,\r\n handler: (this: HTMLElement, ev: HTMLElementEventMap[KH]) => any,\r\n target?: HTMLElement | null,\r\n options?: UseEventOptions\r\n): void;\r\nexport function useEvent<KW extends keyof WindowEventMap>(\r\n name: KW,\r\n handler: (this: Window, ev: WindowEventMap[KW]) => any,\r\n target?: Window | null,\r\n options?: UseEventOptions\r\n): void;\r\nexport function useEvent(\r\n name: string,\r\n handler: EventListenerOrEventListenerObject,\r\n target: EventTarget | null = isServer ? null : window,\r\n options: UseEventOptions = {}\r\n): void {\r\n const handlerRef = useRef(handler);\r\n handlerRef.current = handler;\r\n\r\n useEffect(() => {\r\n if (!target) return;\r\n\r\n const eventListener = (event: Event) => {\r\n if (typeof handlerRef.current === 'function') {\r\n handlerRef.current(event);\r\n } else {\r\n handlerRef.current.handleEvent(event);\r\n }\r\n };\r\n\r\n target.addEventListener(name, eventListener, options);\r\n\r\n return () => {\r\n target.removeEventListener(name, eventListener, options);\r\n };\r\n }, [name, target, options?.capture, options?.passive, options?.once]);\r\n}\r\n\r\nexport default useEvent;\r\n","import { useCallback, useRef } from 'react';\r\n\r\nexport interface UseLongPressOptions {\r\n /** Time in ms to trigger long press (default: 500) */\r\n threshold?: number;\r\n /** Cancel on movement (default: true) */\r\n cancelOnMove?: boolean;\r\n /** Triggered when long press starts */\r\n onStart?: (event: AnyEvent) => void;\r\n /** Triggered when long press finishes successfully */\r\n onFinish?: (event: AnyEvent) => void;\r\n /** Triggered when long press is cancelled */\r\n onCancel?: (event: AnyEvent) => void;\r\n}\r\n\r\nexport type AnyEvent = MouseEvent | TouchEvent | React.MouseEvent | React.TouchEvent;\r\n\r\nexport interface UseLongPressReturn {\r\n onMouseDown: (e: any) => void;\r\n onTouchStart: (e: any) => void;\r\n onMouseUp: (e: any) => void;\r\n onMouseLeave: (e: any) => void;\r\n onTouchEnd: (e: any) => void;\r\n}\r\n\r\n/**\r\n * useLongPress\r\n *\r\n * A hook for detecting long press gestures.\r\n *\r\n * @param onLongPress - Callback fired when long press threshold is reached\r\n * @param options - Configuration options\r\n * @returns Event handlers to spread onto element\r\n *\r\n * @example\r\n * ```tsx\r\n * const onLongPress = () => {\r\n * console.log('Long pressed!');\r\n * };\r\n *\r\n * const bind = useLongPress(onLongPress);\r\n *\r\n * return <button {...bind}>Press me</button>;\r\n * ```\r\n */\r\nexport function useLongPress(\r\n onLongPress: (event: AnyEvent) => void,\r\n options: UseLongPressOptions = {}\r\n): UseLongPressReturn {\r\n const {\r\n threshold = 500,\r\n cancelOnMove = true,\r\n onStart,\r\n onFinish,\r\n onCancel,\r\n } = options;\r\n\r\n const callbackRef = useRef(onLongPress);\r\n const onStartRef = useRef(onStart);\r\n const onFinishRef = useRef(onFinish);\r\n const onCancelRef = useRef(onCancel);\r\n\r\n callbackRef.current = onLongPress;\r\n onStartRef.current = onStart;\r\n onFinishRef.current = onFinish;\r\n onCancelRef.current = onCancel;\r\n\r\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const isLongPressActive = useRef(false);\r\n\r\n const start = useCallback(\r\n (event: AnyEvent) => {\r\n // Stop generic click\r\n // event.persist?.(); // React < 17\r\n\r\n onStartRef.current?.(event);\r\n isLongPressActive.current = false;\r\n\r\n timerRef.current = setTimeout(() => {\r\n isLongPressActive.current = true;\r\n callbackRef.current(event);\r\n onFinishRef.current?.(event);\r\n }, threshold);\r\n },\r\n [threshold]\r\n );\r\n\r\n const cancel = useCallback(\r\n (event: AnyEvent) => {\r\n if (timerRef.current) {\r\n clearTimeout(timerRef.current);\r\n timerRef.current = null;\r\n\r\n if (!isLongPressActive.current) {\r\n onCancelRef.current?.(event);\r\n }\r\n }\r\n isLongPressActive.current = false;\r\n },\r\n []\r\n );\r\n\r\n return {\r\n onMouseDown: (e) => start(e),\r\n onTouchStart: (e) => start(e),\r\n onMouseUp: (e) => cancel(e),\r\n onMouseLeave: (e) => cancel(e),\r\n onTouchEnd: (e) => cancel(e),\r\n };\r\n}\r\n\r\nexport default useLongPress;\r\n","import { useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\n/**\r\n * useWindowFocus\r\n *\r\n * A hook that detects if the window currently has focus.\r\n *\r\n * @returns boolean - true if window is focused, false if blurred\r\n *\r\n * @example\r\n * ```tsx\r\n * const isFocused = useWindowFocus();\r\n *\r\n * useEffect(() => {\r\n * if (isFocused) {\r\n * // Resume polling\r\n * } else {\r\n * // Pause polling\r\n * }\r\n * }, [isFocused]);\r\n * ```\r\n */\r\nexport function useWindowFocus(): boolean {\r\n const [isFocused, setIsFocused] = useState(() =>\r\n !isServer && typeof document !== 'undefined' ? document.hasFocus() : true\r\n );\r\n\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n const onFocus = () => setIsFocused(true);\r\n const onBlur = () => setIsFocused(false);\r\n\r\n window.addEventListener('focus', onFocus);\r\n window.addEventListener('blur', onBlur);\r\n\r\n // Initial check\r\n setIsFocused(document.hasFocus());\r\n\r\n return () => {\r\n window.removeEventListener('focus', onFocus);\r\n window.removeEventListener('blur', onBlur);\r\n };\r\n }, []);\r\n\r\n return isFocused;\r\n}\r\n\r\nexport default useWindowFocus;\r\n","import { RefObject, useEffect, useRef, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseResizeObserverOptions {\r\n /** Output only contentRect (default: true) */\r\n contentRect?: boolean;\r\n /** Throttling delay in ms (default: 0) */\r\n throttle?: number;\r\n}\r\n\r\n/**\r\n * useResizeObserver\r\n *\r\n * A hook that tracks element size changes using ResizeObserver.\r\n *\r\n * @param ref - Ref to the element to observe\r\n * @param options - Configuration options\r\n * @returns The resize observer entry's contentRect\r\n *\r\n * @example\r\n * ```tsx\r\n * const ref = useRef<HTMLDivElement>(null);\r\n * const rect = useResizeObserver(ref);\r\n *\r\n * return (\r\n * <div ref={ref}>\r\n * Width: {rect?.width}, Height: {rect?.height}\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useResizeObserver<T extends HTMLElement = HTMLElement>(\r\n ref: RefObject<T | null>,\r\n options: UseResizeObserverOptions = {}\r\n): DOMRectReadOnly | undefined {\r\n const { throttle = 0 } = options;\r\n\r\n const [contentRect, setContentRect] = useState<DOMRectReadOnly>();\r\n const throttleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n const element = ref.current;\r\n if (!element) return;\r\n\r\n if (!window.ResizeObserver) {\r\n console.warn('ResizeObserver is not supported in this browser');\r\n return;\r\n }\r\n\r\n const observer = new ResizeObserver((entries) => {\r\n const entry = entries[0];\r\n if (!entry) return;\r\n\r\n const update = () => {\r\n setContentRect(entry.contentRect);\r\n };\r\n\r\n if (throttle > 0) {\r\n if (!throttleTimerRef.current) {\r\n throttleTimerRef.current = setTimeout(() => {\r\n update();\r\n throttleTimerRef.current = null;\r\n }, throttle);\r\n }\r\n } else {\r\n update();\r\n }\r\n });\r\n\r\n observer.observe(element);\r\n\r\n return () => {\r\n observer.disconnect();\r\n if (throttleTimerRef.current) {\r\n clearTimeout(throttleTimerRef.current);\r\n }\r\n };\r\n }, [ref, throttle]);\r\n\r\n return contentRect;\r\n}\r\n\r\nexport default useResizeObserver;\r\n","import { RefObject, useEffect, useRef } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseMutationObserverOptions extends MutationObserverInit {}\r\n\r\n/**\r\n * useMutationObserver\r\n *\r\n * A hook that tracks mutations in the DOM using MutationObserver.\r\n *\r\n * @param ref - Ref to the element to observe\r\n * @param callback - Function to call on mutation\r\n * @param options - MutationObserver options\r\n *\r\n * @example\r\n * ```tsx\r\n * const ref = useRef(null);\r\n * useMutationObserver(ref, (mutations) => {\r\n * console.log('DOM changed!', mutations);\r\n * }, { childList: true });\r\n * ```\r\n */\r\nexport function useMutationObserver<T extends HTMLElement>(\r\n ref: RefObject<T | null>,\r\n callback: MutationCallback,\r\n options: UseMutationObserverOptions = {\r\n attributes: true,\r\n characterData: true,\r\n childList: true,\r\n subtree: true,\r\n }\r\n): void {\r\n const callbackRef = useRef(callback);\r\n callbackRef.current = callback;\r\n\r\n const optionsRef = useRef(options);\r\n optionsRef.current = options; // Note: You might want deep comparison here if options object is unstable\r\n\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n const element = ref.current;\r\n if (!element) return;\r\n\r\n if (!window.MutationObserver) {\r\n console.warn('MutationObserver is not supported');\r\n return;\r\n }\r\n\r\n const observer = new MutationObserver((mutations, obs) => {\r\n callbackRef.current(mutations, obs);\r\n });\r\n\r\n observer.observe(element, optionsRef.current);\r\n\r\n return () => {\r\n observer.disconnect();\r\n };\r\n }, [ref]);\r\n}\r\n\r\nexport default useMutationObserver;\r\n","import { useEffect } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\n/**\r\n * usePageLeave\r\n *\r\n * It triggers a callback when the mouse leaves the page (e.g. intent to close tab).\r\n *\r\n * @param onPageLeave - Callback function\r\n *\r\n * @example\r\n * ```tsx\r\n * usePageLeave(() => {\r\n * console.log('User is leaving!');\r\n * });\r\n * ```\r\n */\r\nexport function usePageLeave(onPageLeave: () => void): void {\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n const handler = (event: MouseEvent) => {\r\n event = event || window.event;\r\n // @ts-ignore\r\n const from = event.relatedTarget || event.toElement;\r\n if (!from || (from as any).nodeName === 'HTML') {\r\n // Technically this checks if we left the window\r\n // But better check is checking clientY <= 0 usually for \"Top\" exit\r\n // Or checking generic mouseout on document\r\n if (event.clientY <= 0) {\r\n onPageLeave();\r\n }\r\n }\r\n };\r\n\r\n // A simpler way often used for \"Exit Intent\" is checking specific bounds\r\n const simpleHandler = (event: MouseEvent) => {\r\n if (event.clientY <= 0) {\r\n onPageLeave();\r\n }\r\n };\r\n\r\n document.addEventListener('mouseleave', simpleHandler);\r\n\r\n return () => {\r\n document.removeEventListener('mouseleave', simpleHandler);\r\n };\r\n }, [onPageLeave]);\r\n}\r\n\r\nexport default usePageLeave;\r\n","import { useCallback } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface EyeDropperOpenOptions {\r\n signal?: AbortSignal;\r\n}\r\n\r\nexport interface UseEyeDropperReturn {\r\n isSupported: boolean;\r\n open: (options?: EyeDropperOpenOptions) => Promise<{ sRGBHex: string } | undefined>;\r\n}\r\n\r\n/**\r\n * useEyeDropper\r\n *\r\n * A hook for using the EyeDropper API to sample colors from the screen.\r\n *\r\n * @returns Object with support status and open function\r\n *\r\n * @example\r\n * ```tsx\r\n * const { open, isSupported } = useEyeDropper();\r\n *\r\n * const pickColor = async () => {\r\n * try {\r\n * const color = await open();\r\n * console.log(color?.sRGBHex);\r\n * } catch (e) {\r\n * console.error(e);\r\n * }\r\n * };\r\n * ```\r\n */\r\nexport function useEyeDropper(): UseEyeDropperReturn {\r\n const isSupported = !isServer && 'EyeDropper' in window;\r\n\r\n const open = useCallback(async (options?: EyeDropperOpenOptions) => {\r\n if (!isSupported) {\r\n throw new Error('EyeDropper is not supported');\r\n }\r\n\r\n const eyeDropper = new (window as any).EyeDropper();\r\n return eyeDropper.open(options);\r\n }, [isSupported]);\r\n\r\n return {\r\n isSupported,\r\n open,\r\n };\r\n}\r\n\r\nexport default useEyeDropper;\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseOnlineReturn {\r\n /** Whether the browser is online */\r\n isOnline: boolean;\r\n /** Whether the browser is offline */\r\n isOffline: boolean;\r\n /** Time since last status change (in ms) */\r\n since: number | null;\r\n}\r\n\r\n/**\r\n * useOnline\r\n *\r\n * A hook that tracks the browser's online/offline status.\r\n *\r\n * @returns Object with online status\r\n *\r\n * @example\r\n * ```tsx\r\n * const { isOnline, isOffline } = useOnline();\r\n *\r\n * return (\r\n * <div>\r\n * {isOnline ? '🟢 Online' : '🔴 Offline'}\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useOnline(): UseOnlineReturn {\r\n const [isOnline, setIsOnline] = useState<boolean>(() => {\r\n if (isServer) return true;\r\n return navigator.onLine;\r\n });\r\n\r\n const [since, setSince] = useState<number | null>(null);\r\n\r\n const handleOnline = useCallback(() => {\r\n setIsOnline(true);\r\n setSince(Date.now());\r\n }, []);\r\n\r\n const handleOffline = useCallback(() => {\r\n setIsOnline(false);\r\n setSince(Date.now());\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n // Set initial state\r\n setIsOnline(navigator.onLine);\r\n\r\n window.addEventListener('online', handleOnline);\r\n window.addEventListener('offline', handleOffline);\r\n\r\n return () => {\r\n window.removeEventListener('online', handleOnline);\r\n window.removeEventListener('offline', handleOffline);\r\n };\r\n }, [handleOnline, handleOffline]);\r\n\r\n return {\r\n isOnline,\r\n isOffline: !isOnline,\r\n since,\r\n };\r\n}\r\n\r\nexport default useOnline;\r\n","import { useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface NetworkState {\r\n online: boolean;\r\n downlink?: number;\r\n downlinkMax?: number;\r\n effectiveType?: 'slow-2g' | '2g' | '3g' | '4g';\r\n rtt?: number;\r\n saveData?: boolean;\r\n type?: 'bluetooth' | 'cellular' | 'ethernet' | 'none' | 'wifi' | 'wimax' | 'other' | 'unknown';\r\n}\r\n\r\n/**\r\n * useNetworkState\r\n *\r\n * A hook that tracks detailed network connection information.\r\n * Note: Browser support varies for Navigator.connection.\r\n */\r\nexport function useNetworkState(): NetworkState {\r\n const [state, setState] = useState<NetworkState>({\r\n online: true,\r\n });\r\n\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n const nav = navigator as any;\r\n const connection = nav.connection || nav.mozConnection || nav.webkitConnection;\r\n\r\n const updateState = () => {\r\n setState({\r\n online: navigator.onLine,\r\n downlink: connection?.downlink,\r\n downlinkMax: connection?.downlinkMax,\r\n effectiveType: connection?.effectiveType,\r\n rtt: connection?.rtt,\r\n saveData: connection?.saveData,\r\n type: connection?.type,\r\n });\r\n };\r\n\r\n updateState();\r\n\r\n window.addEventListener('online', updateState);\r\n window.addEventListener('offline', updateState);\r\n\r\n if (connection) {\r\n connection.addEventListener('change', updateState);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('online', updateState);\r\n window.removeEventListener('offline', updateState);\r\n if (connection) {\r\n connection.removeEventListener('change', updateState);\r\n }\r\n };\r\n }, []);\r\n\r\n return state;\r\n}\r\n\r\nexport default useNetworkState;\r\n","import { RefObject, useCallback, useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseFullscreenReturn {\r\n /** Whether fullscreen is active */\r\n isFullscreen: boolean;\r\n /** Whether fullscreen is supported */\r\n isSupported: boolean;\r\n /** Enter fullscreen mode */\r\n enter: () => Promise<void>;\r\n /** Exit fullscreen mode */\r\n exit: () => Promise<void>;\r\n /** Toggle fullscreen mode */\r\n toggle: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * useFullscreen\r\n *\r\n * A hook for controlling the Fullscreen API.\r\n *\r\n * @param ref - Optional ref to element to make fullscreen (defaults to document.documentElement)\r\n * @returns Object with fullscreen state and controls\r\n *\r\n * @example\r\n * ```tsx\r\n * // Fullscreen the whole document\r\n * const { isFullscreen, toggle, isSupported } = useFullscreen();\r\n *\r\n * // Fullscreen a specific element\r\n * const videoRef = useRef<HTMLVideoElement>(null);\r\n * const { isFullscreen, enter, exit } = useFullscreen(videoRef);\r\n *\r\n * return (\r\n * <div>\r\n * <video ref={videoRef} />\r\n * <button onClick={toggle} disabled={!isSupported}>\r\n * {isFullscreen ? 'Exit' : 'Enter'} Fullscreen\r\n * </button>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useFullscreen<T extends HTMLElement = HTMLElement>(\r\n ref?: RefObject<T | null>\r\n): UseFullscreenReturn {\r\n const [isFullscreen, setIsFullscreen] = useState(false);\r\n\r\n const isSupported = !isServer && !!document.fullscreenEnabled;\r\n\r\n const getElement = useCallback((): HTMLElement => {\r\n return ref?.current ?? document.documentElement;\r\n }, [ref]);\r\n\r\n const enter = useCallback(async (): Promise<void> => {\r\n if (isServer || !isSupported) return;\r\n\r\n const element = getElement();\r\n if (!element) return;\r\n\r\n try {\r\n await element.requestFullscreen();\r\n } catch (error) {\r\n console.error('Failed to enter fullscreen:', error);\r\n }\r\n }, [isSupported, getElement]);\r\n\r\n const exit = useCallback(async (): Promise<void> => {\r\n if (isServer || !isSupported) return;\r\n\r\n try {\r\n await document.exitFullscreen();\r\n } catch (error) {\r\n console.error('Failed to exit fullscreen:', error);\r\n }\r\n }, [isSupported]);\r\n\r\n const toggle = useCallback(async (): Promise<void> => {\r\n if (isFullscreen) {\r\n await exit();\r\n } else {\r\n await enter();\r\n }\r\n }, [isFullscreen, enter, exit]);\r\n\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n const handleChange = (): void => {\r\n setIsFullscreen(!!document.fullscreenElement);\r\n };\r\n\r\n document.addEventListener('fullscreenchange', handleChange);\r\n\r\n return () => {\r\n document.removeEventListener('fullscreenchange', handleChange);\r\n };\r\n }, []);\r\n\r\n return {\r\n isFullscreen,\r\n isSupported,\r\n enter,\r\n exit,\r\n toggle,\r\n };\r\n}\r\n\r\nexport default useFullscreen;\r\n","import { useCallback, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface ShareData {\r\n /** Title of the shared content */\r\n title?: string;\r\n /** Text/description of the shared content */\r\n text?: string;\r\n /** URL to share */\r\n url?: string;\r\n}\r\n\r\nexport interface UseShareReturn {\r\n /** Whether Web Share API is supported */\r\n isSupported: boolean;\r\n /** Whether a share is currently in progress */\r\n isSharing: boolean;\r\n /** Whether share was successful */\r\n isSuccess: boolean;\r\n /** Any error that occurred */\r\n error: Error | null;\r\n /** Share data */\r\n share: (data: ShareData) => Promise<boolean>;\r\n /** Check if specific data can be shared */\r\n canShare: (data?: ShareData) => boolean;\r\n}\r\n\r\n/**\r\n * useShare\r\n *\r\n * A hook for using the Web Share API.\r\n *\r\n * @returns Object with share function and state\r\n *\r\n * @example\r\n * ```tsx\r\n * const { share, isSupported, isSharing } = useShare();\r\n *\r\n * const handleShare = async () => {\r\n * const success = await share({\r\n * title: 'Check this out!',\r\n * text: 'A very interesting article',\r\n * url: window.location.href,\r\n * });\r\n *\r\n * if (success) {\r\n * console.log('Shared successfully!');\r\n * }\r\n * };\r\n *\r\n * if (!isSupported) {\r\n * return <CopyLinkButton />;\r\n * }\r\n *\r\n * return (\r\n * <button onClick={handleShare} disabled={isSharing}>\r\n * {isSharing ? 'Sharing...' : 'Share'}\r\n * </button>\r\n * );\r\n * ```\r\n */\r\nexport function useShare(): UseShareReturn {\r\n const [isSharing, setIsSharing] = useState(false);\r\n const [isSuccess, setIsSuccess] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const isSupported = !isServer && !!navigator.share;\r\n\r\n const canShare = useCallback(\r\n (data?: ShareData): boolean => {\r\n if (isServer || !navigator.canShare) return isSupported;\r\n if (!data) return isSupported;\r\n return navigator.canShare(data);\r\n },\r\n [isSupported]\r\n );\r\n\r\n const share = useCallback(\r\n async (data: ShareData): Promise<boolean> => {\r\n if (isServer || !isSupported) {\r\n setError(new Error('Web Share API is not supported'));\r\n return false;\r\n }\r\n\r\n setIsSharing(true);\r\n setIsSuccess(false);\r\n setError(null);\r\n\r\n try {\r\n await navigator.share(data);\r\n setIsSuccess(true);\r\n return true;\r\n } catch (err) {\r\n // User cancelled is not an error\r\n if (err instanceof Error && err.name === 'AbortError') {\r\n setIsSuccess(false);\r\n return false;\r\n }\r\n\r\n const error = err instanceof Error ? err : new Error('Share failed');\r\n setError(error);\r\n return false;\r\n } finally {\r\n setIsSharing(false);\r\n }\r\n },\r\n [isSupported]\r\n );\r\n\r\n return {\r\n isSupported,\r\n isSharing,\r\n isSuccess,\r\n error,\r\n share,\r\n canShare,\r\n };\r\n}\r\n\r\nexport default useShare;\r\n","import { useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport type PermissionName =\r\n | 'geolocation'\r\n | 'notifications'\r\n | 'push'\r\n | 'midi'\r\n | 'camera'\r\n | 'microphone'\r\n | 'speaker-selection'\r\n | 'device-info'\r\n | 'background-fetch'\r\n | 'background-sync'\r\n | 'bluetooth'\r\n | 'persistent-storage'\r\n | 'ambient-light-sensor'\r\n | 'accelerometer'\r\n | 'gyroscope'\r\n | 'magnetometer'\r\n | 'clipboard-read'\r\n | 'clipboard-write'\r\n | 'display-capture'\r\n | 'nfc';\r\n\r\nexport type PermissionState = 'granted' | 'denied' | 'prompt' | 'unknown';\r\n\r\n/**\r\n * usePermissions\r\n *\r\n * A hook to query and track permission status for browser APIs.\r\n *\r\n * @param name - The name of the permission to query\r\n * @returns The current state of the permission\r\n *\r\n * @example\r\n * ```tsx\r\n * const status = usePermissions('geolocation');\r\n *\r\n * return <div>Location permission: {status}</div>;\r\n * ```\r\n */\r\nexport function usePermissions(name: PermissionName | string): PermissionState {\r\n const [state, setState] = useState<PermissionState>('unknown');\r\n\r\n useEffect(() => {\r\n if (isServer || !navigator.permissions) return;\r\n\r\n let mounted = true;\r\n let permissionStatus: PermissionStatus | null = null;\r\n\r\n const handleChange = () => {\r\n if (mounted && permissionStatus) {\r\n setState(permissionStatus.state as PermissionState);\r\n }\r\n };\r\n\r\n navigator.permissions\r\n .query({ name: name as any })\r\n .then((status) => {\r\n if (!mounted) return;\r\n\r\n permissionStatus = status;\r\n setState(permissionStatus.state as PermissionState);\r\n\r\n status.addEventListener('change', handleChange);\r\n })\r\n .catch(() => {\r\n if (mounted) setState('unknown');\r\n });\r\n\r\n return () => {\r\n mounted = false;\r\n if (permissionStatus) {\r\n permissionStatus.removeEventListener('change', handleChange);\r\n }\r\n };\r\n }, [name]);\r\n\r\n return state;\r\n}\r\n\r\nexport default usePermissions;\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseWakeLockReturn {\r\n isSupported: boolean;\r\n released: boolean;\r\n request: () => Promise<void>;\r\n release: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * useWakeLock\r\n *\r\n * A hook to prevent the device screen from dimming/sleeping.\r\n *\r\n * @param onRequest - Callback when lock is acquired\r\n * @param onRelease - Callback when lock is released\r\n * @returns Object with lock status and controls\r\n */\r\nexport function useWakeLock({\r\n onRequest,\r\n onRelease,\r\n onError,\r\n}: {\r\n onRequest?: () => void;\r\n onRelease?: () => void;\r\n onError?: (err: Error) => void;\r\n} = {}): UseWakeLockReturn {\r\n const [released, setReleased] = useState<boolean | undefined>();\r\n const wakeLockRef = useRef<WakeLockSentinel | null>(null);\r\n\r\n const isSupported = !isServer && 'wakeLock' in navigator;\r\n\r\n const release = useCallback(async () => {\r\n if (!wakeLockRef.current) return;\r\n\r\n try {\r\n await wakeLockRef.current.release();\r\n wakeLockRef.current = null;\r\n } catch (err) {\r\n onError?.(err instanceof Error ? err : new Error(String(err)));\r\n }\r\n }, [onError]);\r\n\r\n const request = useCallback(async () => {\r\n if (!isSupported) return;\r\n\r\n try {\r\n const wakeLock = await navigator.wakeLock.request('screen');\r\n\r\n wakeLock.addEventListener('release', () => {\r\n setReleased(true);\r\n onRelease?.();\r\n wakeLockRef.current = null;\r\n });\r\n\r\n wakeLockRef.current = wakeLock;\r\n setReleased(false);\r\n onRequest?.();\r\n } catch (err) {\r\n onError?.(err instanceof Error ? err : new Error(String(err)));\r\n }\r\n }, [isSupported, onRequest, onRelease, onError]);\r\n\r\n // Cleanup\r\n useEffect(() => {\r\n return () => {\r\n release();\r\n };\r\n }, [release]);\r\n\r\n // Handle visibility change (re-acquire lock if tab becomes visible again)\r\n useEffect(() => {\r\n const handleVisibilityChange = async () => {\r\n if (wakeLockRef.current !== null && document.visibilityState === 'visible') {\r\n // According to spec, wake lock is released when document loses visibility\r\n // We might want to re-acquire it.\r\n // But the 'release' event would have fired.\r\n // So we need to track if we *intended* to have it locked.\r\n // Leaving this as basic implementation for now.\r\n // Users can call request() again in onRelease if checking visibility.\r\n }\r\n };\r\n\r\n document.addEventListener('visibilitychange', handleVisibilityChange);\r\n return () => {\r\n document.removeEventListener('visibilitychange', handleVisibilityChange);\r\n };\r\n }, []);\r\n\r\n return {\r\n isSupported,\r\n released: released ?? true, // Default to true (released) initially\r\n request,\r\n release,\r\n };\r\n}\r\n\r\nexport default useWakeLock;\r\n","import { useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\nimport useStableCallback from '../useStableCallback';\r\n\r\nexport interface UseMediaDevicesReturn {\r\n devices: MediaDeviceInfo[];\r\n isLoading: boolean;\r\n error: Error | null;\r\n isSupported: boolean;\r\n}\r\n\r\n/**\r\n * useMediaDevices\r\n *\r\n * A hook to list and track connected hardware (cameras, microphones, speakers).\r\n * Automatically updates when devices are plugged in or removed.\r\n *\r\n * @returns Object with devices list, loading state, and support status\r\n *\r\n * @example\r\n * ```tsx\r\n * const { devices, isLoading, error, isSupported } = useMediaDevices();\r\n *\r\n * if (!isSupported) return <p>Media Devices API not supported</p>;\r\n * if (isLoading) return <p>Scanning hardware...</p>;\r\n *\r\n * const cameras = devices.filter(d => d.kind === 'videoinput');\r\n * const mics = devices.filter(d => d.kind === 'audioinput');\r\n *\r\n * return (\r\n * <div className=\"device-manager\">\r\n * <h3>Cameras ({cameras.length})</h3>\r\n * <ul>\r\n * {cameras.map(c => <li key={c.deviceId}>{c.label || 'Unknown Camera'}</li>)}\r\n * </ul>\r\n *\r\n * <h3>Microphones ({mics.length})</h3>\r\n * <ul>\r\n * {mics.map(m => <li key={m.deviceId}>{m.label || 'Unknown Mic'}</li>)}\r\n * </ul>\r\n *\r\n * {error && <p className=\"error\">{error.message}</p>}\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useMediaDevices(): UseMediaDevicesReturn {\r\n const [devices, setDevices] = useState<MediaDeviceInfo[]>([]);\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const isSupported = !isServer && !!navigator.mediaDevices?.enumerateDevices;\r\n\r\n const getDevices = useStableCallback(async () => {\r\n if (!isSupported) {\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const allDevices = await navigator.mediaDevices.enumerateDevices();\r\n setDevices(allDevices);\r\n setError(null);\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error(String(err)));\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n getDevices();\r\n\r\n if (isSupported) {\r\n // Handle device changes\r\n navigator.mediaDevices.addEventListener('devicechange', getDevices);\r\n return () => {\r\n navigator.mediaDevices.removeEventListener('devicechange', getDevices);\r\n };\r\n }\r\n }, [getDevices, isSupported]);\r\n\r\n return {\r\n devices,\r\n isLoading,\r\n error,\r\n isSupported,\r\n };\r\n}\r\n\r\nexport default useMediaDevices;\r\n","import { useCallback, useRef, useState } from 'react';\r\n\r\nexport type RecorderStatus = 'idle' | 'recording' | 'paused' | 'stopped';\r\n\r\nexport interface LinkProps {\r\n href: string;\r\n download: string;\r\n}\r\n\r\nexport interface UseMediaRecorderReturn {\r\n status: RecorderStatus;\r\n start: (timeSlice?: number) => void;\r\n stop: () => void;\r\n pause: () => void;\r\n resume: () => void;\r\n isRecording: boolean;\r\n mediaBlob: Blob | undefined;\r\n mediaUrl: string | undefined;\r\n clear: () => void;\r\n error: Error | null;\r\n}\r\n\r\n/**\r\n * useMediaRecorder\r\n *\r\n * A hook to record media (audio/video) from a MediaStream.\r\n * Returns a Blob and URL for the recording.\r\n *\r\n * @param stream - The MediaStream to record (from useMediaDevices)\r\n * @param options - MediaRecorder options (mimeType, bitsPerSecond)\r\n * @returns Object with recording controls and data\r\n *\r\n * @example\r\n * ```tsx\r\n * const [stream, setStream] = useState<MediaStream | null>(null);\r\n * const {\r\n * status,\r\n * start,\r\n * stop,\r\n * mediaUrl,\r\n * clear\r\n * } = useMediaRecorder(stream);\r\n *\r\n * // Setup camera (simplified)\r\n * useEffect(() => {\r\n * navigator.mediaDevices.getUserMedia({ video: true, audio: true })\r\n * .then(setStream);\r\n * }, []);\r\n *\r\n * return (\r\n * <div>\r\n * <video\r\n * ref={v => v && (v.srcObject = stream)}\r\n * autoPlay muted\r\n * width={300}\r\n * />\r\n *\r\n * <div className=\"controls\">\r\n * <button onClick={() => start()}>Record</button>\r\n * <button onClick={stop} disabled={status !== 'recording'}>Stop</button>\r\n * </div>\r\n *\r\n * {mediaUrl && (\r\n * <div className=\"preview\">\r\n * <h3>Recorded Video</h3>\r\n * <video src={mediaUrl} controls width={300} />\r\n * <a href={mediaUrl} download=\"recording.webm\">Download</a>\r\n * <button onClick={clear}>Clear</button>\r\n * </div>\r\n * )}\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useMediaRecorder(\r\n stream: MediaStream | null,\r\n options?: MediaRecorderOptions\r\n): UseMediaRecorderReturn {\r\n const [status, setStatus] = useState<RecorderStatus>('idle');\r\n const [mediaBlob, setMediaBlob] = useState<Blob>();\r\n const [mediaUrl, setMediaUrl] = useState<string>();\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\r\n const chunksRef = useRef<Blob[]>([]);\r\n\r\n const start = useCallback(\r\n (timeSlice?: number) => {\r\n if (!stream) return;\r\n\r\n try {\r\n if (!mediaRecorderRef.current) {\r\n mediaRecorderRef.current = new MediaRecorder(stream, options);\r\n\r\n mediaRecorderRef.current.ondataavailable = (event) => {\r\n if (event.data && event.data.size > 0) {\r\n chunksRef.current.push(event.data);\r\n }\r\n };\r\n\r\n mediaRecorderRef.current.onerror = (event: any) => {\r\n setError(event.error);\r\n setStatus('idle');\r\n };\r\n\r\n mediaRecorderRef.current.onstop = () => {\r\n const blob = new Blob(chunksRef.current, { type: options?.mimeType || 'video/webm' });\r\n setMediaBlob(blob);\r\n const url = URL.createObjectURL(blob);\r\n setMediaUrl(url);\r\n chunksRef.current = [];\r\n setStatus('stopped');\r\n };\r\n }\r\n\r\n if (mediaRecorderRef.current.state !== 'recording') {\r\n mediaRecorderRef.current.start(timeSlice);\r\n setStatus('recording');\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error(String(err)));\r\n }\r\n },\r\n [stream, options]\r\n );\r\n\r\n const stop = useCallback(() => {\r\n if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {\r\n mediaRecorderRef.current.stop();\r\n // status updated in onstop\r\n }\r\n }, []);\r\n\r\n const pause = useCallback(() => {\r\n if (mediaRecorderRef.current && mediaRecorderRef.current.state === 'recording') {\r\n mediaRecorderRef.current.pause();\r\n setStatus('paused');\r\n }\r\n }, []);\r\n\r\n const resume = useCallback(() => {\r\n if (mediaRecorderRef.current && mediaRecorderRef.current.state === 'paused') {\r\n mediaRecorderRef.current.resume();\r\n setStatus('recording');\r\n }\r\n }, []);\r\n\r\n const clear = useCallback(() => {\r\n if (mediaUrl) {\r\n URL.revokeObjectURL(mediaUrl);\r\n }\r\n setMediaBlob(undefined);\r\n setMediaUrl(undefined);\r\n setError(null);\r\n setStatus('idle');\r\n }, [mediaUrl]);\r\n\r\n return {\r\n status,\r\n start,\r\n stop,\r\n pause,\r\n resume,\r\n isRecording: status === 'recording',\r\n mediaBlob,\r\n mediaUrl,\r\n clear,\r\n error,\r\n };\r\n}\r\n\r\nexport default useMediaRecorder;\r\n","import { useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface BatteryState {\r\n supported: boolean;\r\n loading: boolean;\r\n level: number; // 0.0 - 1.0\r\n charging: boolean;\r\n chargingTime: number;\r\n dischargingTime: number;\r\n}\r\n\r\n/**\r\n * useBattery\r\n *\r\n * A hook that tracks battery status.\r\n *\r\n * @returns Battery state object\r\n */\r\nexport function useBattery(): BatteryState {\r\n const [state, setState] = useState<BatteryState>({\r\n supported: false,\r\n loading: true,\r\n level: 1,\r\n charging: false,\r\n chargingTime: 0,\r\n dischargingTime: Infinity,\r\n });\r\n\r\n useEffect(() => {\r\n if (isServer || !('getBattery' in navigator)) {\r\n setState((s) => ({ ...s, loading: false, supported: false }));\r\n return;\r\n }\r\n\r\n let mounted = true;\r\n let battery: any = null;\r\n\r\n const handleChange = () => {\r\n if (!mounted || !battery) return;\r\n\r\n setState({\r\n supported: true,\r\n loading: false,\r\n level: battery.level,\r\n charging: battery.charging,\r\n chargingTime: battery.chargingTime,\r\n dischargingTime: battery.dischargingTime,\r\n });\r\n };\r\n\r\n (navigator as any).getBattery().then((bat: any) => {\r\n if (!mounted) return;\r\n battery = bat;\r\n handleChange();\r\n\r\n battery.addEventListener('levelchange', handleChange);\r\n battery.addEventListener('chargingchange', handleChange);\r\n battery.addEventListener('chargingtimechange', handleChange);\r\n battery.addEventListener('dischargingtimechange', handleChange);\r\n });\r\n\r\n return () => {\r\n mounted = false;\r\n if (battery) {\r\n battery.removeEventListener('levelchange', handleChange);\r\n battery.removeEventListener('chargingchange', handleChange);\r\n battery.removeEventListener('chargingtimechange', handleChange);\r\n battery.removeEventListener('dischargingtimechange', handleChange);\r\n }\r\n };\r\n }, []);\r\n\r\n return state;\r\n}\r\n\r\nexport default useBattery;\r\n","import { useCallback, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseBluetoothReturn {\r\n isSupported: boolean;\r\n isConnected: boolean;\r\n isConnecting: boolean;\r\n device: BluetoothDevice | null;\r\n server: BluetoothRemoteGATTServer | null;\r\n error: Error | null;\r\n requestDevice: (options?: RequestDeviceOptions) => Promise<void>;\r\n disconnect: () => void;\r\n}\r\n\r\n/**\r\n * useBluetooth\r\n *\r\n * A hook for connecting to Bluetooth Low Energy (BLE) devices.\r\n */\r\nexport function useBluetooth(): UseBluetoothReturn {\r\n const [device, setDevice] = useState<BluetoothDevice | null>(null);\r\n const [server, setServer] = useState<BluetoothRemoteGATTServer | null>(null);\r\n const [error, setError] = useState<Error | null>(null);\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n\r\n const isSupported = !isServer && 'bluetooth' in navigator;\r\n\r\n const disconnect = useCallback(() => {\r\n if (device && device.gatt?.connected) {\r\n device.gatt.disconnect();\r\n }\r\n setDevice(null);\r\n setServer(null);\r\n setIsConnecting(false);\r\n }, [device]);\r\n\r\n const requestDevice = useCallback(\r\n async (options?: RequestDeviceOptions) => {\r\n if (!isSupported) {\r\n setError(new Error('Bluetooth API not supported'));\r\n return;\r\n }\r\n\r\n setIsConnecting(true);\r\n setError(null);\r\n\r\n try {\r\n const device = await navigator.bluetooth.requestDevice(options || { acceptAllDevices: true });\r\n setDevice(device);\r\n\r\n device.addEventListener('gattserverdisconnected', () => {\r\n setServer(null);\r\n // Optionally auto-reconnect or clear device\r\n });\r\n\r\n if (device.gatt) {\r\n const server = await device.gatt.connect();\r\n setServer(server);\r\n }\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error(String(err)));\r\n } finally {\r\n setIsConnecting(false);\r\n }\r\n },\r\n [isSupported]\r\n );\r\n\r\n return {\r\n isSupported,\r\n isConnected: !!server?.connected,\r\n isConnecting,\r\n device,\r\n server,\r\n error,\r\n requestDevice,\r\n disconnect,\r\n };\r\n}\r\n\r\nexport default useBluetooth;\r\n","import { useEffect, useRef, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseGamepadOptions {\r\n /** Enable polling loop (default: true) */\r\n enabled?: boolean;\r\n}\r\n\r\n/**\r\n * useGamepad\r\n *\r\n * A hook that tracks connected gamepads and their state.\r\n * Uses requestAnimationFrame for polling input state.\r\n */\r\nexport function useGamepad(options: UseGamepadOptions = {}): { gamepads: (Gamepad | null)[] } {\r\n const { enabled = true } = options;\r\n const [gamepads, setGamepads] = useState<(Gamepad | null)[]>([]);\r\n const requestRef = useRef<number | null>(null);\r\n\r\n const scanGamepads = () => {\r\n if (isServer) return;\r\n const detectedGamepads = navigator.getGamepads ? navigator.getGamepads() : [];\r\n // Convert to array and clone to force state update if needed\r\n // Note: getGamepads returns GamepadList which is array-like\r\n const gamepadArray = Array.from(detectedGamepads);\r\n setGamepads(gamepadArray);\r\n };\r\n\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n window.addEventListener('gamepadconnected', scanGamepads);\r\n window.addEventListener('gamepaddisconnected', scanGamepads);\r\n\r\n return () => {\r\n window.removeEventListener('gamepadconnected', scanGamepads);\r\n window.removeEventListener('gamepaddisconnected', scanGamepads);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (isServer || !enabled) return;\r\n\r\n const tick = () => {\r\n scanGamepads();\r\n requestRef.current = requestAnimationFrame(tick);\r\n };\r\n\r\n requestRef.current = requestAnimationFrame(tick);\r\n\r\n return () => {\r\n if (requestRef.current) {\r\n cancelAnimationFrame(requestRef.current);\r\n }\r\n };\r\n }, [enabled]);\r\n\r\n return { gamepads };\r\n}\r\n\r\nexport default useGamepad;\r\n","import { useCallback, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseFileSystemReturn {\r\n isSupported: boolean;\r\n file: File | null;\r\n fileHandle: FileSystemFileHandle | null;\r\n openFile: (options?: OpenFilePickerOptions) => Promise<void>;\r\n saveFile: (data: BlobPart, options?: SaveFilePickerOptions) => Promise<void>;\r\n error: Error | null;\r\n}\r\n\r\n/**\r\n * useFileSystem\r\n *\r\n * A hook for the File System Access API.\r\n */\r\nexport function useFileSystem(): UseFileSystemReturn {\r\n const [file, setFile] = useState<File | null>(null);\r\n const [fileHandle, setFileHandle] = useState<FileSystemFileHandle | null>(null);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const isSupported = !isServer && 'showOpenFilePicker' in window;\r\n\r\n const openFile = useCallback(async (options?: OpenFilePickerOptions) => {\r\n if (!isSupported) {\r\n setError(new Error('File System Access API not supported'));\r\n return;\r\n }\r\n\r\n try {\r\n const handles = await window.showOpenFilePicker(options);\r\n const handle = handles[0];\r\n const file = await handle.getFile();\r\n\r\n setFileHandle(handle);\r\n setFile(file);\r\n setError(null);\r\n } catch (err) {\r\n if ((err as Error).name !== 'AbortError') {\r\n setError(err instanceof Error ? err : new Error(String(err)));\r\n }\r\n }\r\n }, [isSupported]);\r\n\r\n const saveFile = useCallback(async (data: BlobPart, options?: SaveFilePickerOptions) => {\r\n if (!isSupported) {\r\n setError(new Error('File System Access API not supported'));\r\n return;\r\n }\r\n\r\n try {\r\n const handle = await window.showSaveFilePicker(options);\r\n const writable = await handle.createWritable();\r\n await writable.write(data);\r\n await writable.close();\r\n\r\n setError(null);\r\n } catch (err) {\r\n if ((err as Error).name !== 'AbortError') {\r\n setError(err instanceof Error ? err : new Error(String(err)));\r\n }\r\n }\r\n }, [isSupported]);\r\n\r\n return {\r\n isSupported,\r\n file,\r\n fileHandle,\r\n openFile,\r\n saveFile,\r\n error,\r\n };\r\n}\r\n\r\nexport default useFileSystem;\r\n","import { useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface StorageEstimateState {\r\n quota: number | undefined;\r\n usage: number | undefined;\r\n supported: boolean;\r\n loading: boolean;\r\n}\r\n\r\n/**\r\n * useStorageEstimate\r\n *\r\n * A hook to estimate storage quota and usage.\r\n */\r\nexport function useStorageEstimate(): StorageEstimateState {\r\n const [estimate, setEstimate] = useState<StorageEstimateState>({\r\n quota: undefined,\r\n usage: undefined,\r\n supported: false,\r\n loading: true,\r\n });\r\n\r\n useEffect(() => {\r\n if (isServer || !navigator.storage?.estimate) {\r\n setEstimate((s) => ({ ...s, loading: false, supported: false }));\r\n return;\r\n }\r\n\r\n navigator.storage.estimate()\r\n .then(({ quota, usage }) => {\r\n setEstimate({\r\n quota,\r\n usage,\r\n supported: true,\r\n loading: false,\r\n });\r\n })\r\n .catch(() => {\r\n setEstimate((s) => ({ ...s, loading: false }));\r\n });\r\n }, []);\r\n\r\n return estimate;\r\n}\r\n\r\nexport default useStorageEstimate;\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport type AsyncStatus = 'idle' | 'pending' | 'success' | 'error';\r\n\r\nexport interface UseAsyncOptions<T> {\r\n /** Execute immediately on mount (default: false) */\r\n immediate?: boolean;\r\n /** Initial data value */\r\n initialData?: T;\r\n /** Callback on success */\r\n onSuccess?: (data: T) => void;\r\n /** Callback on error */\r\n onError?: (error: Error) => void;\r\n}\r\n\r\nexport interface UseAsyncReturn<T, Args extends unknown[]> {\r\n /** The async function execution result */\r\n data: T | undefined;\r\n /** Any error that occurred */\r\n error: Error | null;\r\n /** Current status */\r\n status: AsyncStatus;\r\n /** Whether currently loading */\r\n isLoading: boolean;\r\n /** Whether request was successful */\r\n isSuccess: boolean;\r\n /** Whether request errored */\r\n isError: boolean;\r\n /** Execute the async function */\r\n execute: (...args: Args) => Promise<T | undefined>;\r\n /** Reset to initial state */\r\n reset: () => void;\r\n}\r\n\r\n/**\r\n * useAsync\r\n *\r\n * A hook for managing async function state.\r\n *\r\n * @param asyncFunction - The async function to execute\r\n * @param options - Configuration options\r\n * @returns Object with async state and execute function\r\n *\r\n * @example\r\n * ```tsx\r\n * const fetchUser = async (id: number) => {\r\n * const response = await fetch(`/api/users/${id}`);\r\n * return response.json();\r\n * };\r\n *\r\n * const { data, isLoading, execute } = useAsync(fetchUser);\r\n *\r\n * return (\r\n * <div>\r\n * <button onClick={() => execute(1)}>Load User</button>\r\n * {isLoading && <Spinner />}\r\n * {data && <UserCard user={data} />}\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useAsync<T, Args extends unknown[] = []>(\r\n asyncFunction: (...args: Args) => Promise<T>,\r\n options: UseAsyncOptions<T> = {}\r\n): UseAsyncReturn<T, Args> {\r\n const { immediate = false, initialData, onSuccess, onError } = options;\r\n\r\n const [status, setStatus] = useState<AsyncStatus>('idle');\r\n const [data, setData] = useState<T | undefined>(initialData);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const isMountedRef = useRef(true);\r\n const asyncFunctionRef = useRef(asyncFunction);\r\n asyncFunctionRef.current = asyncFunction;\r\n\r\n const execute = useCallback(\r\n async (...args: Args): Promise<T | undefined> => {\r\n setStatus('pending');\r\n setError(null);\r\n\r\n try {\r\n const result = await asyncFunctionRef.current(...args);\r\n\r\n if (isMountedRef.current) {\r\n setData(result);\r\n setStatus('success');\r\n onSuccess?.(result);\r\n }\r\n\r\n return result;\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error(String(err));\r\n\r\n if (isMountedRef.current) {\r\n setError(error);\r\n setStatus('error');\r\n onError?.(error);\r\n }\r\n\r\n return undefined;\r\n }\r\n },\r\n [onSuccess, onError]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setStatus('idle');\r\n setData(initialData);\r\n setError(null);\r\n }, [initialData]);\r\n\r\n // Immediate execution\r\n useEffect(() => {\r\n if (immediate) {\r\n execute(...([] as unknown as Args));\r\n }\r\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // Track mounted state\r\n useEffect(() => {\r\n isMountedRef.current = true;\r\n return () => {\r\n isMountedRef.current = false;\r\n };\r\n }, []);\r\n\r\n return {\r\n data,\r\n error,\r\n status,\r\n isLoading: status === 'pending',\r\n isSuccess: status === 'success',\r\n isError: status === 'error',\r\n execute,\r\n reset,\r\n };\r\n}\r\n\r\nexport default useAsync;\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport type FetchStatus = 'idle' | 'loading' | 'success' | 'error';\r\n\r\nexport interface UseFetchOptions<T> extends Omit<RequestInit, 'signal'> {\r\n /** Execute immediately (default: true) */\r\n immediate?: boolean;\r\n /** Initial data value */\r\n initialData?: T;\r\n /** Transform response before setting data */\r\n transform?: (response: Response) => Promise<T>;\r\n /** Number of retry attempts (default: 0) */\r\n retries?: number;\r\n /** Retry delay in ms (default: 1000) */\r\n retryDelay?: number;\r\n /** Callback on success */\r\n onSuccess?: (data: T) => void;\r\n /** Callback on error */\r\n onError?: (error: Error) => void;\r\n /** Abort previous request (default: true) */\r\n abortPrevious?: boolean;\r\n}\r\n\r\nexport interface UseFetchReturn<T> {\r\n /** Fetched data */\r\n data: T | undefined;\r\n /** Error if any */\r\n error: Error | null;\r\n /** Current status */\r\n status: FetchStatus;\r\n /** Loading state */\r\n isLoading: boolean;\r\n /** Success state */\r\n isSuccess: boolean;\r\n /** Error state */\r\n isError: boolean;\r\n /** Refetch data */\r\n refetch: () => Promise<void>;\r\n /** Abort current request */\r\n abort: () => void;\r\n}\r\n\r\n/**\r\n * useFetch\r\n *\r\n * A powerful hook for data fetching with abort, retry, and race condition handling.\r\n *\r\n * @param url - URL to fetch\r\n * @param options - Fetch and hook options\r\n * @returns Object with data, status, and control functions\r\n *\r\n * @example\r\n * ```tsx\r\n * interface User { id: number; name: string; }\r\n *\r\n * const {\r\n * data,\r\n * isLoading,\r\n * error,\r\n * refetch,\r\n * abort\r\n * } = useFetch<User[]>('/api/users', {\r\n * retries: 3,\r\n * retryDelay: 2000,\r\n * immediate: true,\r\n * transform: async (res) => {\r\n * const json = await res.json();\r\n * return json.users; // Transform response structure\r\n * },\r\n * onSuccess: (data) => console.log('Fetched:', data.length),\r\n * onError: (err) => console.error('Failed:', err)\r\n * });\r\n *\r\n * if (isLoading) return <div>Loading... <button onClick={abort}>Cancel</button></div>;\r\n * if (error) return <ErrorDisplay message={error.message} onRetry={refetch} />;\r\n *\r\n * return (\r\n * <ul>\r\n * {data?.map(user => (\r\n * <li key={user.id}>{user.name}</li>\r\n * ))}\r\n * </ul>\r\n * );\r\n * ```\r\n */\r\nexport function useFetch<T = unknown>(\r\n url: string | null,\r\n options: UseFetchOptions<T> = {}\r\n): UseFetchReturn<T> {\r\n const {\r\n immediate = true,\r\n initialData,\r\n transform,\r\n retries = 0,\r\n retryDelay = 1000,\r\n onSuccess,\r\n onError,\r\n abortPrevious = true,\r\n ...fetchOptions\r\n } = options;\r\n\r\n const [data, setData] = useState<T | undefined>(initialData);\r\n const [error, setError] = useState<Error | null>(null);\r\n const [status, setStatus] = useState<FetchStatus>('idle');\r\n\r\n const abortControllerRef = useRef<AbortController | null>(null);\r\n const isMountedRef = useRef(true);\r\n const retryCountRef = useRef(0);\r\n\r\n const abort = useCallback(() => {\r\n abortControllerRef.current?.abort();\r\n }, []);\r\n\r\n const optionsRef = useRef(fetchOptions);\r\n optionsRef.current = fetchOptions;\r\n const onSuccessRef = useRef(onSuccess);\r\n onSuccessRef.current = onSuccess;\r\n const onErrorRef = useRef(onError);\r\n onErrorRef.current = onError;\r\n const transformRef = useRef(transform);\r\n transformRef.current = transform;\r\n\r\n const fetchData = useCallback(async (): Promise<void> => {\r\n if (!url) return;\r\n\r\n // Abort previous request if configured\r\n if (abortPrevious) {\r\n abort();\r\n }\r\n\r\n const controller = new AbortController();\r\n abortControllerRef.current = controller;\r\n\r\n setStatus('loading');\r\n setError(null);\r\n\r\n const attemptFetch = async (attempt: number): Promise<void> => {\r\n try {\r\n const response = await fetch(url, {\r\n ...optionsRef.current,\r\n signal: controller.signal,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const result = transformRef.current\r\n ? await transformRef.current(response)\r\n : await response.json();\r\n\r\n if (isMountedRef.current && !controller.signal.aborted) {\r\n setData(result);\r\n setStatus('success');\r\n setError(null);\r\n retryCountRef.current = 0;\r\n onSuccessRef.current?.(result);\r\n }\r\n } catch (err) {\r\n // Ignore abort errors\r\n if (err instanceof Error && err.name === 'AbortError') {\r\n return;\r\n }\r\n\r\n const error = err instanceof Error ? err : new Error(String(err));\r\n\r\n // Retry logic\r\n if (attempt < retries && isMountedRef.current) {\r\n retryCountRef.current = attempt + 1;\r\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\r\n if (!controller.signal.aborted) {\r\n return attemptFetch(attempt + 1);\r\n }\r\n }\r\n\r\n if (isMountedRef.current && !controller.signal.aborted) {\r\n setError(error);\r\n setStatus('error');\r\n retryCountRef.current = 0;\r\n onErrorRef.current?.(error);\r\n }\r\n }\r\n };\r\n\r\n await attemptFetch(0);\r\n }, [url, retries, retryDelay, abort, abortPrevious]);\r\n\r\n // Initial fetch\r\n useEffect(() => {\r\n if (immediate && url) {\r\n fetchData();\r\n }\r\n\r\n return () => {\r\n abort();\r\n };\r\n }, [url, immediate]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // Track mounted state\r\n useEffect(() => {\r\n isMountedRef.current = true;\r\n return () => {\r\n isMountedRef.current = false;\r\n };\r\n }, []);\r\n\r\n return {\r\n data,\r\n error,\r\n status,\r\n isLoading: status === 'loading',\r\n isSuccess: status === 'success',\r\n isError: status === 'error',\r\n refetch: fetchData,\r\n abort,\r\n };\r\n}\r\n\r\nexport default useFetch;\r\n","import { useEffect, useRef, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport type ScriptStatus = 'idle' | 'loading' | 'ready' | 'error';\r\n\r\nexport interface UseScriptOptions {\r\n /** Load script immediately (default: true) */\r\n immediate?: boolean;\r\n /** Remove script on unmount (default: false) */\r\n removeOnUnmount?: boolean;\r\n /** Script attributes */\r\n attributes?: Record<string, string>;\r\n}\r\n\r\nexport interface UseScriptReturn {\r\n /** Script loading status */\r\n status: ScriptStatus;\r\n /** Whether script is loading */\r\n isLoading: boolean;\r\n /** Whether script is ready */\r\n isReady: boolean;\r\n /** Whether script failed to load */\r\n isError: boolean;\r\n /** Load the script manually */\r\n load: () => void;\r\n}\r\n\r\n// Global cache for script status\r\nconst scriptCache = new Map<string, ScriptStatus>();\r\n\r\n/**\r\n * useScript\r\n *\r\n * A hook for dynamically loading external scripts.\r\n *\r\n * @param src - Script source URL\r\n * @param options - Configuration options\r\n * @returns Object with script status and controls\r\n *\r\n * @example\r\n * ```tsx\r\n * const { isReady, isLoading, isError } = useScript(\r\n * 'https://maps.googleapis.com/maps/api/js?key=YOUR_KEY'\r\n * );\r\n *\r\n * if (isLoading) return <LoadingSpinner />;\r\n * if (isError) return <ErrorMessage />;\r\n * if (isReady) return <GoogleMap />;\r\n * ```\r\n */\r\nexport function useScript(\r\n src: string,\r\n options: UseScriptOptions = {}\r\n): UseScriptReturn {\r\n const { immediate = true, removeOnUnmount = false, attributes = {} } = options;\r\n\r\n const [status, setStatus] = useState<ScriptStatus>(() => {\r\n if (isServer) return 'idle';\r\n\r\n // Check if script is already cached\r\n const cached = scriptCache.get(src);\r\n if (cached) return cached;\r\n\r\n // Check if script already exists in DOM\r\n const existingScript = document.querySelector(`script[src=\"${src}\"]`);\r\n if (existingScript) {\r\n return 'ready';\r\n }\r\n\r\n return 'idle';\r\n });\r\n\r\n const hasLoaded = useRef(false);\r\n\r\n const load = (): void => {\r\n if (isServer || hasLoaded.current) return;\r\n\r\n // Check cache again\r\n const cached = scriptCache.get(src);\r\n if (cached === 'ready') {\r\n setStatus('ready');\r\n return;\r\n }\r\n\r\n // Check if already in DOM\r\n const existingScript = document.querySelector(`script[src=\"${src}\"]`);\r\n if (existingScript) {\r\n setStatus('ready');\r\n scriptCache.set(src, 'ready');\r\n return;\r\n }\r\n\r\n hasLoaded.current = true;\r\n setStatus('loading');\r\n scriptCache.set(src, 'loading');\r\n\r\n const script = document.createElement('script');\r\n script.src = src;\r\n script.async = true;\r\n\r\n // Apply attributes\r\n Object.entries(attributes).forEach(([key, value]) => {\r\n script.setAttribute(key, value);\r\n });\r\n\r\n const handleLoad = (): void => {\r\n setStatus('ready');\r\n scriptCache.set(src, 'ready');\r\n };\r\n\r\n const handleError = (): void => {\r\n setStatus('error');\r\n scriptCache.set(src, 'error');\r\n script.remove();\r\n };\r\n\r\n script.addEventListener('load', handleLoad);\r\n script.addEventListener('error', handleError);\r\n\r\n document.body.appendChild(script);\r\n };\r\n\r\n useEffect(() => {\r\n if (immediate && status === 'idle') {\r\n load();\r\n }\r\n\r\n return () => {\r\n if (removeOnUnmount && !isServer) {\r\n const script = document.querySelector(`script[src=\"${src}\"]`);\r\n if (script) {\r\n script.remove();\r\n scriptCache.delete(src);\r\n }\r\n }\r\n };\r\n }, [src, immediate]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n return {\r\n status,\r\n isLoading: status === 'loading',\r\n isReady: status === 'ready',\r\n isError: status === 'error',\r\n load,\r\n };\r\n}\r\n\r\nexport default useScript;\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport type WorkerFunction<T, R> = (input: T) => R;\r\nexport type WorkerStatus = 'idle' | 'running' | 'error' | 'success';\r\n\r\nexport interface UseWorkerReturn<T, R> {\r\n result: R | undefined;\r\n error: Error | null;\r\n status: WorkerStatus;\r\n run: (input: T) => void;\r\n terminate: () => void;\r\n}\r\n\r\n/**\r\n * useWorker\r\n *\r\n * A hook to offload heavy computation to a Web Worker.\r\n *\r\n * @param workerScript - URL string or Function code to run in worker\r\n */\r\nexport function useWorker<T = any, R = any>(\r\n workerScript: string | WorkerFunction<T, R>\r\n): UseWorkerReturn<T, R> {\r\n const [result, setResult] = useState<R>();\r\n const [error, setError] = useState<Error | null>(null);\r\n const [status, setStatus] = useState<WorkerStatus>('idle');\r\n\r\n const workerRef = useRef<Worker | null>(null);\r\n const workerUrlRef = useRef<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (isServer) return;\r\n\r\n // Create worker\r\n const createWorker = () => {\r\n try {\r\n let worker: Worker;\r\n\r\n if (typeof workerScript === 'string') {\r\n // Assuming it's a URL\r\n worker = new Worker(workerScript);\r\n } else {\r\n // Function case: Create blob\r\n const code = `\r\n self.onmessage = function(e) {\r\n const result = (${workerScript.toString()})(e.data);\r\n self.postMessage(result);\r\n }\r\n `;\r\n const blob = new Blob([code], { type: 'application/javascript' });\r\n const url = URL.createObjectURL(blob);\r\n workerUrlRef.current = url;\r\n worker = new Worker(url);\r\n }\r\n\r\n worker.onmessage = (e) => {\r\n setResult(e.data);\r\n setStatus('success');\r\n };\r\n\r\n worker.onerror = (e) => {\r\n setError(new Error(e.message));\r\n setStatus('error');\r\n };\r\n\r\n workerRef.current = worker;\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error(String(err)));\r\n setStatus('error');\r\n }\r\n };\r\n\r\n createWorker();\r\n\r\n return () => {\r\n workerRef.current?.terminate();\r\n if (workerUrlRef.current) {\r\n URL.revokeObjectURL(workerUrlRef.current);\r\n }\r\n };\r\n }, [workerScript]); // Re-create if script changes\r\n\r\n const run = useCallback((input: T) => {\r\n if (workerRef.current) {\r\n setStatus('running');\r\n setError(null);\r\n workerRef.current.postMessage(input);\r\n }\r\n }, []);\r\n\r\n const terminate = useCallback(() => {\r\n workerRef.current?.terminate();\r\n setStatus('idle');\r\n }, []);\r\n\r\n return {\r\n result,\r\n error,\r\n status,\r\n run,\r\n terminate,\r\n };\r\n}\r\n\r\nexport default useWorker;\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport { isServer } from '../../utils';\r\n\r\nexport interface UseIndexedDBReturn<T> {\r\n value: T | undefined;\r\n set: (value: T) => Promise<void>;\r\n remove: () => Promise<void>;\r\n error: Error | null;\r\n isLoading: boolean;\r\n}\r\n\r\n/**\r\n * useIndexedDB\r\n *\r\n * A simple hook to persist data in IndexedDB.\r\n * Suitable for storing large objects/blobs that LocalStorage can't handle.\r\n */\r\nexport function useIndexedDB<T = any>(\r\n dbName: string,\r\n storeName: string,\r\n key: string\r\n): UseIndexedDBReturn<T> {\r\n const [value, setValue] = useState<T>();\r\n const [error, setError] = useState<Error | null>(null);\r\n const [isLoading, setIsLoading] = useState(true);\r\n\r\n const openDB = useCallback((): Promise<IDBDatabase> => {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(dbName, 1);\r\n\r\n request.onupgradeneeded = (event) => {\r\n const db = (event.target as IDBOpenDBRequest).result;\r\n if (!db.objectStoreNames.contains(storeName)) {\r\n db.createObjectStore(storeName);\r\n }\r\n };\r\n\r\n request.onsuccess = () => resolve(request.result);\r\n request.onerror = () => reject(request.error);\r\n });\r\n }, [dbName, storeName]);\r\n\r\n const load = useCallback(async () => {\r\n if (isServer) {\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const db = await openDB();\r\n const tx = db.transaction(storeName, 'readonly');\r\n const store = tx.objectStore(storeName);\r\n const request = store.get(key);\r\n\r\n request.onsuccess = () => {\r\n setValue(request.result);\r\n setIsLoading(false);\r\n };\r\n\r\n request.onerror = () => {\r\n throw request.error;\r\n };\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error(String(err)));\r\n setIsLoading(false);\r\n }\r\n }, [key, storeName, openDB]);\r\n\r\n useEffect(() => {\r\n load();\r\n }, [load]);\r\n\r\n const set = useCallback(async (newValue: T) => {\r\n try {\r\n const db = await openDB();\r\n const tx = db.transaction(storeName, 'readwrite');\r\n const store = tx.objectStore(storeName);\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n const req = store.put(newValue, key);\r\n req.onsuccess = () => {\r\n setValue(newValue);\r\n resolve();\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error(String(err)));\r\n throw err;\r\n }\r\n }, [openDB, storeName, key]);\r\n\r\n const remove = useCallback(async () => {\r\n try {\r\n const db = await openDB();\r\n const tx = db.transaction(storeName, 'readwrite');\r\n const store = tx.objectStore(storeName);\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n const req = store.delete(key);\r\n req.onsuccess = () => {\r\n setValue(undefined);\r\n resolve();\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n } catch (err) {\r\n setError(err instanceof Error ? err : new Error(String(err)));\r\n throw err;\r\n }\r\n }, [openDB, storeName, key]);\r\n\r\n return {\r\n value,\r\n set,\r\n remove,\r\n error,\r\n isLoading,\r\n };\r\n}\r\n\r\nexport default useIndexedDB;\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface UseHistoryOptions {\r\n /** Maximum history size (default: 100) */\r\n maxSize?: number;\r\n}\r\n\r\nexport interface UseHistoryReturn<T> {\r\n /** Current value */\r\n value: T;\r\n /** Set new value (adds to history) */\r\n set: (value: T | ((prev: T) => T)) => void;\r\n /** Undo to previous value */\r\n undo: () => void;\r\n /** Redo to next value */\r\n redo: () => void;\r\n /** Clear history and set new value */\r\n reset: (value: T) => void;\r\n /** Whether undo is available */\r\n canUndo: boolean;\r\n /** Whether redo is available */\r\n canRedo: boolean;\r\n /** History array (past values) */\r\n history: T[];\r\n /** Current position in history */\r\n position: number;\r\n /** Go to specific position in history */\r\n go: (position: number) => void;\r\n}\r\n\r\n/**\r\n * useHistory\r\n *\r\n * A hook for managing state with undo/redo functionality.\r\n *\r\n * @param initialValue - Initial state value\r\n * @param options - Configuration options\r\n * @returns Object with value, history controls, and state\r\n *\r\n * @example\r\n * ```tsx\r\n * const { value, set, undo, redo, canUndo, canRedo } = useHistory('');\r\n *\r\n * return (\r\n * <div>\r\n * <input value={value} onChange={(e) => set(e.target.value)} />\r\n * <button onClick={undo} disabled={!canUndo}>Undo</button>\r\n * <button onClick={redo} disabled={!canRedo}>Redo</button>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useHistory<T>(\r\n initialValue: T,\r\n options: UseHistoryOptions = {}\r\n): UseHistoryReturn<T> {\r\n const { maxSize = 100 } = options;\r\n\r\n const [state, setState] = useState<{ history: T[]; position: number }>({\r\n history: [initialValue],\r\n position: 0,\r\n });\r\n\r\n const { history, position } = state;\r\n const value = history[position];\r\n\r\n const set = useCallback(\r\n (newValue: T | ((prev: T) => T)) => {\r\n setState((currentState) => {\r\n const { history: currentHistory, position: currentPosition } = currentState;\r\n\r\n const resolvedValue =\r\n typeof newValue === 'function'\r\n ? (newValue as (prev: T) => T)(currentHistory[currentPosition])\r\n : newValue;\r\n\r\n // Remove any future history (after current position)\r\n const slicedHistory = currentHistory.slice(0, currentPosition + 1);\r\n\r\n // Add new value\r\n const newHistory = [...slicedHistory, resolvedValue];\r\n\r\n // Limit history size\r\n if (newHistory.length > maxSize) {\r\n const trimmedHistory = newHistory.slice(newHistory.length - maxSize);\r\n return {\r\n history: trimmedHistory,\r\n position: trimmedHistory.length - 1,\r\n };\r\n }\r\n\r\n return {\r\n history: newHistory,\r\n position: newHistory.length - 1,\r\n };\r\n });\r\n },\r\n [maxSize]\r\n );\r\n\r\n const undo = useCallback(() => {\r\n setState((prev) => ({\r\n ...prev,\r\n position: Math.max(0, prev.position - 1),\r\n }));\r\n }, []);\r\n\r\n const redo = useCallback(() => {\r\n setState((prev) => ({\r\n ...prev,\r\n position: Math.min(prev.history.length - 1, prev.position + 1),\r\n }));\r\n }, []);\r\n\r\n const reset = useCallback((value: T) => {\r\n setState({\r\n history: [value],\r\n position: 0,\r\n });\r\n }, []);\r\n\r\n const go = useCallback((newPosition: number) => {\r\n setState((prev) => {\r\n const maxPosition = prev.history.length - 1;\r\n return {\r\n ...prev,\r\n position: Math.max(0, Math.min(maxPosition, newPosition)),\r\n };\r\n });\r\n }, []);\r\n\r\n const canUndo = position > 0;\r\n const canRedo = position < history.length - 1;\r\n\r\n return {\r\n value,\r\n set,\r\n undo,\r\n redo,\r\n reset,\r\n canUndo,\r\n canRedo,\r\n history,\r\n position,\r\n go,\r\n };\r\n}\r\n\r\nexport default useHistory;\r\n","import { useCallback, useMemo, useState } from 'react';\r\n\r\nexport interface UseStepOptions {\r\n /** Initial step (default: 0) */\r\n initialStep?: number;\r\n /** Total number of steps */\r\n maxStep: number;\r\n}\r\n\r\nexport interface UseStepReturn {\r\n /** Current step (0-indexed) */\r\n currentStep: number;\r\n /** Current step (1-indexed for display) */\r\n step: number;\r\n /** Go to next step */\r\n next: () => void;\r\n /** Go to previous step */\r\n prev: () => void;\r\n /** Go to specific step */\r\n goTo: (step: number) => void;\r\n /** Reset to initial step */\r\n reset: () => void;\r\n /** Whether at first step */\r\n isFirst: boolean;\r\n /** Whether at last step */\r\n isLast: boolean;\r\n /** Progress percentage (0-100) */\r\n progress: number;\r\n /** Total number of steps */\r\n totalSteps: number;\r\n /** Whether a specific step is completed */\r\n isStepComplete: (step: number) => boolean;\r\n}\r\n\r\n/**\r\n * useStep\r\n *\r\n * A hook for managing wizard/stepper flow.\r\n *\r\n * @param options - Configuration options\r\n * @returns Object with step state and control functions\r\n *\r\n * @example\r\n * ```tsx\r\n * const steps = ['Personal Info', 'Address', 'Payment', 'Confirm'];\r\n *\r\n * const { currentStep, step, next, prev, isFirst, isLast, progress } = useStep({\r\n * maxStep: steps.length,\r\n * });\r\n *\r\n * return (\r\n * <div>\r\n * <ProgressBar value={progress} />\r\n * <h2>Step {step}: {steps[currentStep]}</h2>\r\n * {currentStep === 0 && <PersonalInfoForm />}\r\n * {currentStep === 1 && <AddressForm />}\r\n * {currentStep === 2 && <PaymentForm />}\r\n * {currentStep === 3 && <ConfirmForm />}\r\n * <div>\r\n * <button onClick={prev} disabled={isFirst}>Back</button>\r\n * <button onClick={next} disabled={isLast}>Next</button>\r\n * </div>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useStep(options: UseStepOptions): UseStepReturn {\r\n const { initialStep = 0, maxStep } = options;\r\n\r\n const [currentStep, setCurrentStep] = useState(() =>\r\n Math.max(0, Math.min(initialStep, maxStep - 1))\r\n );\r\n\r\n const next = useCallback(() => {\r\n setCurrentStep((prev) => Math.min(prev + 1, maxStep - 1));\r\n }, [maxStep]);\r\n\r\n const prev = useCallback(() => {\r\n setCurrentStep((prev) => Math.max(prev - 1, 0));\r\n }, []);\r\n\r\n const goTo = useCallback(\r\n (step: number) => {\r\n setCurrentStep(Math.max(0, Math.min(step, maxStep - 1)));\r\n },\r\n [maxStep]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setCurrentStep(Math.max(0, Math.min(initialStep, maxStep - 1)));\r\n }, [initialStep, maxStep]);\r\n\r\n const isStepComplete = useCallback(\r\n (step: number): boolean => {\r\n return step < currentStep;\r\n },\r\n [currentStep]\r\n );\r\n\r\n const isFirst = currentStep === 0;\r\n const isLast = currentStep === maxStep - 1;\r\n const progress = useMemo(\r\n () => ((currentStep + 1) / maxStep) * 100,\r\n [currentStep, maxStep]\r\n );\r\n\r\n return {\r\n currentStep,\r\n step: currentStep + 1,\r\n next,\r\n prev,\r\n goTo,\r\n reset,\r\n isFirst,\r\n isLast,\r\n progress,\r\n totalSteps: maxStep,\r\n isStepComplete,\r\n };\r\n}\r\n\r\nexport default useStep;\r\n","import { useCallback, useMemo, useState } from 'react';\r\n\r\nexport interface UsePaginationOptions {\r\n /** Total number of items */\r\n totalItems: number;\r\n /** Items per page (default: 10) */\r\n pageSize?: number;\r\n /** Initial page (1-indexed, default: 1) */\r\n initialPage?: number;\r\n /** Number of sibling pages to show (default: 1) */\r\n siblings?: number;\r\n}\r\n\r\nexport interface UsePaginationReturn {\r\n /** Current page (1-indexed) */\r\n page: number;\r\n /** Total number of pages */\r\n totalPages: number;\r\n /** Items per page */\r\n pageSize: number;\r\n /** Go to next page */\r\n next: () => void;\r\n /** Go to previous page */\r\n prev: () => void;\r\n /** Go to specific page */\r\n goTo: (page: number) => void;\r\n /** Go to first page */\r\n first: () => void;\r\n /** Go to last page */\r\n last: () => void;\r\n /** Whether at first page */\r\n isFirst: boolean;\r\n /** Whether at last page */\r\n isLast: boolean;\r\n /** Start index for current page (0-indexed) */\r\n startIndex: number;\r\n /** End index for current page (0-indexed, exclusive) */\r\n endIndex: number;\r\n /** Page range for pagination UI */\r\n range: (number | 'dots')[];\r\n /** Set page size */\r\n setPageSize: (size: number) => void;\r\n}\r\n\r\n/**\r\n * usePagination\r\n *\r\n * A hook for managing pagination state and logic.\r\n *\r\n * @param options - Configuration options\r\n * @returns Object with pagination state and controls\r\n *\r\n * @example\r\n * ```tsx\r\n * const { page, totalPages, next, prev, range, isFirst, isLast } = usePagination({\r\n * totalItems: 100,\r\n * pageSize: 10,\r\n * });\r\n *\r\n * return (\r\n * <div>\r\n * <button onClick={prev} disabled={isFirst}>Previous</button>\r\n *\r\n * {range.map((item, index) =>\r\n * item === 'dots' ? (\r\n * <span key={index}>...</span>\r\n * ) : (\r\n * <button\r\n * key={index}\r\n * onClick={() => goTo(item)}\r\n * className={item === page ? 'active' : ''}\r\n * >\r\n * {item}\r\n * </button>\r\n * )\r\n * )}\r\n *\r\n * <button onClick={next} disabled={isLast}>Next</button>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function usePagination(options: UsePaginationOptions): UsePaginationReturn {\r\n const {\r\n totalItems,\r\n pageSize: initialPageSize = 10,\r\n initialPage = 1,\r\n siblings = 1,\r\n } = options;\r\n\r\n const [page, setPage] = useState(() => Math.max(1, initialPage));\r\n const [pageSize, setPageSizeState] = useState(initialPageSize);\r\n\r\n const totalPages = useMemo(\r\n () => Math.max(1, Math.ceil(totalItems / pageSize)),\r\n [totalItems, pageSize]\r\n );\r\n\r\n // Ensure page is within bounds when totalPages changes\r\n const boundedPage = useMemo(\r\n () => Math.min(page, totalPages),\r\n [page, totalPages]\r\n );\r\n\r\n const next = useCallback(() => {\r\n setPage((prev) => Math.min(prev + 1, totalPages));\r\n }, [totalPages]);\r\n\r\n const prev = useCallback(() => {\r\n setPage((prev) => Math.max(prev - 1, 1));\r\n }, []);\r\n\r\n const goTo = useCallback(\r\n (newPage: number) => {\r\n setPage(Math.max(1, Math.min(newPage, totalPages)));\r\n },\r\n [totalPages]\r\n );\r\n\r\n const first = useCallback(() => {\r\n setPage(1);\r\n }, []);\r\n\r\n const last = useCallback(() => {\r\n setPage(totalPages);\r\n }, [totalPages]);\r\n\r\n const setPageSize = useCallback(\r\n (size: number) => {\r\n const newTotalPages = Math.max(1, Math.ceil(totalItems / size));\r\n setPageSizeState(size);\r\n // Reset to page 1 or adjust if current page would be out of bounds\r\n setPage((prev) => Math.min(prev, newTotalPages));\r\n },\r\n [totalItems]\r\n );\r\n\r\n const startIndex = (boundedPage - 1) * pageSize;\r\n const endIndex = Math.min(startIndex + pageSize, totalItems);\r\n\r\n // Generate page range\r\n const range = useMemo((): (number | 'dots')[] => {\r\n const totalPageNumbers = siblings * 2 + 5; // siblings + 5 (first, last, current, 2 dots)\r\n\r\n if (totalPageNumbers >= totalPages) {\r\n return Array.from({ length: totalPages }, (_, i) => i + 1);\r\n }\r\n\r\n const leftSiblingIndex = Math.max(boundedPage - siblings, 1);\r\n const rightSiblingIndex = Math.min(boundedPage + siblings, totalPages);\r\n\r\n const showLeftDots = leftSiblingIndex > 2;\r\n const showRightDots = rightSiblingIndex < totalPages - 1;\r\n\r\n if (!showLeftDots && showRightDots) {\r\n const leftItemCount = 3 + 2 * siblings;\r\n const leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1);\r\n return [...leftRange, 'dots', totalPages];\r\n }\r\n\r\n if (showLeftDots && !showRightDots) {\r\n const rightItemCount = 3 + 2 * siblings;\r\n const rightRange = Array.from(\r\n { length: rightItemCount },\r\n (_, i) => totalPages - rightItemCount + i + 1\r\n );\r\n return [1, 'dots', ...rightRange];\r\n }\r\n\r\n const middleRange = Array.from(\r\n { length: rightSiblingIndex - leftSiblingIndex + 1 },\r\n (_, i) => leftSiblingIndex + i\r\n );\r\n return [1, 'dots', ...middleRange, 'dots', totalPages];\r\n }, [boundedPage, totalPages, siblings]);\r\n\r\n return {\r\n page: boundedPage,\r\n totalPages,\r\n pageSize,\r\n next,\r\n prev,\r\n goTo,\r\n first,\r\n last,\r\n isFirst: boundedPage === 1,\r\n isLast: boundedPage === totalPages,\r\n startIndex,\r\n endIndex,\r\n range,\r\n setPageSize,\r\n };\r\n}\r\n\r\nexport default usePagination;\r\n","import { useReducer } from 'react';\r\n\r\nexport interface MachineState<S> {\r\n value: S;\r\n context?: any;\r\n}\r\n\r\nexport type MachineEvent<E> = E | { type: E; [key: string]: any };\r\n\r\nexport interface MachineConfig<S extends string, E extends string> {\r\n initial: S;\r\n states: {\r\n [key in S]: {\r\n on?: {\r\n [key in E]?: S | { target: S; action?: () => void };\r\n };\r\n effect?: () => (() => void) | void;\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * useMachine\r\n *\r\n * A lightweight state machine hook.\r\n */\r\nexport function useMachine<S extends string, E extends string>(\r\n config: MachineConfig<S, E>\r\n): [S, (event: E) => void] {\r\n const [state, dispatch] = useReducer(\r\n (currentState: S, event: E): S => {\r\n const stateConfig = config.states[currentState];\r\n const transition = stateConfig?.on?.[event];\r\n\r\n if (!transition) {\r\n return currentState;\r\n }\r\n\r\n if (typeof transition === 'string') {\r\n return transition as S;\r\n }\r\n\r\n // Handle object transition with action\r\n if (transition.action) {\r\n transition.action();\r\n }\r\n return transition.target;\r\n },\r\n config.initial\r\n );\r\n\r\n // Note: Side effects (entry/exit actions) are not fully implemented here for simplicity\r\n // But could be added with useEffect watching 'state'.\r\n\r\n return [state, dispatch];\r\n}\r\n\r\nexport default useMachine;\r\n","import { UIEvent, useCallback, useMemo, useState } from 'react';\r\n\r\nexport interface UseVirtualListOptions {\r\n /** Height of individual item */\r\n itemHeight: number;\r\n /** Total number of items */\r\n itemCount: number;\r\n /** Height of scrollable container (viewport) */\r\n containerHeight: number;\r\n /** Number of items to render outside viewport (buffer) */\r\n overscan?: number;\r\n}\r\n\r\nexport interface VirtualItem {\r\n index: number;\r\n style: {\r\n position: 'absolute';\r\n top: number;\r\n height: number;\r\n width: '100%';\r\n };\r\n}\r\n\r\nexport interface UseVirtualListReturn {\r\n items: VirtualItem[];\r\n totalHeight: number;\r\n onScroll: (event: UIEvent<HTMLElement>) => void;\r\n}\r\n\r\n/**\r\n * useVirtualList\r\n *\r\n * A hook for efficiently rendering large lists by only rendering visible items.\r\n * Assumes fixed height items.\r\n */\r\nexport function useVirtualList(options: UseVirtualListOptions): UseVirtualListReturn {\r\n const { itemHeight, itemCount, containerHeight, overscan = 3 } = options;\r\n\r\n const [scrollTop, setScrollTop] = useState(0);\r\n\r\n const totalHeight = itemCount * itemHeight;\r\n\r\n const onScroll = useCallback((event: UIEvent<HTMLElement>) => {\r\n setScrollTop(event.currentTarget.scrollTop);\r\n }, []);\r\n\r\n const items = useMemo(() => {\r\n const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan);\r\n const endIndex = Math.min(\r\n itemCount - 1,\r\n Math.floor((scrollTop + containerHeight) / itemHeight) + overscan\r\n );\r\n\r\n const virtualItems: VirtualItem[] = [];\r\n\r\n for (let i = startIndex; i <= endIndex; i++) {\r\n // cast style properties to correct type if needed, but here simple object is enough\r\n // We use 'as const' or explicit typing in interface\r\n virtualItems.push({\r\n index: i,\r\n style: {\r\n position: 'absolute',\r\n top: i * itemHeight,\r\n height: itemHeight,\r\n width: '100%',\r\n },\r\n });\r\n }\r\n\r\n return virtualItems;\r\n }, [scrollTop, itemHeight, itemCount, containerHeight, overscan]);\r\n\r\n return {\r\n items,\r\n totalHeight,\r\n onScroll,\r\n };\r\n}\r\n\r\nexport default useVirtualList;\r\n","import { MutableRefObject, useEffect, useRef } from 'react';\r\nimport useStableCallback from '../useStableCallback';\r\n\r\nexport interface UseInfiniteScrollOptions {\r\n /** Threshold for intersection (0.0 - 1.0) */\r\n threshold?: number;\r\n /** Root margin for intersection */\r\n rootMargin?: string;\r\n /** Whether loading is currently in progress */\r\n isLoading?: boolean;\r\n /** Whether there is more data to load */\r\n hasMore?: boolean;\r\n /** Disable the observer */\r\n disabled?: boolean;\r\n}\r\n\r\n/**\r\n * useInfiniteScroll\r\n *\r\n * A hook that triggers a callback when an element (target) becomes visible.\r\n * Useful for infinite scrolling.\r\n *\r\n * @param onLoadMore - Function to call when target is visible\r\n * @param options - Configuration options\r\n * @returns A ref to attach to the sentinel element (bottom of list)\r\n */\r\nexport function useInfiniteScroll(\r\n onLoadMore: () => void,\r\n options: UseInfiniteScrollOptions = {}\r\n): MutableRefObject<HTMLDivElement | null> {\r\n const {\r\n threshold = 0,\r\n rootMargin = '0px',\r\n isLoading = false,\r\n hasMore = true,\r\n disabled = false,\r\n } = options;\r\n\r\n const targetRef = useRef<HTMLDivElement | null>(null);\r\n const onLoadMoreStable = useStableCallback(onLoadMore);\r\n\r\n useEffect(() => {\r\n if (disabled || isLoading || !hasMore || !targetRef.current) return;\r\n\r\n const observer = new IntersectionObserver(\r\n (entries) => {\r\n const entry = entries[0];\r\n if (entry.isIntersecting) {\r\n onLoadMoreStable();\r\n }\r\n },\r\n { threshold, rootMargin }\r\n );\r\n\r\n observer.observe(targetRef.current);\r\n\r\n return () => {\r\n observer.disconnect();\r\n };\r\n }, [disabled, isLoading, hasMore, threshold, rootMargin, onLoadMoreStable]);\r\n\r\n return targetRef;\r\n}\r\n\r\nexport default useInfiniteScroll;\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface AnthropicMessage {\r\n role: 'user' | 'assistant';\r\n content: string;\r\n}\r\n\r\nexport interface UseAnthropicOptions {\r\n apiKey?: string;\r\n model?: string; // e.g., 'claude-3-opus-20240229'\r\n maxTokens?: number;\r\n temperature?: number;\r\n}\r\n\r\nexport function useAnthropic(options: UseAnthropicOptions = {}) {\r\n const {\r\n apiKey,\r\n model = 'claude-3-haiku-20240307',\r\n maxTokens = 1024,\r\n temperature = 0.7,\r\n } = options;\r\n\r\n const [loading, setLoading] = useState(false);\r\n const [response, setResponse] = useState<string | null>(null);\r\n const [error, setError] = useState<any>(null);\r\n\r\n const chat = useCallback(async (messages: AnthropicMessage[]) => {\r\n setLoading(true);\r\n setResponse(null);\r\n setError(null);\r\n\r\n try {\r\n const res = await fetch('https://api.anthropic.com/v1/messages', {\r\n method: 'POST',\r\n headers: {\r\n 'x-api-key': apiKey || '',\r\n 'anthropic-version': '2023-06-01',\r\n 'content-type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n model,\r\n messages,\r\n max_tokens: maxTokens,\r\n temperature,\r\n }),\r\n });\r\n\r\n if (!res.ok) {\r\n const err = await res.json();\r\n throw new Error(err.error?.message || 'Anthropic API Error');\r\n }\r\n\r\n const data = await res.json();\r\n const content = data.content?.[0]?.text || '';\r\n setResponse(content);\r\n return content;\r\n } catch (err) {\r\n setError(err);\r\n throw err;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [apiKey, model, maxTokens, temperature]);\r\n\r\n return { chat, response, loading, error };\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface UseEmbeddingsReturn {\r\n embeddings: number[][] | null;\r\n loading: boolean;\r\n error: any;\r\n generate: (texts: string[]) => Promise<number[][]>;\r\n}\r\n\r\n/**\r\n * useEmbeddings\r\n *\r\n * Generic hook to manage embedding generation.\r\n * The actual provider logic is passed via the `fetcher` callback.\r\n */\r\nexport function useEmbeddings(\r\n fetcher: (texts: string[]) => Promise<number[][]>\r\n): UseEmbeddingsReturn {\r\n const [embeddings, setEmbeddings] = useState<number[][] | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<any>(null);\r\n\r\n const generate = useCallback(async (texts: string[]) => {\r\n setLoading(true);\r\n setError(null);\r\n try {\r\n const result = await fetcher(texts);\r\n setEmbeddings(result);\r\n return result;\r\n } catch (err) {\r\n setError(err);\r\n throw err;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [fetcher]);\r\n\r\n return { embeddings, loading, error, generate };\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface GeminiPart {\r\n text: string;\r\n}\r\n\r\nexport interface GeminiContent {\r\n role: 'user' | 'model';\r\n parts: GeminiPart[];\r\n}\r\n\r\nexport interface UseGeminiOptions {\r\n apiKey?: string;\r\n model?: string; // e.g., 'gemini-pro'\r\n}\r\n\r\nexport function useGemini(options: UseGeminiOptions = {}) {\r\n const {\r\n apiKey,\r\n model = 'gemini-pro',\r\n } = options;\r\n\r\n const [loading, setLoading] = useState(false);\r\n const [response, setResponse] = useState<string | null>(null);\r\n const [error, setError] = useState<any>(null);\r\n\r\n const chat = useCallback(async (contents: GeminiContent[]) => {\r\n setLoading(true);\r\n setResponse(null);\r\n setError(null);\r\n\r\n try {\r\n const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${apiKey}`;\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({ contents }),\r\n });\r\n\r\n if (!res.ok) {\r\n const err = await res.json();\r\n throw new Error(err.error?.message || 'Gemini API Error');\r\n }\r\n\r\n const data = await res.json();\r\n const text = data.candidates?.[0]?.content?.parts?.[0]?.text || '';\r\n setResponse(text);\r\n return text;\r\n } catch (err) {\r\n setError(err);\r\n throw err;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [apiKey, model]);\r\n\r\n return { chat, response, loading, error };\r\n}\r\n","import { useCallback, useRef, useState } from 'react';\r\n\r\nexport interface UseLLMStreamOptions {\r\n onToken?: (token: string, fullText: string) => void;\r\n onComplete?: (fullText: string) => void;\r\n onError?: (error: any) => void;\r\n}\r\n\r\nexport interface UseLLMStreamReturn {\r\n stream: (url: string, fetchOptions?: RequestInit) => Promise<void>;\r\n cancel: () => void;\r\n data: string;\r\n loading: boolean;\r\n error: any;\r\n}\r\n\r\n/**\r\n * useLLMStream\r\n *\r\n * A hook for handling streaming responses (Server-Sent Events) from LLM APIs.\r\n * Simplifies the process of reading chunks and updating UI in real-time.\r\n *\r\n * @param options - Callbacks for token updates, completion, and errors\r\n * @returns Object with stream initiator, canceler, and current data\r\n *\r\n * @example\r\n * ```tsx\r\n * const { stream, data, loading, error } = useLLMStream({\r\n * onToken: (token) => console.log('Received token:', token),\r\n * onComplete: (fullText) => console.log('Stream finished:', fullText)\r\n * });\r\n *\r\n * const handleAsk = async (prompt: string) => {\r\n * await stream('/api/chat', {\r\n * method: 'POST',\r\n * body: JSON.stringify({ prompt }),\r\n * headers: { 'Content-Type': 'application/json' }\r\n * });\r\n * };\r\n *\r\n * return (\r\n * <div className=\"chat-box\">\r\n * <div className=\"response\">\r\n * {data || (loading ? 'Generating...' : 'Waiting for prompt...')}\r\n * </div>\r\n *\r\n * <button onClick={() => handleAsk('Write a React hook')}>\r\n * Ask AI\r\n * </button>\r\n *\r\n * {error && <div className=\"error\">{error.message}</div>}\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useLLMStream(options: UseLLMStreamOptions = {}): UseLLMStreamReturn {\r\n const [data, setData] = useState('');\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<any>(null);\r\n\r\n const abortControllerRef = useRef<AbortController | null>(null);\r\n\r\n const stream = useCallback(async (\r\n url: string,\r\n fetchOptions: RequestInit = {}\r\n ) => {\r\n try {\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort();\r\n }\r\n\r\n const controller = new AbortController();\r\n abortControllerRef.current = controller;\r\n\r\n setLoading(true);\r\n setError(null);\r\n setData('');\r\n\r\n const response = await fetch(url, {\r\n ...fetchOptions,\r\n signal: controller.signal,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP Error: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const reader = response.body?.getReader();\r\n const decoder = new TextDecoder();\r\n\r\n if (!reader) {\r\n throw new Error('Response body is not readable');\r\n }\r\n\r\n let accumulatedText = '';\r\n\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n const chunk = decoder.decode(value, { stream: true });\r\n // Naive clean up for SSE \"data: \" prefix if needed,\r\n // but this hook is generic. User might need to parse chunks.\r\n // For now we assume raw text or user parses in onToken if complex.\r\n // Actually, for generic use, we just return the chunk.\r\n\r\n accumulatedText += chunk;\r\n setData(prev => prev + chunk);\r\n options.onToken?.(chunk, accumulatedText);\r\n }\r\n\r\n options.onComplete?.(accumulatedText);\r\n\r\n } catch (err: any) {\r\n if (err.name === 'AbortError') return;\r\n setError(err);\r\n options.onError?.(err);\r\n } finally {\r\n setLoading(false);\r\n abortControllerRef.current = null;\r\n }\r\n }, [options]);\r\n\r\n const cancel = useCallback(() => {\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort();\r\n abortControllerRef.current = null;\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n return {\r\n stream,\r\n cancel,\r\n data,\r\n loading,\r\n error,\r\n };\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface Message {\r\n role: 'system' | 'user' | 'assistant';\r\n content: string;\r\n}\r\n\r\nexport interface UseOpenAIOptions {\r\n apiKey?: string;\r\n apiBase?: string; // e.g., for proxies\r\n model?: string;\r\n temperature?: number;\r\n stream?: boolean;\r\n}\r\n\r\nexport function useOpenAI(options: UseOpenAIOptions = {}) {\r\n const {\r\n apiKey,\r\n apiBase = 'https://api.openai.com/v1',\r\n model = 'gpt-3.5-turbo',\r\n temperature = 0.7,\r\n stream = false\r\n } = options;\r\n\r\n const [loading, setLoading] = useState(false);\r\n const [response, setResponse] = useState<string | null>(null);\r\n const [error, setError] = useState<any>(null);\r\n\r\n const chat = useCallback(async (messages: Message[]) => {\r\n setLoading(true);\r\n setResponse(null);\r\n setError(null);\r\n\r\n try {\r\n const res = await fetch(`${apiBase}/chat/completions`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${apiKey}`,\r\n },\r\n body: JSON.stringify({\r\n model,\r\n messages,\r\n temperature,\r\n stream: false // Streaming strictly not supported in this basic version, useLLMStream for that\r\n }),\r\n });\r\n\r\n if (!res.ok) {\r\n const err = await res.json();\r\n throw new Error(err.error?.message || 'OpenAI API Error');\r\n }\r\n\r\n const data = await res.json();\r\n const content = data.choices?.[0]?.message?.content || '';\r\n setResponse(content);\r\n return content;\r\n } catch (err) {\r\n setError(err);\r\n throw err;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [apiKey, apiBase, model, temperature]);\r\n\r\n return {\r\n chat,\r\n response,\r\n loading,\r\n error,\r\n };\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface RAGDocument {\r\n id: string;\r\n content: string;\r\n metadata?: Record<string, any>;\r\n}\r\n\r\nexport interface UseRAGOptions {\r\n retrieve: (query: string) => Promise<RAGDocument[]>;\r\n generate: (prompt: string, context: RAGDocument[]) => Promise<string>;\r\n}\r\n\r\nexport function useRAG(options: UseRAGOptions) {\r\n const [loading, setLoading] = useState(false);\r\n const [answer, setAnswer] = useState<string | null>(null);\r\n const [retrievedDocs, setRetrievedDocs] = useState<RAGDocument[]>([]);\r\n const [error, setError] = useState<any>(null);\r\n\r\n const ask = useCallback(async (query: string) => {\r\n setLoading(true);\r\n setError(null);\r\n setAnswer(null);\r\n setRetrievedDocs([]);\r\n\r\n try {\r\n // 1. Retrieve\r\n const docs = await options.retrieve(query);\r\n setRetrievedDocs(docs);\r\n\r\n // 2. Augment & Generate\r\n const contextPrompt = `\r\nContext documents:\r\n${docs.map(d => `- ${d.content}`).join('\\n')}\r\n\r\nQuery: ${query}\r\n`;\r\n const result = await options.generate(contextPrompt, docs);\r\n setAnswer(result);\r\n return result;\r\n } catch (err) {\r\n setError(err);\r\n throw err;\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [options]);\r\n\r\n return { ask, answer, retrievedDocs, loading, error };\r\n}\r\n","import { useMemo } from 'react';\r\n\r\nexport interface UseSearchHighlightOptions {\r\n highlightTag?: string;\r\n highlightClass?: string;\r\n caseSensitive?: boolean;\r\n}\r\n\r\nexport interface HighlightPart {\r\n text: string;\r\n isMatch: boolean;\r\n}\r\n\r\n/**\r\n * useSearchHighlight\r\n *\r\n * Splits text into parts based on a search query.\r\n */\r\nexport function useSearchHighlight(\r\n text: string,\r\n query: string,\r\n options: UseSearchHighlightOptions = {}\r\n): HighlightPart[] {\r\n const { caseSensitive = false } = options;\r\n\r\n return useMemo(() => {\r\n if (!query) {\r\n return [{ text, isMatch: false }];\r\n }\r\n\r\n const escapedQuery = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n const flags = caseSensitive ? 'g' : 'gi';\r\n const regex = new RegExp(`(${escapedQuery})`, flags);\r\n\r\n const parts = text.split(regex);\r\n\r\n return parts\r\n .filter(part => part)\r\n .map(part => {\r\n const isMatch = caseSensitive\r\n ? part === query\r\n : part.toLowerCase() === query.toLowerCase();\r\n\r\n return {\r\n text: part,\r\n isMatch\r\n };\r\n });\r\n }, [text, query, caseSensitive]);\r\n}\r\n","import { useMemo } from 'react';\r\n\r\nexport type Vector = number[];\r\n\r\nexport interface SemanticResult<T> {\r\n item: T;\r\n score: number;\r\n}\r\n\r\n/**\r\n * useSemanticSearch\r\n *\r\n * Performs client-side vector similarity search (Cosine Similarity).\r\n * Assumes embeddings are already generated.\r\n */\r\nexport function useSemanticSearch<T>(\r\n queryEmbedding: Vector | null,\r\n items: T[],\r\n getItemEmbedding: (item: T) => Vector,\r\n topK: number = 5\r\n): SemanticResult<T>[] {\r\n return useMemo(() => {\r\n if (!queryEmbedding || items.length === 0) return [];\r\n\r\n const results = items.map(item => {\r\n const itemEmbedding = getItemEmbedding(item);\r\n const score = cosineSimilarity(queryEmbedding, itemEmbedding);\r\n return { item, score };\r\n });\r\n\r\n return results\r\n .sort((a, b) => b.score - a.score)\r\n .slice(0, topK);\r\n }, [queryEmbedding, items, getItemEmbedding, topK]);\r\n}\r\n\r\nfunction cosineSimilarity(a: Vector, b: Vector): number {\r\n if (a.length !== b.length) return 0;\r\n\r\n let dotProduct = 0;\r\n let magnitudeA = 0;\r\n let magnitudeB = 0;\r\n\r\n for (let i = 0; i < a.length; i++) {\r\n dotProduct += a[i] * b[i];\r\n magnitudeA += a[i] * a[i];\r\n magnitudeB += b[i] * b[i];\r\n }\r\n\r\n magnitudeA = Math.sqrt(magnitudeA);\r\n magnitudeB = Math.sqrt(magnitudeB);\r\n\r\n if (magnitudeA === 0 || magnitudeB === 0) return 0;\r\n\r\n return dotProduct / (magnitudeA * magnitudeB);\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseSTTOptions {\r\n continuous?: boolean;\r\n interimResults?: boolean;\r\n lang?: string;\r\n onResult?: (transcript: string) => void;\r\n onError?: (error: any) => void;\r\n onEnd?: () => void;\r\n}\r\n\r\nexport interface UseSTTReturn {\r\n listen: () => void;\r\n stop: () => void;\r\n abort: () => void;\r\n listening: boolean;\r\n transcript: string;\r\n supported: boolean;\r\n}\r\n\r\n/**\r\n * useSTT\r\n *\r\n * A hook for Speech-to-Text (Recognition) integration.\r\n * Provides real-time transcription with controls for continuous or one-shot listening.\r\n *\r\n * @param options - Configuration options (lang, continuous, interimResults, etc.)\r\n * @returns Object with recognition controls and transcription state\r\n *\r\n * @example\r\n * ```tsx\r\n * const { listen, stop, transcript, listening, supported } = useSTT({\r\n * lang: 'en-US',\r\n * continuous: true,\r\n * interimResults: true\r\n * });\r\n *\r\n * if (!supported) return <p>Speech Recognition not supported in this browser</p>;\r\n *\r\n * return (\r\n * <div className=\"stt-container\">\r\n * <div className=\"controls\">\r\n * <button onClick={listen} disabled={listening}>Start Listening</button>\r\n * <button onClick={stop} disabled={!listening}>Stop</button>\r\n * </div>\r\n *\r\n * <div className={`status ${listening ? 'active' : ''}`}>\r\n * {listening ? '🎤 Listening...' : 'Mic Off'}\r\n * </div>\r\n *\r\n * <div className=\"transcript\">\r\n * <h3>Transcript:</h3>\r\n * <p>{transcript || 'Start speaking to see transcription...'}</p>\r\n * </div>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useSTT(options: UseSTTOptions = {}): UseSTTReturn {\r\n const [listening, setListening] = useState(false);\r\n const [transcript, setTranscript] = useState('');\r\n const [supported, setSupported] = useState(false);\r\n\r\n const recognitionRef = useRef<any>(null);\r\n const optionsRef = useRef(options);\r\n optionsRef.current = options;\r\n\r\n useEffect(() => {\r\n const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;\r\n if (SpeechRecognition) {\r\n setSupported(true);\r\n recognitionRef.current = new SpeechRecognition();\r\n }\r\n }, []);\r\n\r\n const listen = useCallback(() => {\r\n if (!recognitionRef.current) return;\r\n\r\n const recognition = recognitionRef.current;\r\n const opts = optionsRef.current;\r\n\r\n recognition.continuous = opts.continuous ?? false;\r\n recognition.interimResults = opts.interimResults ?? false;\r\n recognition.lang = opts.lang || 'en-US';\r\n\r\n recognition.onstart = () => setListening(true);\r\n\r\n recognition.onresult = (event: any) => {\r\n let finalTranscript = '';\r\n for (let i = event.resultIndex; i < event.results.length; ++i) {\r\n if (event.results[i].isFinal) {\r\n finalTranscript += event.results[i][0].transcript;\r\n } else if (opts.interimResults) {\r\n finalTranscript += event.results[i][0].transcript;\r\n }\r\n }\r\n setTranscript(finalTranscript);\r\n opts.onResult?.(finalTranscript);\r\n };\r\n\r\n recognition.onerror = (event: any) => {\r\n setListening(false);\r\n opts.onError?.(event.error);\r\n };\r\n\r\n recognition.onend = () => {\r\n setListening(false);\r\n opts.onEnd?.();\r\n };\r\n\r\n try {\r\n recognition.start();\r\n } catch (e) {\r\n // Already started\r\n }\r\n }, []);\r\n\r\n const stop = useCallback(() => {\r\n recognitionRef.current?.stop();\r\n setListening(false);\r\n }, []);\r\n\r\n const abort = useCallback(() => {\r\n recognitionRef.current?.abort();\r\n setListening(false);\r\n }, []);\r\n\r\n return {\r\n listen,\r\n stop,\r\n abort,\r\n listening,\r\n transcript,\r\n supported,\r\n };\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseTTSOptions {\r\n volume?: number;\r\n rate?: number;\r\n pitch?: number;\r\n voiceURI?: string;\r\n onStart?: () => void;\r\n onEnd?: () => void;\r\n onError?: (event: SpeechSynthesisErrorEvent) => void;\r\n}\r\n\r\n/**\r\n * useTTS\r\n *\r\n * A hook for Text-to-Speech (Synthesis) integration.\r\n * Wraps the Web Speech API with a React-friendly interface.\r\n *\r\n * @param options - Configuration options (volume, rate, voice, etc.)\r\n * @returns Object with speech controls and state\r\n *\r\n * @example\r\n * ```tsx\r\n * const { speak, cancel, speaking, supported, voices } = useTTS({\r\n * volume: 1,\r\n * rate: 1,\r\n * });\r\n *\r\n * if (!supported) return <p>Text-to-Speech not supported</p>;\r\n *\r\n * return (\r\n * <div>\r\n * <textarea id=\"text-input\" defaultValue=\"Hello world\" />\r\n *\r\n * <div className=\"controls\">\r\n * <button onClick={() => speak(document.querySelector('textarea')?.value || '')}>\r\n * Speak\r\n * </button>\r\n * <button onClick={cancel} disabled={!speaking}>\r\n * Stop\r\n * </button>\r\n * </div>\r\n *\r\n * <div className=\"status\">\r\n * {speaking ? '🔊 Speaking...' : 'Idle'}\r\n * </div>\r\n *\r\n * <div className=\"voices\">\r\n * <p>Available Voices: {voices.length}</p>\r\n * </div>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useTTS(options: UseTTSOptions = {}) {\r\n const [speaking, setSpeaking] = useState(false);\r\n const [supported, setSupported] = useState(false);\r\n const [voices, setVoices] = useState<SpeechSynthesisVoice[]>([]);\r\n\r\n const optionsRef = useRef(options);\r\n optionsRef.current = options;\r\n\r\n useEffect(() => {\r\n if (typeof window !== 'undefined' && 'speechSynthesis' in window) {\r\n setSupported(true);\r\n const updateVoices = () => {\r\n setVoices(window.speechSynthesis.getVoices());\r\n };\r\n updateVoices();\r\n window.speechSynthesis.onvoiceschanged = updateVoices;\r\n }\r\n }, []);\r\n\r\n const cancel = useCallback(() => {\r\n if (!supported) return;\r\n window.speechSynthesis.cancel();\r\n setSpeaking(false);\r\n }, [supported]);\r\n\r\n const speak = useCallback((text: string, overrideOptions: UseTTSOptions = {}) => {\r\n if (!supported) return;\r\n\r\n cancel();\r\n\r\n const opts = { ...optionsRef.current, ...overrideOptions };\r\n const utterance = new SpeechSynthesisUtterance(text);\r\n\r\n if (opts.volume !== undefined) utterance.volume = opts.volume;\r\n if (opts.rate !== undefined) utterance.rate = opts.rate;\r\n if (opts.pitch !== undefined) utterance.pitch = opts.pitch;\r\n\r\n if (opts.voiceURI) {\r\n const voice = voices.find(v => v.voiceURI === opts.voiceURI);\r\n if (voice) utterance.voice = voice;\r\n }\r\n\r\n utterance.onstart = () => {\r\n setSpeaking(true);\r\n opts.onStart?.();\r\n };\r\n\r\n utterance.onend = () => {\r\n setSpeaking(false);\r\n opts.onEnd?.();\r\n };\r\n\r\n utterance.onerror = (event) => {\r\n setSpeaking(false);\r\n opts.onError?.(event);\r\n };\r\n\r\n window.speechSynthesis.speak(utterance);\r\n }, [supported, voices, cancel]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (supported) {\r\n window.speechSynthesis.cancel();\r\n }\r\n };\r\n }, [supported]);\r\n\r\n return {\r\n speak,\r\n cancel,\r\n speaking,\r\n supported,\r\n voices,\r\n };\r\n}\r\n","import { useCallback, useEffect, useRef } from 'react';\r\nimport { useStableCallback } from '../useStableCallback';\r\n\r\nexport type AnimationCallback = (time: number, deltaTime: number) => void;\r\n\r\nexport function useAnimate(\r\n callback: AnimationCallback,\r\n running: boolean = true\r\n) {\r\n const requestRef = useRef<number>();\r\n const previousTimeRef = useRef<number>();\r\n const savedCallback = useStableCallback(callback);\r\n\r\n const animate = useCallback((time: number) => {\r\n if (previousTimeRef.current !== undefined) {\r\n const deltaTime = time - previousTimeRef.current;\r\n savedCallback(time, deltaTime);\r\n }\r\n previousTimeRef.current = time;\r\n requestRef.current = requestAnimationFrame(animate);\r\n }, [savedCallback]);\r\n\r\n useEffect(() => {\r\n if (running) {\r\n requestRef.current = requestAnimationFrame(animate);\r\n } else {\r\n previousTimeRef.current = undefined;\r\n if (requestRef.current) {\r\n cancelAnimationFrame(requestRef.current);\r\n }\r\n }\r\n return () => {\r\n if (requestRef.current) {\r\n cancelAnimationFrame(requestRef.current);\r\n }\r\n };\r\n }, [running, animate]);\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseMediaRefReturn<T extends HTMLMediaElement> {\r\n ref: React.RefObject<T>;\r\n controls: {\r\n play: () => Promise<void>;\r\n pause: () => void;\r\n toggle: () => void;\r\n seek: (time: number) => void;\r\n mute: () => void;\r\n unmute: () => void;\r\n setVolume: (val: number) => void;\r\n };\r\n state: {\r\n playing: boolean;\r\n paused: boolean;\r\n muted: boolean;\r\n volume: number;\r\n time: number;\r\n duration: number;\r\n buffered: number;\r\n waiting: boolean;\r\n ended: boolean;\r\n };\r\n}\r\n\r\n\r\nexport function useMediaRef<T extends HTMLMediaElement>(): UseMediaRefReturn<T> {\r\n const ref = useRef<T>(null);\r\n\r\n const [state, setState] = useState({\r\n playing: false,\r\n paused: true,\r\n muted: false,\r\n volume: 1,\r\n time: 0,\r\n duration: 0,\r\n buffered: 0,\r\n waiting: false,\r\n ended: false,\r\n });\r\n\r\n const updateState = useCallback(() => {\r\n const el = ref.current;\r\n if (!el) return;\r\n\r\n setState({\r\n playing: !el.paused && !el.ended && el.readyState > 2,\r\n paused: el.paused,\r\n muted: el.muted,\r\n volume: el.volume,\r\n time: el.currentTime,\r\n duration: el.duration || 0,\r\n buffered: el.buffered.length > 0 ? el.buffered.end(el.buffered.length - 1) : 0,\r\n waiting: el.readyState < 3, // HAVE_FUTURE_DATA\r\n ended: el.ended,\r\n });\r\n }, []);\r\n\r\n useEffect(() => {\r\n const el = ref.current;\r\n if (!el) return;\r\n\r\n const events = [\r\n 'loadstart', 'loadedmetadata', 'canplay', 'play', 'playing',\r\n 'pause', 'waiting', 'seeking', 'seeked', 'ended', 'durationchange',\r\n 'timeupdate', 'progress', 'volumechange'\r\n ];\r\n\r\n events.forEach(ev => el.addEventListener(ev, updateState));\r\n updateState();\r\n\r\n return () => {\r\n events.forEach(ev => el.removeEventListener(ev, updateState));\r\n };\r\n }, [updateState]);\r\n\r\n const controls = {\r\n play: async () => { await ref.current?.play(); },\r\n pause: () => { ref.current?.pause(); },\r\n toggle: () => {\r\n const el = ref.current;\r\n if (el) el.paused ? el.play() : el.pause();\r\n },\r\n seek: (time: number) => {\r\n if (ref.current) ref.current.currentTime = time;\r\n },\r\n mute: () => {\r\n if (ref.current) ref.current.muted = true;\r\n },\r\n unmute: () => {\r\n if (ref.current) ref.current.muted = false;\r\n },\r\n setVolume: (val: number) => {\r\n if (ref.current) ref.current.volume = Math.max(0, Math.min(1, val));\r\n },\r\n };\r\n\r\n return { ref, controls, state };\r\n}\r\n\r\n/**\r\n * useVideoRef\r\n *\r\n * A hook providing a declarative interface for HTML5 Video elements.\r\n * Returns a ref, easy-to-use controls, and real-time playback state.\r\n *\r\n * @returns Object with ref, controls (play, pause, volume), and state (time, duration, etc.)\r\n *\r\n * @example\r\n * ```tsx\r\n * const { ref, controls, state } = useVideoRef();\r\n *\r\n * return (\r\n * <div className=\"player\">\r\n * <video ref={ref} src=\"movie.mp4\" width=\"600\" />\r\n *\r\n * <div className=\"ui\">\r\n * <button onClick={controls.toggle}>\r\n * {state.paused ? '▶️ Play' : '⏸️ Pause'}\r\n * </button>\r\n *\r\n * <input\r\n * type=\"range\"\r\n * min=\"0\"\r\n * max={state.duration}\r\n * value={state.time}\r\n * onChange={(e) => controls.seek(Number(e.target.value))}\r\n * />\r\n *\r\n * <span>{Math.round(state.time)}s / {Math.round(state.duration)}s</span>\r\n *\r\n * <button onClick={controls.mute}>\r\n * {state.muted ? '🔈' : '🔊'}\r\n * </button>\r\n * </div>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useVideoRef() {\r\n return useMediaRef<HTMLVideoElement>();\r\n}\r\n","import { useMediaRef } from '../useVideoRef/useVideoRef';\r\n\r\n/**\r\n * useAudioRef\r\n *\r\n * Helper for audio elements.\r\n * Provides controls (play, pause, seek, volume) and state (time, duration, buffered).\r\n *\r\n * @returns Object with ref, controls, and state\r\n *\r\n * @example\r\n * ```tsx\r\n * const { ref, controls, state } = useAudioRef();\r\n *\r\n * return (\r\n * <div>\r\n * <audio ref={ref} src=\"song.mp3\" />\r\n * <button onClick={controls.toggle}>\r\n * {state.paused ? 'Play' : 'Pause'}\r\n * </button>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useAudioRef() {\r\n return useMediaRef<HTMLAudioElement>();\r\n}\r\n","import { useEffect, useRef } from 'react';\r\n\r\nexport interface UseCanvasOptions {\r\n width?: number;\r\n height?: number;\r\n animate?: (context: CanvasRenderingContext2D, frameCount: number) => void;\r\n}\r\n\r\nexport function useCanvas(options: UseCanvasOptions = {}) {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const requestRef = useRef<number>();\r\n const frameCountRef = useRef(0);\r\n\r\n useEffect(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n\r\n const context = canvas.getContext('2d');\r\n if (!context) return;\r\n\r\n // Handle high-DPI displays\r\n const dpr = window.devicePixelRatio || 1;\r\n const rect = canvas.getBoundingClientRect();\r\n\r\n // Use provided width/height or client dimensions\r\n const width = options.width ?? rect.width;\r\n const height = options.height ?? rect.height;\r\n\r\n canvas.width = width * dpr;\r\n canvas.height = height * dpr;\r\n\r\n context.scale(dpr, dpr);\r\n canvas.style.width = `${width}px`;\r\n canvas.style.height = `${height}px`;\r\n\r\n const render = () => {\r\n frameCountRef.current++;\r\n if (options.animate) {\r\n options.animate(context, frameCountRef.current);\r\n }\r\n requestRef.current = requestAnimationFrame(render);\r\n };\r\n\r\n if (options.animate) {\r\n render();\r\n }\r\n\r\n return () => {\r\n if (requestRef.current) cancelAnimationFrame(requestRef.current);\r\n };\r\n }, [options.width, options.height, options.animate]);\r\n\r\n return canvasRef;\r\n}\r\n","import { useEffect, useRef, useState } from 'react';\r\n\r\nexport function useFrameRate(running: boolean = true) {\r\n const [fps, setFps] = useState(0);\r\n const frameCountRef = useRef(0);\r\n const lastTimeRef = useRef(performance.now());\r\n const requestRef = useRef<number>();\r\n\r\n useEffect(() => {\r\n if (!running) return;\r\n\r\n const loop = (time: number) => {\r\n frameCountRef.current++;\r\n\r\n if (time - lastTimeRef.current >= 1000) {\r\n setFps(frameCountRef.current);\r\n frameCountRef.current = 0;\r\n lastTimeRef.current = time;\r\n }\r\n\r\n requestRef.current = requestAnimationFrame(loop);\r\n };\r\n\r\n requestRef.current = requestAnimationFrame(loop);\r\n\r\n return () => {\r\n if (requestRef.current) cancelAnimationFrame(requestRef.current);\r\n };\r\n }, [running]);\r\n\r\n return fps;\r\n}\r\n","import lottie, { AnimationConfig, AnimationItem } from 'lottie-web';\r\nimport { useEffect, useRef } from 'react';\r\n\r\nexport interface UseLottieOptions extends Omit<AnimationConfig, 'container'> {\r\n path?: string;\r\n animationData?: any;\r\n speed?: number;\r\n direction?: 1 | -1;\r\n isPlaying?: boolean;\r\n}\r\n\r\nexport function useLottie(containerRef: React.RefObject<HTMLElement>, options: UseLottieOptions) {\r\n const animationRef = useRef<AnimationItem>();\r\n\r\n useEffect(() => {\r\n if (!containerRef.current) return;\r\n\r\n const anim = lottie.loadAnimation({\r\n container: containerRef.current,\r\n renderer: 'svg',\r\n loop: options.loop ?? true,\r\n autoplay: options.autoplay ?? true,\r\n animationData: options.animationData,\r\n path: options.path,\r\n });\r\n\r\n animationRef.current = anim;\r\n\r\n if (options.speed) anim.setSpeed(options.speed);\r\n if (options.direction) anim.setDirection(options.direction);\r\n\r\n return () => {\r\n anim.destroy();\r\n };\r\n }, [options.path, options.animationData]); // Re-init if source changes\r\n\r\n // Dynamic updates\r\n useEffect(() => {\r\n if (!animationRef.current) return;\r\n if (options.speed !== undefined) animationRef.current.setSpeed(options.speed);\r\n if (options.direction !== undefined) animationRef.current.setDirection(options.direction);\r\n\r\n if (options.isPlaying !== undefined) {\r\n options.isPlaying ? animationRef.current.play() : animationRef.current.pause();\r\n }\r\n }, [options.speed, options.direction, options.isPlaying]);\r\n\r\n return animationRef.current;\r\n}\r\n","import { useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseParallaxOptions {\r\n speed?: number; // Speed multiplier, e.g. 0.5 (half speed), -1 (reverse)\r\n axis?: 'y' | 'x';\r\n}\r\n\r\n/**\r\n * useParallax\r\n *\r\n * Returns a style object with transform to create a parallax effect.\r\n * Needs to be attached to the element style.\r\n */\r\nexport function useParallax(options: UseParallaxOptions = {}) {\r\n const { speed = 0.5, axis = 'y' } = options;\r\n const [offset, setOffset] = useState(0);\r\n const ref = useRef<HTMLElement>(null);\r\n\r\n useEffect(() => {\r\n const handleScroll = () => {\r\n if (!ref.current) return;\r\n const rect = ref.current.getBoundingClientRect();\r\n const scrollY = window.scrollY || window.pageYOffset;\r\n const scrollX = window.scrollX || window.pageXOffset;\r\n\r\n // Calculate offset based on scroll position relative to viewport\r\n // Simple implementation: offset = scrolledAmount * speed\r\n // More complex: based on element position (rect.top)\r\n\r\n const val = axis === 'y' ? scrollY : scrollX;\r\n setOffset(val * speed);\r\n };\r\n\r\n window.addEventListener('scroll', handleScroll, { passive: true });\r\n handleScroll(); // Initial\r\n\r\n return () => window.removeEventListener('scroll', handleScroll);\r\n }, [speed, axis]);\r\n\r\n return {\r\n ref,\r\n style: {\r\n transform: axis === 'y'\r\n ? `translateY(${offset}px)`\r\n : `translateX(${offset}px)`,\r\n willChange: 'transform'\r\n }\r\n };\r\n}\r\n","import { useEffect, useRef, useState } from 'react';\r\n\r\nexport interface SpringConfig {\r\n stiffness?: number; // k\r\n damping?: number; // c\r\n mass?: number; // m\r\n}\r\n\r\nexport interface UseSpringCoreOptions extends SpringConfig {\r\n initialValue?: number;\r\n}\r\n\r\nconst DEFAULT_CONFIG: Required<SpringConfig> = {\r\n stiffness: 170,\r\n damping: 26,\r\n mass: 1,\r\n};\r\n\r\n/**\r\n * useSpringCore\r\n *\r\n * A simplified spring physics implementation using a semi-implicit Euler integration\r\n * or basic RK4 (simplified here for performant React state updates).\r\n *\r\n * Note: For high frequency animation, use useAnimate directly with refs.\r\n * This hook is for state-based spring values.\r\n */\r\nexport function useSpringCore(\r\n targetValue: number,\r\n options: UseSpringCoreOptions = {}\r\n) {\r\n const [value, setValue] = useState(options.initialValue ?? targetValue);\r\n const velocityRef = useRef(0);\r\n const valueRef = useRef(options.initialValue ?? targetValue);\r\n const lastTimeRef = useRef<number>();\r\n const rafRef = useRef<number>();\r\n\r\n const config = { ...DEFAULT_CONFIG, ...options };\r\n\r\n useEffect(() => {\r\n const animate = (time: number) => {\r\n if (lastTimeRef.current === undefined) {\r\n lastTimeRef.current = time;\r\n rafRef.current = requestAnimationFrame(animate);\r\n return;\r\n }\r\n\r\n const deltaTime = (time - lastTimeRef.current) / 1000; // seconds\r\n lastTimeRef.current = time;\r\n\r\n // Safety cap for large deltas\r\n const dt = Math.min(deltaTime, 0.1);\r\n\r\n const force = -config.stiffness * (valueRef.current - targetValue);\r\n const dampingForce = -config.damping * velocityRef.current;\r\n const acceleration = (force + dampingForce) / config.mass;\r\n\r\n velocityRef.current += acceleration * dt;\r\n valueRef.current += velocityRef.current * dt;\r\n\r\n setValue(valueRef.current);\r\n\r\n // Stop if close enough\r\n if (\r\n Math.abs(velocityRef.current) < 0.01 &&\r\n Math.abs(valueRef.current - targetValue) < 0.01\r\n ) {\r\n setValue(targetValue);\r\n valueRef.current = targetValue;\r\n velocityRef.current = 0;\r\n return; // Stop loop\r\n }\r\n\r\n rafRef.current = requestAnimationFrame(animate);\r\n };\r\n\r\n if (valueRef.current !== targetValue) {\r\n lastTimeRef.current = undefined;\r\n rafRef.current = requestAnimationFrame(animate);\r\n }\r\n\r\n return () => {\r\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\r\n };\r\n }, [targetValue, config.stiffness, config.damping, config.mass]);\r\n\r\n return value;\r\n}\r\n","import { useEffect, useState } from 'react';\r\n\r\nexport interface UseSVGAnimationOptions {\r\n duration?: number;\r\n delay?: number;\r\n easing?: (t: number) => number;\r\n}\r\n\r\nexport function useSVGAnimation(\r\n length: number,\r\n options: UseSVGAnimationOptions = {}\r\n) {\r\n const [offset, setOffset] = useState(length);\r\n const { duration = 1000, delay = 0, easing = (t) => t } = options;\r\n\r\n useEffect(() => {\r\n let start: number | null = null;\r\n let rafId: number;\r\n\r\n const animate = (time: number) => {\r\n if (!start) start = time;\r\n const elapsed = time - start;\r\n const progress = Math.min(Math.max((elapsed - delay) / duration, 0), 1);\r\n\r\n const easedProgress = easing(progress);\r\n\r\n // Draw from 0 to length (or hide to show)\r\n // Usually stroke-dashoffset: length -> 0\r\n setOffset(length * (1 - easedProgress));\r\n\r\n if (progress < 1) {\r\n rafId = requestAnimationFrame(animate);\r\n }\r\n };\r\n\r\n rafId = requestAnimationFrame(animate);\r\n\r\n return () => {\r\n cancelAnimationFrame(rafId);\r\n };\r\n }, [length, duration, delay]); // Re-run if props change\r\n\r\n // Return styles for the SVG Path\r\n return {\r\n strokeDasharray: length,\r\n strokeDashoffset: offset,\r\n };\r\n}\r\n","import { useEffect, useRef } from 'react';\r\nimport * as THREE from 'three';\r\n\r\nexport interface UseThreeJSOptions {\r\n init?: (scene: THREE.Scene, camera: THREE.PerspectiveCamera, renderer: THREE.WebGLRenderer) => void;\r\n animate?: (time: number, scene: THREE.Scene, camera: THREE.PerspectiveCamera) => void;\r\n resize?: boolean;\r\n}\r\n\r\nexport function useThreeJS(containerRef: React.RefObject<HTMLElement>, options: UseThreeJSOptions = {}) {\r\n const { init, animate, resize = true } = options;\r\n const rendererRef = useRef<THREE.WebGLRenderer>();\r\n const sceneRef = useRef<THREE.Scene>();\r\n const cameraRef = useRef<THREE.PerspectiveCamera>();\r\n const requestRef = useRef<number>();\r\n\r\n useEffect(() => {\r\n if (!containerRef.current) return;\r\n\r\n const width = containerRef.current.clientWidth;\r\n const height = containerRef.current.clientHeight;\r\n\r\n // Setup\r\n const scene = new THREE.Scene();\r\n const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);\r\n const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });\r\n\r\n renderer.setSize(width, height);\r\n containerRef.current.appendChild(renderer.domElement);\r\n\r\n sceneRef.current = scene;\r\n cameraRef.current = camera;\r\n rendererRef.current = renderer;\r\n\r\n // User init\r\n if (init) {\r\n init(scene, camera, renderer);\r\n }\r\n\r\n // Animation Loop\r\n const loop = (time: number) => {\r\n if (animate) {\r\n animate(time, scene, camera);\r\n }\r\n renderer.render(scene, camera);\r\n requestRef.current = requestAnimationFrame(loop);\r\n };\r\n loop(0);\r\n\r\n // Resize Handler\r\n const handleResize = () => {\r\n if (!containerRef.current) return;\r\n const w = containerRef.current.clientWidth;\r\n const h = containerRef.current.clientHeight;\r\n camera.aspect = w / h;\r\n camera.updateProjectionMatrix();\r\n renderer.setSize(w, h);\r\n };\r\n\r\n if (resize) {\r\n window.addEventListener('resize', handleResize);\r\n }\r\n\r\n return () => {\r\n if (requestRef.current) cancelAnimationFrame(requestRef.current);\r\n if (resize) window.removeEventListener('resize', handleResize);\r\n\r\n renderer.dispose();\r\n // Basic cleanup, user might need more\r\n if (containerRef.current) {\r\n containerRef.current.removeChild(renderer.domElement);\r\n }\r\n };\r\n }, [init, animate, resize]);\r\n\r\n return { scene: sceneRef.current, camera: cameraRef.current, renderer: rendererRef.current };\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport function useBroadcastChannel<T>(channelName: string) {\r\n const [lastMessage, setLastMessage] = useState<T | null>(null);\r\n const channelRef = useRef<BroadcastChannel | null>(null);\r\n\r\n useEffect(() => {\r\n const channel = new BroadcastChannel(channelName);\r\n channelRef.current = channel;\r\n\r\n channel.onmessage = (event) => {\r\n setLastMessage(event.data);\r\n };\r\n\r\n return () => {\r\n channel.close();\r\n };\r\n }, [channelName]);\r\n\r\n const postMessage = useCallback((message: T) => {\r\n channelRef.current?.postMessage(message);\r\n }, []);\r\n\r\n return { postMessage, lastMessage };\r\n}\r\n","import { useMemo, useState } from 'react';\r\n\r\nexport interface UseCalendarOptions {\r\n initialDate?: Date;\r\n}\r\n\r\nexport function useCalendar(options: UseCalendarOptions = {}) {\r\n const [date, setDate] = useState(options.initialDate || new Date());\r\n\r\n const daysInMonth = useMemo(() => {\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n return new Date(year, month + 1, 0).getDate();\r\n }, [date]);\r\n\r\n const firstDayOfMonth = useMemo(() => {\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n return new Date(year, month, 1).getDay();\r\n }, [date]);\r\n\r\n const nextMonth = () => {\r\n setDate(prev => new Date(prev.getFullYear(), prev.getMonth() + 1, 1));\r\n };\r\n\r\n const prevMonth = () => {\r\n setDate(prev => new Date(prev.getFullYear(), prev.getMonth() - 1, 1));\r\n };\r\n\r\n return {\r\n date,\r\n daysInMonth,\r\n firstDayOfMonth,\r\n nextMonth,\r\n prevMonth,\r\n setHeader: setDate,\r\n };\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseDragAndDropOptions {\r\n onDrop?: (files: File[]) => void;\r\n accept?: string[]; // e.g. ['image/*', '.pdf']\r\n}\r\n\r\nexport function useDragAndDrop(options: UseDragAndDropOptions = {}) {\r\n const [isDragging, setIsDragging] = useState(false);\r\n const ref = useRef<HTMLElement>(null);\r\n\r\n const handleDragEnter = useCallback((e: DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDragging(true);\r\n }, []);\r\n\r\n const handleDragLeave = useCallback((e: DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDragging(false);\r\n }, []);\r\n\r\n const handleDragOver = useCallback((e: DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }, []);\r\n\r\n const handleDrop = useCallback((e: DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDragging(false);\r\n\r\n if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\r\n const files = Array.from(e.dataTransfer.files);\r\n // Basic filter logic if needed\r\n options.onDrop?.(files);\r\n e.dataTransfer.clearData();\r\n }\r\n }, [options]);\r\n\r\n useEffect(() => {\r\n const el = ref.current;\r\n if (!el) return;\r\n\r\n el.addEventListener('dragenter', handleDragEnter);\r\n el.addEventListener('dragleave', handleDragLeave);\r\n el.addEventListener('dragover', handleDragOver);\r\n el.addEventListener('drop', handleDrop);\r\n\r\n return () => {\r\n el.removeEventListener('dragenter', handleDragEnter);\r\n el.removeEventListener('dragleave', handleDragLeave);\r\n el.removeEventListener('dragover', handleDragOver);\r\n el.removeEventListener('drop', handleDrop);\r\n };\r\n }, [handleDragEnter, handleDragLeave, handleDragOver, handleDrop]);\r\n\r\n return { ref, isDragging };\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface UseFileProcessingOptions {\r\n limit?: number; // Size limit in bytes\r\n accept?: string[];\r\n}\r\n\r\nexport function useFileProcessing(options: UseFileProcessingOptions = {}) {\r\n const [processing, setProcessing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const process = useCallback(async (file: File) => {\r\n setProcessing(true);\r\n setError(null);\r\n try {\r\n if (options.limit && file.size > options.limit) {\r\n throw new Error('File too large');\r\n }\r\n\r\n const text = await file.text();\r\n // Assume generic processing or return raw for now\r\n return text;\r\n } catch (err: any) {\r\n setError(err.message);\r\n throw err;\r\n } finally {\r\n setProcessing(false);\r\n }\r\n }, [options.limit]);\r\n\r\n return { process, processing, error };\r\n}\r\n","import { FormEvent, useCallback, useState } from 'react';\r\n\r\nexport interface UseFormOptions<T> {\r\n /** Initial values for the form fields */\r\n initialValues: T;\r\n /** Callback function when form is submitted successfully */\r\n onSubmit: (values: T) => void | Promise<void>;\r\n /** Validation function that returns an object of error messages */\r\n validate?: (values: T) => Record<keyof T, string> | Promise<Record<keyof T, string>>;\r\n}\r\n\r\nexport interface UseFormReturn<T> {\r\n /** Current form values */\r\n values: T;\r\n /** Current validation errors */\r\n errors: Record<keyof T, string>;\r\n /** Touched fields status */\r\n touched: Record<keyof T, boolean>;\r\n /** Whether the form is currently submitting */\r\n isSubmitting: boolean;\r\n /** Handle input change events */\r\n handleChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => void;\r\n /** Handle input blur events */\r\n handleBlur: (e: React.FocusEvent<any>) => void;\r\n /** Handle form submission */\r\n handleSubmit: (e?: FormEvent) => Promise<void>;\r\n /** Manually set a field value */\r\n setFieldValue: (name: keyof T, value: any) => void;\r\n /** Manually set all form values */\r\n setValues: React.Dispatch<React.SetStateAction<T>>;\r\n}\r\n\r\n/**\r\n * useForm\r\n *\r\n * A simple yet powerful hook for managing form state, validation, and submission.\r\n * It handles values, errors, touched states, and provides handlers for inputs and forms.\r\n *\r\n * @param options - Configuration options for the form\r\n * @returns Object with form state and handlers\r\n *\r\n * @example\r\n * ```tsx\r\n * interface LoginForm {\r\n * email: string;\r\n * password: string;\r\n * }\r\n *\r\n * const {\r\n * values,\r\n * errors,\r\n * handleChange,\r\n * handleSubmit,\r\n * isSubmitting\r\n * } = useForm<LoginForm>({\r\n * initialValues: { email: '', password: '' },\r\n *\r\n * validate: (values) => {\r\n * const errors: Partial<Record<keyof LoginForm, string>> = {};\r\n * if (!values.email) errors.email = 'Email required';\r\n * if (!values.password) errors.password = 'Password required';\r\n * return errors as Record<keyof LoginForm, string>;\r\n * },\r\n *\r\n * onSubmit: async (values) => {\r\n * console.log('Logging in...', values);\r\n * await new Promise(r => setTimeout(r, 1000));\r\n * }\r\n * });\r\n *\r\n * return (\r\n * <form onSubmit={handleSubmit} className=\"login-form\">\r\n * <div className=\"field\">\r\n * <label>Email</label>\r\n * <input\r\n * name=\"email\"\r\n * value={values.email}\r\n * onChange={handleChange}\r\n * className={errors.email ? 'invalid' : ''}\r\n * />\r\n * {errors.email && <span className=\"error\">{errors.email}</span>}\r\n * </div>\r\n *\r\n * <div className=\"field\">\r\n * <label>Password</label>\r\n * <input\r\n * name=\"password\"\r\n * type=\"password\"\r\n * value={values.password}\r\n * onChange={handleChange}\r\n * />\r\n * {errors.password && <span className=\"error\">{errors.password}</span>}\r\n * </div>\r\n *\r\n * <button type=\"submit\" disabled={isSubmitting}>\r\n * {isSubmitting ? 'Verifying...' : 'Login'}\r\n * </button>\r\n * </form>\r\n * );\r\n * ```\r\n */\r\nexport function useForm<T extends Record<string, any>>(options: UseFormOptions<T>): UseFormReturn<T> {\r\n const [values, setValues] = useState<T>(options.initialValues);\r\n const [errors, setErrors] = useState<Record<keyof T, string>>({} as any);\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [touched, setTouched] = useState<Record<keyof T, boolean>>({} as any);\r\n\r\n const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => {\r\n const { name, value, type } = e.target;\r\n const val = type === 'checkbox' ? (e.target as HTMLInputElement).checked : value;\r\n\r\n setValues(prev => ({ ...prev, [name]: val }));\r\n }, []);\r\n\r\n const setFieldValue = useCallback((name: keyof T, value: any) => {\r\n setValues(prev => ({ ...prev, [name]: value }));\r\n }, []);\r\n\r\n const handleBlur = useCallback((e: React.FocusEvent<any>) => {\r\n const { name } = e.target;\r\n setTouched(prev => ({ ...prev, [name]: true }));\r\n }, []);\r\n\r\n const handleSubmit = useCallback(async (e?: FormEvent) => {\r\n e?.preventDefault();\r\n setIsSubmitting(true);\r\n setErrors({} as any);\r\n\r\n if (options.validate) {\r\n const validationErrors = await options.validate(values);\r\n if (Object.keys(validationErrors).length > 0) {\r\n setErrors(validationErrors);\r\n setIsSubmitting(false);\r\n return;\r\n }\r\n }\r\n\r\n try {\r\n await options.onSubmit(values);\r\n } catch (err) {\r\n // Handle submit error if needed\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n }, [values, options]);\r\n\r\n return {\r\n values,\r\n errors,\r\n touched,\r\n isSubmitting,\r\n handleChange,\r\n handleBlur,\r\n handleSubmit,\r\n setFieldValue,\r\n setValues, // expose for resets\r\n };\r\n}\r\n","\r\n/**\r\n * useMarkdown\r\n *\r\n * Simple parser or wrapper typically.\r\n * Here we return a simple compilation function.\r\n */\r\nexport function useMarkdown() {\r\n const compile = (markdown: string) => {\r\n // Very basic regex parser for demo\r\n let html = markdown\r\n .replace(/^# (.*)/gm, '<h1>$1</h1>')\r\n .replace(/^## (.*)/gm, '<h2>$1</h2>')\r\n .replace(/\\*\\*(.*)\\*\\*/g, '<b>$1</b>');\r\n return html;\r\n };\r\n\r\n return { compile };\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\n// Stub for PDF generation.\r\n// Real impl would use pdf-lib or jspdf.\r\n\r\nexport function usePDF() {\r\n const [generating, setGenerating] = useState(false);\r\n\r\n const generate = useCallback(async (content: string, filename = 'document.pdf') => {\r\n setGenerating(true);\r\n // Simulate async work\r\n await new Promise(r => setTimeout(r, 100));\r\n console.log('Generating PDF for:', filename);\r\n setGenerating(false);\r\n return true;\r\n }, []);\r\n\r\n return { generate, generating };\r\n}\r\n","import { useEffect, useState } from 'react';\r\n\r\n/**\r\n * usePresence\r\n *\r\n * Tracks basic user presence (online/idle) or remote presence list logic.\r\n */\r\nexport function usePresence(heartbeatInterval = 5000) {\r\n const [lastActive, setLastActive] = useState(Date.now());\r\n const [isIdle, setIsIdle] = useState(false);\r\n\r\n useEffect(() => {\r\n const handleActivity = () => {\r\n setLastActive(Date.now());\r\n if (isIdle) setIsIdle(false);\r\n };\r\n\r\n window.addEventListener('mousemove', handleActivity);\r\n window.addEventListener('keydown', handleActivity);\r\n\r\n const interval = setInterval(() => {\r\n if (Date.now() - lastActive > heartbeatInterval * 2) {\r\n setIsIdle(true);\r\n }\r\n }, heartbeatInterval);\r\n\r\n return () => {\r\n window.removeEventListener('mousemove', handleActivity);\r\n window.removeEventListener('keydown', handleActivity);\r\n clearInterval(interval);\r\n };\r\n }, [heartbeatInterval, lastActive, isIdle]);\r\n\r\n return { isIdle, lastActive };\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface CollabEvent {\r\n type: string;\r\n payload: any;\r\n timestamp: number;\r\n userId: string;\r\n}\r\n\r\n/**\r\n * useRealtimeCollab\r\n *\r\n * Logic stub for Operational Transformation or CRDTs.\r\n * Simple event log for now.\r\n */\r\nexport function useRealtimeCollab(userId: string) {\r\n const [events, setEvents] = useState<CollabEvent[]>([]);\r\n\r\n const emit = useCallback((type: string, payload: any) => {\r\n const event: CollabEvent = {\r\n type,\r\n payload,\r\n timestamp: Date.now(),\r\n userId,\r\n };\r\n setEvents(prev => [...prev, event]);\r\n // Sync logic would go here (e.g. broadcast)\r\n }, [userId]);\r\n\r\n const applyRemote = useCallback((event: CollabEvent) => {\r\n setEvents(prev => [...prev, event]);\r\n }, []);\r\n\r\n return { events, emit, applyRemote };\r\n}\r\n","import { useEffect } from 'react';\r\n\r\nexport type ShortcutHandler = (event: KeyboardEvent) => void;\r\n\r\nexport interface ShortcutMap {\r\n [key: string]: ShortcutHandler;\r\n}\r\n\r\n/**\r\n * useShortcuts\r\n *\r\n * Defines keyboard shortcuts.\r\n * key combo format: 'Control+Shift+K', 'Enter', 'a'\r\n */\r\nexport function useShortcuts(shortcuts: ShortcutMap) {\r\n useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n const parts = [];\r\n if (event.ctrlKey) parts.push('Control');\r\n if (event.metaKey) parts.push('Meta');\r\n if (event.altKey) parts.push('Alt');\r\n if (event.shiftKey) parts.push('Shift');\r\n\r\n // key is 'a', 'Enter', etc.\r\n // normalize key for single chars to upper if we want case-insensitivity or matching?\r\n // Native event.key handles shift ('a' vs 'A').\r\n // Let's assume exact match on event.key, unless it's a modifier itself.\r\n if (['Control', 'Meta', 'Alt', 'Shift'].includes(event.key)) {\r\n // just modifiers pressed\r\n } else {\r\n parts.push(event.key);\r\n }\r\n\r\n const combo = parts.join('+');\r\n\r\n if (shortcuts[combo]) {\r\n shortcuts[combo](event);\r\n } else if (shortcuts[event.key]) {\r\n // Fallback for simple keys without modifiers explicitly named?\r\n // e.g. \"Escape\"\r\n shortcuts[event.key](event);\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => window.removeEventListener('keydown', handleKeyDown);\r\n }, [shortcuts]);\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface UseSortableOptions<T> {\r\n items: T[];\r\n onReorder: (newItems: T[]) => void;\r\n}\r\n\r\nexport function useSortable<T>(options: UseSortableOptions<T>) {\r\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\r\n\r\n const move = useCallback((fromIndex: number, toIndex: number) => {\r\n if (fromIndex === toIndex) return;\r\n\r\n const newItems = [...options.items];\r\n const [removed] = newItems.splice(fromIndex, 1);\r\n newItems.splice(toIndex, 0, removed);\r\n\r\n options.onReorder(newItems);\r\n }, [options]);\r\n\r\n return {\r\n draggedIndex,\r\n setDraggedIndex,\r\n move,\r\n };\r\n}\r\n","import { useState } from 'react';\r\n\r\nexport type CellValue = string | number | null;\r\nexport type GridData = CellValue[][];\r\n\r\nexport interface UseSpreadsheetOptions {\r\n rows: number;\r\n cols: number;\r\n initialData?: GridData;\r\n}\r\n\r\nexport function useSpreadsheet(options: UseSpreadsheetOptions) {\r\n const { rows, cols, initialData } = options;\r\n\r\n // Initialize grid\r\n const createGrid = () => {\r\n if (initialData) return initialData;\r\n return Array.from({ length: rows }, () => Array(cols).fill(null));\r\n };\r\n\r\n const [data, setData] = useState<GridData>(createGrid);\r\n const [selectedCell, setSelectedCell] = useState<{ r: number; c: number } | null>(null);\r\n\r\n const setCell = (r: number, c: number, value: CellValue) => {\r\n setData(prev => {\r\n const next = [...prev]; // Shallow copy of rows\r\n next[r] = [...next[r]]; // Shallow copy of col\r\n next[r][c] = value;\r\n return next;\r\n });\r\n };\r\n\r\n return {\r\n data,\r\n setCell,\r\n selectedCell,\r\n setSelectedCell,\r\n };\r\n}\r\n","import { useMemo, useState } from 'react';\r\n\r\nexport type SortDirection = 'asc' | 'desc';\r\n\r\nexport interface Column<T> {\r\n /** Property key of the data item */\r\n key: keyof T;\r\n /** Header label for the column */\r\n label: string;\r\n /** Whether the column is sortable */\r\n sortable?: boolean;\r\n}\r\n\r\nexport interface UseTableOptions<T> {\r\n /** Array of data items to display */\r\n data: T[];\r\n /** Array of column definitions */\r\n columns: Column<T>[];\r\n /** Initial sorting configuration */\r\n initialSort?: { key: keyof T; direction: SortDirection };\r\n}\r\n\r\nexport interface UseTableReturn<T> {\r\n /** Sorted and filtered items */\r\n items: T[];\r\n /** Function to request sorting by a key */\r\n requestSort: (key: keyof T) => void;\r\n /** Current sort configuration */\r\n sortConfig: { key: keyof T; direction: SortDirection } | null;\r\n /** Column definitions (passed through) */\r\n columns: Column<T>[];\r\n}\r\n\r\n/**\r\n * useTable\r\n *\r\n * A headless hook for managing table state, including sorting and column definitions.\r\n *\r\n * @param options - Table configuration options\r\n * @returns Object with sorted items and sort controls\r\n *\r\n * @example\r\n * ```tsx\r\n * interface User { id: number; name: string; age: number; email: string; }\r\n *\r\n * const data: User[] = [\r\n * { id: 1, name: 'Alice', age: 28, email: 'alice@example.com' },\r\n * { id: 2, name: 'Bob', age: 34, email: 'bob@example.com' },\r\n * ];\r\n *\r\n * const columns: Column<User>[] = [\r\n * { key: 'name', label: 'Full Name', sortable: true },\r\n * { key: 'age', label: 'Age', sortable: true },\r\n * { key: 'email', label: 'Email' },\r\n * ];\r\n *\r\n * export function DataTable() {\r\n * const { items, requestSort, sortConfig, columns: cols } = useTable({ data, columns });\r\n *\r\n * return (\r\n * <table className=\"data-table\">\r\n * <thead>\r\n * <tr>\r\n * {cols.map(col => (\r\n * <th\r\n * key={col.key.toString()}\r\n * onClick={() => col.sortable && requestSort(col.key)}\r\n * className={col.sortable ? 'sortable' : ''}\r\n * >\r\n * {col.label}\r\n * {sortConfig?.key === col.key && (\r\n * <span>{sortConfig.direction === 'asc' ? ' ↑' : ' ↓'}</span>\r\n * )}\r\n * </th>\r\n * ))}\r\n * </tr>\r\n * </thead>\r\n * <tbody>\r\n * {items.map(user => (\r\n * <tr key={user.id}>\r\n * <td>{user.name}</td>\r\n * <td>{user.age}</td>\r\n * <td>{user.email}</td>\r\n * </tr>\r\n * ))}\r\n * </tbody>\r\n * </table>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function useTable<T>(options: UseTableOptions<T>): UseTableReturn<T> {\r\n const [sortConfig, setSortConfig] = useState<{ key: keyof T; direction: SortDirection } | null>(\r\n options.initialSort || null\r\n );\r\n\r\n const requestSort = (key: keyof T) => {\r\n let direction: SortDirection = 'asc';\r\n if (sortConfig && sortConfig.key === key && sortConfig.direction === 'asc') {\r\n direction = 'desc';\r\n }\r\n setSortConfig({ key, direction });\r\n };\r\n\r\n const sortedData = useMemo(() => {\r\n const sortableItems = [...options.data];\r\n if (sortConfig !== null) {\r\n sortableItems.sort((a, b) => {\r\n const valA = a[sortConfig.key];\r\n const valB = b[sortConfig.key];\r\n\r\n if (valA < valB) return sortConfig.direction === 'asc' ? -1 : 1;\r\n if (valA > valB) return sortConfig.direction === 'asc' ? 1 : -1;\r\n return 0;\r\n });\r\n }\r\n return sortableItems;\r\n }, [options.data, sortConfig]);\r\n\r\n return {\r\n items: sortedData,\r\n requestSort,\r\n sortConfig,\r\n columns: options.columns,\r\n };\r\n}\r\n","import { useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseWebRTCOptions {\r\n iceServers?: RTCIceServer[];\r\n}\r\n\r\n/**\r\n * useWebRTC\r\n *\r\n * Basic wrapper for RTCPeerConnection.\r\n */\r\nexport function useWebRTC(options: UseWebRTCOptions = {}) {\r\n const [connectionState, setConnectionState] = useState<RTCPeerConnectionState>('new');\r\n const [signalingState, setSignalingState] = useState<RTCSignalingState>('stable');\r\n const pcRef = useRef<RTCPeerConnection | null>(null);\r\n\r\n useEffect(() => {\r\n const pc = new RTCPeerConnection({\r\n iceServers: options.iceServers || [{ urls: 'stun:stun.l.google.com:19302' }],\r\n });\r\n pcRef.current = pc;\r\n\r\n pc.onconnectionstatechange = () => setConnectionState(pc.connectionState);\r\n pc.onsignalingstatechange = () => setSignalingState(pc.signalingState);\r\n\r\n return () => {\r\n pc.close();\r\n };\r\n }, [options.iceServers]);\r\n\r\n return {\r\n pc: pcRef.current,\r\n connectionState,\r\n signalingState,\r\n };\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseWebSocketOptions {\r\n onOpen?: (event: Event) => void;\r\n onClose?: (event: CloseEvent) => void;\r\n onMessage?: (event: MessageEvent) => void;\r\n onError?: (event: Event) => void;\r\n reconnect?: boolean;\r\n reconnectAttempts?: number;\r\n reconnectInterval?: number;\r\n}\r\n\r\nexport function useWebSocket(url: string, options: UseWebSocketOptions = {}) {\r\n const {\r\n reconnect = true,\r\n reconnectAttempts = 5,\r\n reconnectInterval = 3000,\r\n } = options;\r\n\r\n const [isConnected, setIsConnected] = useState(false);\r\n const [lastMessage, setLastMessage] = useState<MessageEvent | null>(null);\r\n\r\n const wsRef = useRef<WebSocket | null>(null);\r\n const reconnectCountRef = useRef(0);\r\n const reconnectTimerRef = useRef<NodeJS.Timeout>();\r\n\r\n const connect = useCallback(() => {\r\n if (reconnectTimerRef.current) clearTimeout(reconnectTimerRef.current);\r\n\r\n const ws = new WebSocket(url);\r\n wsRef.current = ws;\r\n\r\n ws.onopen = (e) => {\r\n setIsConnected(true);\r\n reconnectCountRef.current = 0;\r\n options.onOpen?.(e);\r\n };\r\n\r\n ws.onclose = (e) => {\r\n setIsConnected(false);\r\n options.onClose?.(e);\r\n if (reconnect && reconnectCountRef.current < reconnectAttempts) {\r\n reconnectTimerRef.current = setTimeout(() => {\r\n reconnectCountRef.current++;\r\n connect();\r\n }, reconnectInterval);\r\n }\r\n };\r\n\r\n ws.onmessage = (e) => {\r\n setLastMessage(e);\r\n options.onMessage?.(e);\r\n };\r\n\r\n ws.onerror = (e) => {\r\n options.onError?.(e);\r\n };\r\n\r\n }, [url, reconnect, reconnectAttempts, reconnectInterval, options]); // options ref is better but simplicity here\r\n\r\n useEffect(() => {\r\n connect();\r\n return () => {\r\n if (reconnectTimerRef.current) clearTimeout(reconnectTimerRef.current);\r\n wsRef.current?.close();\r\n };\r\n }, [connect]);\r\n\r\n const send = useCallback((data: string | ArrayBuffer | Blob | ArrayBufferView) => {\r\n if (wsRef.current?.readyState === WebSocket.OPEN) {\r\n wsRef.current.send(data);\r\n }\r\n }, []);\r\n\r\n return {\r\n send,\r\n lastMessage,\r\n isConnected,\r\n ws: wsRef.current,\r\n };\r\n}\r\n","import { useEvent } from '../useEvent';\r\n\r\nexport function useClickAnywhere(handler: (event: MouseEvent) => void) {\r\n useEvent('click', (event) => {\r\n handler(event as MouseEvent);\r\n });\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport interface UseCountdownOptions {\r\n countStart: number;\r\n intervalMs?: number;\r\n isIncrement?: boolean;\r\n countStop?: number;\r\n}\r\n\r\nexport interface UseCountdownReturn {\r\n count: number;\r\n startCountdown: () => void;\r\n stopCountdown: () => void;\r\n resetCountdown: () => void;\r\n}\r\n\r\nexport function useCountdown({\r\n countStart,\r\n intervalMs = 1000,\r\n isIncrement = false,\r\n countStop = 0,\r\n}: UseCountdownOptions): UseCountdownReturn {\r\n const [count, setCount] = useState(countStart);\r\n const [isRunning, setIsRunning] = useState(false);\r\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\r\n\r\n const startCountdown = useCallback(() => setIsRunning(true), []);\r\n const stopCountdown = useCallback(() => setIsRunning(false), []);\r\n const resetCountdown = useCallback(() => {\r\n setIsRunning(false);\r\n setCount(countStart);\r\n }, [countStart]);\r\n\r\n useEffect(() => {\r\n if (!isRunning) {\r\n if (intervalRef.current) {\r\n clearInterval(intervalRef.current);\r\n intervalRef.current = null;\r\n }\r\n return;\r\n }\r\n\r\n intervalRef.current = setInterval(() => {\r\n setCount((prev) => {\r\n if (isIncrement) {\r\n if (prev < countStop) {\r\n return prev + 1;\r\n } else {\r\n setIsRunning(false);\r\n return prev;\r\n }\r\n } else {\r\n if (prev > countStop) {\r\n return prev - 1;\r\n } else {\r\n setIsRunning(false);\r\n return prev;\r\n }\r\n }\r\n });\r\n }, intervalMs);\r\n\r\n return () => {\r\n if (intervalRef.current) {\r\n clearInterval(intervalRef.current);\r\n }\r\n };\r\n }, [isRunning, intervalMs, isIncrement, countStop]);\r\n\r\n return { count, startCountdown, stopCountdown, resetCountdown };\r\n}\r\n","import { useEffect, useMemo, useRef } from 'react';\r\n\r\nexport interface DebounceOptions {\r\n leading?: boolean;\r\n trailing?: boolean;\r\n maxWait?: number;\r\n}\r\n\r\nexport interface ControlFunctions {\r\n cancel: () => void;\r\n flush: () => void;\r\n}\r\n\r\nexport function useDebounceCallback<T extends (...args: any[]) => any>(\r\n func: T,\r\n wait = 0,\r\n options: DebounceOptions = {}\r\n): ((...args: Parameters<T>) => void) & ControlFunctions {\r\n const funcRef = useRef(func);\r\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>();\r\n\r\n useEffect(() => {\r\n funcRef.current = func;\r\n }, [func]);\r\n\r\n const debounced = useMemo(() => {\r\n const debouncedFunc = (...args: Parameters<T>) => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n\r\n timeoutRef.current = setTimeout(() => {\r\n funcRef.current(...args);\r\n }, wait);\r\n };\r\n\r\n const cancel = () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n }\r\n };\r\n\r\n const flush = () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current);\r\n // Note: flush behavior usually executes immediately.\r\n // Simplified here for parity.\r\n }\r\n };\r\n\r\n (debouncedFunc as any).cancel = cancel;\r\n (debouncedFunc as any).flush = flush;\r\n\r\n return debouncedFunc as ((...args: Parameters<T>) => void) & ControlFunctions;\r\n }, [wait]);\r\n\r\n return debounced;\r\n}\r\n","import { useEffect, useState } from 'react';\r\n\r\nexport function useIsClient() {\r\n const [isClient, setIsClient] = useState(false);\r\n\r\n useEffect(() => {\r\n setIsClient(true);\r\n }, []);\r\n\r\n return isClient;\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface UseListActions<T> {\r\n set: (list: T[]) => void;\r\n push: (element: T) => void;\r\n updateAt: (index: number, element: T) => void;\r\n insertAt: (index: number, element: T) => void;\r\n update: (predicate: (a: T, b: T) => boolean, newElement: T) => void;\r\n removeAt: (index: number) => void;\r\n clear: () => void;\r\n reset: () => void;\r\n}\r\n\r\nexport type UseListReturn<T> = [T[], UseListActions<T>];\r\n\r\nexport function useList<T>(initialList: T[] = []): UseListReturn<T> {\r\n const [list, setList] = useState(initialList);\r\n\r\n const actions: UseListActions<T> = {\r\n set: useCallback((l) => setList(l), []),\r\n push: useCallback((element) => setList((l) => [...l, element]), []),\r\n updateAt: useCallback(\r\n (index, element) =>\r\n setList((l) => {\r\n const m = [...l];\r\n m[index] = element;\r\n return m;\r\n }),\r\n [],\r\n ),\r\n insertAt: useCallback(\r\n (index, element) =>\r\n setList((l) => {\r\n const m = [...l];\r\n m.splice(index, 0, element);\r\n return m;\r\n }),\r\n [],\r\n ),\r\n update: useCallback(\r\n (predicate, newElement) =>\r\n setList((l) => l.map((item) => (predicate(item, newElement) ? newElement : item))),\r\n [],\r\n ),\r\n removeAt: useCallback(\r\n (index) =>\r\n setList((l) => {\r\n const m = [...l];\r\n m.splice(index, 1);\r\n return m;\r\n }),\r\n [],\r\n ),\r\n clear: useCallback(() => setList([]), []),\r\n reset: useCallback(() => setList(initialList), [initialList]),\r\n };\r\n\r\n return [list, actions];\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport type MapOrEntries<K, V> = Map<K, V> | [K, V][];\r\n\r\nexport interface UseMapActions<K, V> {\r\n set: (key: K, value: V) => void;\r\n setAll: (entries: MapOrEntries<K, V>) => void;\r\n remove: (key: K) => void;\r\n reset: () => void;\r\n}\r\n\r\nexport type UseMapReturn<K, V> = [Map<K, V>, UseMapActions<K, V>];\r\n\r\n/**\r\n * useMap\r\n *\r\n * A specific hook for managing `Map` state in React.\r\n * Simplifies adding, removing, and updating Map entries while ensuring immutability.\r\n *\r\n * @param initialState - Initial Map entries\r\n * @returns [map, actions]\r\n *\r\n * @example\r\n * ```tsx\r\n * const initialData = [['key1', 'value1'], ['key2', 'value2']] as const;\r\n * const [map, mapActions] = useMap<string, string>(initialData);\r\n *\r\n * return (\r\n * <div>\r\n * <h3>Map Size: {map.size}</h3>\r\n *\r\n * <button onClick={() => mapActions.set('newKey', 'newValue')}>\r\n * Add/Update Key\r\n * </button>\r\n * <button onClick={() => mapActions.setAll([['fresh', 'start']])}>\r\n * Replace All\r\n * </button>\r\n * <button onClick={() => mapActions.reset()}>\r\n * Reset to Initial\r\n * </button>\r\n *\r\n * <ul>\r\n * {Array.from(map.entries()).map(([key, value]) => (\r\n * <li key={key}>\r\n * <strong>{key}:</strong> {value}\r\n * <button onClick={() => mapActions.remove(key)}>X</button>\r\n * </li>\r\n * ))}\r\n * </ul>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useMap<K, V>(\r\n initialState: MapOrEntries<K, V> = new Map()\r\n): UseMapReturn<K, V> {\r\n const [map, setMap] = useState(new Map(initialState));\r\n\r\n const actions: UseMapActions<K, V> = {\r\n set: useCallback((key, value) => {\r\n setMap((prev) => {\r\n const copy = new Map(prev);\r\n copy.set(key, value);\r\n return copy;\r\n });\r\n }, []),\r\n\r\n setAll: useCallback((entries) => {\r\n setMap(new Map(entries));\r\n }, []),\r\n\r\n remove: useCallback((key) => {\r\n setMap((prev) => {\r\n const copy = new Map(prev);\r\n copy.delete(key);\r\n return copy;\r\n });\r\n }, []),\r\n\r\n reset: useCallback(() => {\r\n setMap(new Map(initialState));\r\n }, [initialState]),\r\n };\r\n\r\n return [map, actions];\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface UseQueueActions<T> {\r\n add: (element: T) => void;\r\n remove: () => T | undefined;\r\n clear: () => void;\r\n}\r\n\r\nexport type UseQueueReturn<T> = {\r\n queue: T[];\r\n first: T;\r\n last: T;\r\n size: number;\r\n} & UseQueueActions<T>;\r\n\r\n/**\r\n * useQueue\r\n *\r\n * A hook for managing a queue data structure (FIFO - First In First Out).\r\n *\r\n * @param initialValue - Initial elements in the queue\r\n * @returns Object with queue state and operations\r\n *\r\n * @example\r\n * ```tsx\r\n * const {\r\n * add,\r\n * remove,\r\n * clear,\r\n * first,\r\n * last,\r\n * size,\r\n * queue\r\n * } = useQueue<string>(['Task 1']);\r\n *\r\n * return (\r\n * <div>\r\n * <h2>Task Queue ({size})</h2>\r\n *\r\n * <div className=\"controls\">\r\n * <button onClick={() => add(`Task ${Date.now()}`)}>Add Task</button>\r\n * <button onClick={() => remove()} disabled={size === 0}>Process Next</button>\r\n * <button onClick={clear}>Clear All</button>\r\n * </div>\r\n *\r\n * <div className=\"status\">\r\n * <p>Next: {first || 'None'}</p>\r\n * <p>Newest: {last || 'None'}</p>\r\n * </div>\r\n *\r\n * <ul>\r\n * {queue.map((task, index) => (\r\n * <li key={index}>{task}</li>\r\n * ))}\r\n * </ul>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\n/**\r\n * useQueue\r\n *\r\n * A hook for managing a queue data structure (FIFO - First In First Out).\r\n *\r\n * @param initialValue - Initial elements in the queue\r\n * @returns Object with queue state and operations\r\n *\r\n * @example\r\n * ```tsx\r\n * const {\r\n * add,\r\n * remove,\r\n * clear,\r\n * first,\r\n * last,\r\n * size,\r\n * queue\r\n * } = useQueue<string>(['Task 1']);\r\n *\r\n * return (\r\n * <div>\r\n * <h2>Task Queue ({size})</h2>\r\n *\r\n * <div className=\"controls\">\r\n * <button onClick={() => add(`Task ${Date.now()}`)}>Add Task</button>\r\n * <button onClick={() => remove()} disabled={size === 0}>Process Next</button>\r\n * <button onClick={clear}>Clear All</button>\r\n * </div>\r\n *\r\n * <div className=\"status\">\r\n * <p>Next: {first || 'None'}</p>\r\n * <p>Newest: {last || 'None'}</p>\r\n * </div>\r\n *\r\n * <ul>\r\n * {queue.map((task, index) => (\r\n * <li key={index}>{task}</li>\r\n * ))}\r\n * </ul>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useQueue<T>(initialValue: T[] = []): UseQueueReturn<T> {\r\n const [queue, setQueue] = useState(initialValue);\r\n\r\n const add = useCallback((element: T) => {\r\n setQueue((q) => [...q, element]);\r\n }, []);\r\n\r\n const remove = useCallback(() => {\r\n let removedElement: T | undefined;\r\n setQueue((q) => {\r\n const [first, ...rest] = q;\r\n removedElement = first;\r\n return rest;\r\n });\r\n return removedElement;\r\n }, []);\r\n\r\n const clear = useCallback(() => {\r\n setQueue([]);\r\n }, []);\r\n\r\n return {\r\n queue,\r\n add,\r\n remove,\r\n clear,\r\n first: queue[0],\r\n last: queue[queue.length - 1],\r\n size: queue.length,\r\n };\r\n}\r\n","import { useEffect, useState } from 'react';\r\nimport { useEvent } from '../useEvent';\r\n\r\nexport function useScreen() {\r\n const getScreen = () => {\r\n if (typeof window !== 'undefined' && window.screen) {\r\n return window.screen;\r\n }\r\n return undefined;\r\n };\r\n\r\n const [screen, setScreen] = useState<Screen | undefined>(getScreen());\r\n\r\n const handleResize = () => {\r\n setScreen(getScreen());\r\n };\r\n\r\n useEvent('resize', handleResize);\r\n\r\n useEffect(() => {\r\n setScreen(getScreen());\r\n }, []);\r\n\r\n return screen;\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport interface UseSetActions<K> {\r\n add: (key: K) => void;\r\n remove: (key: K) => void;\r\n toggle: (key: K) => void;\r\n reset: () => void;\r\n clear: () => void;\r\n}\r\n\r\nexport type UseSetReturn<K> = [Set<K>, UseSetActions<K>];\r\n\r\n/**\r\n * useSet\r\n *\r\n * A specific hook for managing `Set` state in React.\r\n * Useful for tracking selections, tags, or active filters.\r\n *\r\n * @param initialSet - Initial Set entries\r\n * @returns [set, actions]\r\n *\r\n * @example\r\n * ```tsx\r\n * const availableTags = ['React', 'Vue', 'Angular', 'Svelte'];\r\n * const [selectedTags, { toggle, has, clear }] = useSet<string>(new Set(['React']));\r\n *\r\n * return (\r\n * <div>\r\n * <h2>Select Frameworks ({selectedTags.size})</h2>\r\n *\r\n * <div className=\"tags\">\r\n * {availableTags.map(tag => (\r\n * <button\r\n * key={tag}\r\n * onClick={() => toggle(tag)}\r\n * className={selectedTags.has(tag) ? 'active' : ''}\r\n * >\r\n * {tag} {selectedTags.has(tag) ? '✓' : ''}\r\n * </button>\r\n * ))}\r\n * </div>\r\n *\r\n * <button onClick={clear}>Clear Selection</button>\r\n *\r\n * <pre>\r\n * Selection: {JSON.stringify(Array.from(selectedTags))}\r\n * </pre>\r\n * </div>\r\n * );\r\n * ```\r\n */\r\nexport function useSet<K>(initialSet = new Set<K>()): UseSetReturn<K> {\r\n const [set, setSet] = useState(initialSet);\r\n\r\n const actions: UseSetActions<K> = {\r\n add: useCallback((key) => {\r\n setSet((prev) => {\r\n const copy = new Set(prev);\r\n copy.add(key);\r\n return copy;\r\n });\r\n }, []),\r\n\r\n remove: useCallback((key) => {\r\n setSet((prev) => {\r\n const copy = new Set(prev);\r\n copy.delete(key);\r\n return copy;\r\n });\r\n }, []),\r\n\r\n toggle: useCallback((key) => {\r\n setSet((prev) => {\r\n const copy = new Set(prev);\r\n if (copy.has(key)) {\r\n copy.delete(key);\r\n } else {\r\n copy.add(key);\r\n }\r\n return copy;\r\n });\r\n }, []),\r\n\r\n reset: useCallback(() => {\r\n setSet(initialSet);\r\n }, [initialSet]),\r\n\r\n clear: useCallback(() => {\r\n setSet(new Set());\r\n }, []),\r\n };\r\n\r\n return [set, actions];\r\n}\r\n"],"mappings":"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","names":["useCallback","useState","useEffect","useEffect","useRef","useEffect","useRef","useCallback","useEffect","useRef","useState","useEffect","useRef","useState","useCallback","useEffect","useState","useCallback","useState","useEffect","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useEffect","useRef","useState","useCallback","useEffect","useRef","useState","useEffect","useRef","useCallback","useEffect","useRef","useCallback","useEffect","useRef","useCallback","useEffect","useState","useCallback","useState","useEffect","useCallback","useEffect","useState","useCallback","useState","useEffect","useEffect","useRef","useRef","useEffect","useCallback","useRef","useState","useCallback","useEffect","useState","useState","useCallback","useEffect","event","useEffect","useRef","useState","useState","useRef","useEffect","useEffect","useRef","useState","useState","useRef","useEffect","useCallback","useState","useState","useCallback","useEffect","useRef","useRef","useEffect","useEffect","useEffect","useCallback","useCallback","useEffect","useRef","useRef","useEffect","useCallback","useRef","useEffect","useState","useState","useEffect","useEffect","useRef","useState","useState","useRef","useEffect","useEffect","useRef","useRef","useEffect","useEffect","useEffect","useCallback","useCallback","useCallback","useEffect","useState","useState","useCallback","useEffect","useEffect","useState","useState","useEffect","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useState","useState","useCallback","error","useEffect","useState","useState","useEffect","useCallback","useEffect","useRef","useState","useState","useRef","useCallback","useEffect","useEffect","useState","useState","useEffect","useCallback","useRef","useState","useEffect","useState","useState","useEffect","useCallback","useState","useState","useCallback","device","server","useEffect","useRef","useState","useState","useRef","useEffect","useCallback","useState","useState","useCallback","file","useEffect","useState","useState","useEffect","useCallback","useEffect","useRef","useState","error","useCallback","useEffect","useRef","useState","error","useEffect","useRef","useState","useState","useRef","useEffect","useCallback","useEffect","useRef","useState","useState","useRef","useEffect","useCallback","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useState","value","useCallback","useMemo","useState","prev","useCallback","useMemo","useState","prev","useCallback","useMemo","useState","useEffect","useRef","useRef","useEffect","useCallback","useState","useCallback","useState","useCallback","useState","useCallback","useRef","useState","useCallback","useState","useCallback","useState","useMemo","useMemo","useCallback","useEffect","useRef","useState","useCallback","useEffect","useRef","useState","useCallback","useEffect","useRef","useRef","useCallback","useEffect","useCallback","useEffect","useRef","useState","useEffect","useRef","useEffect","useRef","useState","useEffect","useRef","useEffect","useRef","useState","useEffect","useRef","useState","useEffect","useState","useEffect","useRef","useCallback","useEffect","useRef","useState","useMemo","useState","useCallback","useEffect","useRef","useState","useCallback","useState","useCallback","useState","useCallback","useState","useEffect","useState","useCallback","useState","useEffect","useCallback","useState","useState","useMemo","useState","useEffect","useRef","useState","useCallback","useEffect","useRef","useState","useCallback","useEffect","useRef","useState","useEffect","useMemo","useRef","useEffect","useState","useCallback","useState","useCallback","useState","useCallback","useState","useEffect","useState","useState","useEffect","useCallback","useState"]}
|