@fictjs/hooks 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/index.cjs +2548 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +744 -0
- package/dist/index.d.ts +744 -0
- package/dist/index.js +2483 -0
- package/dist/index.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lifecycle/useMount.ts","../src/lifecycle/useUnmount.ts","../src/async/useAsyncState.ts","../src/async/useFetch.ts","../src/internal/value.ts","../src/async/useRequest.ts","../src/clipboard/useClipboard.ts","../src/internal/env.ts","../src/event/useEventListener.ts","../src/internal/target.ts","../src/internal/event.ts","../src/event/useClickOutside.ts","../src/event/useFocusWithin.ts","../src/event/useHover.ts","../src/event/useKeyPress.ts","../src/internal/timing.ts","../src/timing/useDebounceFn.ts","../src/timing/useIntervalFn.ts","../src/timing/useRafFn.ts","../src/timing/useThrottleFn.ts","../src/timing/useTimeoutFn.ts","../src/internal/storage.ts","../src/storage/useLocalStorage.ts","../src/storage/useSessionStorage.ts","../src/storage/useStorage.ts","../src/observer/useIntersectionObserver.ts","../src/observer/useMutationObserver.ts","../src/observer/useResizeObserver.ts","../src/state/useCounter.ts","../src/state/usePrevious.ts","../src/state/useToggle.ts","../src/state/useVirtualList.ts","../src/browser/useDocumentVisibility.ts","../src/browser/useMediaQuery.ts","../src/browser/useNetwork.ts","../src/browser/useScroll.ts","../src/browser/usePermission.ts","../src/browser/useGeolocation.ts","../src/browser/useIdle.ts","../src/browser/useSize.ts","../src/browser/useWebSocket.ts","../src/browser/useWindowSize.ts","../src/browser/useWindowScroll.ts","../src/browser/useTitle.ts","../src/browser/useFullscreen.ts"],"sourcesContent":["import { onMount, type Cleanup } from '@fictjs/runtime';\n\nexport type MountCallback = () => void | Cleanup;\n\n/**\n * Register a callback that runs after the current root mounts.\n *\n * @fictReturn {}\n */\nexport function useMount(callback: MountCallback): void {\n onMount(callback);\n}\n","import { onDestroy, type Cleanup } from '@fictjs/runtime';\n\nexport type UnmountCallback = () => void | Cleanup;\n\n/**\n * Register cleanup logic for root disposal.\n *\n * @fictReturn {}\n */\nexport function useUnmount(callback: UnmountCallback): void {\n onDestroy(callback);\n}\n","import { createSignal } from '@fictjs/runtime/advanced';\n\nexport interface UseAsyncStateOptions {\n immediate?: boolean;\n resetOnExecute?: boolean;\n onError?: (error: unknown) => void;\n}\n\nexport interface UseAsyncStateReturn<T, Args extends unknown[]> {\n state: () => T;\n isLoading: () => boolean;\n error: () => unknown;\n execute: (...args: Args) => Promise<T>;\n}\n\n/**\n * Lightweight async state manager with race protection.\n *\n * @fictReturn { state: 'signal', isLoading: 'signal', error: 'signal' }\n */\nexport function useAsyncState<T, Args extends unknown[] = []>(\n executor: (...args: Args) => Promise<T>,\n initialState: T,\n options: UseAsyncStateOptions = {}\n): UseAsyncStateReturn<T, Args> {\n const state = createSignal(initialState);\n const isLoading = createSignal(false);\n const error = createSignal<unknown>(null);\n\n let callId = 0;\n\n const execute = async (...args: Args): Promise<T> => {\n const id = ++callId;\n\n if (options.resetOnExecute) {\n state(initialState);\n }\n\n isLoading(true);\n error(null);\n\n try {\n const result = await executor(...args);\n if (id === callId) {\n state(result);\n }\n return result;\n } catch (err) {\n if (id === callId) {\n error(err);\n }\n options.onError?.(err);\n throw err;\n } finally {\n if (id === callId) {\n isLoading(false);\n }\n }\n };\n\n if (options.immediate) {\n void execute(...([] as unknown as Args)).catch(() => {\n // ignore by default; error signal + onError handle it\n });\n }\n\n return {\n state,\n isLoading,\n error,\n execute\n };\n}\n","import { createSignal } from '@fictjs/runtime/advanced';\nimport { toValue, type MaybeAccessor } from '../internal/value';\n\nexport interface UseFetchOptions<T> {\n immediate?: boolean;\n initialData?: T | null;\n fetch?: typeof fetch;\n parse?: (response: Response) => Promise<T>;\n onError?: (error: unknown) => void;\n init?: RequestInit;\n}\n\nexport interface UseFetchReturn<T> {\n data: () => T | null;\n error: () => unknown;\n isLoading: () => boolean;\n status: () => number | null;\n aborted: () => boolean;\n execute: (init?: RequestInit) => Promise<T | null>;\n abort: () => void;\n}\n\nasync function defaultParse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n return (await response.json()) as T;\n }\n return (await response.text()) as T;\n}\n\n/**\n * Fetch helper with loading/error/abort state.\n *\n * @fictReturn { data: 'signal', error: 'signal', isLoading: 'signal', status: 'signal', aborted: 'signal' }\n */\nexport function useFetch<T = unknown>(\n input: RequestInfo | URL | MaybeAccessor<RequestInfo | URL>,\n options: UseFetchOptions<T> = {}\n): UseFetchReturn<T> {\n const data = createSignal<T | null>(options.initialData ?? null);\n const error = createSignal<unknown>(null);\n const isLoading = createSignal(false);\n const status = createSignal<number | null>(null);\n const aborted = createSignal(false);\n\n const fetcher = options.fetch ?? fetch;\n const parse = options.parse ?? defaultParse<T>;\n\n let requestId = 0;\n let controller: AbortController | undefined;\n\n const abort = () => {\n if (controller) {\n controller.abort();\n controller = undefined;\n aborted(true);\n isLoading(false);\n }\n };\n\n const execute = async (init?: RequestInit): Promise<T | null> => {\n const id = ++requestId;\n\n abort();\n error(null);\n isLoading(true);\n aborted(false);\n\n controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined;\n\n try {\n const response = await fetcher(toValue(input as MaybeAccessor<RequestInfo | URL>), {\n ...options.init,\n ...init,\n signal: controller?.signal\n });\n\n if (id !== requestId) {\n return data();\n }\n\n status(response.status);\n\n if (!response.ok) {\n throw new Error(`Fetch failed with status ${response.status}`);\n }\n\n const parsed = await parse(response);\n data(parsed);\n return parsed;\n } catch (err) {\n if (id !== requestId) {\n return data();\n }\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n aborted(true);\n return data();\n }\n\n error(err);\n options.onError?.(err);\n return data();\n } finally {\n if (id === requestId) {\n isLoading(false);\n }\n }\n };\n\n if (options.immediate ?? true) {\n void execute();\n }\n\n return {\n data,\n error,\n isLoading,\n status,\n aborted,\n execute,\n abort\n };\n}\n","export type MaybeAccessor<T> = T | (() => T);\n\nexport function toValue<T>(value: MaybeAccessor<T>): T {\n return typeof value === 'function' ? (value as () => T)() : value;\n}\n\nexport function toArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function isFunction(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === 'function';\n}\n","import { onDestroy } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\n\ninterface CacheEntry<T> {\n data: T;\n timestamp: number;\n}\n\nconst requestCache = new Map<string, CacheEntry<unknown>>();\n\nexport interface UseRequestOptions<TData, TParams extends unknown[]> {\n manual?: boolean;\n defaultParams?: TParams;\n retryCount?: number;\n retryInterval?: number;\n pollingInterval?: number;\n cacheKey?: string;\n staleTime?: number;\n onSuccess?: (data: TData, params: TParams) => void;\n onError?: (error: unknown, params: TParams) => void;\n onFinally?: (params: TParams, data?: TData, error?: unknown) => void;\n}\n\nexport interface UseRequestReturn<TData, TParams extends unknown[]> {\n data: () => TData | undefined;\n error: () => unknown;\n loading: () => boolean;\n params: () => TParams | undefined;\n run: (...params: TParams) => void;\n runAsync: (...params: TParams) => Promise<TData | undefined>;\n cancel: () => void;\n refresh: () => Promise<TData | undefined>;\n mutate: (value: TData | ((prev: TData | undefined) => TData)) => void;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Lightweight request manager with retry, polling and cache.\n *\n * @fictReturn { data: 'signal', error: 'signal', loading: 'signal', params: 'signal' }\n */\nexport function useRequest<TData, TParams extends unknown[] = []>(\n service: (...params: TParams) => Promise<TData>,\n options: UseRequestOptions<TData, TParams> = {}\n): UseRequestReturn<TData, TParams> {\n const data = createSignal<TData | undefined>(undefined);\n const error = createSignal<unknown>(null);\n const loading = createSignal(false);\n const params = createSignal<TParams | undefined>(options.defaultParams);\n\n let callId = 0;\n let pollingTimer: ReturnType<typeof setTimeout> | undefined;\n\n const applyCache = () => {\n if (!options.cacheKey) {\n return;\n }\n\n const entry = requestCache.get(options.cacheKey) as CacheEntry<TData> | undefined;\n if (!entry) {\n return;\n }\n\n const staleTime = options.staleTime ?? 0;\n if (staleTime > 0 && Date.now() - entry.timestamp > staleTime) {\n requestCache.delete(options.cacheKey);\n return;\n }\n\n data(entry.data);\n };\n\n const saveCache = (value: TData) => {\n if (!options.cacheKey) {\n return;\n }\n\n requestCache.set(options.cacheKey, {\n data: value,\n timestamp: Date.now()\n });\n };\n\n const stopPolling = () => {\n if (pollingTimer) {\n clearTimeout(pollingTimer);\n pollingTimer = undefined;\n }\n };\n\n const schedulePolling = (currentParams: TParams) => {\n stopPolling();\n\n if (!options.pollingInterval || options.pollingInterval <= 0) {\n return;\n }\n\n pollingTimer = setTimeout(() => {\n void runAsync(...currentParams);\n }, options.pollingInterval);\n };\n\n const runWithRetry = async (currentParams: TParams, currentId: number): Promise<TData> => {\n const retryCount = options.retryCount ?? 0;\n const retryInterval = options.retryInterval ?? 1000;\n\n let attempt = 0;\n while (true) {\n try {\n return await service(...currentParams);\n } catch (err) {\n if (currentId !== callId) {\n throw err;\n }\n\n if (attempt >= retryCount) {\n throw err;\n }\n\n attempt += 1;\n await delay(retryInterval);\n }\n }\n };\n\n const runAsync = async (...currentParams: TParams): Promise<TData | undefined> => {\n const id = ++callId;\n\n stopPolling();\n loading(true);\n error(null);\n params(currentParams);\n\n try {\n const result = await runWithRetry(currentParams, id);\n if (id !== callId) {\n return data();\n }\n\n data(result);\n saveCache(result);\n options.onSuccess?.(result, currentParams);\n schedulePolling(currentParams);\n return result;\n } catch (err) {\n if (id !== callId) {\n return data();\n }\n\n error(err);\n options.onError?.(err, currentParams);\n schedulePolling(currentParams);\n return data();\n } finally {\n if (id === callId) {\n loading(false);\n }\n options.onFinally?.(currentParams, data(), error());\n }\n };\n\n const run = (...currentParams: TParams) => {\n void runAsync(...currentParams);\n };\n\n const cancel = () => {\n callId += 1;\n loading(false);\n stopPolling();\n };\n\n const refresh = async () => {\n const currentParams = params() ?? options.defaultParams;\n if (!currentParams) {\n return data();\n }\n return runAsync(...currentParams);\n };\n\n const mutate = (value: TData | ((prev: TData | undefined) => TData)) => {\n const next =\n typeof value === 'function' ? (value as (prev: TData | undefined) => TData)(data()) : value;\n data(next);\n saveCache(next);\n };\n\n applyCache();\n\n if (!options.manual && options.defaultParams) {\n void runAsync(...options.defaultParams);\n }\n\n onDestroy(cancel);\n\n return {\n data,\n error,\n loading,\n params,\n run,\n runAsync,\n cancel,\n refresh,\n mutate\n };\n}\n","import { onDestroy } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { defaultDocument, defaultNavigator, defaultWindow } from '../internal/env';\n\ntype NavigatorClipboardLike = {\n clipboard?: {\n writeText: (text: string) => Promise<void>;\n };\n};\n\nexport interface UseClipboardOptions {\n navigator?: NavigatorClipboardLike | null;\n document?: Document | null;\n window?: Window | null;\n copiedDuring?: number;\n}\n\nexport interface UseClipboardReturn {\n text: () => string;\n copied: () => boolean;\n isSupported: () => boolean;\n copy: (value: string) => Promise<boolean>;\n}\n\nfunction fallbackCopy(value: string, documentRef: Document): boolean {\n const textarea = documentRef.createElement('textarea');\n textarea.value = value;\n textarea.setAttribute('readonly', 'true');\n textarea.style.position = 'absolute';\n textarea.style.left = '-9999px';\n documentRef.body.appendChild(textarea);\n textarea.select();\n\n let ok = false;\n try {\n ok = documentRef.execCommand('copy');\n } catch {\n ok = false;\n }\n\n documentRef.body.removeChild(textarea);\n return ok;\n}\n\n/**\n * Clipboard write helper with copied state.\n *\n * @fictReturn { text: 'signal', copied: 'signal', isSupported: 'signal' }\n */\nexport function useClipboard(options: UseClipboardOptions = {}): UseClipboardReturn {\n const navigatorRef =\n options.navigator === undefined\n ? (defaultNavigator as NavigatorClipboardLike | undefined)\n : options.navigator;\n const documentRef = options.document === undefined ? defaultDocument : options.document;\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n\n const text = createSignal('');\n const copied = createSignal(false);\n const isSupported = createSignal(\n !!navigatorRef?.clipboard?.writeText || !!documentRef?.execCommand\n );\n\n const copiedDuring = options.copiedDuring ?? 1500;\n let timer: number | undefined;\n\n const resetCopiedLater = () => {\n if (!windowRef) {\n copied(false);\n return;\n }\n if (timer) {\n clearTimeout(timer);\n }\n timer = windowRef.setTimeout(() => {\n copied(false);\n timer = undefined;\n }, copiedDuring);\n };\n\n const copy = async (value: string): Promise<boolean> => {\n text(value);\n\n if (navigatorRef?.clipboard?.writeText) {\n try {\n await navigatorRef.clipboard.writeText(value);\n copied(true);\n resetCopiedLater();\n return true;\n } catch {\n copied(false);\n return false;\n }\n }\n\n if (documentRef) {\n const ok = fallbackCopy(value, documentRef);\n copied(ok);\n if (ok) {\n resetCopiedLater();\n }\n return ok;\n }\n\n copied(false);\n return false;\n };\n\n onDestroy(() => {\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n });\n\n return {\n text,\n copied,\n isSupported,\n copy\n };\n}\n","export const isClient = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nexport const defaultWindow = isClient ? window : undefined;\nexport const defaultDocument = isClient ? document : undefined;\nexport const defaultNavigator = typeof navigator !== 'undefined' ? navigator : undefined;\n","import { createEffect, onCleanup } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { addEventListeners, type EventName, type UseEventListenerOptions } from '../internal/event';\nimport { resolveTargetList, type MaybeTarget } from '../internal/target';\nimport { toArray, toValue, type MaybeAccessor } from '../internal/value';\n\nexport interface UseEventListenerControls {\n start: () => void;\n stop: () => void;\n active: () => boolean;\n}\n\n/**\n * Bind event listeners with automatic teardown.\n *\n * @fictReturn { active: 'signal' }\n */\nexport function useEventListener<E extends Event = Event>(\n target: MaybeTarget<EventTarget> | Array<MaybeTarget<EventTarget>>,\n event: EventName | MaybeAccessor<EventName>,\n handler: (event: E) => void,\n options: UseEventListenerOptions = {}\n): UseEventListenerControls {\n const active = createSignal(options.immediate ?? true);\n let stopCurrent = () => {};\n\n const bind = (): (() => void) | undefined => {\n const targets = resolveTargetList(target);\n const eventNames = toArray(toValue(event as MaybeAccessor<EventName>));\n\n if (targets.length === 0 || eventNames.length === 0) {\n return undefined;\n }\n\n const listener = (eventObject: Event) => {\n handler(eventObject as E);\n };\n\n const listenerOptions: AddEventListenerOptions = {\n capture: options.capture,\n once: options.once,\n passive: options.passive\n };\n const controller = addEventListeners(targets, eventNames, listener, listenerOptions);\n return () => controller.stop();\n };\n\n createEffect(() => {\n stopCurrent();\n stopCurrent = () => {};\n\n if (!active()) {\n return;\n }\n\n const stop = bind();\n if (!stop) {\n return;\n }\n stopCurrent = () => {\n stop();\n stopCurrent = () => {};\n };\n\n onCleanup(() => {\n stopCurrent();\n });\n });\n\n return {\n start() {\n if (!active()) {\n active(true);\n const stop = bind();\n if (stop) {\n stopCurrent = () => {\n stop();\n stopCurrent = () => {};\n };\n }\n }\n },\n stop() {\n if (!active()) {\n return;\n }\n active(false);\n stopCurrent();\n },\n active\n };\n}\n","import { toArray, toValue, type MaybeAccessor } from './value';\n\nexport interface RefLike<T> {\n current: T | null | undefined;\n}\n\nexport type MaybeRefOrAccessor<T> =\n | T\n | null\n | undefined\n | RefLike<T>\n | (() => T | null | undefined);\n\nexport function resolveTarget<T>(target: MaybeRefOrAccessor<T>): T | undefined {\n if (target == null) {\n return undefined;\n }\n\n if (typeof target === 'function') {\n return (target as () => T | null | undefined)() ?? undefined;\n }\n\n if (typeof target === 'object' && 'current' in target) {\n return target.current ?? undefined;\n }\n\n return target;\n}\n\nexport type MaybeTarget<T> = MaybeRefOrAccessor<T> | MaybeAccessor<MaybeRefOrAccessor<T>>;\n\nexport function resolveMaybeTarget<T>(target: MaybeTarget<T>): T | undefined {\n const resolved = toValue(target as MaybeAccessor<MaybeRefOrAccessor<T>>);\n return resolveTarget(resolved);\n}\n\nexport function resolveTargetList<T>(target: MaybeTarget<T> | Array<MaybeTarget<T>>): T[] {\n return toArray(target)\n .map((item) => resolveMaybeTarget(item))\n .filter((item): item is T => item != null);\n}\n\nexport type MaybeElement = MaybeTarget<Element>;\n\nexport type IgnoreTarget = MaybeElement | string;\n\nexport function resolveIgnoreElement(\n ignore: IgnoreTarget,\n doc: Document\n): Element | Element[] | undefined {\n if (typeof ignore === 'string') {\n return Array.from(doc.querySelectorAll(ignore));\n }\n\n return resolveMaybeTarget(ignore);\n}\n","import { resolveTargetList, type MaybeTarget } from './target';\nimport { toArray } from './value';\n\nexport interface EventListenerController {\n stop: () => void;\n}\n\nexport type EventName = string | string[];\n\nexport interface UseEventListenerOptions extends AddEventListenerOptions {\n immediate?: boolean;\n}\n\nexport function addEventListeners(\n targets: MaybeTarget<EventTarget> | Array<MaybeTarget<EventTarget>>,\n events: EventName,\n listener: EventListener,\n options?: AddEventListenerOptions\n): EventListenerController {\n const resolvedTargets = resolveTargetList(targets);\n const names = toArray(events);\n\n for (const target of resolvedTargets) {\n for (const name of names) {\n target.addEventListener(name, listener, options);\n }\n }\n\n let active = true;\n\n return {\n stop() {\n if (!active) {\n return;\n }\n\n active = false;\n for (const target of resolvedTargets) {\n for (const name of names) {\n target.removeEventListener(name, listener, options);\n }\n }\n }\n };\n}\n","import { useEventListener } from './useEventListener';\nimport {\n resolveIgnoreElement,\n resolveTargetList,\n type IgnoreTarget,\n type MaybeElement\n} from '../internal/target';\nimport { defaultDocument, defaultWindow } from '../internal/env';\nimport { toArray } from '../internal/value';\n\nexport interface UseClickOutsideOptions {\n window?: Window | null;\n document?: Document | null;\n ignore?: IgnoreTarget | IgnoreTarget[];\n capture?: boolean;\n}\n\nexport interface UseClickOutsideControls {\n start: () => void;\n stop: () => void;\n active: () => boolean;\n trigger: (event?: Event) => void;\n}\n\nfunction isNodeInside(elements: Element[], node: Node): boolean {\n return elements.some((element) => element.contains(node));\n}\n\n/**\n * Trigger handler when pointer interaction happens outside target elements.\n *\n * @fictReturn { active: 'signal' }\n */\nexport function useClickOutside(\n target: MaybeElement | MaybeElement[],\n handler: (event: Event) => void,\n options: UseClickOutsideOptions = {}\n): UseClickOutsideControls {\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n const documentRef = options.document === undefined ? defaultDocument : options.document;\n const ignoreTargets = options.ignore ? toArray(options.ignore) : [];\n\n let pointerDownOutside = false;\n\n const isOutside = (event: Event) => {\n const node = event.target as Node | null;\n if (!node || !documentRef) {\n return false;\n }\n\n const targetElements = resolveTargetList(target);\n if (targetElements.length === 0) {\n return false;\n }\n\n const ignoreElements = ignoreTargets.flatMap((item) => {\n const resolved = resolveIgnoreElement(item, documentRef);\n if (!resolved) {\n return [];\n }\n return Array.isArray(resolved) ? resolved : [resolved];\n });\n\n if (isNodeInside(targetElements, node) || isNodeInside(ignoreElements, node)) {\n return false;\n }\n\n return true;\n };\n\n const onPointerDown = (event: Event) => {\n pointerDownOutside = isOutside(event);\n };\n\n const onClick = (event: Event) => {\n if (pointerDownOutside && isOutside(event)) {\n handler(event);\n }\n pointerDownOutside = false;\n };\n\n const downControls = useEventListener(windowRef, 'pointerdown', onPointerDown, {\n capture: options.capture ?? true,\n passive: true\n });\n const clickControls = useEventListener(windowRef, 'click', onClick, {\n capture: options.capture ?? true,\n passive: true\n });\n\n return {\n start() {\n downControls.start();\n clickControls.start();\n },\n stop() {\n downControls.stop();\n clickControls.stop();\n },\n active() {\n return downControls.active() && clickControls.active();\n },\n trigger(event) {\n handler(event ?? new Event('click'));\n }\n };\n}\n","import { createEffect } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { resolveMaybeTarget, type MaybeElement } from '../internal/target';\nimport { useEventListener } from './useEventListener';\n\nexport interface UseFocusWithinOptions {\n initialValue?: boolean;\n}\n\nexport interface UseFocusWithinReturn {\n focused: () => boolean;\n}\n\n/**\n * Track whether focus is currently inside a target element.\n *\n * @fictReturn { focused: 'signal' }\n */\nexport function useFocusWithin(\n target: MaybeElement,\n options: UseFocusWithinOptions = {}\n): UseFocusWithinReturn {\n const initialValue = options.initialValue ?? false;\n const focused = createSignal(initialValue);\n let previousTarget: Element | undefined;\n\n useEventListener(target, 'focusin', () => {\n focused(true);\n });\n\n useEventListener(target, 'focusout', (event) => {\n const targetElement = resolveMaybeTarget(target);\n if (!targetElement) {\n focused(false);\n return;\n }\n\n const relatedTarget = (event as FocusEvent).relatedTarget as Node | null;\n if (relatedTarget && targetElement.contains(relatedTarget)) {\n return;\n }\n focused(false);\n });\n\n createEffect(() => {\n const currentTarget = resolveMaybeTarget(target);\n if (currentTarget !== previousTarget) {\n previousTarget = currentTarget;\n focused(initialValue);\n }\n });\n\n return { focused };\n}\n","import { createEffect } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { resolveMaybeTarget, type MaybeElement } from '../internal/target';\nimport { useEventListener } from './useEventListener';\n\nexport interface UseHoverOptions {\n initialValue?: boolean;\n}\n\nexport interface UseHoverReturn {\n hovered: () => boolean;\n}\n\n/**\n * Track hover state for an element target.\n *\n * @fictReturn { hovered: 'signal' }\n */\nexport function useHover(target: MaybeElement, options: UseHoverOptions = {}): UseHoverReturn {\n const initialValue = options.initialValue ?? false;\n const hovered = createSignal(initialValue);\n let previousTarget: Element | undefined;\n\n useEventListener(target, 'pointerenter', () => {\n hovered(true);\n });\n useEventListener(target, 'pointerleave', () => {\n hovered(false);\n });\n\n createEffect(() => {\n const currentTarget = resolveMaybeTarget(target);\n if (currentTarget !== previousTarget) {\n previousTarget = currentTarget;\n hovered(initialValue);\n }\n });\n\n return { hovered };\n}\n","import { defaultWindow } from '../internal/env';\nimport type { MaybeTarget } from '../internal/target';\nimport { toArray } from '../internal/value';\nimport { useEventListener, type UseEventListenerControls } from './useEventListener';\n\nexport type KeyEventName = 'keydown' | 'keyup' | 'keypress';\nexport type KeyFilter = string | string[] | ((event: KeyboardEvent) => boolean);\n\nexport interface UseKeyPressOptions {\n target?: MaybeTarget<EventTarget> | Array<MaybeTarget<EventTarget>> | null;\n events?: KeyEventName | KeyEventName[];\n exactMatch?: boolean;\n passive?: boolean;\n capture?: boolean;\n preventDefault?: boolean;\n immediate?: boolean;\n}\n\nconst modifierAliases: Record<string, 'ctrl' | 'alt' | 'shift' | 'meta'> = {\n ctrl: 'ctrl',\n control: 'ctrl',\n alt: 'alt',\n option: 'alt',\n shift: 'shift',\n meta: 'meta',\n cmd: 'meta',\n command: 'meta'\n};\n\nconst keyAliases: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n del: 'delete',\n space: ' ',\n spacebar: ' '\n};\n\nfunction normalizeToken(token: string): string {\n return token.trim().toLowerCase();\n}\n\nfunction normalizeKey(key: string): string {\n const normalized = normalizeToken(key);\n return keyAliases[normalized] ?? normalized;\n}\n\nfunction parseCombo(combo: string): string[] {\n return combo\n .split(/[.+]/g)\n .map((part) => normalizeToken(part))\n .filter(Boolean);\n}\n\nfunction isModifierToken(token: string): boolean {\n return token in modifierAliases;\n}\n\nfunction isModifierActive(\n modifier: 'ctrl' | 'alt' | 'shift' | 'meta',\n event: KeyboardEvent\n): boolean {\n if (modifier === 'ctrl') return event.ctrlKey;\n if (modifier === 'alt') return event.altKey;\n if (modifier === 'shift') return event.shiftKey;\n return event.metaKey;\n}\n\nfunction activeModifierCount(event: KeyboardEvent): number {\n return (\n Number(event.ctrlKey) + Number(event.altKey) + Number(event.shiftKey) + Number(event.metaKey)\n );\n}\n\nfunction matchesCombo(event: KeyboardEvent, combo: string, exactMatch: boolean): boolean {\n const tokens = parseCombo(combo);\n if (tokens.length === 0) {\n return false;\n }\n\n const modifiers = tokens.filter(isModifierToken).map((token) => modifierAliases[token]);\n const nonModifiers = tokens.filter((token) => !isModifierToken(token));\n\n for (const modifier of modifiers) {\n if (!isModifierActive(modifier, event)) {\n return false;\n }\n }\n\n const keyMatched =\n nonModifiers.length === 0 ||\n nonModifiers.some((token) => normalizeKey(token) === normalizeKey(event.key));\n\n if (!keyMatched) {\n return false;\n }\n\n if (!exactMatch) {\n return true;\n }\n\n const expectedModifierCount = new Set(modifiers).size;\n return activeModifierCount(event) === expectedModifierCount;\n}\n\nfunction matchesFilter(event: KeyboardEvent, filter: KeyFilter, exactMatch: boolean): boolean {\n if (typeof filter === 'function') {\n return filter(event);\n }\n\n const combos = toArray(filter);\n return combos.some((combo) => matchesCombo(event, combo, exactMatch));\n}\n\n/**\n * Listen to keyboard events with key-filter matching.\n *\n * @fictReturn { active: 'signal' }\n */\nexport function useKeyPress(\n filter: KeyFilter,\n handler: (event: KeyboardEvent) => void,\n options: UseKeyPressOptions = {}\n): UseEventListenerControls {\n const events = toArray(options.events ?? 'keydown');\n const exactMatch = options.exactMatch ?? false;\n const target = options.target === undefined ? defaultWindow : options.target;\n const passive = options.preventDefault ? false : options.passive;\n\n return useEventListener(\n target,\n events,\n (event) => {\n const keyboardEvent = event as KeyboardEvent;\n if (!matchesFilter(keyboardEvent, filter, exactMatch)) {\n return;\n }\n\n if (options.preventDefault) {\n keyboardEvent.preventDefault();\n }\n\n handler(keyboardEvent);\n },\n {\n passive,\n capture: options.capture,\n immediate: options.immediate\n }\n );\n}\n","import { onDestroy } from '@fictjs/runtime';\n\nexport type Procedure = (...args: unknown[]) => void;\n\nexport interface ControlledFn<T extends Procedure> {\n run: (...args: Parameters<T>) => void;\n cancel: () => void;\n flush: () => void;\n pending: () => boolean;\n}\n\nexport interface DebounceOptions {\n leading?: boolean;\n trailing?: boolean;\n maxWait?: number;\n}\n\nexport function createDebouncedFn<T extends Procedure>(\n fn: T,\n wait: number,\n options: DebounceOptions = {}\n): ControlledFn<T> {\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n const maxWait = options.maxWait;\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n let maxTimer: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: Parameters<T> | undefined;\n let pending = false;\n\n const clearTimers = () => {\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = undefined;\n }\n };\n\n const invoke = () => {\n if (!lastArgs) {\n pending = false;\n clearTimers();\n return;\n }\n\n const args = lastArgs;\n lastArgs = undefined;\n pending = false;\n clearTimers();\n fn(...args);\n };\n\n const scheduleTimers = () => {\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(() => {\n if (trailing) {\n invoke();\n } else {\n pending = false;\n clearTimers();\n }\n }, wait);\n\n if (maxWait != null && maxWait >= 0 && !maxTimer) {\n maxTimer = setTimeout(() => {\n invoke();\n }, maxWait);\n }\n };\n\n const run = (...args: Parameters<T>) => {\n const shouldCallLeading = leading && !timer;\n lastArgs = args;\n pending = true;\n\n if (shouldCallLeading) {\n fn(...args);\n if (!trailing) {\n lastArgs = undefined;\n pending = false;\n }\n }\n\n scheduleTimers();\n };\n\n const cancel = () => {\n pending = false;\n lastArgs = undefined;\n clearTimers();\n };\n\n const flush = () => {\n if (pending) {\n invoke();\n }\n };\n\n onDestroy(cancel);\n\n return {\n run,\n cancel,\n flush,\n pending: () => pending\n };\n}\n\nexport interface ThrottleOptions {\n leading?: boolean;\n trailing?: boolean;\n}\n\nexport function createThrottledFn<T extends Procedure>(\n fn: T,\n wait: number,\n options: ThrottleOptions = {}\n): ControlledFn<T> {\n const leading = options.leading ?? true;\n const trailing = options.trailing ?? true;\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: Parameters<T> | undefined;\n let pending = false;\n\n const invoke = (args: Parameters<T>) => {\n fn(...args);\n };\n\n const tick = () => {\n if (trailing && lastArgs) {\n const args = lastArgs;\n lastArgs = undefined;\n pending = false;\n invoke(args);\n timer = setTimeout(tick, wait);\n return;\n }\n\n timer = undefined;\n pending = false;\n };\n\n const run = (...args: Parameters<T>) => {\n if (!timer) {\n if (leading) {\n invoke(args);\n } else if (trailing) {\n lastArgs = args;\n pending = true;\n }\n timer = setTimeout(tick, wait);\n return;\n }\n\n if (trailing) {\n lastArgs = args;\n pending = true;\n }\n };\n\n const cancel = () => {\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n lastArgs = undefined;\n pending = false;\n };\n\n const flush = () => {\n if (lastArgs) {\n const args = lastArgs;\n lastArgs = undefined;\n pending = false;\n invoke(args);\n }\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n onDestroy(cancel);\n\n return {\n run,\n cancel,\n flush,\n pending: () => pending\n };\n}\n","import {\n createDebouncedFn,\n type ControlledFn,\n type DebounceOptions,\n type Procedure\n} from '../internal/timing';\n\nexport type UseDebounceFnOptions = DebounceOptions;\n\n/**\n * Debounced function wrapper with lifecycle-aware cleanup.\n *\n * @fictReturn {}\n */\nexport function useDebounceFn<T extends Procedure>(\n fn: T,\n wait: number,\n options: UseDebounceFnOptions = {}\n): ControlledFn<T> {\n return createDebouncedFn(fn, wait, options);\n}\n","import { onDestroy } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { toValue, type MaybeAccessor } from '../internal/value';\n\nexport interface UseIntervalFnControls {\n run: () => void;\n cancel: () => void;\n flush: () => void;\n pending: () => boolean;\n}\n\n/**\n * Create a managed interval with pause and resume controls.\n *\n * @fictReturn { pending: 'signal' }\n */\nexport function useIntervalFn(\n callback: () => void,\n interval: number | MaybeAccessor<number>\n): UseIntervalFnControls {\n const pending = createSignal(false);\n let timer: ReturnType<typeof setInterval> | undefined;\n\n const cancel = () => {\n if (timer) {\n clearInterval(timer);\n timer = undefined;\n }\n pending(false);\n };\n\n const run = () => {\n cancel();\n const wait = Math.max(0, toValue(interval as MaybeAccessor<number>));\n pending(true);\n timer = setInterval(() => {\n callback();\n }, wait);\n };\n\n const flush = () => {\n callback();\n };\n\n onDestroy(cancel);\n run();\n\n return {\n run,\n cancel,\n flush,\n pending\n };\n}\n","import { onDestroy } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { defaultWindow } from '../internal/env';\n\nexport interface UseRafFnOptions {\n immediate?: boolean;\n window?: Window | null;\n}\n\nexport interface UseRafFnReturn {\n active: () => boolean;\n start: () => void;\n stop: () => void;\n}\n\n/**\n * requestAnimationFrame loop helper.\n *\n * @fictReturn { active: 'signal' }\n */\nexport function useRafFn(\n callback: (delta: number, timestamp: number) => void,\n options: UseRafFnOptions = {}\n): UseRafFnReturn {\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n const active = createSignal(options.immediate ?? true);\n\n let rafId = 0;\n let lastTimestamp: number | undefined;\n\n const loop = (timestamp: number) => {\n if (!active()) {\n return;\n }\n\n const delta = lastTimestamp == null ? 0 : timestamp - lastTimestamp;\n lastTimestamp = timestamp;\n callback(delta, timestamp);\n\n if (windowRef?.requestAnimationFrame) {\n rafId = windowRef.requestAnimationFrame(loop);\n }\n };\n\n const start = () => {\n if (active()) {\n return;\n }\n active(true);\n if (windowRef?.requestAnimationFrame) {\n rafId = windowRef.requestAnimationFrame(loop);\n }\n };\n\n const stop = () => {\n active(false);\n lastTimestamp = undefined;\n\n if (rafId && windowRef?.cancelAnimationFrame) {\n windowRef.cancelAnimationFrame(rafId);\n rafId = 0;\n }\n };\n\n if (active() && windowRef?.requestAnimationFrame) {\n rafId = windowRef.requestAnimationFrame(loop);\n }\n\n onDestroy(stop);\n\n return {\n active,\n start,\n stop\n };\n}\n","import {\n createThrottledFn,\n type ControlledFn,\n type Procedure,\n type ThrottleOptions\n} from '../internal/timing';\n\nexport type UseThrottleFnOptions = ThrottleOptions;\n\n/**\n * Throttled function wrapper with lifecycle-aware cleanup.\n *\n * @fictReturn {}\n */\nexport function useThrottleFn<T extends Procedure>(\n fn: T,\n wait: number,\n options: UseThrottleFnOptions = {}\n): ControlledFn<T> {\n return createThrottledFn(fn, wait, options);\n}\n","import { createSignal } from '@fictjs/runtime/advanced';\nimport { onDestroy } from '@fictjs/runtime';\nimport { toValue, type MaybeAccessor } from '../internal/value';\n\nexport interface UseTimeoutFnControls {\n run: () => void;\n cancel: () => void;\n flush: () => void;\n pending: () => boolean;\n}\n\n/**\n * Schedule a callback with timeout controls.\n *\n * @fictReturn { pending: 'signal' }\n */\nexport function useTimeoutFn(\n callback: () => void,\n delay: number | MaybeAccessor<number>\n): UseTimeoutFnControls {\n const pending = createSignal(false);\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const cancel = () => {\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n pending(false);\n };\n\n const run = () => {\n cancel();\n const wait = Math.max(0, toValue(delay as MaybeAccessor<number>));\n\n pending(true);\n timer = setTimeout(() => {\n timer = undefined;\n pending(false);\n callback();\n }, wait);\n };\n\n const flush = () => {\n if (!pending()) {\n return;\n }\n cancel();\n callback();\n };\n\n onDestroy(cancel);\n run();\n\n return {\n run,\n cancel,\n flush,\n pending\n };\n}\n","import { createSignal } from '@fictjs/runtime/advanced';\nimport { onDestroy } from '@fictjs/runtime';\nimport { defaultWindow } from './env';\n\nexport interface Serializer<T> {\n read: (raw: string) => T;\n write: (value: T) => string;\n}\n\nexport interface UseStorageOptions<T> {\n window?: Window;\n listenToStorageChanges?: boolean;\n writeDefaults?: boolean;\n serializer?: Serializer<T>;\n onError?: (error: unknown) => void;\n}\n\nconst syncEvent = 'fict-storage-sync';\n\nconst jsonSerializer: Serializer<unknown> = {\n read: (raw) => JSON.parse(raw),\n write: (value) => JSON.stringify(value)\n};\n\nfunction inferSerializer<T>(initial: T): Serializer<T> {\n const kind = typeof initial;\n\n if (kind === 'string') {\n return {\n read: (raw) => raw as T,\n write: (value) => String(value)\n };\n }\n\n if (kind === 'number') {\n return {\n read: (raw) => Number(raw) as T,\n write: (value) => String(value)\n };\n }\n\n if (kind === 'boolean') {\n return {\n read: (raw) => (raw === 'true') as T,\n write: (value) => String(value)\n };\n }\n\n if (initial instanceof Date) {\n return {\n read: (raw) => new Date(raw) as T,\n write: (value) => (value as Date).toISOString()\n };\n }\n\n if (initial instanceof Map) {\n return {\n read: (raw) => new Map(JSON.parse(raw) as [unknown, unknown][]) as T,\n write: (value) => JSON.stringify(Array.from((value as Map<unknown, unknown>).entries()))\n };\n }\n\n if (initial instanceof Set) {\n return {\n read: (raw) => new Set(JSON.parse(raw) as unknown[]) as T,\n write: (value) => JSON.stringify(Array.from((value as Set<unknown>).values()))\n };\n }\n\n return jsonSerializer as Serializer<T>;\n}\n\nexport interface UseStorageReturn<T> {\n value: () => T;\n set: (next: T | ((prev: T) => T)) => void;\n remove: () => void;\n}\n\nfunction safeCall(onError: ((error: unknown) => void) | undefined, error: unknown): void {\n if (!onError) {\n return;\n }\n onError(error);\n}\n\nfunction resolveNextValue<T>(next: T | ((prev: T) => T), prev: T): T {\n if (typeof next === 'function') {\n return (next as (prev: T) => T)(prev);\n }\n return next;\n}\n\nexport function createStorageHook<T>(\n storage: Storage | undefined,\n key: string,\n initial: T,\n options: UseStorageOptions<T> = {}\n): UseStorageReturn<T> {\n const windowRef = options.window ?? defaultWindow;\n const serializer = options.serializer ?? inferSerializer(initial);\n const emitSync = windowRef != null;\n\n const readStorage = (): T => {\n if (!storage) {\n return initial;\n }\n\n try {\n const raw = storage.getItem(key);\n if (raw == null) {\n if (options.writeDefaults ?? true) {\n storage.setItem(key, serializer.write(initial));\n }\n return initial;\n }\n return serializer.read(raw);\n } catch (error) {\n safeCall(options.onError, error);\n return initial;\n }\n };\n\n const state = createSignal(readStorage());\n\n let paused = false;\n\n const writeState = (next: T) => {\n state(next);\n };\n\n const set = (next: T | ((prev: T) => T)) => {\n const prev = state();\n const value = resolveNextValue(next, prev);\n\n if (!storage) {\n writeState(value);\n return;\n }\n\n try {\n const serialized = serializer.write(value);\n const current = storage.getItem(key);\n if (current === serialized) {\n writeState(value);\n return;\n }\n\n paused = true;\n storage.setItem(key, serialized);\n writeState(value);\n if (emitSync) {\n windowRef.dispatchEvent(\n new CustomEvent(syncEvent, {\n detail: {\n key,\n value: serialized\n }\n })\n );\n }\n } catch (error) {\n safeCall(options.onError, error);\n } finally {\n paused = false;\n }\n };\n\n const remove = () => {\n if (!storage) {\n writeState(initial);\n return;\n }\n\n try {\n paused = true;\n storage.removeItem(key);\n writeState(initial);\n if (emitSync) {\n windowRef.dispatchEvent(\n new CustomEvent(syncEvent, {\n detail: {\n key,\n value: null\n }\n })\n );\n }\n } catch (error) {\n safeCall(options.onError, error);\n } finally {\n paused = false;\n }\n };\n\n const syncFromRaw = (raw: string | null) => {\n if (paused) {\n return;\n }\n\n if (raw == null) {\n state(initial);\n return;\n }\n\n try {\n state(serializer.read(raw));\n } catch (error) {\n safeCall(options.onError, error);\n }\n };\n\n const listenToStorageChanges = options.listenToStorageChanges ?? true;\n\n if (windowRef && storage && listenToStorageChanges) {\n const storageListener = (event: StorageEvent) => {\n if (event.storageArea !== storage || event.key !== key) {\n return;\n }\n syncFromRaw(event.newValue);\n };\n\n const customListener = (event: Event) => {\n const custom = event as CustomEvent<{ key: string; value: string | null }>;\n if (custom.detail?.key !== key) {\n return;\n }\n syncFromRaw(custom.detail.value);\n };\n\n windowRef.addEventListener('storage', storageListener);\n windowRef.addEventListener(syncEvent, customListener);\n\n onDestroy(() => {\n windowRef.removeEventListener('storage', storageListener);\n windowRef.removeEventListener(syncEvent, customListener);\n });\n }\n\n return {\n value: state,\n set,\n remove\n };\n}\n","import { defaultWindow } from '../internal/env';\nimport {\n createStorageHook,\n type UseStorageOptions,\n type UseStorageReturn\n} from '../internal/storage';\n\n/**\n * localStorage-backed state.\n *\n * @fictReturn { value: 'signal' }\n */\nexport function useLocalStorage<T>(\n key: string,\n initial: T,\n options: UseStorageOptions<T> = {}\n): UseStorageReturn<T> {\n const windowRef = options.window ?? defaultWindow;\n return createStorageHook(windowRef?.localStorage, key, initial, {\n ...options,\n window: windowRef\n });\n}\n","import { defaultWindow } from '../internal/env';\nimport {\n createStorageHook,\n type UseStorageOptions,\n type UseStorageReturn\n} from '../internal/storage';\n\n/**\n * sessionStorage-backed state.\n *\n * @fictReturn { value: 'signal' }\n */\nexport function useSessionStorage<T>(\n key: string,\n initial: T,\n options: UseStorageOptions<T> = {}\n): UseStorageReturn<T> {\n const windowRef = options.window ?? defaultWindow;\n return createStorageHook(windowRef?.sessionStorage, key, initial, {\n ...options,\n window: windowRef\n });\n}\n","import { defaultWindow } from '../internal/env';\nimport {\n createStorageHook,\n type Serializer,\n type UseStorageOptions,\n type UseStorageReturn\n} from '../internal/storage';\n\nexport interface UseStorageHookOptions<T> extends UseStorageOptions<T> {\n storage?: Storage | null;\n}\n\n/**\n * Generic storage-backed state.\n *\n * @fictReturn { value: 'signal' }\n */\nexport function useStorage<T>(\n key: string,\n initial: T,\n options: UseStorageHookOptions<T> = {}\n): UseStorageReturn<T> {\n const windowRef = options.window ?? defaultWindow;\n const storage = options.storage === undefined ? windowRef?.localStorage : options.storage;\n\n return createStorageHook(storage ?? undefined, key, initial, {\n window: windowRef,\n serializer: options.serializer as Serializer<T> | undefined,\n onError: options.onError,\n listenToStorageChanges: options.listenToStorageChanges,\n writeDefaults: options.writeDefaults\n });\n}\n","import { createEffect, onCleanup } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { defaultWindow } from '../internal/env';\nimport {\n resolveMaybeTarget,\n resolveTargetList,\n type MaybeElement,\n type MaybeTarget\n} from '../internal/target';\n\nexport interface UseIntersectionObserverOptions extends Omit<IntersectionObserverInit, 'root'> {\n window?: Window | null;\n root?: MaybeTarget<Element>;\n}\n\nexport interface UseIntersectionObserverReturn {\n entries: () => IntersectionObserverEntry[];\n isSupported: () => boolean;\n start: () => void;\n stop: () => void;\n active: () => boolean;\n}\n\n/**\n * Observe element intersection changes.\n *\n * @fictReturn { entries: 'signal', isSupported: 'signal', active: 'signal' }\n */\nexport function useIntersectionObserver(\n target: MaybeElement | MaybeElement[],\n callback?: (entries: IntersectionObserverEntry[], observer: IntersectionObserver) => void,\n options: UseIntersectionObserverOptions = {}\n): UseIntersectionObserverReturn {\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n const observerCtor =\n (windowRef as (Window & { IntersectionObserver?: typeof IntersectionObserver }) | null)\n ?.IntersectionObserver ?? globalThis.IntersectionObserver;\n const entries = createSignal<IntersectionObserverEntry[]>([]);\n const isSupported = createSignal(!!observerCtor);\n const active = createSignal(true);\n\n let cleanup = () => {};\n\n const setup = () => {\n const Observer = observerCtor;\n if (!Observer) {\n isSupported(false);\n return;\n }\n\n isSupported(true);\n\n const rootElement = options.root ? resolveMaybeTarget(options.root) : undefined;\n const observer = new Observer(\n (nextEntries: IntersectionObserverEntry[], currentObserver: IntersectionObserver) => {\n entries(nextEntries);\n callback?.(nextEntries, currentObserver);\n },\n {\n root: rootElement ?? null,\n rootMargin: options.rootMargin,\n threshold: options.threshold\n }\n );\n\n const targets = resolveTargetList(target);\n for (const element of targets) {\n observer.observe(element);\n }\n\n cleanup = () => {\n observer.disconnect();\n cleanup = () => {};\n };\n };\n\n createEffect(() => {\n cleanup();\n\n if (!active()) {\n return;\n }\n\n setup();\n\n onCleanup(() => {\n cleanup();\n });\n });\n\n return {\n entries,\n isSupported,\n start() {\n active(true);\n },\n stop() {\n active(false);\n cleanup();\n },\n active\n };\n}\n","import { createEffect, onCleanup } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { defaultWindow } from '../internal/env';\nimport { resolveTargetList, type MaybeElement } from '../internal/target';\n\nexport interface UseMutationObserverOptions extends MutationObserverInit {\n window?: Window | null;\n}\n\nexport interface UseMutationObserverReturn {\n records: () => MutationRecord[];\n isSupported: () => boolean;\n active: () => boolean;\n start: () => void;\n stop: () => void;\n}\n\n/**\n * Observe DOM mutations for target elements.\n *\n * @fictReturn { records: 'signal', isSupported: 'signal', active: 'signal' }\n */\nexport function useMutationObserver(\n target: MaybeElement | MaybeElement[],\n callback?: (records: MutationRecord[], observer: MutationObserver) => void,\n options: UseMutationObserverOptions = {}\n): UseMutationObserverReturn {\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n const observerCtor =\n (windowRef as (Window & { MutationObserver?: typeof MutationObserver }) | null)\n ?.MutationObserver ?? globalThis.MutationObserver;\n const records = createSignal<MutationRecord[]>([]);\n const isSupported = createSignal(!!observerCtor);\n const active = createSignal(true);\n\n let cleanup = () => {};\n\n createEffect(() => {\n cleanup();\n\n if (!active()) {\n return;\n }\n\n const Observer = observerCtor;\n if (!Observer) {\n isSupported(false);\n return;\n }\n\n isSupported(true);\n\n const observer = new Observer(\n (nextRecords: MutationRecord[], currentObserver: MutationObserver) => {\n records(nextRecords);\n callback?.(nextRecords, currentObserver);\n }\n );\n\n const targets = resolveTargetList(target);\n const observeOptions: MutationObserverInit = {\n subtree: options.subtree ?? true,\n childList: options.childList ?? true,\n attributes: options.attributes,\n characterData: options.characterData,\n attributeFilter: options.attributeFilter,\n attributeOldValue: options.attributeOldValue,\n characterDataOldValue: options.characterDataOldValue\n };\n\n for (const element of targets) {\n observer.observe(element, observeOptions);\n }\n\n cleanup = () => {\n observer.disconnect();\n cleanup = () => {};\n };\n\n onCleanup(() => {\n cleanup();\n });\n });\n\n return {\n records,\n isSupported,\n active,\n start() {\n active(true);\n },\n stop() {\n active(false);\n cleanup();\n }\n };\n}\n","import { createEffect, onCleanup } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { defaultWindow } from '../internal/env';\nimport { resolveTargetList, type MaybeElement } from '../internal/target';\n\nexport interface UseResizeObserverOptions {\n box?: ResizeObserverBoxOptions;\n window?: Window | null;\n}\n\nexport interface UseResizeObserverReturn {\n entries: () => ResizeObserverEntry[];\n isSupported: () => boolean;\n active: () => boolean;\n start: () => void;\n stop: () => void;\n}\n\n/**\n * Observe element resize changes.\n *\n * @fictReturn { entries: 'signal', isSupported: 'signal', active: 'signal' }\n */\nexport function useResizeObserver(\n target: MaybeElement | MaybeElement[],\n callback?: (entries: ResizeObserverEntry[], observer: ResizeObserver) => void,\n options: UseResizeObserverOptions = {}\n): UseResizeObserverReturn {\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n const observerCtor =\n (windowRef as (Window & { ResizeObserver?: typeof ResizeObserver }) | null)?.ResizeObserver ??\n globalThis.ResizeObserver;\n const entries = createSignal<ResizeObserverEntry[]>([]);\n const isSupported = createSignal(!!observerCtor);\n const active = createSignal(true);\n\n let cleanup = () => {};\n\n createEffect(() => {\n cleanup();\n\n if (!active()) {\n return;\n }\n\n const Observer = observerCtor;\n if (!Observer) {\n isSupported(false);\n return;\n }\n\n isSupported(true);\n const observer = new Observer(\n (nextEntries: ResizeObserverEntry[], currentObserver: ResizeObserver) => {\n entries(nextEntries);\n callback?.(nextEntries, currentObserver);\n }\n );\n\n const targets = resolveTargetList(target);\n for (const element of targets) {\n observer.observe(element, options.box ? { box: options.box } : undefined);\n }\n\n cleanup = () => {\n observer.disconnect();\n cleanup = () => {};\n };\n\n onCleanup(() => {\n cleanup();\n });\n });\n\n return {\n entries,\n isSupported,\n active,\n start() {\n active(true);\n },\n stop() {\n active(false);\n cleanup();\n }\n };\n}\n","import { createSignal } from '@fictjs/runtime/advanced';\n\nexport interface UseCounterOptions {\n min?: number;\n max?: number;\n}\n\nexport interface UseCounterReturn {\n count: () => number;\n set: (next: number) => void;\n inc: (delta?: number) => void;\n dec: (delta?: number) => void;\n reset: () => void;\n}\n\nfunction clamp(value: number, min: number | undefined, max: number | undefined): number {\n let next = value;\n if (min != null) {\n next = Math.max(min, next);\n }\n if (max != null) {\n next = Math.min(max, next);\n }\n return next;\n}\n\n/**\n * Number state helper with optional min/max bounds.\n *\n * @fictReturn { count: 'signal' }\n */\nexport function useCounter(initial = 0, options: UseCounterOptions = {}): UseCounterReturn {\n const start = clamp(initial, options.min, options.max);\n const count = createSignal(start);\n\n return {\n count,\n set(next) {\n count(clamp(next, options.min, options.max));\n },\n inc(delta = 1) {\n count(clamp(count() + delta, options.min, options.max));\n },\n dec(delta = 1) {\n count(clamp(count() - delta, options.min, options.max));\n },\n reset() {\n count(start);\n }\n };\n}\n","import { createEffect } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { toValue, type MaybeAccessor } from '../internal/value';\n\n/**\n * Track the previous value of a reactive source.\n *\n * @fictReturn 'signal'\n */\nexport function usePrevious<T>(value: T | MaybeAccessor<T>): () => T | undefined {\n const previous = createSignal<T | undefined>(undefined);\n let lastValue: T | undefined;\n let initialized = false;\n\n createEffect(() => {\n const current = toValue(value as MaybeAccessor<T>);\n if (initialized) {\n previous(lastValue);\n }\n lastValue = current;\n initialized = true;\n });\n\n return previous;\n}\n","import { createSignal } from '@fictjs/runtime/advanced';\n\nexport interface UseToggleReturn {\n value: () => boolean;\n toggle: () => void;\n set: (next: boolean) => void;\n setTrue: () => void;\n setFalse: () => void;\n}\n\n/**\n * Boolean state helper.\n *\n * @fictReturn { value: 'signal' }\n */\nexport function useToggle(initial = false): UseToggleReturn {\n const value = createSignal(initial);\n\n return {\n value,\n toggle() {\n value(!value());\n },\n set(next) {\n value(next);\n },\n setTrue() {\n value(true);\n },\n setFalse() {\n value(false);\n }\n };\n}\n","import { createMemo } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { toValue, type MaybeAccessor } from '../internal/value';\n\nexport interface VirtualItem<T> {\n index: number;\n data: T;\n start: number;\n end: number;\n}\n\nexport interface UseVirtualListOptions {\n itemHeight: number;\n containerHeight: number | MaybeAccessor<number>;\n overscan?: number;\n initialScrollTop?: number;\n}\n\nexport interface UseVirtualListReturn<T> {\n list: () => VirtualItem<T>[];\n totalHeight: () => number;\n start: () => number;\n end: () => number;\n scrollTop: () => number;\n setScrollTop: (value: number) => void;\n scrollTo: (index: number) => void;\n onScroll: (event: Event) => void;\n}\n\n/**\n * Fixed-height virtual list state helper.\n *\n * @fictReturn { list: 'memo', totalHeight: 'memo', start: 'memo', end: 'memo', scrollTop: 'signal' }\n */\nexport function useVirtualList<T>(\n source: T[] | MaybeAccessor<T[]>,\n options: UseVirtualListOptions\n): UseVirtualListReturn<T> {\n const overscan = options.overscan ?? 2;\n const itemHeight = options.itemHeight;\n\n const scrollTop = createSignal(options.initialScrollTop ?? 0);\n\n const totalHeight = createMemo(() => toValue(source as MaybeAccessor<T[]>).length * itemHeight);\n\n const start = createMemo(() => {\n const base = Math.floor(scrollTop() / itemHeight) - overscan;\n return Math.max(0, base);\n });\n\n const end = createMemo(() => {\n const items = toValue(source as MaybeAccessor<T[]>);\n const containerHeight = toValue(options.containerHeight as MaybeAccessor<number>);\n const visibleCount = Math.ceil(containerHeight / itemHeight) + overscan * 2;\n return Math.min(items.length, start() + visibleCount);\n });\n\n const list = createMemo(() => {\n const items = toValue(source as MaybeAccessor<T[]>);\n const from = start();\n const to = end();\n\n const result: VirtualItem<T>[] = [];\n for (let index = from; index < to; index += 1) {\n result.push({\n index,\n data: items[index]!,\n start: index * itemHeight,\n end: (index + 1) * itemHeight\n });\n }\n\n return result;\n });\n\n const setScrollTop = (value: number) => {\n scrollTop(Math.max(0, value));\n };\n\n const scrollTo = (index: number) => {\n setScrollTop(index * itemHeight);\n };\n\n const onScroll = (event: Event) => {\n const element = event.target as HTMLElement | null;\n if (!element) {\n return;\n }\n setScrollTop(element.scrollTop);\n };\n\n return {\n list,\n totalHeight,\n start,\n end,\n scrollTop,\n setScrollTop,\n scrollTo,\n onScroll\n };\n}\n","import { createMemo } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { useEventListener } from '../event/useEventListener';\nimport { defaultDocument } from '../internal/env';\n\nexport interface UseDocumentVisibilityOptions {\n document?: Document | null;\n initialVisibility?: DocumentVisibilityState;\n}\n\nexport interface UseDocumentVisibilityReturn {\n visibility: () => DocumentVisibilityState;\n hidden: () => boolean;\n}\n\n/**\n * Track page visibility state.\n *\n * @fictReturn { visibility: 'signal', hidden: 'memo' }\n */\nexport function useDocumentVisibility(\n options: UseDocumentVisibilityOptions = {}\n): UseDocumentVisibilityReturn {\n const documentRef = options.document === undefined ? defaultDocument : options.document;\n const fallback = options.initialVisibility ?? 'visible';\n\n const visibility = createSignal(documentRef?.visibilityState ?? fallback);\n\n const update = () => {\n visibility(documentRef?.visibilityState ?? fallback);\n };\n\n useEventListener(documentRef, 'visibilitychange', update, { passive: true });\n\n const hidden = createMemo(() => visibility() !== 'visible');\n\n return {\n visibility,\n hidden\n };\n}\n","import { createEffect, onCleanup } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { defaultWindow } from '../internal/env';\nimport { toValue, type MaybeAccessor } from '../internal/value';\n\nexport interface UseMediaQueryOptions {\n window?: Window | null;\n initialValue?: boolean;\n}\n\nexport interface UseMediaQueryReturn {\n matches: () => boolean;\n query: () => string;\n isSupported: () => boolean;\n}\n\n/**\n * Reactive media query matching state.\n *\n * @fictReturn { matches: 'signal', query: 'signal', isSupported: 'signal' }\n */\nexport function useMediaQuery(\n mediaQuery: string | MaybeAccessor<string>,\n options: UseMediaQueryOptions = {}\n): UseMediaQueryReturn {\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n const fallback = options.initialValue ?? false;\n\n const matches = createSignal(fallback);\n const query = createSignal(typeof mediaQuery === 'string' ? mediaQuery : '');\n const isSupported = createSignal(!!windowRef?.matchMedia);\n\n createEffect(() => {\n const nextQuery = toValue(mediaQuery as MaybeAccessor<string>);\n query(nextQuery);\n\n if (!windowRef?.matchMedia) {\n isSupported(false);\n matches(fallback);\n return;\n }\n\n isSupported(true);\n const mql = windowRef.matchMedia(nextQuery);\n matches(mql.matches);\n\n const listener = (event: MediaQueryListEvent) => {\n matches(event.matches);\n };\n\n mql.addEventListener('change', listener);\n onCleanup(() => {\n mql.removeEventListener('change', listener);\n });\n });\n\n return {\n matches,\n query,\n isSupported\n };\n}\n","import { createSignal } from '@fictjs/runtime/advanced';\nimport { useEventListener } from '../event/useEventListener';\nimport { defaultNavigator, defaultWindow } from '../internal/env';\n\ninterface NetworkConnectionLike extends EventTarget {\n downlink?: number;\n effectiveType?: string;\n rtt?: number;\n saveData?: boolean;\n type?: string;\n}\n\ninterface NavigatorWithConnection extends Navigator {\n connection?: NetworkConnectionLike;\n mozConnection?: NetworkConnectionLike;\n webkitConnection?: NetworkConnectionLike;\n}\n\nexport interface UseNetworkOptions {\n window?: Window | null;\n navigator?: NavigatorWithConnection | null;\n}\n\nexport interface UseNetworkReturn {\n online: () => boolean;\n downlink: () => number | null;\n effectiveType: () => string | null;\n rtt: () => number | null;\n saveData: () => boolean;\n type: () => string | null;\n isSupported: () => boolean;\n}\n\nfunction resolveConnection(navigatorRef: NavigatorWithConnection | null | undefined) {\n return navigatorRef?.connection ?? navigatorRef?.mozConnection ?? navigatorRef?.webkitConnection;\n}\n\n/**\n * Reactive network status state.\n *\n * @fictReturn { online: 'signal', downlink: 'signal', effectiveType: 'signal', rtt: 'signal', saveData: 'signal', type: 'signal', isSupported: 'signal' }\n */\nexport function useNetwork(options: UseNetworkOptions = {}): UseNetworkReturn {\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n const navigatorRef =\n options.navigator === undefined\n ? (defaultNavigator as NavigatorWithConnection | undefined)\n : options.navigator;\n const connection = resolveConnection(navigatorRef);\n\n const online = createSignal(navigatorRef?.onLine ?? true);\n const downlink = createSignal<number | null>(connection?.downlink ?? null);\n const effectiveType = createSignal<string | null>(connection?.effectiveType ?? null);\n const rtt = createSignal<number | null>(connection?.rtt ?? null);\n const saveData = createSignal<boolean>(connection?.saveData ?? false);\n const type = createSignal<string | null>(connection?.type ?? null);\n const isSupported = createSignal(navigatorRef != null);\n\n const update = () => {\n const nextConnection = resolveConnection(navigatorRef);\n\n online(navigatorRef?.onLine ?? true);\n downlink(nextConnection?.downlink ?? null);\n effectiveType(nextConnection?.effectiveType ?? null);\n rtt(nextConnection?.rtt ?? null);\n saveData(nextConnection?.saveData ?? false);\n type(nextConnection?.type ?? null);\n };\n\n useEventListener(windowRef, 'online', update, { passive: true });\n useEventListener(windowRef, 'offline', update, { passive: true });\n\n if (connection) {\n useEventListener(connection, 'change', update, { passive: true });\n }\n\n update();\n\n return {\n online,\n downlink,\n effectiveType,\n rtt,\n saveData,\n type,\n isSupported\n };\n}\n","import { createEffect } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { useEventListener } from '../event/useEventListener';\nimport { defaultWindow } from '../internal/env';\nimport { resolveMaybeTarget, type MaybeTarget } from '../internal/target';\n\nexport interface ScrollPosition {\n x: number;\n y: number;\n}\n\nexport interface UseScrollOptions {\n target?: MaybeTarget<Element | Document | Window> | null;\n window?: Window | null;\n initialX?: number;\n initialY?: number;\n shouldUpdate?: (next: ScrollPosition, prev: ScrollPosition) => boolean;\n passive?: boolean;\n capture?: boolean;\n}\n\nexport interface UseScrollReturn {\n x: () => number;\n y: () => number;\n}\n\nfunction isWindowLike(target: unknown): target is Window {\n if (!target || typeof target !== 'object') {\n return false;\n }\n return (\n ('pageXOffset' in target || 'scrollX' in target) &&\n ('pageYOffset' in target || 'scrollY' in target)\n );\n}\n\nfunction readDocumentScrollPosition(documentRef: Document, windowRef?: Window): ScrollPosition {\n const view = documentRef.defaultView ?? windowRef;\n if (view) {\n return {\n x: view.pageXOffset ?? view.scrollX ?? 0,\n y: view.pageYOffset ?? view.scrollY ?? 0\n };\n }\n\n const scrolling =\n documentRef.scrollingElement ??\n (documentRef.documentElement as Element | null) ??\n documentRef.body;\n return {\n x: scrolling?.scrollLeft ?? 0,\n y: scrolling?.scrollTop ?? 0\n };\n}\n\nfunction readScrollPosition(\n target: Element | Document | Window | undefined,\n windowRef: Window | null | undefined,\n fallback: ScrollPosition\n): ScrollPosition {\n if (!target) {\n return fallback;\n }\n\n if ('documentElement' in target) {\n return readDocumentScrollPosition(target, windowRef ?? undefined);\n }\n\n if (isWindowLike(target)) {\n return {\n x: target.pageXOffset ?? target.scrollX ?? 0,\n y: target.pageYOffset ?? target.scrollY ?? 0\n };\n }\n\n return {\n x: target.scrollLeft ?? 0,\n y: target.scrollTop ?? 0\n };\n}\n\n/**\n * Track scroll position for window, document or element targets.\n *\n * @fictReturn { x: 'signal', y: 'signal' }\n */\nexport function useScroll(options: UseScrollOptions = {}): UseScrollReturn {\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n const fallback = {\n x: options.initialX ?? 0,\n y: options.initialY ?? 0\n };\n\n const x = createSignal(fallback.x);\n const y = createSignal(fallback.y);\n let previous = { ...fallback };\n\n const resolveScrollTarget = (): Element | Document | Window | undefined => {\n if (options.target === null) {\n return undefined;\n }\n if (options.target === undefined) {\n return windowRef ?? undefined;\n }\n return resolveMaybeTarget(options.target);\n };\n\n const update = () => {\n const next = readScrollPosition(resolveScrollTarget(), windowRef, fallback);\n const shouldUpdate = options.shouldUpdate?.(next, previous) ?? true;\n if (!shouldUpdate) {\n return;\n }\n if (next.x === previous.x && next.y === previous.y) {\n return;\n }\n previous = next;\n x(next.x);\n y(next.y);\n };\n\n useEventListener(() => resolveScrollTarget() as EventTarget | undefined, 'scroll', update, {\n passive: options.passive ?? true,\n capture: options.capture\n });\n\n createEffect(() => {\n update();\n });\n\n return {\n x,\n y\n };\n}\n","import { createEffect, onDestroy } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { defaultNavigator } from '../internal/env';\nimport { toValue, type MaybeAccessor } from '../internal/value';\n\ninterface PermissionNavigator {\n permissions?: {\n query: (permissionDesc: PermissionDescriptor) => Promise<PermissionStatus>;\n };\n}\n\nexport type PermissionInput = PermissionDescriptor | string;\n\nexport interface UsePermissionOptions {\n navigator?: PermissionNavigator | null;\n initialState?: PermissionState;\n immediate?: boolean;\n}\n\nexport interface UsePermissionReturn {\n state: () => PermissionState;\n isSupported: () => boolean;\n query: () => Promise<PermissionStatus | null>;\n}\n\nfunction normalizePermission(input: PermissionInput): PermissionDescriptor {\n if (typeof input === 'string') {\n return { name: input as PermissionName };\n }\n return input;\n}\n\n/**\n * Reactive Permissions API helper.\n *\n * @fictReturn { state: 'signal', isSupported: 'signal' }\n */\nexport function usePermission(\n permission: PermissionInput | MaybeAccessor<PermissionInput>,\n options: UsePermissionOptions = {}\n): UsePermissionReturn {\n const navigatorRef =\n options.navigator === undefined\n ? (defaultNavigator as PermissionNavigator | undefined)\n : options.navigator;\n const initialState = options.initialState ?? 'prompt';\n const isSupported = createSignal<boolean>(!!navigatorRef?.permissions?.query);\n const state = createSignal<PermissionState>(initialState);\n\n let activePermission = normalizePermission(toValue(permission as MaybeAccessor<PermissionInput>));\n let cleanup = () => {};\n\n const bindStatus = (nextStatus: PermissionStatus) => {\n cleanup();\n state(nextStatus.state);\n\n const onChange = () => {\n state(nextStatus.state);\n };\n\n nextStatus.addEventListener('change', onChange as EventListener);\n cleanup = () => {\n nextStatus.removeEventListener('change', onChange as EventListener);\n cleanup = () => {};\n };\n };\n\n const query = async (): Promise<PermissionStatus | null> => {\n if (!navigatorRef?.permissions?.query) {\n isSupported(false);\n return null;\n }\n\n isSupported(true);\n\n try {\n const nextStatus = await navigatorRef.permissions.query(activePermission);\n bindStatus(nextStatus);\n return nextStatus;\n } catch {\n state(initialState);\n return null;\n }\n };\n\n createEffect(() => {\n activePermission = normalizePermission(toValue(permission as MaybeAccessor<PermissionInput>));\n if (options.immediate ?? true) {\n void query();\n }\n });\n\n onDestroy(() => {\n cleanup();\n });\n\n return {\n state,\n isSupported,\n query\n };\n}\n","import { onDestroy } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { defaultNavigator } from '../internal/env';\n\ninterface GeolocationNavigator {\n geolocation?: {\n watchPosition: (\n success: PositionCallback,\n error?: PositionErrorCallback,\n options?: PositionOptions\n ) => number;\n clearWatch: (watchId: number) => void;\n };\n}\n\nexport interface GeolocationCoordsState {\n accuracy: number;\n latitude: number;\n longitude: number;\n altitude: number | null;\n altitudeAccuracy: number | null;\n heading: number | null;\n speed: number | null;\n}\n\nexport interface UseGeolocationOptions extends PositionOptions {\n navigator?: GeolocationNavigator | null;\n immediate?: boolean;\n}\n\nexport interface UseGeolocationReturn {\n isSupported: () => boolean;\n coords: () => GeolocationCoordsState;\n locatedAt: () => number | null;\n error: () => GeolocationPositionError | null;\n active: () => boolean;\n resume: () => void;\n pause: () => void;\n}\n\nfunction createInitialCoords(): GeolocationCoordsState {\n return {\n accuracy: 0,\n latitude: Number.POSITIVE_INFINITY,\n longitude: Number.POSITIVE_INFINITY,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null\n };\n}\n\n/**\n * Reactive Geolocation API wrapper.\n *\n * @fictReturn { isSupported: 'signal', coords: 'signal', locatedAt: 'signal', error: 'signal', active: 'signal' }\n */\nexport function useGeolocation(options: UseGeolocationOptions = {}): UseGeolocationReturn {\n const navigatorRef =\n options.navigator === undefined\n ? (defaultNavigator as GeolocationNavigator | undefined)\n : options.navigator;\n const geolocationRef = navigatorRef?.geolocation;\n\n const isSupported = createSignal(!!geolocationRef);\n const coords = createSignal<GeolocationCoordsState>(createInitialCoords());\n const locatedAt = createSignal<number | null>(null);\n const error = createSignal<GeolocationPositionError | null>(null);\n const active = createSignal(false);\n\n let watchId: number | null = null;\n\n const resume = () => {\n if (!geolocationRef || active()) {\n if (!geolocationRef) {\n isSupported(false);\n }\n return;\n }\n\n watchId = geolocationRef.watchPosition(\n (position) => {\n coords({\n accuracy: position.coords.accuracy,\n latitude: position.coords.latitude,\n longitude: position.coords.longitude,\n altitude: position.coords.altitude,\n altitudeAccuracy: position.coords.altitudeAccuracy,\n heading: position.coords.heading,\n speed: position.coords.speed\n });\n locatedAt(position.timestamp);\n error(null);\n },\n (nextError) => {\n error(nextError);\n },\n {\n enableHighAccuracy: options.enableHighAccuracy,\n timeout: options.timeout,\n maximumAge: options.maximumAge\n }\n );\n\n active(true);\n };\n\n const pause = () => {\n if (!geolocationRef || watchId == null) {\n active(false);\n return;\n }\n geolocationRef.clearWatch(watchId);\n watchId = null;\n active(false);\n };\n\n if (options.immediate ?? true) {\n resume();\n }\n\n onDestroy(() => {\n pause();\n });\n\n return {\n isSupported,\n coords,\n locatedAt,\n error,\n active,\n resume,\n pause\n };\n}\n","import { onDestroy } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { useEventListener } from '../event/useEventListener';\nimport { defaultDocument, defaultWindow } from '../internal/env';\n\nconst DEFAULT_IDLE_EVENTS = [\n 'mousemove',\n 'mousedown',\n 'resize',\n 'keydown',\n 'touchstart',\n 'wheel',\n 'pointerdown'\n] as const;\n\nexport interface UseIdleOptions {\n timeout?: number;\n window?: Window | null;\n document?: Document | null;\n events?: Array<(typeof DEFAULT_IDLE_EVENTS)[number] | string>;\n listenForVisibilityChange?: boolean;\n immediate?: boolean;\n initialState?: boolean;\n}\n\nexport interface UseIdleReturn {\n idle: () => boolean;\n lastActive: () => number | null;\n isSupported: () => boolean;\n active: () => boolean;\n reset: () => void;\n pause: () => void;\n resume: () => void;\n}\n\n/**\n * Track user idle state using activity events + timer.\n *\n * @fictReturn { idle: 'signal', lastActive: 'signal', isSupported: 'signal', active: 'signal' }\n */\nexport function useIdle(options: UseIdleOptions = {}): UseIdleReturn {\n const timeout = options.timeout ?? 60_000;\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n const documentRef = options.document === undefined ? defaultDocument : options.document;\n const events = options.events ?? [...DEFAULT_IDLE_EVENTS];\n const listenForVisibilityChange = options.listenForVisibilityChange ?? true;\n\n const idle = createSignal(options.initialState ?? false);\n const lastActive = createSignal<number | null>(null);\n const isSupported = createSignal(!!windowRef);\n const active = createSignal(false);\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const clearTimer = () => {\n if (timer == null) {\n return;\n }\n clearTimeout(timer);\n timer = null;\n };\n\n const scheduleIdle = () => {\n clearTimer();\n if (!active() || !isSupported()) {\n return;\n }\n timer = setTimeout(() => {\n idle(true);\n }, timeout);\n };\n\n const markActive = () => {\n idle(false);\n lastActive(Date.now());\n scheduleIdle();\n };\n\n const activityListener = useEventListener(windowRef, events, markActive, {\n passive: true,\n immediate: false\n });\n\n const visibilityListener = useEventListener(\n documentRef,\n 'visibilitychange',\n () => {\n if (!documentRef || documentRef.visibilityState !== 'visible') {\n return;\n }\n markActive();\n },\n {\n passive: true,\n immediate: false\n }\n );\n\n const pause = () => {\n if (!active()) {\n return;\n }\n\n active(false);\n activityListener.stop();\n visibilityListener.stop();\n clearTimer();\n };\n\n const resume = () => {\n if (!windowRef || active()) {\n if (!windowRef) {\n isSupported(false);\n }\n return;\n }\n\n isSupported(true);\n active(true);\n activityListener.start();\n if (listenForVisibilityChange) {\n visibilityListener.start();\n }\n markActive();\n };\n\n const reset = () => {\n markActive();\n };\n\n if (options.immediate ?? true) {\n resume();\n }\n\n onDestroy(() => {\n pause();\n });\n\n return {\n idle,\n lastActive,\n isSupported,\n active,\n reset,\n pause,\n resume\n };\n}\n","import { createEffect, onCleanup } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { useEventListener } from '../event/useEventListener';\nimport { defaultWindow } from '../internal/env';\nimport { resolveMaybeTarget, type MaybeElement } from '../internal/target';\n\nexport interface UseSizeOptions {\n window?: Window | null;\n box?: ResizeObserverBoxOptions;\n initialWidth?: number;\n initialHeight?: number;\n initialTop?: number;\n initialLeft?: number;\n initialX?: number;\n initialY?: number;\n immediate?: boolean;\n}\n\nexport interface UseSizeReturn {\n width: () => number;\n height: () => number;\n top: () => number;\n left: () => number;\n x: () => number;\n y: () => number;\n isSupported: () => boolean;\n active: () => boolean;\n update: () => void;\n start: () => void;\n stop: () => void;\n}\n\nfunction readRect(target: Element) {\n const rect = target.getBoundingClientRect();\n return {\n width: rect.width,\n height: rect.height,\n top: rect.top,\n left: rect.left,\n x: rect.x ?? rect.left,\n y: rect.y ?? rect.top\n };\n}\n\n/**\n * Track element size/position reactively.\n *\n * @fictReturn { width: 'signal', height: 'signal', top: 'signal', left: 'signal', x: 'signal', y: 'signal', isSupported: 'signal', active: 'signal' }\n */\nexport function useSize(target: MaybeElement | null, options: UseSizeOptions = {}): UseSizeReturn {\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n const observerCtor =\n (windowRef as (Window & { ResizeObserver?: typeof ResizeObserver }) | null)?.ResizeObserver ??\n globalThis.ResizeObserver;\n\n const width = createSignal(options.initialWidth ?? 0);\n const height = createSignal(options.initialHeight ?? 0);\n const top = createSignal(options.initialTop ?? 0);\n const left = createSignal(options.initialLeft ?? 0);\n const x = createSignal(options.initialX ?? options.initialLeft ?? 0);\n const y = createSignal(options.initialY ?? options.initialTop ?? 0);\n const isSupported = createSignal(!!observerCtor);\n const active = createSignal(options.immediate ?? true);\n\n let observer: ResizeObserver | null = null;\n\n const applyRect = (nextTarget: Element) => {\n const rect = readRect(nextTarget);\n width(rect.width);\n height(rect.height);\n top(rect.top);\n left(rect.left);\n x(rect.x);\n y(rect.y);\n };\n\n const update = () => {\n const nextTarget = resolveMaybeTarget(target);\n if (!nextTarget) {\n return;\n }\n applyRect(nextTarget);\n };\n\n const resizeListener = useEventListener(windowRef, 'resize', update, {\n passive: true,\n immediate: false\n });\n\n const stopObserver = () => {\n if (!observer) {\n return;\n }\n observer.disconnect();\n observer = null;\n };\n\n createEffect(() => {\n stopObserver();\n\n const nextTarget = target ? resolveMaybeTarget(target) : undefined;\n if (!active() || !nextTarget) {\n resizeListener.stop();\n return;\n }\n\n applyRect(nextTarget);\n if (windowRef) {\n resizeListener.start();\n }\n\n const Observer = observerCtor;\n if (!Observer) {\n isSupported(false);\n return;\n }\n\n isSupported(true);\n observer = new Observer((entries: ResizeObserverEntry[]) => {\n const entry = entries[0];\n if (entry?.contentRect) {\n width(entry.contentRect.width);\n height(entry.contentRect.height);\n applyRect(nextTarget);\n return;\n }\n applyRect(nextTarget);\n });\n\n observer.observe(nextTarget, options.box ? { box: options.box } : undefined);\n\n onCleanup(() => {\n stopObserver();\n });\n });\n\n return {\n width,\n height,\n top,\n left,\n x,\n y,\n isSupported,\n active,\n update,\n start() {\n active(true);\n },\n stop() {\n active(false);\n resizeListener.stop();\n stopObserver();\n }\n };\n}\n","import { onDestroy } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { defaultWindow } from '../internal/env';\nimport { toValue, type MaybeAccessor } from '../internal/value';\n\nexport type WebSocketStatus = 'CONNECTING' | 'OPEN' | 'CLOSING' | 'CLOSED';\n\nexport interface UseWebSocketReconnectOptions {\n retries?: number;\n delay?: number | ((attempt: number) => number);\n}\n\ntype SerializablePayload = string | ArrayBufferLike | Blob | ArrayBufferView;\ntype WebSocketLike = Pick<\n WebSocket,\n | 'addEventListener'\n | 'removeEventListener'\n | 'send'\n | 'close'\n | 'readyState'\n | 'binaryType'\n | 'OPEN'\n | 'CONNECTING'\n | 'CLOSING'\n | 'CLOSED'\n>;\n\ntype WebSocketConstructor = new (url: string | URL, protocols?: string | string[]) => WebSocketLike;\n\nexport interface UseWebSocketOptions<TIncoming = unknown, TOutgoing = SerializablePayload> {\n window?: Window | null;\n webSocket?: WebSocketConstructor | null;\n protocols?: string | string[];\n immediate?: boolean;\n autoReconnect?: boolean | UseWebSocketReconnectOptions;\n binaryType?: BinaryType;\n initialData?: TIncoming | null;\n serialize?: (payload: TOutgoing) => SerializablePayload;\n deserialize?: (event: MessageEvent) => TIncoming;\n onOpen?: (event: Event) => void;\n onMessage?: (data: TIncoming, event: MessageEvent) => void;\n onError?: (event: Event) => void;\n onClose?: (event: CloseEvent) => void;\n}\n\nexport interface UseWebSocketReturn<TIncoming = unknown, TOutgoing = SerializablePayload> {\n data: () => TIncoming | null;\n error: () => Event | null;\n status: () => WebSocketStatus;\n isSupported: () => boolean;\n reconnectCount: () => number;\n open: () => boolean;\n close: (code?: number, reason?: string) => void;\n reconnect: () => boolean;\n send: (payload: TOutgoing) => boolean;\n}\n\nfunction normalizeReconnectOptions(\n value: boolean | UseWebSocketReconnectOptions | undefined\n): UseWebSocketReconnectOptions | null {\n if (!value) {\n return null;\n }\n if (value === true) {\n return { retries: Infinity, delay: 1000 };\n }\n return {\n retries: value.retries ?? Infinity,\n delay: value.delay ?? 1000\n };\n}\n\nfunction toStatus(value: number, socket: WebSocketLike): WebSocketStatus {\n switch (value) {\n case socket.CONNECTING:\n return 'CONNECTING';\n case socket.OPEN:\n return 'OPEN';\n case socket.CLOSING:\n return 'CLOSING';\n default:\n return 'CLOSED';\n }\n}\n\n/**\n * Reactive WebSocket connection helper.\n *\n * @fictReturn { data: 'signal', error: 'signal', status: 'signal', isSupported: 'signal', reconnectCount: 'signal' }\n */\nexport function useWebSocket<TIncoming = unknown, TOutgoing = SerializablePayload>(\n url: MaybeAccessor<string | URL | null | undefined>,\n options: UseWebSocketOptions<TIncoming, TOutgoing> = {}\n): UseWebSocketReturn<TIncoming, TOutgoing> {\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n const windowSocketCtor = (windowRef as (Window & { WebSocket?: WebSocketConstructor }) | null)\n ?.WebSocket;\n const webSocketCtor =\n options.webSocket === undefined\n ? (windowSocketCtor ?? (globalThis.WebSocket as WebSocketConstructor | undefined))\n : options.webSocket;\n const reconnectOptions = normalizeReconnectOptions(options.autoReconnect);\n\n const data = createSignal<TIncoming | null>(options.initialData ?? null);\n const error = createSignal<Event | null>(null);\n const status = createSignal<WebSocketStatus>('CLOSED');\n const isSupported = createSignal(!!webSocketCtor);\n const reconnectCount = createSignal(0);\n\n const serialize =\n options.serialize ??\n ((payload: TOutgoing): SerializablePayload => payload as unknown as SerializablePayload);\n const deserialize =\n options.deserialize ?? ((event: MessageEvent): TIncoming => event.data as TIncoming);\n\n let socket: WebSocketLike | null = null;\n let manuallyClosed = false;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n let reconnectAttempts = 0;\n let cleanupSocket = () => {};\n\n const stopReconnectTimer = () => {\n if (reconnectTimer == null) {\n return;\n }\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n };\n\n const resetReconnectAttempts = () => {\n reconnectAttempts = 0;\n reconnectCount(0);\n };\n\n const scheduleReconnect = () => {\n if (!reconnectOptions) {\n return;\n }\n\n const retries = reconnectOptions.retries ?? Infinity;\n if (reconnectAttempts >= retries) {\n return;\n }\n\n reconnectAttempts += 1;\n reconnectCount(reconnectAttempts);\n\n const delayValue = reconnectOptions.delay ?? 1000;\n const delay = typeof delayValue === 'function' ? delayValue(reconnectAttempts) : delayValue;\n stopReconnectTimer();\n reconnectTimer = setTimeout(\n () => {\n reconnectTimer = null;\n open();\n },\n Math.max(0, delay)\n );\n };\n\n const open = (): boolean => {\n const resolvedUrl = toValue(url);\n if (!webSocketCtor || !resolvedUrl) {\n isSupported(false);\n return false;\n }\n\n if (socket && (socket.readyState === socket.CONNECTING || socket.readyState === socket.OPEN)) {\n return true;\n }\n\n stopReconnectTimer();\n manuallyClosed = false;\n error(null);\n\n let currentSocket: WebSocketLike;\n try {\n currentSocket = new webSocketCtor(resolvedUrl, options.protocols);\n } catch (nextError) {\n error(nextError as Event);\n status('CLOSED');\n scheduleReconnect();\n return false;\n }\n\n socket = currentSocket;\n status(toStatus(currentSocket.readyState, currentSocket));\n\n if (options.binaryType) {\n currentSocket.binaryType = options.binaryType;\n }\n\n const onOpen = (event: Event) => {\n if (socket !== currentSocket) {\n return;\n }\n status('OPEN');\n resetReconnectAttempts();\n options.onOpen?.(event);\n };\n\n const onMessage = (event: Event) => {\n if (socket !== currentSocket) {\n return;\n }\n const messageEvent = event as MessageEvent;\n const nextData = deserialize(messageEvent);\n data(nextData);\n options.onMessage?.(nextData, messageEvent);\n };\n\n const onError = (event: Event) => {\n if (socket !== currentSocket) {\n return;\n }\n error(event);\n options.onError?.(event);\n };\n\n const onClose = (event: Event) => {\n if (socket !== currentSocket) {\n return;\n }\n\n socket = null;\n cleanupSocket();\n status('CLOSED');\n options.onClose?.(event as CloseEvent);\n\n if (!manuallyClosed) {\n scheduleReconnect();\n }\n };\n\n currentSocket.addEventListener('open', onOpen as EventListener);\n currentSocket.addEventListener('message', onMessage as EventListener);\n currentSocket.addEventListener('error', onError as EventListener);\n currentSocket.addEventListener('close', onClose as EventListener);\n\n cleanupSocket = () => {\n currentSocket.removeEventListener('open', onOpen as EventListener);\n currentSocket.removeEventListener('message', onMessage as EventListener);\n currentSocket.removeEventListener('error', onError as EventListener);\n currentSocket.removeEventListener('close', onClose as EventListener);\n cleanupSocket = () => {};\n };\n\n return true;\n };\n\n const close = (code?: number, reason?: string) => {\n stopReconnectTimer();\n resetReconnectAttempts();\n manuallyClosed = true;\n\n const currentSocket = socket;\n if (!currentSocket) {\n status('CLOSED');\n return;\n }\n\n socket = null;\n cleanupSocket();\n status('CLOSING');\n currentSocket.close(code, reason);\n status('CLOSED');\n };\n\n const reconnect = () => {\n stopReconnectTimer();\n\n if (socket) {\n const currentSocket = socket;\n socket = null;\n cleanupSocket();\n manuallyClosed = true;\n currentSocket.close();\n }\n\n manuallyClosed = false;\n return open();\n };\n\n const send = (payload: TOutgoing): boolean => {\n const currentSocket = socket;\n if (!currentSocket || currentSocket.readyState !== currentSocket.OPEN) {\n return false;\n }\n\n try {\n currentSocket.send(serialize(payload));\n return true;\n } catch (nextError) {\n error(nextError as Event);\n return false;\n }\n };\n\n if (options.immediate ?? true) {\n open();\n }\n\n onDestroy(() => {\n stopReconnectTimer();\n close();\n });\n\n return {\n data,\n error,\n status,\n isSupported,\n reconnectCount,\n open,\n close,\n reconnect,\n send\n };\n}\n","import { createSignal } from '@fictjs/runtime/advanced';\nimport { defaultWindow } from '../internal/env';\nimport { useEventListener } from '../event/useEventListener';\n\nexport interface UseWindowSizeOptions {\n window?: Window | null;\n initialWidth?: number;\n initialHeight?: number;\n}\n\nexport interface UseWindowSizeReturn {\n width: () => number;\n height: () => number;\n}\n\n/**\n * Reactive window size state.\n *\n * @fictReturn { width: 'signal', height: 'signal' }\n */\nexport function useWindowSize(options: UseWindowSizeOptions = {}): UseWindowSizeReturn {\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n\n const width = createSignal(windowRef?.innerWidth ?? options.initialWidth ?? 0);\n const height = createSignal(windowRef?.innerHeight ?? options.initialHeight ?? 0);\n\n const update = () => {\n if (!windowRef) {\n return;\n }\n width(windowRef.innerWidth);\n height(windowRef.innerHeight);\n };\n\n useEventListener(windowRef, 'resize', update, { passive: true });\n\n if (windowRef) {\n update();\n }\n\n return {\n width,\n height\n };\n}\n","import { defaultWindow } from '../internal/env';\nimport { useScroll, type UseScrollOptions, type UseScrollReturn } from './useScroll';\n\nexport interface UseWindowScrollOptions extends Omit<UseScrollOptions, 'target'> {\n window?: Window | null;\n}\n\n/**\n * Track scroll position for window only.\n *\n * @fictReturn { x: 'signal', y: 'signal' }\n */\nexport function useWindowScroll(options: UseWindowScrollOptions = {}): UseScrollReturn {\n const windowRef = options.window === undefined ? defaultWindow : options.window;\n return useScroll({\n ...options,\n window: windowRef,\n target: windowRef\n });\n}\n","import { createEffect, onDestroy } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { defaultDocument } from '../internal/env';\nimport { toValue, type MaybeAccessor } from '../internal/value';\n\nexport interface UseTitleOptions {\n document?: Document | null;\n restoreOnUnmount?: boolean;\n}\n\nexport interface UseTitleReturn {\n title: () => string;\n}\n\n/**\n * Reactive document title helper.\n *\n * @fictReturn { title: 'signal' }\n */\nexport function useTitle(\n value: string | MaybeAccessor<string>,\n options: UseTitleOptions = {}\n): UseTitleReturn {\n const documentRef = options.document === undefined ? defaultDocument : options.document;\n const initialTitle = documentRef?.title ?? '';\n const title = createSignal(documentRef?.title ?? toValue(value as MaybeAccessor<string>));\n\n createEffect(() => {\n const nextTitle = toValue(value as MaybeAccessor<string>);\n title(nextTitle);\n if (documentRef) {\n documentRef.title = nextTitle;\n }\n });\n\n if (options.restoreOnUnmount) {\n onDestroy(() => {\n if (documentRef) {\n documentRef.title = initialTitle;\n }\n });\n }\n\n return { title };\n}\n","import { createEffect, onDestroy } from '@fictjs/runtime';\nimport { createSignal } from '@fictjs/runtime/advanced';\nimport { useEventListener } from '../event/useEventListener';\nimport { defaultDocument } from '../internal/env';\nimport { resolveMaybeTarget, type MaybeElement } from '../internal/target';\n\ninterface FullscreenDocument extends Document {\n webkitFullscreenElement?: Element | null;\n mozFullScreenElement?: Element | null;\n msFullscreenElement?: Element | null;\n webkitFullscreenEnabled?: boolean;\n mozFullScreenEnabled?: boolean;\n msFullscreenEnabled?: boolean;\n webkitExitFullscreen?: () => Promise<void> | void;\n mozCancelFullScreen?: () => Promise<void> | void;\n msExitFullscreen?: () => Promise<void> | void;\n}\n\ninterface FullscreenElement extends Element {\n webkitRequestFullscreen?: () => Promise<void> | void;\n webkitRequestFullScreen?: () => Promise<void> | void;\n mozRequestFullScreen?: () => Promise<void> | void;\n msRequestFullscreen?: () => Promise<void> | void;\n}\n\nexport interface UseFullscreenOptions {\n target?: MaybeElement | null;\n document?: Document | null;\n autoExit?: boolean;\n}\n\nexport interface UseFullscreenReturn {\n isSupported: () => boolean;\n isFullscreen: () => boolean;\n enter: () => Promise<boolean>;\n exit: () => Promise<boolean>;\n toggle: () => Promise<boolean>;\n}\n\nfunction getFullscreenElement(documentRef: FullscreenDocument): Element | null {\n return (\n documentRef.fullscreenElement ??\n documentRef.webkitFullscreenElement ??\n documentRef.mozFullScreenElement ??\n documentRef.msFullscreenElement ??\n null\n );\n}\n\nfunction isFullscreenSupported(documentRef: FullscreenDocument | null | undefined): boolean {\n if (!documentRef) {\n return false;\n }\n\n if (\n documentRef.fullscreenEnabled ||\n documentRef.webkitFullscreenEnabled ||\n documentRef.mozFullScreenEnabled ||\n documentRef.msFullscreenEnabled\n ) {\n return true;\n }\n\n return (\n typeof documentRef.exitFullscreen === 'function' ||\n typeof documentRef.webkitExitFullscreen === 'function' ||\n typeof documentRef.mozCancelFullScreen === 'function' ||\n typeof documentRef.msExitFullscreen === 'function'\n );\n}\n\nfunction resolveRequestMethod(target: FullscreenElement): (() => Promise<void> | void) | undefined {\n return (\n target.requestFullscreen ??\n target.webkitRequestFullscreen ??\n target.webkitRequestFullScreen ??\n target.mozRequestFullScreen ??\n target.msRequestFullscreen\n );\n}\n\nfunction resolveExitMethod(\n documentRef: FullscreenDocument\n): (() => Promise<void> | void) | undefined {\n return (\n documentRef.exitFullscreen ??\n documentRef.webkitExitFullscreen ??\n documentRef.mozCancelFullScreen ??\n documentRef.msExitFullscreen\n );\n}\n\nfunction resolveTargetElement(\n options: UseFullscreenOptions,\n documentRef: FullscreenDocument | null\n): Element | undefined {\n if (!documentRef) {\n return undefined;\n }\n if (options.target === null) {\n return undefined;\n }\n if (options.target === undefined) {\n return documentRef.documentElement ?? undefined;\n }\n return resolveMaybeTarget(options.target);\n}\n\n/**\n * Fullscreen API wrapper for target elements.\n *\n * @fictReturn { isSupported: 'signal', isFullscreen: 'signal' }\n */\nexport function useFullscreen(options: UseFullscreenOptions = {}): UseFullscreenReturn {\n const documentRef = (\n options.document === undefined ? defaultDocument : options.document\n ) as FullscreenDocument | null;\n\n const isSupported = createSignal(isFullscreenSupported(documentRef));\n const isFullscreen = createSignal(false);\n\n const update = () => {\n if (!documentRef) {\n isFullscreen(false);\n isSupported(false);\n return;\n }\n\n isSupported(isFullscreenSupported(documentRef));\n const target = resolveTargetElement(options, documentRef);\n const fullscreenElement = getFullscreenElement(documentRef);\n isFullscreen(!!target && !!fullscreenElement && fullscreenElement === target);\n };\n\n useEventListener(\n documentRef,\n ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange'],\n update,\n { passive: true }\n );\n\n createEffect(() => {\n resolveTargetElement(options, documentRef);\n update();\n });\n\n const enter = async (): Promise<boolean> => {\n if (!documentRef || !isSupported()) {\n return false;\n }\n\n const target = resolveTargetElement(options, documentRef) as FullscreenElement | undefined;\n if (!target) {\n return false;\n }\n\n const request = resolveRequestMethod(target);\n if (!request) {\n return false;\n }\n\n try {\n await request.call(target);\n update();\n return true;\n } catch {\n update();\n return false;\n }\n };\n\n const exit = async (): Promise<boolean> => {\n if (!documentRef || !isSupported()) {\n return false;\n }\n\n const exitMethod = resolveExitMethod(documentRef);\n if (!exitMethod) {\n return false;\n }\n\n try {\n await exitMethod.call(documentRef);\n update();\n return true;\n } catch {\n update();\n return false;\n }\n };\n\n const toggle = async (): Promise<boolean> => {\n return isFullscreen() ? exit() : enter();\n };\n\n if (options.autoExit) {\n onDestroy(() => {\n void exit();\n });\n }\n\n return {\n isSupported,\n isFullscreen,\n enter,\n exit,\n toggle\n };\n}\n"],"mappings":"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","names":["createSignal","createSignal","onDestroy","createSignal","onDestroy","createSignal","createSignal","onDestroy","createSignal","createSignal","createEffect","createSignal","createSignal","createEffect","createEffect","createSignal","createSignal","createEffect","onDestroy","onDestroy","createSignal","createSignal","onDestroy","onDestroy","createSignal","createSignal","onDestroy","createSignal","onDestroy","delay","createSignal","onDestroy","createSignal","onDestroy","createSignal","onDestroy","createEffect","onCleanup","createSignal","createSignal","createEffect","onCleanup","createEffect","onCleanup","createSignal","createSignal","createEffect","onCleanup","createEffect","onCleanup","createSignal","createSignal","createEffect","onCleanup","createSignal","createEffect","createSignal","createSignal","createEffect","createSignal","createSignal","createSignal","createMemo","createSignal","createSignal","createMemo","createEffect","onCleanup","createSignal","createSignal","createEffect","onCleanup","createSignal","createSignal","createEffect","createSignal","createSignal","createEffect","createEffect","onDestroy","createSignal","createSignal","createEffect","onDestroy","onDestroy","createSignal","createSignal","onDestroy","onDestroy","createSignal","createSignal","onDestroy","createEffect","onCleanup","createSignal","createSignal","createEffect","onCleanup","onDestroy","createSignal","createSignal","delay","onDestroy","createSignal","createSignal","createEffect","onDestroy","createSignal","createSignal","createEffect","onDestroy","createEffect","onDestroy","createSignal","createSignal","createEffect","onDestroy"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fictjs/hooks",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Official hooks package for Fict",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"packageManager": "pnpm@9.1.1",
|
|
8
|
+
"main": "./dist/index.cjs",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"require": "./dist/index.cjs"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=18"
|
|
24
|
+
},
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"@fictjs/runtime": "^0.8.0"
|
|
27
|
+
},
|
|
28
|
+
"config": {
|
|
29
|
+
"commitizen": {
|
|
30
|
+
"path": "cz-conventional-changelog"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public",
|
|
35
|
+
"provenance": true
|
|
36
|
+
},
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/fictjs/hooks.git"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsup",
|
|
43
|
+
"dev": "tsup --watch",
|
|
44
|
+
"demo:dev": "vite playground",
|
|
45
|
+
"demo:build": "vite build playground",
|
|
46
|
+
"demo:preview": "vite preview playground",
|
|
47
|
+
"clean": "rimraf dist coverage",
|
|
48
|
+
"typecheck": "tsc --noEmit",
|
|
49
|
+
"test:types": "tsc -p test-dts/tsconfig.json --noEmit",
|
|
50
|
+
"lint": "eslint .",
|
|
51
|
+
"lint:fix": "eslint . --fix",
|
|
52
|
+
"format": "prettier --write .",
|
|
53
|
+
"format:check": "prettier --check .",
|
|
54
|
+
"test": "vitest run",
|
|
55
|
+
"test:coverage": "vitest run --coverage",
|
|
56
|
+
"test:watch": "vitest",
|
|
57
|
+
"prepare": "husky",
|
|
58
|
+
"commit": "pnpm git-cz",
|
|
59
|
+
"prepublishOnly": "pnpm run lint && pnpm run typecheck && pnpm run test:types && pnpm run test && pnpm run build"
|
|
60
|
+
},
|
|
61
|
+
"lint-staged": {
|
|
62
|
+
"*.{ts,tsx,js,mjs,cjs}": [
|
|
63
|
+
"eslint --fix",
|
|
64
|
+
"prettier --write"
|
|
65
|
+
],
|
|
66
|
+
"*.{json,md,yml,yaml}": [
|
|
67
|
+
"prettier --write"
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
"devDependencies": {
|
|
71
|
+
"@eslint/js": "^9.20.0",
|
|
72
|
+
"@fictjs/runtime": "^0.8.0",
|
|
73
|
+
"@types/node": "^22.13.1",
|
|
74
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
75
|
+
"commitizen": "^4.3.1",
|
|
76
|
+
"eslint": "^9.20.1",
|
|
77
|
+
"husky": "^9.1.7",
|
|
78
|
+
"jsdom": "^27.4.0",
|
|
79
|
+
"lint-staged": "^15.4.3",
|
|
80
|
+
"prettier": "^3.5.1",
|
|
81
|
+
"rimraf": "^6.0.1",
|
|
82
|
+
"tsup": "^8.4.0",
|
|
83
|
+
"typescript": "^5.7.3",
|
|
84
|
+
"typescript-eslint": "^8.24.0",
|
|
85
|
+
"vite": "^7.1.12",
|
|
86
|
+
"vitest": "^3.2.4"
|
|
87
|
+
}
|
|
88
|
+
}
|