@mantine-vue/hooks 1.1.2
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/cjs/index.cjs +4696 -0
- package/cjs/index.cjs.map +1 -0
- package/esm/index.mjs +4579 -0
- package/esm/index.mjs.map +1 -0
- package/lib/index.d.mts +141 -0
- package/lib/index.d.ts +141 -0
- package/lib/use-click-outside/use-click-outside.d.ts +4 -0
- package/lib/use-clipboard/use-clipboard.d.ts +11 -0
- package/lib/use-collapse/use-collapse.d.ts +38 -0
- package/lib/use-collapse/use-horizontal-collapse.d.ts +4 -0
- package/lib/use-color-scheme/use-color-scheme.d.ts +4 -0
- package/lib/use-counter/use-counter.d.ts +14 -0
- package/lib/use-debounced-callback/use-debounced-callback.d.ts +12 -0
- package/lib/use-debounced-state/use-debounced-state.d.ts +6 -0
- package/lib/use-debounced-value/use-debounced-value.d.ts +14 -0
- package/lib/use-did-update/use-did-update.d.ts +2 -0
- package/lib/use-disclosure/use-disclosure.d.ts +13 -0
- package/lib/use-document-title/use-document-title.d.ts +2 -0
- package/lib/use-document-visibility/use-document-visibility.d.ts +2 -0
- package/lib/use-drag/use-drag.d.ts +56 -0
- package/lib/use-event-listener/use-event-listener.d.ts +2 -0
- package/lib/use-eye-dropper/use-eye-dropper.d.ts +12 -0
- package/lib/use-favicon/use-favicon.d.ts +2 -0
- package/lib/use-fetch/use-fetch.d.ts +12 -0
- package/lib/use-file-dialog/use-file-dialog.d.ts +25 -0
- package/lib/use-floating-window/use-floating-window.d.ts +30 -0
- package/lib/use-focus-return/use-focus-return.d.ts +6 -0
- package/lib/use-focus-trap/scope-tab.d.ts +1 -0
- package/lib/use-focus-trap/tabbable.d.ts +4 -0
- package/lib/use-focus-trap/use-focus-trap.d.ts +5 -0
- package/lib/use-focus-within/use-focus-within.d.ts +10 -0
- package/lib/use-force-update/use-force-update.d.ts +2 -0
- package/lib/use-fullscreen/use-fullscreen.d.ts +12 -0
- package/lib/use-hash/use-hash.d.ts +6 -0
- package/lib/use-headroom/use-headroom.d.ts +27 -0
- package/lib/use-hotkeys/parse-hotkey.d.ts +20 -0
- package/lib/use-hotkeys/use-hotkeys.d.ts +15 -0
- package/lib/use-hover/use-hover.d.ts +6 -0
- package/lib/use-id/use-id.d.ts +2 -0
- package/lib/use-idle/use-idle.d.ts +6 -0
- package/lib/use-in-viewport/use-in-viewport.d.ts +6 -0
- package/lib/use-input-state/use-input-state.d.ts +6 -0
- package/lib/use-intersection/use-intersection.d.ts +6 -0
- package/lib/use-interval/use-interval.d.ts +16 -0
- package/lib/use-is-first-render/use-is-first-render.d.ts +2 -0
- package/lib/use-isomorphic-effect/use-isomorphic-effect.d.ts +1 -0
- package/lib/use-list-state/use-list-state.d.ts +25 -0
- package/lib/use-local-storage/create-storage.d.ts +23 -0
- package/lib/use-local-storage/use-local-storage.d.ts +3 -0
- package/lib/use-logger/use-logger.d.ts +2 -0
- package/lib/use-long-press/use-long-press.d.ts +20 -0
- package/lib/use-map/use-map.d.ts +1 -0
- package/lib/use-mask/use-mask.d.ts +57 -0
- package/lib/use-media-query/use-media-query.d.ts +5 -0
- package/lib/use-merged-ref/use-merged-ref.d.ts +6 -0
- package/lib/use-mounted/use-mounted.d.ts +2 -0
- package/lib/use-mouse/use-mouse.d.ts +15 -0
- package/lib/use-move/use-move.d.ts +17 -0
- package/lib/use-mutation-observer/use-mutation-observer.d.ts +3 -0
- package/lib/use-network/use-network.d.ts +11 -0
- package/lib/use-orientation/use-orientation.d.ts +23 -0
- package/lib/use-os/use-os.d.ts +6 -0
- package/lib/use-page-leave/use-page-leave.d.ts +2 -0
- package/lib/use-pagination/use-pagination.d.ts +20 -0
- package/lib/use-previous/use-previous.d.ts +2 -0
- package/lib/use-queue/use-queue.d.ts +20 -0
- package/lib/use-radial-move/use-radial-move.d.ts +13 -0
- package/lib/use-reduced-motion/use-reduced-motion.d.ts +3 -0
- package/lib/use-resize-observer/use-resize-observer.d.ts +13 -0
- package/lib/use-roving-index/use-roving-index.d.ts +45 -0
- package/lib/use-scroll-direction/use-scroll-direction.d.ts +3 -0
- package/lib/use-scroll-into-view/use-scroll-into-view.d.ts +32 -0
- package/lib/use-scroll-spy/use-scroll-spy.d.ts +30 -0
- package/lib/use-scroller/use-scroller.d.ts +25 -0
- package/lib/use-selection/use-selection.d.ts +27 -0
- package/lib/use-session-storage/use-session-storage.d.ts +3 -0
- package/lib/use-set/use-set.d.ts +9 -0
- package/lib/use-set-state/use-set-state.d.ts +4 -0
- package/lib/use-shallow-effect/use-shallow-effect.d.ts +2 -0
- package/lib/use-splitter/use-splitter.d.ts +94 -0
- package/lib/use-state-history/use-state-history.d.ts +17 -0
- package/lib/use-text-selection/use-text-selection.d.ts +2 -0
- package/lib/use-throttled-callback/use-throttled-callback.d.ts +2 -0
- package/lib/use-throttled-state/use-throttled-state.d.ts +3 -0
- package/lib/use-throttled-value/use-throttled-value.d.ts +2 -0
- package/lib/use-timeout/use-timeout.d.ts +8 -0
- package/lib/use-toggle/use-toggle.d.ts +4 -0
- package/lib/use-uncontrolled/use-uncontrolled.d.ts +13 -0
- package/lib/use-validated-state/use-validated-state.d.ts +16 -0
- package/lib/use-viewport-size/use-viewport-size.d.ts +6 -0
- package/lib/use-window-event/use-window-event.d.ts +2 -0
- package/lib/use-window-scroll/use-window-scroll.d.ts +8 -0
- package/lib/utils/clamp/clamp.d.ts +1 -0
- package/lib/utils/index.d.ts +7 -0
- package/lib/utils/lower-first/lower-first.d.ts +1 -0
- package/lib/utils/random-id/random-id.d.ts +1 -0
- package/lib/utils/range/range.d.ts +1 -0
- package/lib/utils/shallow-equal/shallow-equal.d.ts +1 -0
- package/lib/utils/upper-first/upper-first.d.ts +1 -0
- package/lib/utils/use-callback-ref/use-callback-ref.d.ts +2 -0
- package/package.json +37 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/utils/clamp/clamp.ts","../src/utils/lower-first/lower-first.ts","../src/utils/random-id/random-id.ts","../src/utils/range/range.ts","../src/utils/shallow-equal/shallow-equal.ts","../src/utils/upper-first/upper-first.ts","../src/utils/use-callback-ref/use-callback-ref.ts","../src/use-debounced-callback/use-debounced-callback.ts","../src/use-click-outside/use-click-outside.ts","../src/use-clipboard/use-clipboard.ts","../src/use-media-query/use-media-query.ts","../src/use-color-scheme/use-color-scheme.ts","../src/use-counter/use-counter.ts","../src/use-debounced-state/use-debounced-state.ts","../src/use-debounced-value/use-debounced-value.ts","../src/use-isomorphic-effect/use-isomorphic-effect.ts","../src/use-document-title/use-document-title.ts","../src/use-document-visibility/use-document-visibility.ts","../src/use-focus-return/use-focus-return.ts","../src/use-did-update/use-did-update.ts","../src/use-focus-trap/tabbable.ts","../src/use-focus-trap/scope-tab.ts","../src/use-focus-trap/use-focus-trap.ts","../src/use-force-update/use-force-update.ts","../src/use-id/use-id.ts","../src/use-idle/use-idle.ts","../src/use-interval/use-interval.ts","../src/use-list-state/use-list-state.ts","../src/use-window-event/use-window-event.ts","../src/use-local-storage/create-storage.ts","../src/use-local-storage/use-local-storage.ts","../src/use-session-storage/use-session-storage.ts","../src/use-merged-ref/use-merged-ref.ts","../src/use-mouse/use-mouse.ts","../src/use-move/use-move.ts","../src/use-uncontrolled/use-uncontrolled.ts","../src/use-pagination/use-pagination.ts","../src/use-queue/use-queue.ts","../src/use-page-leave/use-page-leave.ts","../src/use-reduced-motion/use-reduced-motion.ts","../src/use-scroll-into-view/use-scroll-into-view.ts","../src/use-resize-observer/use-resize-observer.ts","../src/use-shallow-effect/use-shallow-effect.ts","../src/use-toggle/use-toggle.ts","../src/use-viewport-size/use-viewport-size.ts","../src/use-window-scroll/use-window-scroll.ts","../src/use-intersection/use-intersection.ts","../src/use-hash/use-hash.ts","../src/use-hotkeys/parse-hotkey.ts","../src/use-hotkeys/use-hotkeys.ts","../src/use-fullscreen/use-fullscreen.ts","../src/use-logger/use-logger.ts","../src/use-hover/use-hover.ts","../src/use-validated-state/use-validated-state.ts","../src/use-os/use-os.ts","../src/use-set-state/use-set-state.ts","../src/use-input-state/use-input-state.ts","../src/use-event-listener/use-event-listener.ts","../src/use-disclosure/use-disclosure.ts","../src/use-focus-within/use-focus-within.ts","../src/use-network/use-network.ts","../src/use-timeout/use-timeout.ts","../src/use-text-selection/use-text-selection.ts","../src/use-previous/use-previous.ts","../src/use-favicon/use-favicon.ts","../src/use-scroll-direction/use-scroll-direction.ts","../src/use-headroom/use-headroom.ts","../src/use-eye-dropper/use-eye-dropper.ts","../src/use-in-viewport/use-in-viewport.ts","../src/use-mutation-observer/use-mutation-observer.ts","../src/use-mounted/use-mounted.ts","../src/use-state-history/use-state-history.ts","../src/use-map/use-map.ts","../src/use-set/use-set.ts","../src/use-throttled-callback/use-throttled-callback.ts","../src/use-throttled-state/use-throttled-state.ts","../src/use-throttled-value/use-throttled-value.ts","../src/use-is-first-render/use-is-first-render.ts","../src/use-orientation/use-orientation.ts","../src/use-fetch/use-fetch.ts","../src/use-radial-move/use-radial-move.ts","../src/use-scroll-spy/use-scroll-spy.ts","../src/use-scroller/use-scroller.ts","../src/use-file-dialog/use-file-dialog.ts","../src/use-long-press/use-long-press.ts","../src/use-selection/use-selection.ts","../src/use-floating-window/use-floating-window.ts","../src/use-collapse/use-collapse.ts","../src/use-collapse/use-horizontal-collapse.ts","../src/use-mask/use-mask.ts","../src/use-roving-index/use-roving-index.ts","../src/use-drag/use-drag.ts","../src/use-splitter/use-splitter.ts"],"sourcesContent":["export function clamp(value: number, min: number | undefined, max: number | undefined): number {\n if (min === undefined && max === undefined) {\n return value\n }\n\n if (min !== undefined && max === undefined) {\n return Math.max(value, min)\n }\n\n if (min === undefined && max !== undefined) {\n return Math.min(value, max)\n }\n\n return Math.min(Math.max(value, min!), max!)\n}\n","export function lowerFirst(value: string): string {\n return typeof value !== 'string' ? '' : value.charAt(0).toLowerCase() + value.slice(1)\n}\n","export function randomId(prefix = 'mantine-'): string {\n return `${prefix}${Math.random().toString(36).slice(2, 11)}`\n}\n","export function range(start: number, end: number): number[] {\n const length = Math.abs(end - start) + 1\n const reversed = start > end\n\n if (!reversed) {\n return Array.from({ length }, (_, index) => index + start)\n }\n\n return Array.from({ length }, (_, index) => start - index)\n}\n","export function shallowEqual(a: any, b: any): boolean {\n if (a === b) {\n return true\n }\n\n if (Number.isNaN(a) && Number.isNaN(b)) {\n return true\n }\n\n if (!(a instanceof Object) || !(b instanceof Object)) {\n return false\n }\n\n const keys = Object.keys(a)\n const { length } = keys\n\n if (length !== Object.keys(b).length) {\n return false\n }\n\n for (let i = 0; i < length; i += 1) {\n const key = keys[i]\n\n if (!(key in b)) {\n return false\n }\n\n if (a[key] !== b[key] && !(Number.isNaN(a[key]) && Number.isNaN(b[key]))) {\n return false\n }\n }\n\n return true\n}\n","export function upperFirst(value: string): string {\n return typeof value !== 'string' ? '' : value.charAt(0).toUpperCase() + value.slice(1)\n}\n","import { ref, toValue, watchEffect, type MaybeRefOrGetter, type Ref } from 'vue'\n\nexport function useCallbackRef<T extends (...args: any[]) => any>(\n callback: MaybeRefOrGetter<T | undefined>,\n): T {\n const callbackRef: Ref<T | undefined> = ref(toValue(callback)) as Ref<T | undefined>\n\n watchEffect(() => {\n callbackRef.value = toValue(callback)\n })\n\n return ((...args: Parameters<T>) => callbackRef.value?.(...args)) as T\n}\n","import { onBeforeUnmount } from 'vue'\n\nexport interface UseDebouncedCallbackOptions {\n delay: number\n flushOnUnmount?: boolean\n leading?: boolean\n maxWait?: number\n}\n\nexport type UseDebouncedCallbackReturnValue<Args extends unknown[]> = ((...args: Args) => void) & {\n cancel: () => void\n flush: () => void\n isPending: () => boolean\n}\n\nexport function useDebouncedCallback<Args extends unknown[]>(\n callback: (...args: Args) => void,\n waitOrOptions: number | UseDebouncedCallbackOptions,\n): UseDebouncedCallbackReturnValue<Args> {\n const options = typeof waitOrOptions === 'number' ? { delay: waitOrOptions } : waitOrOptions\n const { delay, flushOnUnmount = false, leading = false, maxWait } = options\n\n let timeout: ReturnType<typeof setTimeout> | undefined\n let maxTimeout: ReturnType<typeof setTimeout> | undefined\n let lastArgs: Args | undefined\n let leadingCalled = false\n\n const clear = () => {\n if (timeout) {\n clearTimeout(timeout)\n timeout = undefined\n }\n\n if (maxTimeout) {\n clearTimeout(maxTimeout)\n maxTimeout = undefined\n }\n }\n\n const invoke = () => {\n if (!lastArgs) {\n return\n }\n\n callback(...lastArgs)\n lastArgs = undefined\n leadingCalled = false\n clear()\n }\n\n const cancel = () => {\n lastArgs = undefined\n leadingCalled = false\n clear()\n }\n\n onBeforeUnmount(() => {\n if (flushOnUnmount) {\n invoke()\n } else {\n cancel()\n }\n })\n\n const debounced = (...args: Args) => {\n lastArgs = args\n\n if (leading && !leadingCalled) {\n callback(...args)\n lastArgs = undefined\n leadingCalled = true\n timeout = setTimeout(() => {\n leadingCalled = false\n timeout = undefined\n }, delay)\n return\n }\n\n if (timeout) {\n clearTimeout(timeout)\n }\n\n timeout = setTimeout(() => {\n if (!leading || maxWait !== undefined) {\n invoke()\n } else {\n lastArgs = undefined\n leadingCalled = false\n clear()\n }\n }, delay)\n\n if (maxWait !== undefined && !maxTimeout) {\n maxTimeout = setTimeout(invoke, maxWait)\n }\n }\n\n debounced.cancel = cancel\n debounced.flush = invoke\n debounced.isPending = () => lastArgs !== undefined\n\n return debounced\n}\n","import {\n onBeforeUnmount,\n onMounted,\n ref,\n toValue,\n watch,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue'\n\ntype OutsideEvent = MouseEvent | TouchEvent\n\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\n callback: (event: OutsideEvent) => void,\n events: MaybeRefOrGetter<string[] | null | undefined> = ['mousedown', 'touchstart'],\n nodes?: MaybeRefOrGetter<Array<HTMLElement | null | undefined>>,\n enabled: MaybeRefOrGetter<boolean> = true,\n): Ref<T | null> {\n const element = ref<T | null>(null) as Ref<T | null>\n let activeEvents: string[] = []\n const listener = (event: Event) => {\n const target = event.target as Node | null\n if (!target || (!document.body.contains(target) && (target as Element).tagName !== 'HTML'))\n return\n const path = event.composedPath()\n const resolvedNodes = nodes ? toValue(nodes) : undefined\n if (resolvedNodes) {\n if (resolvedNodes.every((node) => !!node && !path.includes(node)))\n callback(event as OutsideEvent)\n } else if (element.value && !path.includes(element.value)) callback(event as OutsideEvent)\n }\n const cleanup = () => {\n activeEvents.forEach((event) => document.removeEventListener(event, listener))\n activeEvents = []\n }\n const bind = () => {\n cleanup()\n if (!toValue(enabled)) return\n activeEvents = toValue(events) || ['mousedown', 'touchstart']\n activeEvents.forEach((event) => document.addEventListener(event, listener))\n }\n onMounted(bind)\n watch([() => toValue(events)?.join(','), () => toValue(enabled)], bind)\n onBeforeUnmount(cleanup)\n return element\n}\n","import { onBeforeUnmount, ref, type Ref } from 'vue'\n\nexport interface UseClipboardInput {\n timeout?: number\n}\n\nexport interface UseClipboardReturnValue {\n copy: (value: string) => Promise<void>\n copied: Ref<boolean>\n reset: () => void\n error: Ref<Error | null>\n}\n\nexport function useClipboard({ timeout = 2000 }: UseClipboardInput = {}): UseClipboardReturnValue {\n const copied = ref(false)\n const error = ref<Error | null>(null)\n let timer: ReturnType<typeof setTimeout> | undefined\n\n const reset = () => {\n copied.value = false\n error.value = null\n clearTimeout(timer)\n }\n\n const copy = async (value: string) => {\n // Matches the pre-refactor behavior this hook has always had: when the\n // Clipboard API isn't available (e.g. jsdom in tests, insecure\n // contexts), `copy()` still resolves as a no-op \"success\" rather than\n // silently doing nothing. Only an actual `writeText` rejection is\n // treated as a real failure.\n let succeeded = true\n\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n try {\n await navigator.clipboard.writeText(value)\n error.value = null\n } catch (err) {\n error.value = err as Error\n succeeded = false\n }\n }\n\n if (succeeded) {\n copied.value = true\n clearTimeout(timer)\n timer = setTimeout(() => {\n copied.value = false\n }, timeout)\n }\n }\n\n onBeforeUnmount(() => clearTimeout(timer))\n\n return { copy, copied, reset, error }\n}\n","import {\n getCurrentInstance,\n onBeforeUnmount,\n onMounted,\n readonly,\n ref,\n toValue,\n watch,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue'\n\nexport interface UseMediaQueryOptions {\n getInitialValueInEffect?: boolean\n}\n\nfunction getInitialMediaQueryValue(query: string, initialValue?: boolean) {\n if (typeof initialValue === 'boolean') {\n return initialValue\n }\n\n if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {\n return window.matchMedia(query).matches\n }\n\n return false\n}\n\nexport function useMediaQuery(\n query: MaybeRefOrGetter<string>,\n initialValue = false,\n options: UseMediaQueryOptions = { getInitialValueInEffect: true },\n): Readonly<Ref<boolean>> {\n const matches = ref(initialValue)\n const instance = getCurrentInstance()\n let mediaQueryList: MediaQueryList | undefined\n\n const cleanup = () => mediaQueryList?.removeEventListener('change', update)\n const update = (event?: MediaQueryListEvent) => {\n matches.value = event ? event.matches : Boolean(mediaQueryList?.matches)\n }\n\n if (!options.getInitialValueInEffect) {\n matches.value = getInitialMediaQueryValue(toValue(query), initialValue)\n }\n\n if (instance) {\n onMounted(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return\n }\n\n mediaQueryList = window.matchMedia(toValue(query))\n update()\n mediaQueryList.addEventListener('change', update)\n })\n\n onBeforeUnmount(cleanup)\n }\n\n watch(\n () => toValue(query),\n () => {\n cleanup()\n if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {\n mediaQueryList = window.matchMedia(toValue(query))\n update()\n mediaQueryList.addEventListener('change', update)\n }\n },\n )\n\n return readonly(matches) as Readonly<Ref<boolean>>\n}\n","import { computed, type Ref } from 'vue'\nimport { useMediaQuery, type UseMediaQueryOptions } from '../use-media-query/use-media-query'\n\nexport type UseColorSchemeValue = 'dark' | 'light'\n\nexport function useColorScheme(\n initialValue?: UseColorSchemeValue,\n options?: UseMediaQueryOptions,\n): Readonly<Ref<UseColorSchemeValue>> {\n const prefersDark = useMediaQuery(\n '(prefers-color-scheme: dark)',\n initialValue === 'dark',\n options,\n )\n\n return computed(() => (prefersDark.value ? 'dark' : 'light')) as Readonly<\n Ref<UseColorSchemeValue>\n >\n}\n","import { ref, type Ref } from 'vue'\n\nexport interface UseCounterOptions {\n min?: number\n max?: number\n step?: number\n}\n\nexport interface UseCounterHandlers {\n increment: () => void\n decrement: () => void\n set: (value: number | ((current: number) => number)) => void\n reset: () => void\n}\n\nexport type UseCounterReturnValue = [Ref<number>, UseCounterHandlers]\n\nexport function useCounter(\n initialValue = 0,\n options: UseCounterOptions = {},\n): UseCounterReturnValue {\n const step = Math.abs(options.step ?? 1)\n const clamp = (value: number) =>\n Math.min(options.max ?? value, Math.max(options.min ?? value, value))\n const count = ref(clamp(initialValue))\n const set = (value: number | ((current: number) => number)) => {\n count.value = clamp(typeof value === 'function' ? value(count.value) : value)\n }\n\n return [\n count,\n {\n increment: () => set((value) => value + step),\n decrement: () => set((value) => value - step),\n set,\n reset: () => set(initialValue),\n },\n ]\n}\n","import { onBeforeUnmount, ref, type Ref } from 'vue'\n\nexport interface UseDebouncedStateOptions {\n leading?: boolean\n}\n\nexport type UseDebouncedStateReturnValue<T> = [Ref<T>, (nextValue: T | ((value: T) => T)) => void]\n\nexport function useDebouncedState<T>(\n initialValue: T,\n wait: number,\n options: UseDebouncedStateOptions = {},\n): UseDebouncedStateReturnValue<T> {\n const value = ref(initialValue) as Ref<T>\n let timeout: ReturnType<typeof setTimeout> | undefined\n let leadingCalled = false\n\n const clear = () => {\n if (timeout) {\n clearTimeout(timeout)\n timeout = undefined\n }\n }\n\n const setValue = (nextValue: T | ((value: T) => T)) => {\n const next = nextValue instanceof Function ? nextValue(value.value) : nextValue\n\n if (options.leading && !leadingCalled) {\n value.value = next\n leadingCalled = true\n } else {\n clear()\n timeout = setTimeout(() => {\n value.value = next\n leadingCalled = false\n }, wait)\n }\n }\n\n onBeforeUnmount(clear)\n\n return [value, setValue]\n}\n","import {\n onBeforeUnmount,\n readonly,\n ref,\n toValue,\n watch,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue'\n\nexport interface UseDebouncedValueOptions {\n leading?: boolean\n}\n\nexport type UseDebouncedValueHandlers = {\n cancel: () => void\n flush: () => void\n}\n\nexport type UseDebouncedValueReturnValue<T> = [\n Readonly<Ref<T>>,\n () => void,\n UseDebouncedValueHandlers,\n]\n\nexport function useDebouncedValue<T>(\n value: MaybeRefOrGetter<T>,\n wait: number,\n options: UseDebouncedValueOptions = {},\n): UseDebouncedValueReturnValue<T> {\n const debounced = ref(toValue(value)) as Ref<T>\n let timeout: ReturnType<typeof setTimeout> | undefined\n let cooldown = false\n let latestValue = toValue(value)\n\n const cancel = () => {\n if (timeout) {\n clearTimeout(timeout)\n timeout = undefined\n }\n cooldown = false\n }\n\n const flush = () => {\n if (timeout) {\n cancel()\n debounced.value = latestValue\n }\n }\n\n watch(\n () => toValue(value),\n (nextValue) => {\n latestValue = nextValue\n\n if (!cooldown && options.leading) {\n cooldown = true\n debounced.value = nextValue\n timeout = setTimeout(() => {\n cooldown = false\n timeout = undefined\n }, wait)\n } else {\n cancel()\n timeout = setTimeout(() => {\n cooldown = false\n timeout = undefined\n debounced.value = nextValue\n }, wait)\n }\n },\n )\n\n onBeforeUnmount(cancel)\n\n return [readonly(debounced) as Readonly<Ref<T>>, cancel, { cancel, flush }]\n}\n","import { onMounted } from 'vue'\n\nexport function useIsomorphicEffect(effect: () => void) {\n if (typeof window === 'undefined') {\n return\n }\n\n onMounted(effect)\n}\n","import { toValue, watch, type MaybeRefOrGetter } from 'vue'\nimport { useIsomorphicEffect } from '../use-isomorphic-effect/use-isomorphic-effect'\n\nexport function useDocumentTitle(title: MaybeRefOrGetter<string>) {\n useIsomorphicEffect(() => {\n watch(\n () => toValue(title),\n (value) => {\n const nextTitle = value.trim()\n\n if (nextTitle) {\n document.title = nextTitle\n }\n },\n { immediate: true },\n )\n })\n}\n","import { onBeforeUnmount, onMounted, readonly, ref, type Ref } from 'vue'\n\nexport function useDocumentVisibility(): Readonly<Ref<DocumentVisibilityState>> {\n const documentVisibility = ref<DocumentVisibilityState>('visible') as Ref<DocumentVisibilityState>\n\n const listener = () => {\n documentVisibility.value = document.visibilityState\n }\n\n onMounted(() => {\n documentVisibility.value = document.visibilityState\n document.addEventListener('visibilitychange', listener)\n })\n\n onBeforeUnmount(() => document.removeEventListener('visibilitychange', listener))\n\n return readonly(documentVisibility) as Readonly<Ref<DocumentVisibilityState>>\n}\n","import { onBeforeUnmount, watch, type MaybeRefOrGetter } from 'vue'\n\nexport interface UseFocusReturnInput {\n opened: MaybeRefOrGetter<boolean>\n shouldReturnFocus?: MaybeRefOrGetter<boolean>\n}\n\nexport function useFocusReturn({ opened, shouldReturnFocus = true }: UseFocusReturnInput) {\n let lastActiveElement: HTMLElement | null = null\n let timeout: ReturnType<typeof setTimeout> | undefined\n const value = (input: MaybeRefOrGetter<boolean>) =>\n typeof input === 'function'\n ? input()\n : typeof input === 'object' && input && 'value' in input\n ? input.value\n : input\n const returnFocus = () => lastActiveElement?.focus?.({ preventScroll: true })\n const clearOnTab = (event: KeyboardEvent) => event.key === 'Tab' && clearTimeout(timeout)\n\n watch(\n () => value(opened),\n (isOpened, wasOpened) => {\n if (typeof document === 'undefined' || isOpened === wasOpened) return\n clearTimeout(timeout)\n if (isOpened) {\n lastActiveElement = document.activeElement as HTMLElement\n document.addEventListener('keydown', clearOnTab)\n } else {\n document.removeEventListener('keydown', clearOnTab)\n if (value(shouldReturnFocus)) {\n const activeAtClose = document.activeElement\n timeout = setTimeout(() => {\n if (\n !document.activeElement ||\n document.activeElement === document.body ||\n document.activeElement === activeAtClose\n )\n returnFocus()\n }, 10)\n }\n }\n },\n )\n onBeforeUnmount(() => {\n clearTimeout(timeout)\n document?.removeEventListener('keydown', clearOnTab)\n })\n return returnFocus\n}\n","import { onUpdated, toValue, watch, type MaybeRefOrGetter } from 'vue'\n\nexport function useDidUpdate(\n effect: () => void | (() => void),\n deps?: MaybeRefOrGetter<unknown>[],\n) {\n let cleanup: void | (() => void)\n\n const runEffect = () => {\n cleanup?.()\n cleanup = effect()\n }\n\n if (!deps) {\n onUpdated(runEffect)\n return\n }\n\n watch(\n deps.map((dep) => () => toValue(dep)),\n runEffect,\n )\n}\n","const TABBABLE_NODES = /input|select|textarea|button|object/\nexport const FOCUS_SELECTOR = 'a, input, select, textarea, button, object, [tabindex]'\n\nfunction hidden(element: HTMLElement) {\n const isTest = typeof process !== 'undefined' && process.env?.NODE_ENV === 'test'\n\n if (isTest) {\n return false\n }\n\n return element.style.display === 'none'\n}\n\nfunction visible(element: HTMLElement) {\n const isHidden =\n element.getAttribute('aria-hidden') ||\n element.getAttribute('hidden') ||\n element.getAttribute('type') === 'hidden'\n\n if (isHidden) {\n return false\n }\n\n let parentElement: HTMLElement | null = element\n\n while (parentElement) {\n if (parentElement === document.body || parentElement.nodeType === 11) {\n break\n }\n\n if (hidden(parentElement)) {\n return false\n }\n\n parentElement = parentElement.parentNode as HTMLElement | null\n }\n\n return true\n}\n\nfunction getElementTabIndex(element: HTMLElement) {\n const tabIndex = element.getAttribute('tabindex')\n return Number.parseInt(tabIndex ?? '', 10)\n}\n\nexport function focusable(element: HTMLElement) {\n const nodeName = element.nodeName.toLowerCase()\n const isTabIndexNotNaN = !Number.isNaN(getElementTabIndex(element))\n const disabled = 'disabled' in element ? Boolean((element as HTMLButtonElement).disabled) : false\n const result =\n (TABBABLE_NODES.test(nodeName) && !disabled) ||\n (element instanceof HTMLAnchorElement\n ? Boolean(element.href) || isTabIndexNotNaN\n : isTabIndexNotNaN)\n\n return result && visible(element)\n}\n\nexport function tabbable(element: HTMLElement) {\n const tabIndex = getElementTabIndex(element)\n const isTabIndexNaN = Number.isNaN(tabIndex)\n\n return (isTabIndexNaN || tabIndex >= 0) && focusable(element)\n}\n\nexport function findTabbableDescendants(element: HTMLElement): HTMLElement[] {\n return Array.from(element.querySelectorAll<HTMLElement>(FOCUS_SELECTOR)).filter(tabbable)\n}\n","import { findTabbableDescendants } from './tabbable'\n\nexport function scopeTab(node: HTMLElement, event: KeyboardEvent) {\n const tabbable = findTabbableDescendants(node)\n\n if (!tabbable.length) {\n event.preventDefault()\n return\n }\n\n const finalTabbable = tabbable[event.shiftKey ? 0 : tabbable.length - 1]\n const root = node.getRootNode() as unknown as DocumentOrShadowRoot\n let leavingFinalTabbable = finalTabbable === root.activeElement || node === root.activeElement\n const activeElement = root.activeElement as Element | null\n const activeElementIsRadio =\n activeElement?.tagName === 'INPUT' && activeElement.getAttribute('type') === 'radio'\n\n if (activeElementIsRadio) {\n const activeRadioGroup = tabbable.filter(\n (element) =>\n element.getAttribute('type') === 'radio' &&\n element.getAttribute('name') === activeElement.getAttribute('name'),\n )\n leavingFinalTabbable = activeRadioGroup.includes(finalTabbable)\n }\n\n if (!leavingFinalTabbable) {\n return\n }\n\n event.preventDefault()\n\n const target = tabbable[event.shiftKey ? tabbable.length - 1 : 0]\n target?.focus()\n}\n","import { onBeforeUnmount, onMounted, ref, toValue, watch, type MaybeRefOrGetter } from 'vue'\nimport { FOCUS_SELECTOR, focusable, tabbable } from './tabbable'\nimport { scopeTab } from './scope-tab'\n\nfunction getElement(node: any): HTMLElement | null {\n return (node?.$el ?? node) || null\n}\n\nfunction focusNode(node: HTMLElement) {\n let focusElement: HTMLElement | null = node.querySelector('[data-autofocus]')\n\n if (!focusElement) {\n const children = Array.from<HTMLElement>(node.querySelectorAll(FOCUS_SELECTOR))\n focusElement = children.find(tabbable) || children.find(focusable) || null\n\n if (!focusElement && focusable(node)) {\n focusElement = node\n }\n }\n\n focusElement?.focus({ preventScroll: true })\n}\n\nexport function useFocusTrap(active: MaybeRefOrGetter<boolean> = true) {\n const refTarget = ref<HTMLElement | null>(null)\n const isActive = () => toValue(active)\n\n const setRef = (node: any) => {\n const element = getElement(node)\n\n if (!isActive()) {\n refTarget.value = element\n return\n }\n\n if (element === null) {\n refTarget.value = null\n return\n }\n\n if (refTarget.value === element) {\n return\n }\n\n setTimeout(() => {\n if (element.isConnected || element.getRootNode()) {\n focusNode(element)\n }\n })\n\n refTarget.value = element\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Tab' && refTarget.value && isActive()) {\n scopeTab(refTarget.value, event)\n }\n }\n\n onMounted(() => {\n if (typeof document === 'undefined') {\n return\n }\n\n document.addEventListener('keydown', handleKeyDown)\n\n if (isActive() && refTarget.value) {\n setTimeout(() => {\n if (refTarget.value) {\n focusNode(refTarget.value)\n }\n })\n }\n })\n\n onBeforeUnmount(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handleKeyDown)\n }\n })\n\n watch(\n () => isActive(),\n (value) => {\n if (value && refTarget.value) {\n setTimeout(() => {\n if (refTarget.value) {\n focusNode(refTarget.value)\n }\n })\n }\n },\n )\n\n return setRef\n}\n\nexport { scopeTab }\nexport { FOCUS_SELECTOR, findTabbableDescendants, focusable, tabbable } from './tabbable'\n","import { ref, type Ref } from 'vue'\n\nexport function useForceUpdate(): [Ref<number>, () => void] {\n const key = ref(0)\n return [key, () => key.value++]\n}\n","import { onMounted, ref, type Ref } from 'vue'\n\nlet idCounter = 0\n\nexport function useId(staticId?: string): Ref<string> {\n const id = ref(staticId || '')\n\n onMounted(() => {\n if (!id.value) {\n id.value = `mantine-vue-${++idCounter}`\n }\n })\n\n if (staticId) {\n id.value = staticId\n }\n\n return id\n}\n","import {\n onBeforeUnmount,\n onMounted,\n ref,\n toValue,\n watch,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue'\n\nexport interface UseIdleOptions {\n events?: (keyof DocumentEventMap)[]\n initialState?: boolean\n}\n\nconst DEFAULT_OPTIONS: Required<UseIdleOptions> = {\n events: ['keydown', 'mousemove', 'touchmove', 'click', 'scroll', 'wheel'],\n initialState: true,\n}\n\nexport function useIdle(timeout: MaybeRefOrGetter<number>, options?: UseIdleOptions): Ref<boolean> {\n const { events, initialState } = { ...DEFAULT_OPTIONS, ...options }\n const idle = ref(initialState) as Ref<boolean>\n let timer = -1\n\n const handleEvents = () => {\n idle.value = false\n\n if (timer) {\n window.clearTimeout(timer)\n }\n\n timer = window.setTimeout(() => {\n idle.value = true\n }, toValue(timeout))\n }\n\n const bind = () => {\n events.forEach((event) => document.addEventListener(event, handleEvents))\n\n // Start the timer immediately instead of waiting for the first event to happen\n timer = window.setTimeout(() => {\n idle.value = true\n }, toValue(timeout))\n }\n\n const cleanup = () => {\n events.forEach((event) => document.removeEventListener(event, handleEvents))\n window.clearTimeout(timer)\n timer = -1\n }\n\n onMounted(bind)\n onBeforeUnmount(cleanup)\n\n watch(\n () => toValue(timeout),\n () => {\n cleanup()\n bind()\n },\n )\n\n return idle\n}\n","import {\n onBeforeUnmount,\n onMounted,\n ref,\n toValue,\n watch,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue'\n\nexport interface UseIntervalOptions {\n /** If set, the interval will start automatically when the component is mounted, `false` by default */\n autoInvoke?: boolean\n}\n\nexport interface UseIntervalReturnValue {\n /** Starts the interval */\n start: () => void\n\n /** Stops the interval */\n stop: () => void\n\n /** Toggles the interval */\n toggle: () => void\n\n /** Indicates if the interval is active */\n active: Ref<boolean>\n}\n\nexport function useInterval(\n fn: () => void,\n interval: MaybeRefOrGetter<number>,\n options: UseIntervalOptions = {},\n): UseIntervalReturnValue {\n const { autoInvoke = false } = options\n const active = ref(false) as Ref<boolean>\n let intervalId: number | null = null\n\n const start = () => {\n if (!active.value && !intervalId) {\n intervalId = window.setInterval(fn, toValue(interval))\n }\n active.value = true\n }\n\n const stop = () => {\n active.value = false\n if (intervalId) {\n window.clearInterval(intervalId)\n }\n intervalId = null\n }\n\n const toggle = () => {\n if (active.value) {\n stop()\n } else {\n start()\n }\n }\n\n watch(\n () => toValue(interval),\n () => {\n if (active.value) {\n stop()\n start()\n }\n },\n )\n\n onMounted(() => {\n if (autoInvoke) {\n start()\n }\n })\n\n onBeforeUnmount(stop)\n\n return { start, stop, toggle, active }\n}\n","import { ref, type Ref } from 'vue'\n\nexport interface UseListStateHandlers<T> {\n setState: (value: T[] | ((current: T[]) => T[])) => void\n append: (...items: T[]) => void\n prepend: (...items: T[]) => void\n insert: (index: number, ...items: T[]) => void\n pop: () => void\n shift: () => void\n apply: (fn: (item: T, index?: number) => T) => void\n applyWhere: (\n condition: (item: T, index: number) => boolean,\n fn: (item: T, index?: number) => T,\n ) => void\n remove: (...indices: number[]) => void\n reorder: (payload: { from: number; to: number }) => void\n swap: (payload: { from: number; to: number }) => void\n setItem: (index: number, item: T) => void\n setItemProp: <K extends keyof T, U extends T[K]>(index: number, prop: K, value: U) => void\n filter: (fn: (item: T, i: number) => boolean) => void\n}\n\nexport type UseListStateReturnValue<T> = [Ref<T[]>, UseListStateHandlers<T>]\n\nexport function useListState<T>(initialValue: T[] | (() => T[]) = []): UseListStateReturnValue<T> {\n const state = ref<T[]>(\n typeof initialValue === 'function' ? (initialValue as () => T[])() : initialValue,\n ) as Ref<T[]>\n\n const setState = (value: T[] | ((current: T[]) => T[])) => {\n state.value =\n typeof value === 'function' ? (value as (current: T[]) => T[])(state.value) : value\n }\n\n const append = (...items: T[]) => setState((current) => [...current, ...items])\n\n const prepend = (...items: T[]) => setState((current) => [...items, ...current])\n\n const insert = (index: number, ...items: T[]) =>\n setState((current) => [...current.slice(0, index), ...items, ...current.slice(index)])\n\n const apply = (fn: (item: T, index?: number) => T) =>\n setState((current) => current.map((item, index) => fn(item, index)))\n\n const remove = (...indices: number[]) =>\n setState((current) => current.filter((_, index) => !indices.includes(index)))\n\n const pop = () =>\n setState((current) => {\n const cloned = [...current]\n cloned.pop()\n return cloned\n })\n\n const shift = () =>\n setState((current) => {\n const cloned = [...current]\n cloned.shift()\n return cloned\n })\n\n const reorder = ({ from, to }: { from: number; to: number }) =>\n setState((current) => {\n const cloned = [...current]\n const item = current[from]\n\n cloned.splice(from, 1)\n cloned.splice(to, 0, item)\n\n return cloned\n })\n\n const swap = ({ from, to }: { from: number; to: number }) =>\n setState((current) => {\n const cloned = [...current]\n const fromItem = cloned[from]\n const toItem = cloned[to]\n\n cloned.splice(to, 1, fromItem)\n cloned.splice(from, 1, toItem)\n\n return cloned\n })\n\n const setItem = (index: number, item: T) =>\n setState((current) => {\n const cloned = [...current]\n cloned[index] = item\n return cloned\n })\n\n const setItemProp = <K extends keyof T, U extends T[K]>(index: number, prop: K, value: U) =>\n setState((current) => {\n const cloned = [...current]\n cloned[index] = { ...cloned[index], [prop]: value }\n return cloned\n })\n\n const applyWhere = (\n condition: (item: T, index: number) => boolean,\n fn: (item: T, index?: number) => T,\n ) =>\n setState((current) =>\n current.map((item, index) => (condition(item, index) ? fn(item, index) : item)),\n )\n\n const filter = (fn: (item: T, i: number) => boolean) => {\n setState((current) => current.filter(fn))\n }\n\n const handlers: UseListStateHandlers<T> = {\n setState,\n append,\n prepend,\n insert,\n pop,\n shift,\n apply,\n applyWhere,\n remove,\n reorder,\n swap,\n setItem,\n setItemProp,\n filter,\n }\n\n return [state, handlers]\n}\n","import {\n isRef,\n onBeforeUnmount,\n onMounted,\n toValue,\n watch,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue'\n\nexport function useWindowEvent<K extends keyof WindowEventMap>(\n type: MaybeRefOrGetter<K>,\n listener: MaybeRefOrGetter<(event: WindowEventMap[K]) => void>,\n options?: AddEventListenerOptions,\n) {\n const getListener = () =>\n isRef(listener)\n ? (listener as Ref<(event: WindowEventMap[K]) => void>).value\n : (listener as (event: WindowEventMap[K]) => void)\n const handler = (event: WindowEventMap[K]) => getListener()(event)\n let currentType: K | undefined\n let mounted = false\n\n const add = (eventType: K) => {\n currentType = eventType\n window.addEventListener(eventType, handler as EventListener, options)\n }\n\n const remove = () => {\n if (currentType) {\n window.removeEventListener(currentType, handler as EventListener, options)\n currentType = undefined\n }\n }\n\n onMounted(() => {\n mounted = true\n add(toValue(type))\n })\n\n watch(\n () => toValue(type),\n (nextType) => {\n if (mounted && nextType !== currentType) {\n remove()\n add(nextType)\n }\n },\n )\n\n onBeforeUnmount(remove)\n}\n","/* oxlint-disable no-console */\nimport { onBeforeUnmount, onMounted, ref, type Ref } from 'vue'\nimport { useWindowEvent } from '../use-window-event/use-window-event'\n\nexport type StorageType = 'localStorage' | 'sessionStorage'\n\nexport interface UseStorageOptions<T> {\n /** Storage key */\n key: string\n\n /** Default value that will be set if value is not found in storage */\n defaultValue?: T\n\n /** If set to true, the real storage value is read after mount rather than during initialization. Default value is true. */\n getInitialValueInEffect?: boolean\n\n /** Determines whether the value must be synced between browser tabs, `true` by default */\n sync?: boolean\n\n /** Function to serialize value into string to be saved in storage */\n serialize?: (value: T) => string\n\n /** Function to deserialize string value from storage to value */\n deserialize?: (value: string | undefined) => T\n}\n\nfunction serializeJSON<T>(value: T, hookName = 'use-local-storage') {\n try {\n return JSON.stringify(value)\n } catch {\n throw new Error(`@mantine-vue/hooks ${hookName}: Failed to serialize the value`)\n }\n}\n\nfunction deserializeJSON(value: string | undefined) {\n try {\n return value && JSON.parse(value)\n } catch {\n return value\n }\n}\n\nfunction createStorageHandler(type: StorageType) {\n const getItem = (key: string) => {\n try {\n return window[type].getItem(key)\n } catch {\n console.warn(`use-local-storage: Failed to get value from storage, ${type} is blocked`)\n return null\n }\n }\n\n const setItem = (key: string, value: string) => {\n try {\n window[type].setItem(key, value)\n } catch {\n console.warn(`use-local-storage: Failed to set value to storage, ${type} is blocked`)\n }\n }\n\n const removeItem = (key: string) => {\n try {\n window[type].removeItem(key)\n } catch {\n console.warn(`use-local-storage: Failed to remove value from storage, ${type} is blocked`)\n }\n }\n\n return { getItem, setItem, removeItem }\n}\n\nexport type UseStorageReturnValue<T> = [\n Ref<T>, // current value\n (val: T | ((prevState: T) => T)) => void, // callback to set value in storage\n () => void, // callback to remove value from storage\n]\n\nexport function createStorage<T>(type: StorageType, hookName: string) {\n const eventName =\n type === 'localStorage' ? 'mantine-vue-local-storage' : 'mantine-vue-session-storage'\n const { getItem, setItem, removeItem } = createStorageHandler(type)\n\n return function useStorage({\n key,\n defaultValue,\n getInitialValueInEffect = true,\n sync = true,\n deserialize = deserializeJSON,\n serialize = (value: T) => serializeJSON(value, hookName),\n }: UseStorageOptions<T>): UseStorageReturnValue<T> {\n const readStorageValue = (skipStorage?: boolean): T => {\n let storageBlockedOrSkipped: boolean\n\n try {\n storageBlockedOrSkipped =\n typeof window === 'undefined' ||\n !(type in window) ||\n window[type] === null ||\n !!skipStorage\n } catch {\n storageBlockedOrSkipped = true\n }\n\n if (storageBlockedOrSkipped) {\n return defaultValue as T\n }\n\n const storageValue = getItem(key)\n return storageValue !== null ? deserialize(storageValue) : (defaultValue as T)\n }\n\n const value = ref(readStorageValue(getInitialValueInEffect)) as Ref<T>\n\n const dispatchSyncEvent = (result: T | undefined) => {\n if (typeof window === 'undefined') {\n return\n }\n queueMicrotask(() => {\n window.dispatchEvent(new CustomEvent(eventName, { detail: { key, value: result } }))\n })\n }\n\n const setStorageValue = (val: T | ((prevState: T) => T)) => {\n const result = val instanceof Function ? val(value.value) : val\n setItem(key, serialize(result))\n value.value = result\n dispatchSyncEvent(result)\n }\n\n const removeStorageValue = () => {\n removeItem(key)\n value.value = defaultValue as T\n dispatchSyncEvent(defaultValue)\n }\n\n useWindowEvent('storage', (event) => {\n if (sync && event.storageArea === window[type] && event.key === key) {\n value.value = deserialize(event.newValue ?? undefined)\n }\n })\n\n const handleSyncEvent = (event: Event) => {\n const detail = (event as CustomEvent<{ key: string; value: T }>).detail\n if (sync && detail.key === key) {\n value.value = detail.value\n }\n }\n\n onMounted(() => {\n window.addEventListener(eventName, handleSyncEvent)\n\n if (defaultValue !== undefined && value.value === undefined) {\n setStorageValue(defaultValue)\n }\n\n const val = readStorageValue()\n if (val !== undefined) {\n value.value = val\n }\n })\n\n onBeforeUnmount(() => {\n window.removeEventListener(eventName, handleSyncEvent)\n })\n\n return [value, setStorageValue, removeStorageValue]\n }\n}\n\nexport function readValue(type: StorageType) {\n const { getItem } = createStorageHandler(type)\n\n return function read<T>({\n key,\n defaultValue,\n deserialize = deserializeJSON,\n }: UseStorageOptions<T>) {\n let storageBlockedOrSkipped: boolean\n\n try {\n storageBlockedOrSkipped =\n typeof window === 'undefined' || !(type in window) || window[type] === null\n } catch {\n storageBlockedOrSkipped = true\n }\n\n if (storageBlockedOrSkipped) {\n return defaultValue as T\n }\n\n const storageValue = getItem(key)\n return storageValue !== null ? deserialize(storageValue) : (defaultValue as T)\n }\n}\n","import {\n createStorage,\n readValue,\n type UseStorageOptions,\n type UseStorageReturnValue,\n} from './create-storage'\n\nexport function readLocalStorageValue<T>(options: UseStorageOptions<T>): T {\n return readValue('localStorage')<T>(options)\n}\n\nexport function useLocalStorage<T>(options: UseStorageOptions<T>): UseStorageReturnValue<T> {\n return createStorage<T>('localStorage', 'use-local-storage')(options)\n}\n","import {\n createStorage,\n readValue,\n type UseStorageOptions,\n type UseStorageReturnValue,\n} from '../use-local-storage/create-storage'\n\nexport function readSessionStorageValue<T>(options: UseStorageOptions<T>): T {\n return readValue('sessionStorage')<T>(options)\n}\n\nexport function useSessionStorage<T>(options: UseStorageOptions<T>): UseStorageReturnValue<T> {\n return createStorage<T>('sessionStorage', 'use-session-storage')(options)\n}\n","export type VueRefTarget<T> = { value: T | null } | ((value: T | null) => void) | undefined\n\nexport function assignRef<T>(refTarget: VueRefTarget<T>, value: T | null) {\n if (typeof refTarget === 'function') {\n refTarget(value)\n } else if (refTarget) {\n refTarget.value = value\n }\n}\n\nexport function mergeRefs<T>(...refs: VueRefTarget<T>[]) {\n return (value: T | null) => refs.forEach((refTarget) => assignRef(refTarget, value))\n}\n\nexport function useMergedRef<T>(...refs: VueRefTarget<T>[]) {\n return mergeRefs<T>(...refs)\n}\n","import { onBeforeUnmount, onMounted, ref, watch, type Ref } from 'vue'\n\nexport interface UseMouseOptions {\n resetOnExit?: boolean\n}\n\nexport interface UseMouseReturnValue<T extends HTMLElement = HTMLElement> {\n ref: Ref<T | null>\n x: Ref<number>\n y: Ref<number>\n}\n\nexport function useMouse<T extends HTMLElement = HTMLElement>(\n options: UseMouseOptions = { resetOnExit: false },\n): UseMouseReturnValue<T> {\n const elementRef = ref<T | null>(null) as Ref<T | null>\n const x = ref(0)\n const y = ref(0)\n let cleanup: (() => void) | undefined\n\n watch(\n elementRef,\n (node) => {\n cleanup?.()\n cleanup = undefined\n\n // `node` is normally an HTMLElement, but if a consumer accidentally binds\n // the returned `ref` to a Vue component instance instead of a native DOM\n // element, `node` will be a component proxy without DOM methods. Guard\n // against that instead of throwing on `addEventListener`.\n const target = node instanceof EventTarget ? node : null\n\n const setMousePosition = (event: Event) => {\n const mouseEvent = event as MouseEvent\n if (target) {\n const rect = (target as HTMLElement).getBoundingClientRect()\n x.value = Math.max(0, Math.round(mouseEvent.clientX - rect.left))\n y.value = Math.max(0, Math.round(mouseEvent.clientY - rect.top))\n } else {\n x.value = mouseEvent.clientX\n y.value = mouseEvent.clientY\n }\n }\n\n const resetMousePosition = () => {\n x.value = 0\n y.value = 0\n }\n\n target?.addEventListener('mousemove', setMousePosition)\n if (options.resetOnExit) {\n target?.addEventListener('mouseleave', resetMousePosition)\n }\n\n cleanup = () => {\n target?.removeEventListener('mousemove', setMousePosition)\n if (options.resetOnExit) {\n target?.removeEventListener('mouseleave', resetMousePosition)\n }\n }\n },\n { immediate: true },\n )\n\n onBeforeUnmount(() => cleanup?.())\n\n return { ref: elementRef, x, y }\n}\n\nexport interface UseMousePositionReturnValue {\n x: Ref<number>\n y: Ref<number>\n}\n\nexport function useMousePosition(): UseMousePositionReturnValue {\n const x = ref(0)\n const y = ref(0)\n\n const setMousePosition = (event: MouseEvent) => {\n x.value = event.clientX\n y.value = event.clientY\n }\n\n onMounted(() => document.addEventListener('mousemove', setMousePosition))\n onBeforeUnmount(() => document.removeEventListener('mousemove', setMousePosition))\n\n return { x, y }\n}\n","import { onBeforeUnmount, onMounted, readonly, ref, type ComponentPublicInstance } from 'vue'\n\nexport interface UseMovePosition {\n x: number\n y: number\n}\nexport interface UseMoveHandlers {\n onScrubStart?: () => void\n onScrubEnd?: () => void\n}\n\nconst clamp = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value))\n\nexport function clampUseMovePosition(position: UseMovePosition) {\n return { x: clamp(position.x, 0, 1), y: clamp(position.y, 0, 1) }\n}\n\nexport function useMove<T extends HTMLElement = HTMLElement>(\n onChange: (position: UseMovePosition) => void,\n handlers: UseMoveHandlers = {},\n dir: 'ltr' | 'rtl' = 'ltr',\n) {\n const active = ref(false)\n let element: T | null = null\n let mounted = false\n let frame = 0\n\n const scrub = (x: number, y: number) => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n if (!mounted || !element) return\n const rect = element.getBoundingClientRect()\n if (!rect.width || !rect.height) return\n const positionX = clamp((x - rect.left) / rect.width, 0, 1)\n onChange({\n x: dir === 'ltr' ? positionX : 1 - positionX,\n y: clamp((y - rect.top) / rect.height, 0, 1),\n })\n })\n }\n const mouseMove = (event: MouseEvent) => scrub(event.clientX, event.clientY)\n const touchMove = (event: TouchEvent) => {\n if (event.cancelable) event.preventDefault()\n const touch = event.changedTouches[0]\n if (touch) scrub(touch.clientX, touch.clientY)\n }\n const unbind = () => {\n document.removeEventListener('mousemove', mouseMove)\n document.removeEventListener('mouseup', stop)\n document.removeEventListener('touchmove', touchMove)\n document.removeEventListener('touchend', stop)\n }\n const stop = () => {\n if (!active.value) return\n active.value = false\n unbind()\n setTimeout(() => handlers.onScrubEnd?.(), 0)\n }\n const start = (event: MouseEvent | TouchEvent) => {\n if (!mounted) return\n if ('button' in event && event.button !== 0) return\n if (event.cancelable) event.preventDefault()\n active.value = true\n handlers.onScrubStart?.()\n document.addEventListener('mousemove', mouseMove)\n document.addEventListener('mouseup', stop)\n document.addEventListener('touchmove', touchMove, { passive: false })\n document.addEventListener('touchend', stop)\n if ('changedTouches' in event) touchMove(event)\n else mouseMove(event)\n }\n const setRef = (node: Element | ComponentPublicInstance | null) => {\n const safeNode = node instanceof HTMLElement ? (node as T) : null\n element?.removeEventListener('mousedown', start)\n element?.removeEventListener('touchstart', start)\n element = safeNode\n element?.addEventListener('mousedown', start)\n element?.addEventListener('touchstart', start, { passive: false })\n }\n\n onMounted(() => {\n mounted = true\n })\n onBeforeUnmount(() => {\n mounted = false\n unbind()\n cancelAnimationFrame(frame)\n element?.removeEventListener('mousedown', start)\n element?.removeEventListener('touchstart', start)\n })\n return { ref: setRef, active: readonly(active) }\n}\n","import { computed, ref, toValue, type MaybeRefOrGetter, type Ref } from 'vue'\n\nexport interface UseUncontrolledOptions<T> {\n value?: MaybeRefOrGetter<T | undefined>\n defaultValue?: T\n finalValue?: T\n onChange?: (value: T, ...payload: any[]) => void\n}\n\nexport type UseUncontrolledReturnValue<T> = [\n Ref<T>,\n (value: T, ...payload: any[]) => void,\n Ref<boolean>,\n]\n\nexport function useUncontrolled<T>({\n value,\n defaultValue,\n finalValue,\n onChange = () => {},\n}: UseUncontrolledOptions<T>): UseUncontrolledReturnValue<T> {\n const uncontrolledValue = ref(defaultValue !== undefined ? defaultValue : finalValue) as Ref<T>\n const isControlled = computed(() => toValue(value) !== undefined)\n const currentValue = computed({\n get: () => (isControlled.value ? (toValue(value) as T) : uncontrolledValue.value),\n set: (nextValue) => {\n if (!isControlled.value) {\n uncontrolledValue.value = nextValue\n }\n\n onChange(nextValue)\n },\n })\n\n return [\n currentValue,\n (nextValue, ...payload) => {\n if (!isControlled.value) {\n uncontrolledValue.value = nextValue\n }\n onChange(nextValue, ...payload)\n },\n isControlled,\n ]\n}\n","import { computed, type MaybeRefOrGetter } from 'vue'\nimport { useUncontrolled } from '../use-uncontrolled/use-uncontrolled'\n\nexport const DOTS = 'dots' as const\n\nexport interface UsePaginationOptions {\n total: number\n siblings?: number\n boundaries?: number\n page?: MaybeRefOrGetter<number | undefined>\n initialPage?: number\n onChange?: (page: number) => void\n startValue?: number\n}\n\nfunction range(start: number, end: number) {\n const length = Math.max(end - start + 1, 0)\n return Array.from({ length }, (_, index) => index + start)\n}\n\nexport function usePagination({\n total,\n siblings = 1,\n boundaries = 1,\n page,\n initialPage,\n onChange,\n startValue = 1,\n}: UsePaginationOptions) {\n const start = computed(() => Math.max(Math.trunc(startValue), 1))\n const end = computed(() => Math.max(Math.trunc(total), start.value))\n const totalPages = computed(() => end.value - start.value + 1)\n const firstPage = computed(() => initialPage ?? start.value)\n const [active, setActive] = useUncontrolled<number>({\n value: page,\n defaultValue: firstPage.value,\n finalValue: firstPage.value,\n onChange,\n })\n\n const setPage = (pageNumber: number) => {\n const nextPage = Math.min(end.value, Math.max(start.value, pageNumber))\n\n if (nextPage !== active.value) {\n setActive(nextPage)\n }\n }\n\n const paginationRange = computed<(number | typeof DOTS)[]>(() => {\n const totalPageNumbers = siblings * 2 + 3 + boundaries * 2\n\n if (totalPageNumbers >= totalPages.value) {\n return range(start.value, end.value)\n }\n\n const leftSiblingIndex = Math.max(active.value - siblings, start.value + boundaries - 1)\n const rightSiblingIndex = Math.min(active.value + siblings, end.value - boundaries)\n const shouldShowLeftDots = leftSiblingIndex > start.value + boundaries + 1\n const shouldShowRightDots = rightSiblingIndex < end.value - boundaries\n\n if (!shouldShowLeftDots && shouldShowRightDots) {\n const leftItemCount = siblings * 2 + boundaries + 2\n return [\n ...range(start.value, start.value + leftItemCount - 1),\n DOTS,\n ...range(end.value - (boundaries - 1), end.value),\n ]\n }\n\n if (shouldShowLeftDots && !shouldShowRightDots) {\n const rightItemCount = boundaries + 1 + siblings * 2\n return [\n ...range(start.value, start.value + boundaries - 1),\n DOTS,\n ...range(end.value - rightItemCount, end.value),\n ]\n }\n\n return [\n ...range(start.value, start.value + boundaries - 1),\n DOTS,\n ...range(leftSiblingIndex, rightSiblingIndex),\n DOTS,\n ...range(end.value - boundaries + 1, end.value),\n ]\n })\n\n return {\n range: paginationRange,\n active,\n setPage,\n next: () => setPage(active.value + 1),\n previous: () => setPage(active.value - 1),\n first: () => setPage(start.value),\n last: () => setPage(end.value),\n }\n}\n","import { readonly, ref, type Ref } from 'vue'\n\nexport interface UseQueueOptions<T> {\n /** Initial values to be added to the queue */\n initialValues?: T[]\n\n /** Maximum number of items in the state */\n limit: number\n}\n\nexport interface UseQueueReturnValue<T> {\n /** Array of items in the queue */\n queue: Readonly<Ref<T[]>>\n\n /** Array of items in the state */\n state: Readonly<Ref<T[]>>\n\n /** Function to add items to state or queue */\n add: (...items: T[]) => void\n\n /** Function to apply updates to current items */\n update: (fn: (state: T[]) => T[]) => void\n\n /** Function to clear the queue */\n cleanQueue: () => void\n}\n\nexport function useQueue<T>({\n initialValues = [],\n limit,\n}: UseQueueOptions<T>): UseQueueReturnValue<T> {\n const stateRef = ref<T[]>(initialValues.slice(0, limit)) as Ref<T[]>\n const queueRef = ref<T[]>(initialValues.slice(limit)) as Ref<T[]>\n\n const add = (...items: T[]) => {\n const results = [...stateRef.value, ...queueRef.value, ...items]\n stateRef.value = results.slice(0, limit)\n queueRef.value = results.slice(limit)\n }\n\n const update = (fn: (state: T[]) => T[]) => {\n const results = fn([...stateRef.value, ...queueRef.value])\n stateRef.value = results.slice(0, limit)\n queueRef.value = results.slice(limit)\n }\n\n const cleanQueue = () => {\n queueRef.value = []\n }\n\n return {\n state: readonly(stateRef) as Readonly<Ref<T[]>>,\n queue: readonly(queueRef) as Readonly<Ref<T[]>>,\n add,\n update,\n cleanQueue,\n }\n}\n","import { isRef, onBeforeUnmount, onMounted, type MaybeRefOrGetter, type Ref } from 'vue'\n\nexport function usePageLeave(onPageLeave: MaybeRefOrGetter<() => void>): void {\n const getHandler = () =>\n isRef(onPageLeave) ? (onPageLeave as Ref<() => void>).value : (onPageLeave as () => void)\n const handleMouseLeave = (): void => getHandler()()\n\n onMounted(() => {\n document.documentElement.addEventListener('mouseleave', handleMouseLeave)\n })\n\n onBeforeUnmount(() => {\n document.documentElement.removeEventListener('mouseleave', handleMouseLeave)\n })\n}\n","import type { Ref } from 'vue'\nimport { useMediaQuery, type UseMediaQueryOptions } from '../use-media-query/use-media-query'\n\nexport function useReducedMotion(\n initialValue?: boolean,\n options?: UseMediaQueryOptions,\n): Readonly<Ref<boolean>> {\n return useMediaQuery('(prefers-reduced-motion: reduce)', initialValue, options)\n}\n","import { onBeforeUnmount, ref, type Ref } from 'vue'\nimport { useReducedMotion } from '../use-reduced-motion/use-reduced-motion'\nimport { useWindowEvent } from '../use-window-event/use-window-event'\n\ninterface UseScrollIntoViewAnimation {\n /** Target element alignment relatively to parent based on current axis */\n alignment?: 'start' | 'end' | 'center'\n}\n\nexport interface UseScrollIntoViewOptions {\n /** Callback fired after scroll */\n onScrollFinish?: () => void\n\n /** Callback fired when scroll animation is canceled by user interaction */\n onScrollCancel?: () => void\n\n /** Duration of scroll in milliseconds */\n duration?: number\n\n /** Axis of scroll */\n axis?: 'x' | 'y'\n\n /** Custom mathematical easing function */\n easing?: (t: number) => number\n\n /** Additional distance between nearest edge and element */\n offset?: number\n\n /** Indicator if animation may be interrupted by user scrolling */\n cancelable?: boolean\n\n /** Prevents content jumping in scrolling lists with multiple targets */\n isList?: boolean\n}\n\nexport interface UseScrollIntoViewReturnValue<\n Target extends HTMLElement = HTMLElement,\n Parent extends HTMLElement | null = null,\n> {\n scrollableRef: Ref<Parent | null>\n targetRef: Ref<Target | null>\n scrollIntoView: (params?: UseScrollIntoViewAnimation) => void\n cancel: () => void\n scrolling: Ref<boolean>\n}\n\nexport function useScrollIntoView<\n Target extends HTMLElement = HTMLElement,\n Parent extends HTMLElement | null = null,\n>(options: UseScrollIntoViewOptions = {}): UseScrollIntoViewReturnValue<Target, Parent> {\n const {\n duration = 1250,\n axis = 'y',\n onScrollFinish,\n onScrollCancel,\n easing = easeInOutQuad,\n offset = 0,\n cancelable = true,\n isList = false,\n } = options\n\n const frameID = ref(0)\n const startTime = ref(0)\n const shouldStop = ref(false)\n const scrolling = ref(false)\n\n const scrollableRef = ref<Parent | null>(null) as Ref<Parent | null>\n const targetRef = ref<Target | null>(null) as Ref<Target | null>\n\n const reducedMotion = useReducedMotion()\n\n const cancel = (): void => {\n if (frameID.value) {\n cancelAnimationFrame(frameID.value)\n frameID.value = 0\n scrolling.value = false\n }\n }\n\n const scrollIntoView = ({ alignment = 'start' }: UseScrollIntoViewAnimation = {}): void => {\n shouldStop.value = false\n\n if (frameID.value) {\n cancel()\n }\n\n const start = getScrollStart({ parent: scrollableRef.value, axis }) ?? 0\n\n const change =\n getRelativePosition({\n parent: scrollableRef.value,\n target: targetRef.value,\n axis,\n alignment,\n offset,\n isList,\n }) - (scrollableRef.value ? 0 : start)\n\n scrolling.value = true\n\n function animateScroll(): void {\n if (startTime.value === 0) {\n startTime.value = performance.now()\n }\n\n const now = performance.now()\n const elapsed = now - startTime.value\n\n // Easing timing progress\n const t = reducedMotion.value || duration === 0 ? 1 : elapsed / duration\n\n const distance = start + change * easing(t)\n\n setScrollParam({\n parent: scrollableRef.value,\n axis,\n distance,\n })\n\n if (!shouldStop.value && t < 1) {\n frameID.value = requestAnimationFrame(animateScroll)\n } else {\n if (shouldStop.value) {\n onScrollCancel?.()\n } else {\n onScrollFinish?.()\n }\n startTime.value = 0\n frameID.value = 0\n scrolling.value = false\n cancel()\n }\n }\n animateScroll()\n }\n\n const handleStop = (): void => {\n if (cancelable) {\n shouldStop.value = true\n }\n }\n\n /**\n * Detection of one of these events stops scroll animation\n * wheel - mouse wheel / touch pad\n * touchmove - any touchable device\n */\n\n useWindowEvent('wheel', handleStop, {\n passive: true,\n })\n\n useWindowEvent('touchmove', handleStop, {\n passive: true,\n })\n\n // Cleanup requestAnimationFrame\n onBeforeUnmount(cancel)\n\n return {\n scrollableRef,\n targetRef,\n scrollIntoView,\n cancel,\n scrolling,\n }\n}\n\n// ---------------------------------------------------\n// Helpers\n// ---------------------------------------------------\n\nfunction easeInOutQuad(t: number): number {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t\n}\n\ninterface RelativePositionParams {\n axis: 'x' | 'y'\n target: HTMLElement | null\n parent: HTMLElement | null\n alignment: 'start' | 'end' | 'center'\n offset: number\n isList: boolean\n}\n\nfunction getRelativePosition({\n axis,\n target,\n parent,\n alignment,\n offset,\n isList,\n}: RelativePositionParams): number {\n // `target`/`parent` are normally HTMLElements, but if a consumer accidentally\n // binds the returned ref to a Vue component instance instead of a native DOM\n // element, they'll be a component proxy without DOM methods. Guard against\n // that instead of throwing on `getBoundingClientRect`.\n const safeTarget = target instanceof Element ? target : null\n const safeParent = parent instanceof Element ? parent : null\n\n if (!safeTarget || (!safeParent && typeof document === 'undefined')) {\n return 0\n }\n const isCustomParent = !!safeParent\n const parentElement = safeParent || document.body\n const parentPosition = parentElement.getBoundingClientRect()\n const targetPosition = safeTarget.getBoundingClientRect()\n\n const getDiff = (property: 'top' | 'left'): number =>\n targetPosition[property] - parentPosition[property]\n\n if (axis === 'y') {\n const diff = getDiff('top')\n\n if (diff === 0) {\n return 0\n }\n\n if (alignment === 'start') {\n const distance = diff - offset\n const shouldScroll = distance <= targetPosition.height * (isList ? 0 : 1) || !isList\n\n return shouldScroll ? distance : 0\n }\n\n const parentHeight = isCustomParent ? parentPosition.height : window.innerHeight\n\n if (alignment === 'end') {\n const distance = diff + offset - parentHeight + targetPosition.height\n const shouldScroll = distance >= -targetPosition.height * (isList ? 0 : 1) || !isList\n\n return shouldScroll ? distance : 0\n }\n\n if (alignment === 'center') {\n return diff - parentHeight / 2 + targetPosition.height / 2\n }\n\n return 0\n }\n\n if (axis === 'x') {\n const diff = getDiff('left')\n\n if (diff === 0) {\n return 0\n }\n\n if (alignment === 'start') {\n const distance = diff - offset\n const shouldScroll = distance <= targetPosition.width || !isList\n\n return shouldScroll ? distance : 0\n }\n\n const parentWidth = isCustomParent ? parentPosition.width : window.innerWidth\n\n if (alignment === 'end') {\n const distance = diff + offset - parentWidth + targetPosition.width\n const shouldScroll = distance >= -targetPosition.width || !isList\n\n return shouldScroll ? distance : 0\n }\n\n if (alignment === 'center') {\n return diff - parentWidth / 2 + targetPosition.width / 2\n }\n\n return 0\n }\n\n return 0\n}\n\ninterface ScrollStartParams {\n axis: 'x' | 'y'\n parent: HTMLElement | null\n}\n\nfunction getScrollStart({ axis, parent }: ScrollStartParams): number {\n const safeParent = parent instanceof Element ? parent : null\n\n if (!safeParent && typeof document === 'undefined') {\n return 0\n }\n\n const method = axis === 'y' ? 'scrollTop' : 'scrollLeft'\n\n if (safeParent) {\n return safeParent[method]\n }\n\n const { body, documentElement } = document\n\n // While one of it has a value the second is equal 0\n return body[method] + documentElement[method]\n}\n\ninterface SetScrollParamParams {\n axis: 'x' | 'y'\n parent: HTMLElement | null\n distance: number\n}\n\nfunction setScrollParam({ axis, parent, distance }: SetScrollParamParams): void {\n const safeParent = parent instanceof Element ? parent : null\n\n if (!safeParent && typeof document === 'undefined') {\n return\n }\n\n const method = axis === 'y' ? 'scrollTop' : 'scrollLeft'\n\n if (safeParent) {\n safeParent[method] = distance\n } else {\n const { body, documentElement } = document\n body[method] = distance\n documentElement[method] = distance\n }\n}\n","import { onBeforeUnmount, ref, watch, type Ref } from 'vue'\n\nexport type ObserverRect = Omit<DOMRectReadOnly, 'toJSON'>\n\nconst defaultState: ObserverRect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n}\n\nexport interface UseResizeObserverReturnValue<T extends Element = HTMLElement> {\n ref: Ref<T | null>\n rect: Ref<ObserverRect>\n}\n\nexport function useResizeObserver<T extends Element = HTMLElement>(\n options?: ResizeObserverOptions,\n): UseResizeObserverReturnValue<T> {\n const elementRef = ref<T | null>(null) as Ref<T | null>\n const rect = ref<ObserverRect>(defaultState) as Ref<ObserverRect>\n let observer: ResizeObserver | undefined\n\n const disconnect = () => {\n observer?.disconnect()\n observer = undefined\n }\n\n // NOTE: updates apply synchronously inside the ResizeObserver callback\n // (no `requestAnimationFrame` throttling, unlike React Mantine's version).\n // Vue's reactivity already batches/schedules DOM updates via its own\n // scheduler, and tests in this codebase drive resize updates by invoking\n // the observer callback directly and awaiting `nextTick()` — wrapping\n // this in `requestAnimationFrame` would defer past that flush.\n //\n // `flush: 'sync'` is required (not the default 'pre' scheduling) so that\n // the observer is created and `.observe()` is called the instant the\n // template ref binds the DOM node — i.e. synchronously within the same\n // `mount()` call, matching the timing guarantee the original\n // `onMounted`-based implementation gave callers/tests. With default flush\n // timing, this would only run after a microtask tick, so code that reads\n // `elementRef`/attaches to the observer immediately after `mount()`\n // (without an intervening `nextTick()`) would see nothing attached yet.\n watch(\n elementRef,\n (node) => {\n disconnect()\n\n if (!node || typeof ResizeObserver === 'undefined') {\n return\n }\n\n observer = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry) {\n const boxSize = entry.borderBoxSize?.[0] || entry.contentBoxSize?.[0]\n if (boxSize) {\n rect.value = {\n width: boxSize.inlineSize,\n height: boxSize.blockSize,\n x: entry.contentRect.x,\n y: entry.contentRect.y,\n top: entry.contentRect.top,\n left: entry.contentRect.left,\n bottom: entry.contentRect.bottom,\n right: entry.contentRect.right,\n }\n } else {\n rect.value = entry.contentRect\n }\n }\n })\n observer.observe(node, options)\n },\n { immediate: true, flush: 'sync' },\n )\n\n onBeforeUnmount(disconnect)\n\n return { ref: elementRef, rect }\n}\n\nexport interface UseElementSizeReturnValue<T extends Element = HTMLElement> {\n ref: Ref<T | null>\n width: Ref<number>\n height: Ref<number>\n}\n\nexport function useElementSize<T extends Element = HTMLElement>(\n options?: ResizeObserverOptions,\n): UseElementSizeReturnValue<T> {\n const { ref: elementRef, rect } = useResizeObserver<T>(options)\n const width = ref(0)\n const height = ref(0)\n\n watch(\n rect,\n (value) => {\n width.value = value.width\n height.value = value.height\n },\n { immediate: true },\n )\n\n return { ref: elementRef, width, height }\n}\n","import { onUpdated, toValue, watch, type MaybeRefOrGetter } from 'vue'\n\nfunction shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) {\n return true\n }\n\n if (typeof a === 'number' && typeof b === 'number' && Number.isNaN(a) && Number.isNaN(b)) {\n return true\n }\n\n if (!(a instanceof Object) || !(b instanceof Object)) {\n return false\n }\n\n const keys = Object.keys(a)\n const { length } = keys\n\n if (length !== Object.keys(b).length) {\n return false\n }\n\n for (let i = 0; i < length; i += 1) {\n const key = keys[i]\n\n if (!(key in b)) {\n return false\n }\n\n const aValue = (a as Record<string, unknown>)[key]\n const bValue = (b as Record<string, unknown>)[key]\n\n if (aValue !== bValue && !(Number.isNaN(aValue) && Number.isNaN(bValue))) {\n return false\n }\n }\n\n return true\n}\n\nfunction shallowCompareDeps(prev: unknown[] | undefined, curr: unknown[] | undefined): boolean {\n if (!prev || !curr) {\n return false\n }\n\n if (prev === curr) {\n return true\n }\n\n if (prev.length !== curr.length) {\n return false\n }\n\n for (let i = 0; i < prev.length; i += 1) {\n if (!shallowEqual(prev[i], curr[i])) {\n return false\n }\n }\n\n return true\n}\n\nexport function useShallowEffect(\n effect: () => void,\n dependencies?: MaybeRefOrGetter<unknown>[],\n): void {\n if (!dependencies) {\n effect()\n onUpdated(effect)\n return\n }\n\n let previous: unknown[] | undefined\n\n const getDeps = (): unknown[] => dependencies.map((dep) => toValue(dep))\n\n watch(\n getDeps,\n (curr) => {\n if (!shallowCompareDeps(previous, curr)) {\n previous = curr\n effect()\n }\n },\n { immediate: true },\n )\n}\n","import { ref, type Ref } from 'vue'\n\nexport type UseToggleAction<T> = (value?: T | ((value: T) => T)) => void\nexport type UseToggleReturnValue<T> = [Ref<T>, UseToggleAction<T>]\n\nexport function useToggle<T = boolean>(\n options: readonly T[] = [false, true] as unknown as readonly T[],\n): UseToggleReturnValue<T> {\n const state = ref(options[0]) as Ref<T>\n const toggle: UseToggleAction<T> = (value) => {\n if (value !== undefined) {\n const nextValue = value instanceof Function ? value(state.value) : value\n const index = Math.abs(options.indexOf(nextValue))\n state.value = options[index]\n return\n }\n\n const index = options.indexOf(state.value)\n state.value = options[(index + 1) % options.length]\n }\n\n return [state, toggle]\n}\n","import { onMounted, ref, type Ref } from 'vue'\nimport { useWindowEvent } from '../use-window-event/use-window-event'\n\nconst eventListenerOptions: AddEventListenerOptions = {\n passive: true,\n}\n\nexport interface UseViewportSizeReturnValue {\n width: Ref<number>\n height: Ref<number>\n}\n\nexport function useViewportSize(): UseViewportSizeReturnValue {\n const width = ref(0)\n const height = ref(0)\n\n const setSize = () => {\n width.value = window.innerWidth || 0\n height.value = window.innerHeight || 0\n }\n\n useWindowEvent('resize', setSize, eventListenerOptions)\n useWindowEvent('orientationchange', setSize, eventListenerOptions)\n onMounted(setSize)\n\n return { width, height }\n}\n","import { onMounted, ref, type Ref } from 'vue'\nimport { useWindowEvent } from '../use-window-event/use-window-event'\n\nexport interface UseWindowScrollPosition {\n x: number\n y: number\n}\n\nexport type UseWindowScrollTo = (position: Partial<UseWindowScrollPosition>) => void\nexport type UseWindowScrollReturnValue = [Ref<UseWindowScrollPosition>, UseWindowScrollTo]\n\nfunction getScrollPosition(): UseWindowScrollPosition {\n return typeof window !== 'undefined' ? { x: window.scrollX, y: window.scrollY } : { x: 0, y: 0 }\n}\n\nfunction scrollTo({ x, y }: Partial<UseWindowScrollPosition>): void {\n if (typeof window !== 'undefined') {\n const scrollOptions: ScrollToOptions = { behavior: 'smooth' }\n\n if (typeof x === 'number') {\n scrollOptions.left = x\n }\n\n if (typeof y === 'number') {\n scrollOptions.top = y\n }\n\n window.scrollTo(scrollOptions)\n }\n}\n\nexport function useWindowScroll(): UseWindowScrollReturnValue {\n const position = ref<UseWindowScrollPosition>({ x: 0, y: 0 }) as Ref<UseWindowScrollPosition>\n\n useWindowEvent('scroll', () => (position.value = getScrollPosition()), { passive: true })\n useWindowEvent('resize', () => (position.value = getScrollPosition()), { passive: true })\n\n onMounted(() => {\n position.value = getScrollPosition()\n })\n\n return [position, scrollTo] as const\n}\n","import { onBeforeUnmount, ref, watch, type Ref } from 'vue'\n\nexport interface UseIntersectionReturnValue<T extends HTMLElement = HTMLElement> {\n ref: Ref<T | null>\n entry: Ref<IntersectionObserverEntry | null>\n}\n\nexport function useIntersection<T extends HTMLElement = HTMLElement>(\n options?: IntersectionObserverInit,\n): UseIntersectionReturnValue<T> {\n const elementRef = ref<T | null>(null) as Ref<T | null>\n const entry = ref<IntersectionObserverEntry | null>(null) as Ref<IntersectionObserverEntry | null>\n let observer: IntersectionObserver | undefined\n\n watch(\n elementRef,\n (node) => {\n observer?.disconnect()\n observer = undefined\n\n if (!node) {\n entry.value = null\n return\n }\n\n observer = new IntersectionObserver(([_entry]) => {\n entry.value = _entry\n }, options)\n\n observer.observe(node)\n },\n { immediate: true },\n )\n\n onBeforeUnmount(() => observer?.disconnect())\n\n return { ref: elementRef, entry }\n}\n","import { onMounted, ref, type Ref } from 'vue'\nimport { useWindowEvent } from '../use-window-event/use-window-event'\n\nexport interface UseHashInput {\n getInitialValueInEffect?: boolean\n}\n\nexport type UseHashReturnValue = [Ref<string>, (value: string) => void]\n\nfunction getInitialHash(getInitialValueInEffect: boolean): string {\n if (getInitialValueInEffect) {\n return ''\n }\n\n return typeof window !== 'undefined' ? window.location.hash || '' : ''\n}\n\nexport function useHash(options: UseHashInput = {}): UseHashReturnValue {\n const { getInitialValueInEffect = true } = options\n\n const hash = ref<string>(getInitialHash(getInitialValueInEffect)) as Ref<string>\n\n const setHashHandler = (value: string): void => {\n const valueWithHash = value.startsWith('#') ? value : `#${value}`\n if (typeof window !== 'undefined') {\n window.location.hash = valueWithHash\n }\n hash.value = valueWithHash\n }\n\n useWindowEvent('hashchange', () => {\n const newHash = window.location.hash\n if (hash.value !== newHash) {\n hash.value = newHash\n }\n })\n\n onMounted(() => {\n if (getInitialValueInEffect) {\n hash.value = window.location.hash\n }\n })\n\n return [hash, setHashHandler]\n}\n","export interface KeyboardModifiers {\n alt: boolean\n ctrl: boolean\n meta: boolean\n mod: boolean\n shift: boolean\n}\n\nexport interface Hotkey extends KeyboardModifiers {\n key?: string\n}\n\ntype CheckHotkeyMatch = (event: KeyboardEvent) => boolean\n\nconst keyNameMap: Record<string, string> = {\n ' ': 'space',\n ArrowLeft: 'arrowleft',\n ArrowRight: 'arrowright',\n ArrowUp: 'arrowup',\n ArrowDown: 'arrowdown',\n Escape: 'escape',\n Esc: 'escape',\n esc: 'escape',\n Enter: 'enter',\n Tab: 'tab',\n Backspace: 'backspace',\n Delete: 'delete',\n Insert: 'insert',\n Home: 'home',\n End: 'end',\n PageUp: 'pageup',\n PageDown: 'pagedown',\n '+': 'plus',\n '-': 'minus',\n '*': 'asterisk',\n '/': 'slash',\n}\n\nfunction normalizeKey(key: string): string {\n const lowerKey = key.replace('Key', '').toLowerCase()\n return keyNameMap[key] || lowerKey\n}\n\nexport function parseHotkey(hotkey: string): Hotkey {\n const keys = hotkey\n .toLowerCase()\n .split('+')\n .map((part) => part.trim())\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n shift: keys.includes('shift'),\n }\n\n const reservedKeys = ['alt', 'ctrl', 'meta', 'shift', 'mod']\n const freeKey = keys.find((key) => !reservedKeys.includes(key))\n\n return {\n ...modifiers,\n key: freeKey === '[plus]' ? '+' : freeKey,\n }\n}\n\nfunction isExactHotkey(hotkey: Hotkey, event: KeyboardEvent, usePhysicalKeys?: boolean): boolean {\n const { alt, ctrl, meta, mod, shift, key } = hotkey\n const { altKey, ctrlKey, metaKey, shiftKey, key: pressedKey, code: pressedCode } = event\n\n if (alt !== altKey) {\n return false\n }\n\n if (mod) {\n if (!ctrlKey && !metaKey) {\n return false\n }\n } else {\n if (ctrl !== ctrlKey) {\n return false\n }\n if (meta !== metaKey) {\n return false\n }\n }\n\n if (shift !== shiftKey) {\n return false\n }\n\n if (\n key &&\n (usePhysicalKeys\n ? normalizeKey(pressedCode) === normalizeKey(key)\n : normalizeKey(pressedKey ?? pressedCode) === normalizeKey(key))\n ) {\n return true\n }\n\n return false\n}\n\nexport function getHotkeyMatcher(hotkey: string, usePhysicalKeys?: boolean): CheckHotkeyMatch {\n return (event) => isExactHotkey(parseHotkey(hotkey), event, usePhysicalKeys)\n}\n\nexport interface HotkeyItemOptions {\n preventDefault?: boolean\n usePhysicalKeys?: boolean\n}\n\ntype HotkeyItemTuple = [string, (event: any) => void, HotkeyItemOptions?]\n\nexport function getHotkeyHandler(hotkeys: HotkeyItemTuple[]) {\n return (event: KeyboardEvent) => {\n hotkeys.forEach(\n ([hotkey, handler, options = { preventDefault: true, usePhysicalKeys: false }]) => {\n if (getHotkeyMatcher(hotkey, options.usePhysicalKeys)(event)) {\n if (options.preventDefault) {\n event.preventDefault()\n }\n\n handler(event)\n }\n },\n )\n }\n}\n","import { onBeforeUnmount, onMounted, toValue, type MaybeRefOrGetter } from 'vue'\nimport { getHotkeyHandler, getHotkeyMatcher, type HotkeyItemOptions } from './parse-hotkey'\n\nexport type { HotkeyItemOptions }\nexport { getHotkeyHandler }\n\nexport type HotkeyItem = [string, (event: KeyboardEvent) => void, HotkeyItemOptions?]\n\nfunction shouldFireEvent(\n event: KeyboardEvent,\n tagsToIgnore: string[],\n triggerOnContentEditable = false,\n) {\n if (event.target instanceof HTMLElement) {\n const tagName = event.target.tagName.toLowerCase()\n\n if (triggerOnContentEditable) {\n return !tagsToIgnore.includes(tagName)\n }\n\n return !event.target.isContentEditable && !tagsToIgnore.includes(tagName)\n }\n\n return true\n}\n\n/**\n * Listens for global keydown events and invokes matching handlers.\n *\n * NOTE: the listener is attached to `window` rather than\n * `document.documentElement` (which is what React Mantine uses). Real\n * keyboard events always bubble to `window`, so this is behaviorally\n * equivalent for actual usage while remaining consistent with how the rest\n * of this package (and its test suite) dispatches synthetic events.\n */\nexport function useHotkeys(\n hotkeys: MaybeRefOrGetter<HotkeyItem[]>,\n tagsToIgnore: MaybeRefOrGetter<string[] | undefined> = ['input', 'textarea', 'select'],\n triggerOnContentEditable: MaybeRefOrGetter<boolean | undefined> = false,\n) {\n const handleKeydown = (event: KeyboardEvent) => {\n toValue(hotkeys).forEach(\n ([hotkey, handler, options = { preventDefault: true, usePhysicalKeys: false }]) => {\n if (\n getHotkeyMatcher(hotkey, options.usePhysicalKeys)(event) &&\n shouldFireEvent(\n event,\n toValue(tagsToIgnore) ?? ['input', 'textarea', 'select'],\n toValue(triggerOnContentEditable),\n )\n ) {\n if (options.preventDefault) {\n event.preventDefault()\n }\n\n handler(event)\n }\n },\n )\n }\n\n onMounted(() => window.addEventListener('keydown', handleKeydown))\n onBeforeUnmount(() => window.removeEventListener('keydown', handleKeydown))\n}\n","import { onBeforeUnmount, onMounted, ref, watch, type Ref } from 'vue'\n\nfunction getFullscreenElement(): Element | null {\n const _document = window.document as any\n\n return (\n _document.fullscreenElement ||\n _document.webkitFullscreenElement ||\n _document.mozFullScreenElement ||\n _document.msFullscreenElement ||\n null\n )\n}\n\nfunction exitFullscreen(): Promise<void> | null {\n const _document = window.document as any\n\n if (typeof _document.exitFullscreen === 'function') {\n return _document.exitFullscreen()\n }\n if (typeof _document.msExitFullscreen === 'function') {\n return _document.msExitFullscreen()\n }\n if (typeof _document.webkitExitFullscreen === 'function') {\n return _document.webkitExitFullscreen()\n }\n if (typeof _document.mozCancelFullScreen === 'function') {\n return _document.mozCancelFullScreen()\n }\n\n return null\n}\n\nfunction enterFullScreen(element: HTMLElement) {\n const _element = element as any\n\n return (\n _element.requestFullscreen?.() ||\n _element.msRequestFullscreen?.() ||\n _element.webkitEnterFullscreen?.() ||\n _element.webkitRequestFullscreen?.() ||\n _element.mozRequestFullscreen?.()\n )\n}\n\nconst prefixes = ['', 'webkit', 'moz', 'ms']\n\ninterface FullscreenEvents {\n onFullScreen: (event: Event) => void\n onError: (event: Event) => void\n}\n\nfunction addEvents(element: HTMLElement, events: FullscreenEvents) {\n const { onFullScreen, onError } = events\n prefixes.forEach((prefix) => {\n element.addEventListener(`${prefix}fullscreenchange`, onFullScreen)\n element.addEventListener(`${prefix}fullscreenerror`, onError)\n })\n\n return () => removeEvents(element, events)\n}\n\nfunction removeEvents(element: HTMLElement, { onFullScreen, onError }: FullscreenEvents) {\n prefixes.forEach((prefix) => {\n element.removeEventListener(`${prefix}fullscreenchange`, onFullScreen)\n element.removeEventListener(`${prefix}fullscreenerror`, onError)\n })\n}\n\nexport interface UseFullscreenElementReturnValue<T extends HTMLElement = HTMLElement> {\n ref: Ref<T | null>\n toggle: () => Promise<void>\n fullscreen: Ref<boolean>\n}\n\nexport function useFullscreenElement<\n T extends HTMLElement = HTMLElement,\n>(): UseFullscreenElementReturnValue<T> {\n const fullscreen = ref(false)\n const elementRef = ref<T | null>(null) as Ref<T | null>\n let removeEventsFn: (() => void) | undefined\n\n const handleFullscreenChange = () => {\n fullscreen.value = elementRef.value === getFullscreenElement()\n }\n\n const handleFullscreenError = () => {\n fullscreen.value = false\n }\n\n const toggle = async () => {\n if (!getFullscreenElement() && elementRef.value) {\n await enterFullScreen(elementRef.value)\n } else {\n await exitFullscreen()\n }\n }\n\n watch(\n elementRef,\n (node) => {\n removeEventsFn?.()\n removeEventsFn = undefined\n\n if (node) {\n removeEventsFn = addEvents(node, {\n onFullScreen: handleFullscreenChange,\n onError: handleFullscreenError,\n })\n }\n },\n { immediate: true },\n )\n\n onBeforeUnmount(() => removeEventsFn?.())\n\n return { ref: elementRef, toggle, fullscreen }\n}\n\nexport interface UseFullscreenDocumentReturnValue {\n toggle: () => Promise<void>\n fullscreen: Ref<boolean>\n}\n\nexport function useFullscreenDocument(): UseFullscreenDocumentReturnValue {\n const fullscreen = ref(false)\n let removeEventsFn: (() => void) | undefined\n\n const handleFullscreenChange = () => {\n fullscreen.value = getFullscreenElement() === window.document.documentElement\n }\n\n const handleFullscreenError = () => {\n fullscreen.value = false\n }\n\n const toggle = async () => {\n if (!getFullscreenElement()) {\n await enterFullScreen(window.document.documentElement)\n } else {\n await exitFullscreen()\n }\n }\n\n onMounted(() => {\n removeEventsFn = addEvents(window.document.documentElement, {\n onFullScreen: handleFullscreenChange,\n onError: handleFullscreenError,\n })\n })\n\n onBeforeUnmount(() => removeEventsFn?.())\n\n return { toggle, fullscreen }\n}\n","/* eslint-disable no-console */\nimport { onBeforeUnmount, onMounted, toValue, type MaybeRefOrGetter } from 'vue'\nimport { useDidUpdate } from '../use-did-update/use-did-update'\n\nexport function useLogger(componentName: string, props: MaybeRefOrGetter<unknown>[]): null {\n onMounted(() => {\n console.log(`${componentName} mounted`, ...props.map((prop) => toValue(prop)))\n })\n\n onBeforeUnmount(() => {\n console.log(`${componentName} unmounted`)\n })\n\n useDidUpdate(() => {\n console.log(`${componentName} updated`, ...props.map((prop) => toValue(prop)))\n }, props)\n\n return null\n}\n","import { onBeforeUnmount, onMounted, ref, type Ref } from 'vue'\n\nexport interface UseHoverReturnValue<T extends HTMLElement = HTMLElement> {\n ref: Ref<T | null>\n hovered: Ref<boolean>\n}\n\nexport function useHover<T extends HTMLElement = HTMLElement>(): UseHoverReturnValue<T> {\n const refTarget = ref<T | null>(null) as Ref<T | null>\n const hovered = ref(false)\n let cleanup: (() => void) | undefined\n\n onMounted(() => {\n const node = refTarget.value\n if (!node) {\n return\n }\n\n const onEnter = () => (hovered.value = true)\n const onLeave = () => (hovered.value = false)\n\n node.addEventListener('mouseenter', onEnter)\n node.addEventListener('mouseleave', onLeave)\n\n cleanup = () => {\n node.removeEventListener('mouseenter', onEnter)\n node.removeEventListener('mouseleave', onLeave)\n }\n })\n\n onBeforeUnmount(() => cleanup?.())\n\n return { ref: refTarget, hovered }\n}\n","import { readonly, ref, type Ref } from 'vue'\n\nexport interface UseValidatedStateValue<T> {\n /** Current value */\n value: T\n\n /** Last valid value */\n lastValidValue: T | undefined\n\n /** True if the current value is valid, false otherwise */\n valid: boolean\n}\n\nexport type UseValidatedStateReturnValue<T> = [\n /** Current value */\n Readonly<Ref<UseValidatedStateValue<T>>>,\n /** Handler to update the state, passes `value` and `payload` to `onChange` */\n (value: T) => void,\n]\n\nexport function useValidatedState<T>(\n initialValue: T,\n validate: (value: T) => boolean,\n initialValidationState?: boolean,\n): UseValidatedStateReturnValue<T> {\n const state = ref<UseValidatedStateValue<T>>({\n value: initialValue,\n lastValidValue: validate(initialValue) ? initialValue : undefined,\n valid:\n typeof initialValidationState === 'boolean' ? initialValidationState : validate(initialValue),\n }) as Ref<UseValidatedStateValue<T>>\n\n const onChange = (val: T) => {\n const isValid = validate(val)\n state.value = {\n value: val,\n lastValidValue: isValid ? val : state.value.lastValidValue,\n valid: isValid,\n }\n }\n\n return [readonly(state) as Readonly<Ref<UseValidatedStateValue<T>>>, onChange]\n}\n","import { readonly, ref, type Ref } from 'vue'\nimport { useIsomorphicEffect } from '../use-isomorphic-effect/use-isomorphic-effect'\n\nexport type UseOSReturnValue =\n | 'undetermined'\n | 'macos'\n | 'ios'\n | 'windows'\n | 'android'\n | 'linux'\n | 'chromeos'\n\nfunction isMacOS(userAgent: string): boolean {\n const macosPattern = /(Macintosh)|(MacIntel)|(MacPPC)|(Mac68K)/i\n\n return macosPattern.test(userAgent)\n}\n\nfunction isIOS(userAgent: string): boolean {\n const iosPattern = /(iPhone)|(iPad)|(iPod)/i\n\n return iosPattern.test(userAgent)\n}\n\nfunction isWindows(userAgent: string): boolean {\n const windowsPattern = /(Win32)|(Win64)|(Windows)|(WinCE)/i\n\n return windowsPattern.test(userAgent)\n}\n\nfunction isAndroid(userAgent: string): boolean {\n const androidPattern = /Android/i\n\n return androidPattern.test(userAgent)\n}\n\nfunction isLinux(userAgent: string): boolean {\n const linuxPattern = /Linux/i\n\n return linuxPattern.test(userAgent)\n}\n\nfunction isChromeOS(userAgent: string): boolean {\n const chromePattern = /CrOS/i\n return chromePattern.test(userAgent)\n}\n\nfunction getOS(): UseOSReturnValue {\n if (typeof window === 'undefined') {\n return 'undetermined'\n }\n\n const { userAgent } = window.navigator\n\n if (isIOS(userAgent) || (isMacOS(userAgent) && 'ontouchend' in document)) {\n return 'ios'\n }\n if (isMacOS(userAgent)) {\n return 'macos'\n }\n if (isWindows(userAgent)) {\n return 'windows'\n }\n if (isAndroid(userAgent)) {\n return 'android'\n }\n if (isChromeOS(userAgent)) {\n return 'chromeos'\n }\n if (isLinux(userAgent)) {\n return 'linux'\n }\n\n return 'undetermined'\n}\n\nexport interface UseOsOptions {\n getValueInEffect: boolean\n}\n\nexport function useOs(\n options: UseOsOptions = { getValueInEffect: true },\n): Readonly<Ref<UseOSReturnValue>> {\n const value = ref<UseOSReturnValue>(\n options.getValueInEffect ? 'undetermined' : getOS(),\n ) as Ref<UseOSReturnValue>\n\n useIsomorphicEffect(() => {\n if (options.getValueInEffect) {\n value.value = getOS()\n }\n })\n\n return readonly(value) as Readonly<Ref<UseOSReturnValue>>\n}\n","import { ref, type Ref } from 'vue'\n\nexport type UseSetStateCallback<T> = (state: Partial<T> | ((currentState: T) => Partial<T>)) => void\n\nexport type UseSetStateReturnValue<T> = [Ref<T>, UseSetStateCallback<T>]\n\nexport function useSetState<T extends Record<string, any>>(\n initialState: T,\n): UseSetStateReturnValue<T> {\n const state = ref(initialState) as Ref<T>\n\n const setState: UseSetStateCallback<T> = (statePartial) => {\n state.value = {\n ...state.value,\n ...(typeof statePartial === 'function' ? statePartial(state.value) : statePartial),\n }\n }\n\n return [state, setState]\n}\n","import { ref, type Ref } from 'vue'\n\nexport type UseInputStateReturnValue<T> = [\n Ref<T>,\n (eventOrValue: Event | T | ((current: T) => T)) => void,\n]\n\nexport function useInputState<T>(initialValue: T): UseInputStateReturnValue<T> {\n const value = ref(initialValue) as Ref<T>\n const setValue = (eventOrValue: Event | T | ((current: T) => T)) => {\n if (eventOrValue instanceof Function) {\n value.value = eventOrValue(value.value)\n return\n }\n\n if (\n eventOrValue instanceof Event ||\n (eventOrValue &&\n typeof eventOrValue === 'object' &&\n 'currentTarget' in (eventOrValue as Record<string, unknown>) &&\n 'nativeEvent' in (eventOrValue as Record<string, unknown>))\n ) {\n const target = ((eventOrValue as Event).target ??\n (eventOrValue as unknown as { currentTarget: HTMLInputElement })\n .currentTarget) as HTMLInputElement\n value.value = (target.type === 'checkbox' ? target.checked : target.value) as T\n } else {\n value.value = eventOrValue\n }\n }\n\n return [value, setValue]\n}\n","import { onBeforeUnmount, ref, watch, type Ref } from 'vue'\n\nexport function useEventListener<\n K extends keyof HTMLElementEventMap,\n T extends HTMLElement = HTMLElement,\n>(\n type: K,\n listener: (this: T, ev: HTMLElementEventMap[K]) => unknown,\n options?: boolean | AddEventListenerOptions,\n): Ref<T | null> {\n const elementRef = ref<T | null>(null) as Ref<T | null>\n let cleanup: (() => void) | undefined\n\n watch(\n elementRef,\n (node) => {\n cleanup?.()\n cleanup = undefined\n\n if (!node) {\n return\n }\n\n node.addEventListener(type, listener as EventListener, options)\n cleanup = () => node.removeEventListener(type, listener as EventListener, options)\n },\n { immediate: true },\n )\n\n onBeforeUnmount(() => cleanup?.())\n\n return elementRef\n}\n","import { ref, type Ref } from 'vue'\n\nexport interface UseDisclosureOptions {\n onOpen?: () => void\n onClose?: () => void\n}\n\nexport interface UseDisclosureHandlers {\n set: (value: boolean) => void\n open: () => void\n close: () => void\n toggle: () => void\n}\n\nexport type UseDisclosureReturnValue = [Ref<boolean>, UseDisclosureHandlers]\n\nexport function useDisclosure(\n initialState = false,\n options: UseDisclosureOptions = {},\n): UseDisclosureReturnValue {\n const opened = ref(initialState)\n\n const set = (value: boolean) => {\n if (value && !opened.value) {\n options.onOpen?.()\n }\n\n if (!value && opened.value) {\n options.onClose?.()\n }\n\n opened.value = value\n }\n\n return [\n opened,\n {\n set,\n open: () => set(true),\n close: () => set(false),\n toggle: () => set(!opened.value),\n },\n ]\n}\n","import { nextTick, onBeforeUnmount, onMounted, ref, type Ref } from 'vue'\n\nexport interface UseFocusWithinOptions {\n onFocus?: (event: FocusEvent) => void\n onBlur?: (event: FocusEvent) => void\n}\n\nexport interface UseFocusWithinReturnValue<T extends HTMLElement = HTMLElement> {\n ref: Ref<T | null>\n focused: Ref<boolean>\n}\n\nexport function useFocusWithin<T extends HTMLElement = HTMLElement>(\n options: UseFocusWithinOptions = {},\n): UseFocusWithinReturnValue<T> {\n const refTarget = ref<T | null>(null) as Ref<T | null>\n const focused = ref(false)\n let cleanup: (() => void) | undefined\n\n onMounted(() => {\n const node = refTarget.value\n if (!node) {\n return\n }\n\n const onFocusIn = (event: FocusEvent) => {\n focused.value = true\n options.onFocus?.(event)\n }\n const onFocusOut = (event: FocusEvent) =>\n nextTick(() => {\n const isFocused = node.matches(':focus-within')\n if (!isFocused && focused.value) {\n options.onBlur?.(event)\n }\n focused.value = isFocused\n })\n\n node.addEventListener('focusin', onFocusIn)\n node.addEventListener('focusout', onFocusOut)\n\n cleanup = () => {\n node.removeEventListener('focusin', onFocusIn)\n node.removeEventListener('focusout', onFocusOut)\n }\n })\n\n onBeforeUnmount(() => cleanup?.())\n\n return { ref: refTarget, focused }\n}\n","import { onBeforeUnmount, onMounted, ref, type Ref } from 'vue'\nimport { useWindowEvent } from '../use-window-event/use-window-event'\n\nexport interface UserNetworkReturnValue {\n online: boolean\n downlink?: number\n downlinkMax?: number\n effectiveType?: 'slow-2g' | '2g' | '3g' | '4g'\n rtt?: number\n saveData?: boolean\n type?: 'bluetooth' | 'cellular' | 'ethernet' | 'wifi' | 'wimax' | 'none' | 'other' | 'unknown'\n}\n\ninterface NetworkConnection extends EventTarget {\n downlink?: number\n downlinkMax?: number\n effectiveType?: 'slow-2g' | '2g' | '3g' | '4g'\n rtt?: number\n saveData?: boolean\n type?: 'bluetooth' | 'cellular' | 'ethernet' | 'wifi' | 'wimax' | 'none' | 'other' | 'unknown'\n}\n\ninterface NavigatorWithConnection extends Navigator {\n connection?: NetworkConnection\n mozConnection?: NetworkConnection\n webkitConnection?: NetworkConnection\n}\n\nfunction getConnection(): Omit<UserNetworkReturnValue, 'online'> {\n if (typeof navigator === 'undefined') {\n return {}\n }\n\n const nav = navigator as NavigatorWithConnection\n const connection = nav.connection || nav.mozConnection || nav.webkitConnection\n\n if (!connection) {\n return {}\n }\n\n return {\n downlink: connection.downlink,\n downlinkMax: connection.downlinkMax,\n effectiveType: connection.effectiveType,\n rtt: connection.rtt,\n saveData: connection.saveData,\n type: connection.type,\n }\n}\n\nexport function useNetwork(): Ref<UserNetworkReturnValue> {\n const status = ref<UserNetworkReturnValue>({ online: true }) as Ref<UserNetworkReturnValue>\n\n const handleConnectionChange = (): void => {\n status.value = { ...status.value, ...getConnection() }\n }\n\n useWindowEvent('online', () => {\n status.value = { online: true, ...getConnection() }\n })\n useWindowEvent('offline', () => {\n status.value = { online: false, ...getConnection() }\n })\n\n onMounted(() => {\n const nav = navigator as NavigatorWithConnection\n\n if (nav.connection) {\n status.value = { online: nav.onLine, ...getConnection() }\n nav.connection.addEventListener('change', handleConnectionChange)\n return\n }\n\n if (typeof nav.onLine === 'boolean') {\n status.value = { ...status.value, online: nav.onLine }\n }\n })\n\n onBeforeUnmount(() => {\n const nav = navigator as NavigatorWithConnection\n nav.connection?.removeEventListener('change', handleConnectionChange)\n })\n\n return status\n}\n","import { onBeforeUnmount } from 'vue'\n\nexport interface UseTimeoutOptions {\n autoInvoke?: boolean\n}\n\nexport interface UseTimeoutReturnValue {\n start: (...callbackParams: unknown[]) => void\n clear: () => void\n}\n\nexport function useTimeout(\n callback: (...callbackParams: unknown[]) => void,\n delay: number,\n options: UseTimeoutOptions = { autoInvoke: false },\n): UseTimeoutReturnValue {\n let timeout: ReturnType<typeof setTimeout> | undefined\n\n const start = (...callbackParams: unknown[]) => {\n clear()\n timeout = setTimeout(() => callback(...callbackParams), delay)\n }\n\n const clear = () => {\n if (timeout) {\n clearTimeout(timeout)\n timeout = undefined\n }\n }\n\n if (options.autoInvoke) {\n start()\n }\n\n onBeforeUnmount(clear)\n return { start, clear }\n}\n","import { onBeforeUnmount, onMounted, shallowRef, triggerRef, type Ref } from 'vue'\n\nexport function useTextSelection(): Ref<Selection | null> {\n const selection = shallowRef<Selection | null>(null)\n\n const handleSelectionChange = (): void => {\n selection.value = document.getSelection()\n triggerRef(selection)\n }\n\n onMounted(() => {\n selection.value = document.getSelection()\n triggerRef(selection)\n document.addEventListener('selectionchange', handleSelectionChange)\n })\n\n onBeforeUnmount(() => {\n document.removeEventListener('selectionchange', handleSelectionChange)\n })\n\n return selection\n}\n","import { shallowRef, toValue, watch, type MaybeRefOrGetter, type ShallowRef } from 'vue'\n\nexport function usePrevious<T>(value: MaybeRefOrGetter<T>): ShallowRef<T | undefined> {\n const previous = shallowRef<T>()\n watch(\n () => toValue(value),\n (_, oldValue) => {\n previous.value = oldValue\n },\n )\n return previous\n}\n","import { toValue, watch, type MaybeRefOrGetter } from 'vue'\nimport { useIsomorphicEffect } from '../use-isomorphic-effect/use-isomorphic-effect'\n\nconst MIME_TYPES: Record<string, string> = {\n ico: 'image/x-icon',\n png: 'image/png',\n svg: 'image/svg+xml',\n gif: 'image/gif',\n}\n\nexport function useFavicon(url: MaybeRefOrGetter<string>) {\n let link: HTMLLinkElement | null = null\n\n useIsomorphicEffect(() => {\n watch(\n () => toValue(url),\n (value) => {\n if (!value) {\n return\n }\n\n if (!link) {\n const existingElements = document.querySelectorAll<HTMLLinkElement>('link[rel*=\"icon\"]')\n existingElements.forEach((element) => document.head.removeChild(element))\n\n const element = document.createElement('link')\n element.rel = 'shortcut icon'\n link = element\n document.querySelector('head')!.appendChild(element)\n }\n\n const splittedUrl = value.split('.')\n const extension = splittedUrl[splittedUrl.length - 1].toLowerCase()\n const mimeType = MIME_TYPES[extension]\n\n if (mimeType) {\n link.setAttribute('type', mimeType)\n } else {\n link.removeAttribute('type')\n }\n\n link.setAttribute('href', value)\n },\n { immediate: true },\n )\n })\n}\n","import { onBeforeUnmount, readonly, ref, type Ref } from 'vue'\nimport { useWindowEvent } from '../use-window-event/use-window-event'\n\nexport type ScrollDirection = 'up' | 'down' | 'unknown'\n\nexport function useScrollDirection(): Readonly<Ref<ScrollDirection>> {\n const scrollDirection = ref<ScrollDirection>('unknown')\n let lastScrollTop = 0\n let isResizing = false\n let resizeTimer: number | undefined\n\n const handleScroll = () => {\n if (isResizing) {\n return\n }\n\n const currentScrollTop = window.scrollY || document.documentElement.scrollTop\n scrollDirection.value = currentScrollTop < lastScrollTop ? 'up' : 'down'\n lastScrollTop = currentScrollTop\n }\n\n const handleResize = () => {\n isResizing = true\n window.clearTimeout(resizeTimer)\n resizeTimer = window.setTimeout(() => {\n isResizing = false\n }, 300)\n }\n\n useWindowEvent('scroll', handleScroll)\n useWindowEvent('resize', handleResize)\n\n onBeforeUnmount(() => window.clearTimeout(resizeTimer))\n\n return readonly(scrollDirection) as Readonly<Ref<ScrollDirection>>\n}\n","import { ref, watch, type Ref } from 'vue'\nimport { useScrollDirection } from '../use-scroll-direction/use-scroll-direction'\nimport { useWindowEvent } from '../use-window-event/use-window-event'\n\nexport { useScrollDirection } from '../use-scroll-direction/use-scroll-direction'\n\nexport const isFixed = (current: number, fixedAt: number) => current <= fixedAt\nexport const isPinned = (current: number, previous: number) => current <= previous\nexport const isReleased = (current: number, previous: number, fixedAt: number) =>\n !isPinned(current, previous) && !isFixed(current, fixedAt)\n\nexport const isPinnedOrReleased = (\n current: number,\n fixedAt: number,\n isCurrentlyPinnedRef: { value: boolean },\n isScrollingUp: boolean,\n onPin?: () => void,\n onRelease?: () => void,\n) => {\n const isInFixedPosition = isFixed(current, fixedAt)\n if (isInFixedPosition && !isCurrentlyPinnedRef.value) {\n isCurrentlyPinnedRef.value = true\n onPin?.()\n } else if (!isInFixedPosition && isScrollingUp && !isCurrentlyPinnedRef.value) {\n isCurrentlyPinnedRef.value = true\n onPin?.()\n } else if (!isInFixedPosition && !isScrollingUp && isCurrentlyPinnedRef.value) {\n isCurrentlyPinnedRef.value = false\n onRelease?.()\n }\n}\n\nexport interface UseHeadroomInput {\n /** Number in px at which element should be fixed */\n fixedAt?: number\n\n /** Number of px to scroll to fully reveal or hide the element, 100 by default */\n scrollDistance?: number\n\n /** Called when element is pinned */\n onPin?: () => void\n\n /** Called when element is at fixed position */\n onFix?: () => void\n\n /** Called when element is unpinned */\n onRelease?: () => void\n}\n\nexport interface UseHeadroomReturnValue {\n /** True when the element is at least partially visible */\n pinned: Ref<boolean>\n\n /** Reveal progress: 0 = fully hidden, 1 = fully visible */\n scrollProgress: Ref<number>\n}\n\nexport function useHeadroom({\n fixedAt = 0,\n scrollDistance = 100,\n onPin,\n onFix,\n onRelease,\n}: UseHeadroomInput = {}): UseHeadroomReturnValue {\n const scrollDirection = useScrollDirection()\n const scrollY = ref(\n typeof window === 'undefined' ? 0 : window.scrollY || document.documentElement.scrollTop,\n )\n\n useWindowEvent('scroll', () => {\n scrollY.value = window.scrollY || document.documentElement.scrollTop\n })\n\n const pinned = ref(false)\n const scrollProgress = ref(0)\n\n const isCurrentlyPinned = { value: false }\n let wasFixed = isFixed(scrollY.value, fixedAt)\n let prevIsFixed = wasFixed\n let directionChangeScrollY = scrollY.value\n let progressAtDirectionChange = wasFixed ? 1 : 0\n let prevIsScrollingUp = scrollDirection.value === 'up'\n\n const recalc = () => {\n const current = scrollY.value\n const isScrollingUp = scrollDirection.value === 'up'\n\n isPinnedOrReleased(current, fixedAt, isCurrentlyPinned, isScrollingUp, onPin, onRelease)\n\n const currentlyFixed = isFixed(current, fixedAt)\n if (currentlyFixed && !wasFixed) {\n onFix?.()\n }\n wasFixed = currentlyFixed\n\n // Detect fixed-zone transitions first. When leaving the fixed zone the baseline\n // is anchored at fixedAt (not the current scroll position) so the delta is measured\n // from where the element was last fully visible, regardless of how scroll position\n // was initialised on the first run.\n if (prevIsFixed !== currentlyFixed) {\n prevIsFixed = currentlyFixed\n directionChangeScrollY = currentlyFixed ? current : fixedAt\n progressAtDirectionChange = 1\n prevIsScrollingUp = isScrollingUp\n }\n\n // When scroll direction changes outside the fixed zone, save the current progress\n // so the next direction accumulates from that point (handles partial reveals).\n if (!currentlyFixed && prevIsScrollingUp !== isScrollingUp) {\n const transitionDelta = Math.abs(current - directionChangeScrollY)\n const transitionProgress = prevIsScrollingUp\n ? Math.min(progressAtDirectionChange + transitionDelta / scrollDistance, 1)\n : Math.max(progressAtDirectionChange - transitionDelta / scrollDistance, 0)\n\n prevIsScrollingUp = isScrollingUp\n directionChangeScrollY = current\n progressAtDirectionChange = transitionProgress\n }\n\n let nextScrollProgress: number\n\n if (currentlyFixed) {\n nextScrollProgress = 1\n } else {\n const scrollDelta = Math.abs(current - directionChangeScrollY)\n\n nextScrollProgress = isScrollingUp\n ? Math.min(progressAtDirectionChange + scrollDelta / scrollDistance, 1)\n : Math.max(progressAtDirectionChange - scrollDelta / scrollDistance, 0)\n }\n\n scrollProgress.value = nextScrollProgress\n pinned.value = nextScrollProgress > 0\n }\n\n watch([scrollY, scrollDirection], recalc, { immediate: true })\n\n return { pinned, scrollProgress }\n}\n","import { ref, type Ref } from 'vue'\nimport { useIsomorphicEffect } from '../use-isomorphic-effect/use-isomorphic-effect'\n\nexport interface EyeDropperOpenOptions {\n signal?: AbortSignal\n}\n\nexport interface EyeDropperOpenReturnType {\n sRGBHex: string\n}\n\nexport interface UseEyeDropperReturnValue {\n supported: Ref<boolean>\n open: (options?: EyeDropperOpenOptions) => Promise<EyeDropperOpenReturnType | undefined>\n}\n\nfunction isOpera(): boolean {\n return navigator.userAgent.includes('OPR')\n}\n\nexport function useEyeDropper(): UseEyeDropperReturnValue {\n const supported = ref(false)\n\n useIsomorphicEffect(() => {\n supported.value = typeof window !== 'undefined' && !isOpera() && 'EyeDropper' in window\n })\n\n const open = (\n options: EyeDropperOpenOptions = {},\n ): Promise<EyeDropperOpenReturnType | undefined> => {\n if (supported.value) {\n const eyeDropper = new (window as any).EyeDropper()\n return eyeDropper.open(options)\n }\n\n return Promise.resolve(undefined)\n }\n\n return { supported, open }\n}\n","import { onBeforeUnmount, ref, watch, type Ref } from 'vue'\n\nexport interface UseInViewportReturnValue<T extends HTMLElement = HTMLElement> {\n inViewport: Ref<boolean>\n ref: Ref<T | null>\n}\n\nexport function useInViewport<T extends HTMLElement = HTMLElement>(): UseInViewportReturnValue<T> {\n const elementRef = ref<T | null>(null) as Ref<T | null>\n const inViewport = ref(false)\n let observer: IntersectionObserver | undefined\n\n watch(\n elementRef,\n (node) => {\n if (typeof IntersectionObserver === 'undefined') {\n return\n }\n\n observer?.disconnect()\n\n // Guard against the ref accidentally being bound to a Vue component\n // instance (which has no `Element` methods) instead of a native DOM node.\n const target = node instanceof Element ? node : null\n\n if (target) {\n observer = new IntersectionObserver((entries) => {\n const lastEntry = entries[entries.length - 1]\n inViewport.value = lastEntry.isIntersecting\n })\n observer.observe(target)\n } else {\n observer = undefined\n inViewport.value = false\n }\n },\n { immediate: true },\n )\n\n onBeforeUnmount(() => observer?.disconnect())\n\n return { ref: elementRef, inViewport }\n}\n","import {\n onBeforeUnmount,\n onMounted,\n ref,\n toValue,\n watch,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue'\n\nexport function useMutationObserver<T extends HTMLElement = HTMLElement>(\n callback: MutationCallback,\n options: MutationObserverInit,\n): Ref<T | null> {\n const elementRef = ref<T | null>(null) as Ref<T | null>\n let observer: MutationObserver | undefined\n\n watch(\n elementRef,\n (node) => {\n observer?.disconnect()\n observer = undefined\n\n // `node` is normally an HTMLElement, but if a consumer accidentally binds\n // the returned ref to a Vue component instance instead of a native DOM\n // element, `node` will be a component proxy without DOM methods. Guard\n // against that instead of throwing on `observe`.\n if (node instanceof Element) {\n observer = new MutationObserver(callback)\n observer.observe(node, options)\n }\n },\n { immediate: true },\n )\n\n onBeforeUnmount(() => observer?.disconnect())\n\n return elementRef\n}\n\nexport function useMutationObserverTarget(\n callback: MutationCallback,\n options: MutationObserverInit,\n target?: MaybeRefOrGetter<HTMLElement | null | undefined>,\n): void {\n let observer: MutationObserver | undefined\n\n const connect = (): void => {\n observer?.disconnect()\n observer = undefined\n\n const targetElement = toValue(target)\n\n if (targetElement instanceof Element) {\n observer = new MutationObserver(callback)\n observer.observe(targetElement, options)\n }\n }\n\n onMounted(connect)\n watch(() => toValue(target), connect)\n\n onBeforeUnmount(() => observer?.disconnect())\n}\n","import { onMounted, readonly, ref, type Ref } from 'vue'\n\nexport function useMounted(): Readonly<Ref<boolean>> {\n const mounted = ref(false)\n onMounted(() => {\n mounted.value = true\n })\n return readonly(mounted) as Readonly<Ref<boolean>>\n}\n","import { computed, readonly, ref, type Ref } from 'vue'\n\nexport interface UseStateHistoryHandlers<T> {\n set: (value: T) => void\n back: (steps?: number) => void\n forward: (steps?: number) => void\n reset: () => void\n}\n\nexport interface UseStateHistoryValue<T> {\n history: T[]\n current: number\n}\n\nexport type UseStateHistoryReturnValue<T> = [\n Readonly<Ref<T>>,\n UseStateHistoryHandlers<T>,\n Readonly<Ref<UseStateHistoryValue<T>>>,\n]\n\nexport function useStateHistory<T>(initialValue: T): UseStateHistoryReturnValue<T> {\n const historyState = ref<UseStateHistoryValue<T>>({\n history: [initialValue],\n current: 0,\n }) as Ref<UseStateHistoryValue<T>>\n\n const set = (val: T) => {\n const nextHistory = [\n ...historyState.value.history.slice(0, historyState.value.current + 1),\n val,\n ]\n historyState.value = {\n history: nextHistory,\n current: nextHistory.length - 1,\n }\n }\n\n const back = (steps = 1) => {\n historyState.value = {\n history: historyState.value.history,\n current: Math.max(0, historyState.value.current - steps),\n }\n }\n\n const forward = (steps = 1) => {\n historyState.value = {\n history: historyState.value.history,\n current: Math.min(historyState.value.history.length - 1, historyState.value.current + steps),\n }\n }\n\n const reset = () => {\n historyState.value = { history: [initialValue], current: 0 }\n }\n\n const handlers: UseStateHistoryHandlers<T> = { back, forward, reset, set }\n\n const current = computed(() => historyState.value.history[historyState.value.current])\n\n return [\n current as Readonly<Ref<T>>,\n handlers,\n readonly(historyState) as Readonly<Ref<UseStateHistoryValue<T>>>,\n ]\n}\n","import { reactive } from 'vue'\n\nexport function useMap<T, V>(initialState?: [T, V][]): Map<T, V> {\n return reactive(new Map<T, V>(initialState)) as Map<T, V>\n}\n","import { reactive } from 'vue'\n\n/** Local re-declaration of the ES2024 `ReadonlySetLike` lib type so this file\n * does not depend on the project `lib` compiler option including `esnext`. */\nexport interface ReadonlySetLike<T> {\n readonly size: number\n has(value: T): boolean\n keys(): IterableIterator<T>\n}\n\nexport function readonlySetLikeToSet<T>(input: ReadonlySetLike<T>): Set<T> {\n if (input instanceof Set) {\n return input\n }\n const result = new Set<T>()\n const iterator = input.keys()\n let next = iterator.next()\n while (!next.done) {\n result.add(next.value)\n next = iterator.next()\n }\n return result\n}\n\nexport function useSet<T>(values?: T[]): Set<T> {\n const rawSet = new Set<T>(values) as Set<T> & {\n union: <U>(other: ReadonlySetLike<U>) => Set<T | U>\n intersection: <U>(other: ReadonlySetLike<U>) => Set<T & U>\n difference: <U>(other: ReadonlySetLike<U>) => Set<T>\n symmetricDifference: <U>(other: ReadonlySetLike<U>) => Set<T | U>\n }\n\n // These combinators only read the current contents of `rawSet` through the\n // closure (never through `this`), so it is safe to invoke them through the\n // reactive proxy returned below.\n rawSet.union = <U>(other: ReadonlySetLike<U>): Set<T | U> => {\n const result = new Set<T | U>(rawSet)\n readonlySetLikeToSet(other).forEach((item) => result.add(item))\n return result\n }\n\n rawSet.intersection = <U>(other: ReadonlySetLike<U>): Set<T & U> => {\n const result = new Set<T & U>()\n const otherSet = readonlySetLikeToSet(other)\n rawSet.forEach((item) => {\n if (otherSet.has(item as unknown as U)) {\n result.add(item as T & U)\n }\n })\n return result\n }\n\n rawSet.difference = <U>(other: ReadonlySetLike<U>): Set<T> => {\n const result = new Set<T>()\n const otherSet = readonlySetLikeToSet(other)\n rawSet.forEach((item) => {\n if (!otherSet.has(item as unknown as U)) {\n result.add(item)\n }\n })\n return result\n }\n\n rawSet.symmetricDifference = <U>(other: ReadonlySetLike<U>): Set<T | U> => {\n const result = new Set<T | U>()\n const otherSet = readonlySetLikeToSet(other)\n\n rawSet.forEach((item) => {\n if (!otherSet.has(item as unknown as U)) {\n result.add(item)\n }\n })\n\n otherSet.forEach((item) => {\n if (!rawSet.has(item as unknown as T)) {\n result.add(item)\n }\n })\n\n return result\n }\n\n return reactive(rawSet) as Set<T>\n}\n","import { onBeforeUnmount } from 'vue'\n\nexport function useThrottledCallbackWithClearTimeout<T extends (...args: any[]) => any>(\n callback: T,\n wait: number,\n): [(...args: Parameters<T>) => void, () => void] {\n let latestInArgs: Parameters<T> | null = null\n let latestOutArgs: Parameters<T> | null = null\n let active = true\n let timeoutId = -1\n\n const clear = () => window.clearTimeout(timeoutId)\n\n const callThrottledCallback = (...args: Parameters<T>) => {\n callback(...args)\n latestInArgs = args\n latestOutArgs = args\n active = false\n }\n\n const timerCallback = () => {\n if (latestInArgs && latestInArgs !== latestOutArgs) {\n callThrottledCallback(...latestInArgs)\n\n timeoutId = window.setTimeout(timerCallback, wait)\n } else {\n active = true\n }\n }\n\n const throttled = (...args: Parameters<T>) => {\n if (active) {\n callThrottledCallback(...args)\n timeoutId = window.setTimeout(timerCallback, wait)\n } else {\n latestInArgs = args\n }\n }\n\n return [throttled, clear]\n}\n\nexport function useThrottledCallback<T extends (...args: any[]) => any>(\n callback: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n const [throttled, clear] = useThrottledCallbackWithClearTimeout(callback, wait)\n onBeforeUnmount(clear)\n return throttled\n}\n","import { onBeforeUnmount, ref, type Ref } from 'vue'\nimport { useThrottledCallbackWithClearTimeout } from '../use-throttled-callback/use-throttled-callback'\n\nexport type UseThrottledStateReturnValue<T> = [Ref<T>, (value: T) => void]\n\nexport function useThrottledState<T = any>(\n defaultValue: T,\n wait: number,\n): UseThrottledStateReturnValue<T> {\n const value = ref(defaultValue) as Ref<T>\n\n const [setThrottledValue, clear] = useThrottledCallbackWithClearTimeout((nextValue: T) => {\n value.value = nextValue\n }, wait)\n\n onBeforeUnmount(clear)\n\n return [value, setThrottledValue]\n}\n","import {\n onBeforeUnmount,\n readonly,\n ref,\n toValue,\n watch,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue'\nimport { useThrottledCallbackWithClearTimeout } from '../use-throttled-callback/use-throttled-callback'\n\nexport function useThrottledValue<T>(value: MaybeRefOrGetter<T>, wait: number): Readonly<Ref<T>> {\n const throttledValue = ref(toValue(value)) as Ref<T>\n\n const [throttledSetValue, clear] = useThrottledCallbackWithClearTimeout((nextValue: T) => {\n throttledValue.value = nextValue\n }, wait)\n\n watch(\n () => toValue(value),\n (nextValue) => throttledSetValue(nextValue),\n )\n\n onBeforeUnmount(clear)\n\n return readonly(throttledValue) as Readonly<Ref<T>>\n}\n","import { onUpdated, readonly, ref, type Ref } from 'vue'\n\nexport function useIsFirstRender(): Readonly<Ref<boolean>> {\n const isFirst = ref(true) as Ref<boolean>\n\n onUpdated(() => {\n isFirst.value = false\n })\n\n return readonly(isFirst) as Readonly<Ref<boolean>>\n}\n","import { onBeforeUnmount, ref, type Ref } from 'vue'\nimport { useIsomorphicEffect } from '../use-isomorphic-effect/use-isomorphic-effect'\n\nexport interface UseOrientationOptions {\n /** Default angle value, used until the real can be retrieved\n * (during server side rendering and before js executes on the page)\n * If not provided, the default value is `0`\n * */\n defaultAngle?: number\n\n /** Default angle value, used until the real can be retrieved\n * (during server side rendering and before js executes on the page)\n * If not provided, the default value is `'landscape-primary'`\n * */\n defaultType?: OrientationType\n\n /** If true, the initial value will be resolved after mount (ssr safe)\n * If false, the initial value will be resolved synchronously (ssr unsafe)\n * True by default.\n */\n getInitialValueInEffect?: boolean\n}\n\nexport interface UseOrientationReturnType {\n angle: number\n type: OrientationType\n}\n\nfunction getInitialValue(\n initialValue: UseOrientationReturnType,\n getInitialValueInEffect: boolean,\n): UseOrientationReturnType {\n if (getInitialValueInEffect) {\n return initialValue\n }\n\n if (typeof window !== 'undefined' && 'screen' in window) {\n return {\n angle: window.screen.orientation?.angle ?? initialValue.angle,\n type: window.screen.orientation?.type ?? initialValue.type,\n }\n }\n\n return initialValue\n}\n\nexport function useOrientation(options: UseOrientationOptions = {}): Ref<UseOrientationReturnType> {\n const {\n defaultAngle = 0,\n defaultType = 'landscape-primary',\n getInitialValueInEffect = true,\n } = options\n\n const orientation = ref<UseOrientationReturnType>(\n getInitialValue({ angle: defaultAngle, type: defaultType }, getInitialValueInEffect),\n ) as Ref<UseOrientationReturnType>\n\n const handleOrientationChange = (event: Event): void => {\n const target = event.currentTarget as ScreenOrientation\n orientation.value = { angle: target?.angle || 0, type: target?.type || 'landscape-primary' }\n }\n\n useIsomorphicEffect(() => {\n if (window.screen.orientation) {\n orientation.value = {\n angle: window.screen.orientation.angle,\n type: window.screen.orientation.type,\n }\n window.screen.orientation.addEventListener('change', handleOrientationChange)\n }\n })\n\n onBeforeUnmount(() => {\n if (typeof window !== 'undefined') {\n window.screen.orientation?.removeEventListener('change', handleOrientationChange)\n }\n })\n\n return orientation\n}\n","import { onBeforeUnmount, ref, toValue, watch, type MaybeRefOrGetter, type Ref } from 'vue'\n\nexport interface UseFetchOptions extends RequestInit {\n autoInvoke?: boolean\n}\n\nexport interface UseFetchReturnValue<T> {\n data: Ref<T | null>\n loading: Ref<boolean>\n error: Ref<Error | null>\n refetch: () => Promise<any>\n abort: () => void\n}\n\nexport function useFetch<T>(\n url: MaybeRefOrGetter<string>,\n { autoInvoke = true, ...options }: UseFetchOptions = {},\n): UseFetchReturnValue<T> {\n const data = ref<T | null>(null) as Ref<T | null>\n const loading = ref(false)\n const error = ref<Error | null>(null)\n let controller: AbortController | null = null\n\n const refetch = (): Promise<any> => {\n if (controller) {\n controller.abort()\n }\n\n controller = new AbortController()\n\n loading.value = true\n\n return fetch(toValue(url), { ...options, signal: controller.signal })\n .then((res) => {\n if (!res.ok) {\n throw new Error(`Request failed with status ${res.status}`)\n }\n return res.json()\n })\n .then((res) => {\n data.value = res\n loading.value = false\n return res as T\n })\n .catch((err) => {\n loading.value = false\n\n if (err.name !== 'AbortError') {\n error.value = err\n }\n\n return err\n })\n }\n\n const abort = () => {\n if (controller) {\n controller.abort('')\n }\n }\n\n watch(\n () => toValue(url),\n () => {\n if (autoInvoke) {\n refetch()\n }\n },\n { immediate: true },\n )\n\n onBeforeUnmount(() => {\n if (controller) {\n controller.abort('')\n }\n })\n\n return { data, loading, error, refetch, abort }\n}\n","import { onBeforeUnmount, ref, type Ref } from 'vue'\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction radiansToDegrees(radians: number) {\n return radians * (180 / Math.PI)\n}\n\nfunction getElementCenter(element: HTMLElement) {\n const rect = element.getBoundingClientRect()\n return [rect.left + rect.width / 2, rect.top + rect.height / 2] as const\n}\n\nfunction getAngle(coordinates: [number, number], element: HTMLElement) {\n const center = getElementCenter(element)\n const x = coordinates[0] - center[0]\n const y = coordinates[1] - center[1]\n const deg = radiansToDegrees(Math.atan2(x, y)) + 180\n\n return 360 - deg\n}\n\nfunction toFixed(value: number, digits: number) {\n return Number.parseFloat(value.toFixed(digits))\n}\n\nfunction getDigitsAfterDot(value: number) {\n return value.toString().split('.')[1]?.length || 0\n}\n\nexport function normalizeRadialValue(degree: number, step: number) {\n const clamped = clamp(degree, 0, 360)\n const high = Math.ceil(clamped / step)\n const low = Math.round(clamped / step)\n\n return toFixed(\n high >= clamped / step ? (high * step === 360 ? 0 : high * step) : low * step,\n getDigitsAfterDot(step),\n )\n}\n\nexport interface UseRadialMoveOptions {\n step?: number\n onChangeEnd?: (value: number) => void\n onScrubStart?: () => void\n onScrubEnd?: () => void\n}\n\nexport interface UseRadialMoveReturnValue<T extends HTMLElement = HTMLElement> {\n ref: (node: T | null) => void\n active: Ref<boolean>\n}\n\nexport function useRadialMove<T extends HTMLElement = HTMLElement>(\n onChange: (value: number) => void,\n { step = 0.01, onChangeEnd, onScrubStart, onScrubEnd }: UseRadialMoveOptions = {},\n): UseRadialMoveReturnValue<T> {\n const active = ref(false)\n let nodeRef: T | null = null\n let cleanupNode: (() => void) | undefined\n\n const update = (event: Pick<MouseEvent, 'clientX' | 'clientY'>, done = false) => {\n if (!nodeRef) {\n return\n }\n\n nodeRef.style.userSelect = 'none'\n const deg = getAngle([event.clientX, event.clientY], nodeRef)\n const nextValue = normalizeRadialValue(deg, step || 1)\n\n onChange(nextValue)\n\n if (done) {\n onChangeEnd?.(nextValue)\n }\n }\n\n const handleMouseMove = (event: MouseEvent) => update(event)\n const handleMouseUp = (event: MouseEvent) => {\n update(event, true)\n endTracking()\n }\n const handleTouchMove = (event: TouchEvent) => {\n event.preventDefault()\n update(event.touches[0] as any)\n }\n const handleTouchEnd = (event: TouchEvent) => {\n update(event.changedTouches[0] as any, true)\n endTracking()\n }\n\n function beginTracking() {\n onScrubStart?.()\n active.value = true\n document.addEventListener('mousemove', handleMouseMove, false)\n document.addEventListener('mouseup', handleMouseUp, false)\n document.addEventListener('touchmove', handleTouchMove, { passive: false })\n document.addEventListener('touchend', handleTouchEnd, false)\n }\n\n function endTracking() {\n onScrubEnd?.()\n active.value = false\n document.removeEventListener('mousemove', handleMouseMove, false)\n document.removeEventListener('mouseup', handleMouseUp, false)\n document.removeEventListener('touchmove', handleTouchMove, false)\n document.removeEventListener('touchend', handleTouchEnd, false)\n }\n\n const handleMouseDown = (event: MouseEvent) => {\n beginTracking()\n update(event)\n }\n\n const handleTouchStart = (event: TouchEvent) => {\n event.preventDefault()\n beginTracking()\n update(event.touches[0] as any)\n }\n\n const setRef = (node: T | null) => {\n cleanupNode?.()\n nodeRef = node\n\n if (!node) {\n cleanupNode = undefined\n return\n }\n\n node.addEventListener('mousedown', handleMouseDown)\n node.addEventListener('touchstart', handleTouchStart, { passive: false })\n cleanupNode = () => {\n node.removeEventListener('mousedown', handleMouseDown)\n node.removeEventListener('touchstart', handleTouchStart)\n }\n }\n\n onBeforeUnmount(() => {\n cleanupNode?.()\n endTracking()\n })\n\n return { ref: setRef, active }\n}\n","import {\n onBeforeUnmount,\n onMounted,\n readonly,\n ref,\n toValue,\n watch,\n type MaybeRefOrGetter,\n} from 'vue'\n\nexport interface UseScrollSpyHeadingData {\n depth: number\n value: string\n id: string\n getNode: () => HTMLElement\n}\n\nexport interface UseScrollSpyOptions {\n selector?: MaybeRefOrGetter<string>\n getDepth?: (element: HTMLElement) => number\n getValue?: (element: HTMLElement) => string\n scrollHost?: MaybeRefOrGetter<HTMLElement | undefined>\n offset?: MaybeRefOrGetter<number>\n}\n\nlet scrollSpyId = 0\n\nfunction getActiveElement(rects: DOMRect[], offset = 0) {\n if (rects.length === 0) return -1\n return rects.reduce(\n (closest, rect, index) =>\n Math.abs(closest.position - offset) < Math.abs(rect.y - offset)\n ? closest\n : { index, position: rect.y },\n { index: 0, position: rects[0].y },\n ).index\n}\n\nexport function useScrollSpy(options: UseScrollSpyOptions = {}) {\n const active = ref(-1)\n const initialized = ref(false)\n const data = ref<UseScrollSpyHeadingData[]>([])\n let host: HTMLElement | Window | undefined\n\n const updateActive = () => {\n active.value = getActiveElement(\n data.value.map((item) => item.getNode()?.getBoundingClientRect()).filter(Boolean),\n toValue(options.offset) ?? 0,\n )\n }\n\n const reinitialize = () => {\n if (typeof document === 'undefined') return\n const getDepth = options.getDepth ?? ((element: HTMLElement) => Number(element.tagName[1]))\n const getValue = options.getValue ?? ((element: HTMLElement) => element.textContent || '')\n data.value = Array.from(\n document.querySelectorAll<HTMLElement>(toValue(options.selector) ?? 'h1, h2, h3, h4, h5, h6'),\n ).map((heading) => ({\n depth: getDepth(heading),\n value: getValue(heading),\n id: heading.id || `mantine-scroll-spy-${++scrollSpyId}`,\n getNode: () => (heading.id ? (document.getElementById(heading.id) ?? heading) : heading),\n }))\n initialized.value = true\n updateActive()\n }\n\n const bind = () => {\n host?.removeEventListener('scroll', updateActive)\n host = toValue(options.scrollHost) ?? (typeof window !== 'undefined' ? window : undefined)\n host?.addEventListener('scroll', updateActive, { passive: true })\n }\n\n onMounted(() => {\n reinitialize()\n bind()\n })\n onBeforeUnmount(() => host?.removeEventListener('scroll', updateActive))\n watch(\n () => [toValue(options.selector), toValue(options.offset), toValue(options.scrollHost)],\n () => {\n reinitialize()\n bind()\n },\n )\n\n return {\n active: readonly(active),\n initialized: readonly(initialized),\n data: readonly(data),\n reinitialize,\n }\n}\n","import { onBeforeUnmount, ref, type ComponentPublicInstance, type Ref } from 'vue'\n\nexport interface UseScrollerOptions {\n scrollAmount?: number\n draggable?: boolean\n onScrollStateChange?: (state: UseScrollerScrollState) => void\n}\n\nexport interface UseScrollerScrollState {\n canScrollStart: boolean\n canScrollEnd: boolean\n}\n\nexport interface UseScrollerReturnValue {\n ref: (node: Element | ComponentPublicInstance | null) => void\n canScrollStart: Ref<boolean>\n canScrollEnd: Ref<boolean>\n scrollStart: () => void\n scrollEnd: () => void\n isDragging: Ref<boolean>\n dragHandlers: {\n onMousedown: (event: MouseEvent) => void\n onMousemove: (event: MouseEvent) => void\n onMouseup: () => void\n onMouseleave: () => void\n }\n}\n\nexport function useScroller<T extends HTMLElement = HTMLDivElement>({\n scrollAmount = 200,\n draggable = true,\n onScrollStateChange,\n}: UseScrollerOptions = {}): UseScrollerReturnValue {\n let containerRef: T | null = null\n let resizeObserver: ResizeObserver | undefined\n let isDraggingRef = false\n let hasDraggedRef = false\n let startX = 0\n let scrollLeftStart = 0\n\n const canScrollStart = ref(false)\n const canScrollEnd = ref(false)\n const isDragging = ref(false)\n\n const updateScrollState = () => {\n const container = containerRef\n\n if (!container) {\n return\n }\n\n const { scrollLeft, scrollWidth, clientWidth } = container\n const isRtl = getComputedStyle(container).direction === 'rtl'\n const nextCanScrollStart = isRtl ? scrollLeft < -1 : scrollLeft > 1\n const nextCanScrollEnd = isRtl\n ? scrollLeft > -(scrollWidth - clientWidth) + 1\n : scrollLeft < scrollWidth - clientWidth - 1\n\n canScrollStart.value = nextCanScrollStart\n canScrollEnd.value = nextCanScrollEnd\n onScrollStateChange?.({ canScrollStart: nextCanScrollStart, canScrollEnd: nextCanScrollEnd })\n }\n\n const setRef = (node: Element | ComponentPublicInstance | null) => {\n const safeNode = node instanceof HTMLElement ? (node as T) : null\n\n if (containerRef) {\n containerRef.removeEventListener('scroll', updateScrollState)\n resizeObserver?.disconnect()\n }\n\n containerRef = safeNode\n\n if (safeNode) {\n safeNode.addEventListener('scroll', updateScrollState)\n\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(updateScrollState)\n resizeObserver.observe(safeNode)\n }\n\n updateScrollState()\n }\n }\n\n const scroll = (direction: 'start' | 'end') => {\n if (!containerRef) {\n return\n }\n\n const isRtl = getComputedStyle(containerRef).direction === 'rtl'\n const scrollBy = direction === 'end' ? scrollAmount : -scrollAmount\n const adjustedScrollBy = isRtl ? -scrollBy : scrollBy\n\n containerRef.scrollBy({ left: adjustedScrollBy, behavior: 'smooth' })\n }\n\n const handleMouseDown = (event: MouseEvent) => {\n if (!draggable || !containerRef) {\n return\n }\n\n isDraggingRef = true\n hasDraggedRef = false\n isDragging.value = true\n startX = event.pageX - containerRef.offsetLeft\n scrollLeftStart = containerRef.scrollLeft\n containerRef.style.cursor = 'grabbing'\n containerRef.style.userSelect = 'none'\n }\n\n const handleMouseMove = (event: MouseEvent) => {\n if (!isDraggingRef || !containerRef) {\n return\n }\n\n event.preventDefault()\n const x = event.pageX - containerRef.offsetLeft\n const walk = x - startX\n\n if (Math.abs(walk) > 5) {\n hasDraggedRef = true\n }\n\n containerRef.scrollLeft = scrollLeftStart - walk\n }\n\n const handleMouseUp = () => {\n const wasDragged = hasDraggedRef\n isDraggingRef = false\n hasDraggedRef = false\n isDragging.value = false\n\n if (!containerRef) {\n return\n }\n\n containerRef.style.cursor = ''\n containerRef.style.userSelect = ''\n\n if (wasDragged) {\n const suppressClick = (event: MouseEvent) => {\n event.stopPropagation()\n event.preventDefault()\n containerRef?.removeEventListener('click', suppressClick, true)\n }\n\n containerRef.addEventListener('click', suppressClick, true)\n }\n }\n\n onBeforeUnmount(() => {\n if (containerRef) {\n containerRef.removeEventListener('scroll', updateScrollState)\n }\n\n resizeObserver?.disconnect()\n })\n\n return {\n ref: setRef,\n canScrollStart,\n canScrollEnd,\n scrollStart: () => scroll('start'),\n scrollEnd: () => scroll('end'),\n isDragging,\n dragHandlers: {\n onMousedown: handleMouseDown,\n onMousemove: handleMouseMove,\n onMouseup: handleMouseUp,\n onMouseleave: () => {\n if (isDraggingRef) {\n handleMouseUp()\n }\n },\n },\n }\n}\n","import { onBeforeUnmount, ref, type Ref } from 'vue'\nimport { useIsomorphicEffect } from '../use-isomorphic-effect/use-isomorphic-effect'\n\nexport interface UseFileDialogOptions {\n /** Determines whether multiple files are allowed, `true` by default */\n multiple?: boolean\n\n /** `accept` attribute of the file input, '*' by default */\n accept?: string\n\n /** `capture` attribute of the file input */\n capture?: string\n\n /** Determines whether the user can pick a directory instead of file, `false` by default */\n directory?: boolean\n\n /** Determines whether the file input state should be reset when the file dialog is opened, `false` by default */\n resetOnOpen?: boolean\n\n /** Initial selected files */\n initialFiles?: FileList | File[]\n\n /** Called when files are selected */\n onChange?: (files: FileList | null) => void\n\n /** Called when file dialog is canceled */\n onCancel?: () => void\n}\n\nconst defaultOptions: UseFileDialogOptions = {\n multiple: true,\n accept: '*',\n}\n\nfunction getInitialFilesList(files: UseFileDialogOptions['initialFiles']): FileList | null {\n if (!files) {\n return null\n }\n\n if (files instanceof FileList) {\n return files\n }\n\n const result = new DataTransfer()\n for (const file of files) {\n result.items.add(file)\n }\n\n return result.files\n}\n\nfunction createInput(options: UseFileDialogOptions): HTMLInputElement | null {\n if (typeof document === 'undefined') {\n return null\n }\n\n const input = document.createElement('input')\n input.type = 'file'\n\n if (options.accept) {\n input.accept = options.accept\n }\n\n if (options.multiple) {\n input.multiple = options.multiple\n }\n\n if (options.capture) {\n input.capture = options.capture\n }\n\n if (options.directory) {\n ;(input as HTMLInputElement & { webkitdirectory?: boolean }).webkitdirectory = options.directory\n }\n\n input.style.display = 'none'\n return input\n}\n\nexport interface UseFileDialogReturnValue {\n files: Ref<FileList | null>\n open: () => void\n reset: () => void\n}\n\nexport function useFileDialog(input: UseFileDialogOptions = {}): UseFileDialogReturnValue {\n const options: UseFileDialogOptions = { ...defaultOptions, ...input }\n const files = ref<FileList | null>(\n getInitialFilesList(options.initialFiles),\n ) as Ref<FileList | null>\n let inputElement: HTMLInputElement | null = null\n\n const handleChange = (event: Event) => {\n const target = event.target as HTMLInputElement\n if (target?.files) {\n files.value = target.files\n options.onChange?.(target.files)\n }\n }\n\n const createAndSetupInput = () => {\n inputElement?.remove()\n inputElement = createInput(options)\n\n if (inputElement) {\n inputElement.addEventListener('change', handleChange, { once: true })\n if (options.onCancel) {\n inputElement.addEventListener('cancel', options.onCancel, { once: true })\n }\n document.body.appendChild(inputElement)\n }\n }\n\n useIsomorphicEffect(() => {\n createAndSetupInput()\n })\n\n onBeforeUnmount(() => inputElement?.remove())\n\n const reset = () => {\n files.value = null\n options.onChange?.(null)\n }\n\n const open = () => {\n if (options.resetOnOpen) {\n reset()\n }\n\n createAndSetupInput()\n inputElement?.click()\n }\n\n return { files, open, reset }\n}\n","import { onBeforeUnmount } from 'vue'\n\nexport type UseLongPressEvent = 'mouse' | 'touch'\nexport interface UseLongPressOptions {\n threshold?: number\n events?: UseLongPressEvent[]\n cancelOnMove?: boolean | number\n onStart?: (event: MouseEvent | TouchEvent) => void\n onFinish?: (event: MouseEvent | TouchEvent) => void\n onCancel?: (event: MouseEvent | TouchEvent) => void\n}\nexport interface UseLongPressReturnValue {\n onMousedown?: (event: MouseEvent) => void\n onMouseup?: (event: MouseEvent) => void\n onMouseleave?: (event: MouseEvent) => void\n onMousemove?: (event: MouseEvent) => void\n onTouchstart?: (event: TouchEvent) => void\n onTouchend?: (event: TouchEvent) => void\n onTouchcancel?: (event: TouchEvent) => void\n onTouchmove?: (event: TouchEvent) => void\n}\n\nconst getPosition = (event: MouseEvent | TouchEvent) => {\n if ('touches' in event) {\n const touch = event.touches[0] ?? event.changedTouches[0]\n return touch ? { x: touch.clientX, y: touch.clientY } : null\n }\n return { x: event.clientX, y: event.clientY }\n}\n\nexport function useLongPress(\n onLongPress: (event: MouseEvent | TouchEvent) => void,\n options: UseLongPressOptions = {},\n): UseLongPressReturnValue {\n const events = options.events ?? ['mouse', 'touch']\n const threshold = options.threshold ?? 400\n const moveThreshold =\n options.cancelOnMove === true\n ? 10\n : typeof options.cancelOnMove === 'number'\n ? options.cancelOnMove\n : 0\n let timeout: ReturnType<typeof setTimeout> | undefined\n let active = false\n let pressed = false\n let startPosition: { x: number; y: number } | null = null\n\n const clear = () => {\n clearTimeout(timeout)\n timeout = undefined\n }\n const start = (event: MouseEvent | TouchEvent) => {\n options.onStart?.(event)\n startPosition = getPosition(event)\n pressed = true\n clear()\n timeout = setTimeout(() => {\n onLongPress(event)\n active = true\n }, threshold)\n }\n const cancel = (event: MouseEvent | TouchEvent) => {\n if (active) options.onFinish?.(event)\n else if (pressed) options.onCancel?.(event)\n active = false\n pressed = false\n startPosition = null\n clear()\n }\n const move = (event: MouseEvent | TouchEvent) => {\n if (!options.cancelOnMove || !pressed || active || !startPosition) return\n const current = getPosition(event)\n if (!current) return\n if (Math.hypot(current.x - startPosition.x, current.y - startPosition.y) > moveThreshold)\n cancel(event)\n }\n\n onBeforeUnmount(clear)\n return {\n ...(events.includes('mouse')\n ? {\n onMousedown: start,\n onMouseup: cancel,\n onMouseleave: cancel,\n ...(options.cancelOnMove ? { onMousemove: move } : {}),\n }\n : {}),\n ...(events.includes('touch')\n ? {\n onTouchstart: start,\n onTouchend: cancel,\n onTouchcancel: cancel,\n ...(options.cancelOnMove ? { onTouchmove: move } : {}),\n }\n : {}),\n }\n}\n","import { computed, ref, toValue, type MaybeRefOrGetter, type Ref } from 'vue'\nimport { useDidUpdate } from '../use-did-update/use-did-update'\n\nexport interface UseSelectionInput<T> {\n /** The array of items to select from */\n data: MaybeRefOrGetter<T[]>\n\n /** The initial selection, empty array by default */\n defaultSelection?: T[]\n\n /** If true, selection is reset when data changes */\n resetSelectionOnDataChange?: MaybeRefOrGetter<boolean | undefined>\n}\n\nexport interface UseSelectionHandlers<T> {\n /** Add an item to the selection */\n select: (selected: T) => void\n\n /** Remove an item from the selection */\n deselect: (deselected: T) => void\n\n /** Toggle an item's selection state */\n toggle: (toggled: T) => void\n\n /** Returns true if all items from the `data` are selected */\n isAllSelected: () => boolean\n\n /** Returns true if at least one item from the `data` is selected */\n isSomeSelected: () => boolean\n\n /** Set the selection to a specific array of items */\n setSelection: (selection: T[]) => void\n\n /** Clear all selections */\n resetSelection: () => void\n}\n\nexport type UseSelectionReturnValue<T> = readonly [Ref<T[]>, UseSelectionHandlers<T>]\n\nexport function useSelection<T>(input: UseSelectionInput<T>): UseSelectionReturnValue<T> {\n const selectionSet = ref(new Set<T>(input.defaultSelection || [])) as Ref<Set<T>>\n\n useDidUpdate(() => {\n if (toValue(input.resetSelectionOnDataChange)) {\n selectionSet.value = new Set()\n }\n }, [input.data, input.resetSelectionOnDataChange])\n\n const select = (selected: T) => {\n if (!selectionSet.value.has(selected)) {\n const newSet = new Set(selectionSet.value)\n newSet.add(selected)\n selectionSet.value = newSet\n }\n }\n\n const deselect = (deselected: T) => {\n if (selectionSet.value.has(deselected)) {\n const newSet = new Set(selectionSet.value)\n newSet.delete(deselected)\n selectionSet.value = newSet\n }\n }\n\n const toggle = (toggled: T) => {\n const newSet = new Set(selectionSet.value)\n if (newSet.has(toggled)) {\n newSet.delete(toggled)\n } else {\n newSet.add(toggled)\n }\n selectionSet.value = newSet\n }\n\n const resetSelection = () => {\n selectionSet.value = new Set()\n }\n\n const setSelection = (selection: T[]) => {\n selectionSet.value = new Set(selection)\n }\n\n const isAllSelected = () => {\n const data = toValue(input.data)\n if (data.length === 0) {\n return false\n }\n return data.every((item) => selectionSet.value.has(item))\n }\n\n const isSomeSelected = () => {\n const data = toValue(input.data)\n return data.some((item) => selectionSet.value.has(item))\n }\n\n const selection = computed(() => Array.from(selectionSet.value)) as Ref<T[]>\n\n return [\n selection,\n {\n select,\n deselect,\n toggle,\n isAllSelected,\n isSomeSelected,\n setSelection,\n resetSelection,\n },\n ] as const\n}\n","import {\n onBeforeUnmount,\n onMounted,\n readonly,\n ref,\n type ComponentPublicInstance,\n type Ref,\n} from 'vue'\n\nexport interface FloatingWindowPositionConfig {\n top?: number\n left?: number\n right?: number\n bottom?: number\n}\n\nexport interface FloatingWindowPosition {\n x: number\n y: number\n}\n\nexport interface UseFloatingWindowOptions {\n enabled?: boolean\n constrainToViewport?: boolean\n constrainOffset?: number\n dragHandleSelector?: string\n excludeDragHandleSelector?: string\n axis?: 'x' | 'y'\n initialPosition?: FloatingWindowPositionConfig\n onPositionChange?: (position: FloatingWindowPosition) => void\n onDragStart?: () => void\n onDragEnd?: () => void\n}\n\nexport type SetFloatingWindowPosition = (position: FloatingWindowPositionConfig) => void\n\nfunction px(value: string) {\n return value.endsWith('px') ? parseFloat(value) : 0\n}\n\nfunction clampToViewport(x: number, y: number, element: HTMLElement, offset = 0) {\n const rect = element.getBoundingClientRect()\n return {\n x: Math.min(Math.max(offset, x), Math.max(offset, window.innerWidth - rect.width - offset)),\n y: Math.min(Math.max(offset, y), Math.max(offset, window.innerHeight - rect.height - offset)),\n }\n}\n\nfunction constrain(\n element: HTMLElement,\n position: FloatingWindowPosition,\n options: UseFloatingWindowOptions,\n) {\n return options.constrainToViewport\n ? clampToViewport(position.x, position.y, element, options.constrainOffset)\n : position\n}\n\nfunction calculateInitialPosition(element: HTMLElement, options: UseFloatingWindowOptions) {\n const rect = element.getBoundingClientRect()\n const style = getComputedStyle(element)\n const offset = options.constrainOffset ?? 0\n const initial = options.initialPosition ?? {}\n const x =\n initial.left ??\n (initial.right !== undefined\n ? window.innerWidth - rect.width - initial.right\n : px(style.left) || window.innerWidth - rect.width - px(style.right) || offset)\n const y =\n initial.top ??\n (initial.bottom !== undefined\n ? window.innerHeight - rect.height - initial.bottom\n : px(style.top) || window.innerHeight - rect.height - px(style.bottom) || offset)\n return constrain(element, { x, y }, options)\n}\n\nfunction excluded(target: Node, selector?: string) {\n return Boolean(selector && target instanceof Element && target.closest(selector))\n}\n\nfunction isHandle(\n element: HTMLElement,\n target: EventTarget | null,\n options: UseFloatingWindowOptions,\n) {\n if (!(target instanceof Node) || excluded(target, options.excludeDragHandleSelector)) return false\n if (!options.dragHandleSelector) return true\n return Array.from(element.querySelectorAll(options.dragHandleSelector)).some((item) =>\n item.contains(target),\n )\n}\n\nexport function useFloatingWindow<T extends HTMLElement>(options: UseFloatingWindowOptions = {}) {\n const element = ref<T | null>(null) as Ref<T | null>\n const isDragging = ref(false)\n let position = { x: 0, y: 0 }\n let pointerOffset = { x: 0, y: 0 }\n let observer: ResizeObserver | undefined\n\n const applyPosition = (next: FloatingWindowPosition, notify = true) => {\n if (!element.value) return\n position = constrain(element.value, next, options)\n element.value.style.left = `${position.x}px`\n element.value.style.top = `${position.y}px`\n element.value.style.right = 'unset'\n element.value.style.bottom = 'unset'\n if (notify) options.onPositionChange?.(position)\n }\n\n const setPosition: SetFloatingWindowPosition = (next) => {\n const node = element.value\n if (!node) return\n const rect = node.getBoundingClientRect()\n applyPosition({\n x:\n next.left ??\n (next.right !== undefined ? window.innerWidth - rect.width - next.right : position.x),\n y:\n next.top ??\n (next.bottom !== undefined ? window.innerHeight - rect.height - next.bottom : position.y),\n })\n }\n\n const end = () => {\n if (!isDragging.value) return\n isDragging.value = false\n document.body.style.userSelect = ''\n document.body.style.webkitUserSelect = ''\n options.onDragEnd?.()\n document.removeEventListener('mousemove', move)\n document.removeEventListener('mouseup', end)\n document.removeEventListener('touchmove', move)\n document.removeEventListener('touchend', end)\n }\n\n const move = (event: MouseEvent | TouchEvent) => {\n if (!isDragging.value || !element.value) return\n const point = 'touches' in event ? event.touches[0] : event\n event.preventDefault()\n const next = constrain(\n element.value,\n { x: point.clientX - pointerOffset.x, y: point.clientY - pointerOffset.y },\n options,\n )\n applyPosition({\n x: options.axis === 'y' ? position.x : next.x,\n y: options.axis === 'x' ? position.y : next.y,\n })\n }\n\n const start = (event: MouseEvent | TouchEvent) => {\n const node = element.value\n if (!node || options.enabled === false || !isHandle(node, event.target, options)) return\n if ('button' in event && event.button !== 0) return\n const point = 'touches' in event ? event.touches[0] : event\n const rect = node.getBoundingClientRect()\n pointerOffset = { x: point.clientX - rect.left, y: point.clientY - rect.top }\n isDragging.value = true\n document.body.style.userSelect = 'none'\n document.body.style.webkitUserSelect = 'none'\n options.onDragStart?.()\n document.addEventListener('mousemove', move)\n document.addEventListener('mouseup', end)\n document.addEventListener('touchmove', move, { passive: false })\n document.addEventListener('touchend', end)\n }\n\n const setRef = (node: Element | ComponentPublicInstance | null) => {\n const safeNode = node instanceof Element ? (node as T) : null\n\n if (safeNode === element.value) {\n return\n }\n\n if (element.value) {\n element.value.removeEventListener('mousedown', start)\n element.value.removeEventListener('touchstart', start)\n }\n observer?.disconnect()\n observer = undefined\n element.value = safeNode\n if (safeNode) {\n safeNode.addEventListener('mousedown', start)\n safeNode.addEventListener('touchstart', start, { passive: false })\n position = calculateInitialPosition(safeNode, options)\n applyPosition(position, false)\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(() => applyPosition(position, false))\n observer.observe(safeNode)\n }\n }\n }\n\n onMounted(\n () => element.value && applyPosition(calculateInitialPosition(element.value, options), false),\n )\n onBeforeUnmount(() => {\n end()\n observer?.disconnect()\n element.value?.removeEventListener('mousedown', start)\n element.value?.removeEventListener('touchstart', start)\n })\n\n return { ref: setRef, element: readonly(element), isDragging: readonly(isDragging), setPosition }\n}\n","import {\n nextTick,\n ref,\n toValue,\n watch,\n type CSSProperties,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue'\nimport { assignRef, type VueRefTarget } from '../use-merged-ref/use-merged-ref'\n\nexport type UseCollapseState = 'entering' | 'entered' | 'exiting' | 'exited'\n\nexport interface UseCollapseInput {\n /** Expanded state */\n expanded: MaybeRefOrGetter<boolean>\n\n /** Transition duration in milliseconds, by default calculated based on content height */\n transitionDuration?: number\n\n /** Transition timing function, `ease` by default */\n transitionTimingFunction?: string\n\n /** Called when transition ends */\n onTransitionEnd?: () => void\n\n /** Called when transition starts */\n onTransitionStart?: () => void\n\n /** If true, collapsed content is kept in the DOM and hidden with `display: none` styles */\n keepMounted?: boolean\n}\n\nexport interface GetCollapsePropsInput {\n style?: CSSProperties\n ref?: VueRefTarget<HTMLDivElement>\n}\n\nexport interface GetCollapsePropsReturnValue {\n 'aria-hidden': boolean\n inert: boolean\n ref: (value: any) => void\n onTransitionend: (event: TransitionEvent) => void\n style: CSSProperties\n}\n\nexport interface UseCollapseReturnValue {\n state: Ref<UseCollapseState>\n getCollapseProps: (input?: GetCollapsePropsInput) => GetCollapsePropsReturnValue\n}\n\nfunction getAutoSizeDuration(size: number | string) {\n if (!size || typeof size === 'string') {\n return 0\n }\n\n const constant = size / 36\n return Math.round((4 + 15 * constant ** 0.25 + constant / 5) * 10)\n}\n\nexport function getElementContentSize(\n element: HTMLElement | null,\n dimension: 'height' | 'width',\n): number | string {\n if (!element) {\n return 'auto'\n }\n\n const size = dimension === 'height' ? element.scrollHeight : element.scrollWidth\n\n if (size !== 0) {\n return size\n }\n\n const children = Array.from(element.children).filter(\n (child): child is HTMLElement => child instanceof HTMLElement,\n )\n\n if (children.length === 0) {\n return size\n }\n\n const childrenScrollSize = children.reduce(\n (acc, child) => acc + (dimension === 'height' ? child.scrollHeight : child.scrollWidth),\n 0,\n )\n\n if (childrenScrollSize !== 0) {\n return childrenScrollSize\n }\n\n const rect = element.getBoundingClientRect()\n const start = dimension === 'height' ? rect.top : rect.left\n const endProperty = dimension === 'height' ? 'bottom' : 'right'\n const marginProperty = dimension === 'height' ? 'marginBottom' : 'marginRight'\n const view = element.ownerDocument.defaultView\n\n return Math.max(\n ...children.map((child) => {\n const childRect = child.getBoundingClientRect()\n const childStyles = view?.getComputedStyle(child)\n const margin = childStyles ? Number.parseFloat(childStyles[marginProperty as any]) || 0 : 0\n\n return (childRect as any)[endProperty] - start + margin\n }),\n 0,\n )\n}\n\nfunction getCssSize(size: number | string) {\n return typeof size === 'number' ? `${size}px` : size\n}\n\nexport function createCollapse({\n dimension,\n getElementSize,\n expanded,\n transitionDuration,\n transitionTimingFunction = 'ease',\n onTransitionEnd,\n onTransitionStart,\n keepMounted,\n}: UseCollapseInput & {\n dimension: 'height' | 'width'\n getElementSize: (element: HTMLElement | null) => number | string\n}): UseCollapseReturnValue {\n const isExpanded = () => toValue(expanded)\n const collapsedStyles = {\n [dimension]: 0,\n overflow: 'hidden',\n ...(keepMounted ? {} : { display: 'none' }),\n } as CSSProperties\n\n const elementRef = ref<HTMLDivElement | null>(null)\n const styles = ref<CSSProperties>(isExpanded() ? {} : collapsedStyles)\n const state = ref<UseCollapseState>(isExpanded() ? 'entered' : 'exited') as Ref<UseCollapseState>\n const raf =\n typeof window === 'undefined'\n ? (callback: FrameRequestCallback) => callback(0)\n : window.requestAnimationFrame\n\n const mergeStyles = (nextStyles: CSSProperties) => {\n styles.value = { ...styles.value, ...nextStyles }\n }\n\n const measureExpandedSize = (attempt = 0) => {\n if (!isExpanded()) {\n return\n }\n\n const size = getElementSize(elementRef.value)\n if (size === 0 && elementRef.value?.children.length && attempt < 5) {\n raf(() => measureExpandedSize(attempt + 1))\n return\n }\n\n mergeStyles({ ...getTransitionStyles(size), [dimension]: getCssSize(size) })\n }\n\n const getTransitionStyles = (size: number | string) => {\n const duration = transitionDuration ?? getAutoSizeDuration(size)\n return {\n transition: `${dimension} ${duration}ms ${transitionTimingFunction}, opacity ${duration}ms ${transitionTimingFunction}`,\n }\n }\n\n watch(\n () => isExpanded(),\n (value, oldValue) => {\n if (value === oldValue) {\n return\n }\n\n if (transitionDuration !== 0) {\n onTransitionStart?.()\n }\n\n if (value) {\n raf(() => {\n state.value = 'entering'\n mergeStyles({ willChange: dimension, display: 'block', overflow: 'hidden' })\n void nextTick(() => {\n raf(() => {\n raf(() => measureExpandedSize())\n })\n })\n })\n } else {\n raf(() => {\n state.value = 'exiting'\n const size = getElementSize(elementRef.value)\n mergeStyles({\n ...getTransitionStyles(size),\n willChange: dimension,\n [dimension]: getCssSize(size),\n })\n raf(() => mergeStyles({ [dimension]: 0, overflow: 'hidden' }))\n })\n }\n },\n { flush: 'post' },\n )\n\n const handleTransitionEnd = (event: TransitionEvent) => {\n if (event.target !== elementRef.value || event.propertyName !== dimension) {\n return\n }\n\n if (isExpanded()) {\n const size = getElementSize(elementRef.value)\n\n if (getCssSize(size) === styles.value[dimension as keyof CSSProperties]) {\n styles.value = {}\n } else {\n mergeStyles({ [dimension]: getCssSize(size) })\n }\n\n state.value = 'entered'\n onTransitionEnd?.()\n } else if (styles.value[dimension as keyof CSSProperties] === 0) {\n styles.value = collapsedStyles\n state.value = 'exited'\n onTransitionEnd?.()\n }\n }\n\n return {\n state,\n getCollapseProps: (input: GetCollapsePropsInput = {}): GetCollapsePropsReturnValue => {\n const setRef = (value: any) => {\n const element = value?.$el ?? value\n elementRef.value = element\n assignRef(input.ref, element)\n }\n\n return {\n 'aria-hidden': !isExpanded(),\n inert: !isExpanded(),\n ref: setRef,\n onTransitionend: handleTransitionEnd,\n style: { boxSizing: 'border-box', ...input.style, ...styles.value },\n }\n },\n }\n}\n\nexport function useCollapse(input: UseCollapseInput): UseCollapseReturnValue {\n return createCollapse({\n ...input,\n dimension: 'height',\n getElementSize: (element) => getElementContentSize(element, 'height'),\n })\n}\n","import {\n createCollapse,\n getElementContentSize,\n type UseCollapseInput,\n type UseCollapseReturnValue,\n} from './use-collapse'\n\nexport type UseHorizontalCollapseInput = UseCollapseInput\nexport type UseHorizontalCollapseReturnValue = UseCollapseReturnValue\n\nexport function useHorizontalCollapse(input: UseCollapseInput): UseCollapseReturnValue {\n return createCollapse({\n ...input,\n dimension: 'width',\n getElementSize: (element) => getElementContentSize(element, 'width'),\n })\n}\n","import { ref, watch, type Ref } from 'vue'\n\nconst DEFAULT_TOKENS: Record<string, RegExp> = {\n '9': /[0-9]/,\n a: /[A-Za-z]/,\n A: /[A-Z]/,\n '*': /[A-Za-z0-9]/,\n '#': /[-+0-9]/,\n}\n\nexport interface UseMaskOptions {\n /** Mask pattern string or array of string literals and RegExp objects */\n mask: string | Array<string | RegExp>\n\n /** Override or extend the default token map */\n tokens?: Record<string, RegExp>\n\n /** Called before masking on each keystroke, can return overrides for mask options */\n modify?: (\n value: string,\n ) => Partial<Pick<UseMaskOptions, 'mask' | 'tokens' | 'slotChar' | 'separate'>> | undefined\n\n /** When true, raw and display values are decoupled */\n separate?: boolean\n\n /** Character displayed in unfilled slots, `\"_\"` by default */\n slotChar?: string | null\n\n /** Show mask pattern even when field is empty and unfocused */\n alwaysShowMask?: boolean\n\n /** Show mask placeholder on focus, `true` by default */\n showMaskOnFocus?: boolean\n\n /** Transform each character before validation and insertion */\n transform?: (char: string) => string\n\n /** Clear value on blur when mask is incomplete, `false` by default */\n autoClear?: boolean\n\n /** Sets aria-invalid on the input */\n invalid?: boolean\n\n /** Called on every change with raw and masked values */\n onChangeRaw?: (rawValue: string, maskedValue: string) => void\n\n /** Called when all required mask slots are filled */\n onComplete?: (maskedValue: string, rawValue: string) => void\n\n /** Escape hatch for advanced cursor/value manipulation */\n beforeMaskedStateChange?: (states: {\n previousState: MaskState\n currentState: MaskState\n nextState: MaskState\n }) => MaskState\n}\n\nexport interface MaskState {\n value: string\n selection: { start: number; end: number } | null\n}\n\nexport interface UseMaskReturnValue {\n /** Ref callback to attach to the input element */\n ref: (node: HTMLInputElement | null) => void\n\n /** Current masked display value */\n value: Ref<string>\n\n /** Current raw unmasked value */\n rawValue: Ref<string>\n\n /** Whether all required mask slots are filled */\n isComplete: Ref<boolean>\n\n /** Clear the input value and reset state */\n reset: () => void\n}\n\ninterface MaskSlot {\n type: 'token' | 'literal'\n char: string\n pattern?: RegExp\n optional?: boolean\n}\n\ninterface UndoState {\n rawValue: string\n selectionStart: number\n}\n\nconst MAX_UNDO_HISTORY = 100\n\nfunction parseMask(\n mask: string | Array<string | RegExp>,\n tokens: Record<string, RegExp>,\n): MaskSlot[] {\n if (Array.isArray(mask)) {\n return mask.map((item) => {\n if (item instanceof RegExp) {\n return { type: 'token', char: '_', pattern: item }\n }\n return { type: 'literal', char: item }\n })\n }\n\n const slots: MaskSlot[] = []\n let optional = false\n\n for (let i = 0; i < mask.length; i++) {\n const char = mask[i]\n\n if (char === '\\\\' && i + 1 < mask.length) {\n i++\n slots.push({ type: 'literal', char: mask[i] })\n continue\n }\n\n if (char === '?') {\n optional = true\n continue\n }\n\n if (tokens[char]) {\n slots.push({ type: 'token', char, pattern: tokens[char], optional })\n } else {\n slots.push({ type: 'literal', char, optional })\n }\n }\n\n return slots\n}\n\nfunction getSlotChar(slotCharOption: string | null | undefined, index: number): string {\n if (slotCharOption === null || slotCharOption === '' || slotCharOption === undefined) {\n return ''\n }\n if (slotCharOption.length > 1) {\n return slotCharOption[index] || '_'\n }\n return slotCharOption\n}\n\nfunction applyMaskToRaw(\n raw: string,\n slots: MaskSlot[],\n _slotCharOption: string | null | undefined,\n transform?: (char: string) => string,\n): string {\n let result = ''\n let rawIndex = 0\n let slotIndex = 0\n\n for (slotIndex = 0; slotIndex < slots.length; slotIndex++) {\n const slot = slots[slotIndex]\n if (slot.type === 'literal') {\n result += slot.char\n } else if (rawIndex < raw.length) {\n const ch = transform ? transform(raw[rawIndex]) : raw[rawIndex]\n if (slot.pattern && slot.pattern.test(ch)) {\n result += ch\n rawIndex++\n } else {\n rawIndex++\n slotIndex--\n }\n } else {\n break\n }\n }\n\n return result\n}\n\nfunction buildDisplayValue(\n value: string,\n slots: MaskSlot[],\n slotCharOption: string | null | undefined,\n showSlots: boolean,\n): string {\n if (!showSlots) {\n return value\n }\n\n let display = value\n\n for (let i = value.length; i < slots.length; i++) {\n const slot = slots[i]\n if (slot.type === 'literal') {\n display += slot.char\n } else {\n const sc = getSlotChar(slotCharOption, i)\n if (!sc) {\n break\n }\n display += sc\n }\n }\n\n return display\n}\n\nfunction extractRaw(masked: string, slots: MaskSlot[]): string {\n let raw = ''\n for (let i = 0; i < masked.length && i < slots.length; i++) {\n if (slots[i].type === 'token') {\n raw += masked[i]\n }\n }\n return raw\n}\n\nfunction checkComplete(masked: string, slots: MaskSlot[]): boolean {\n for (let i = 0; i < slots.length; i++) {\n if (slots[i].type === 'token' && !slots[i].optional) {\n if (i >= masked.length) {\n return false\n }\n if (!slots[i].pattern!.test(masked[i])) {\n return false\n }\n }\n }\n return true\n}\n\nfunction findNextTokenIndex(slots: MaskSlot[], from: number): number {\n for (let i = from; i < slots.length; i++) {\n if (slots[i].type === 'token') {\n return i\n }\n }\n return slots.length\n}\n\nfunction findPrevTokenIndex(slots: MaskSlot[], from: number): number {\n for (let i = from; i >= 0; i--) {\n if (slots[i].type === 'token') {\n return i\n }\n }\n return -1\n}\n\nfunction processInput(\n inputValue: string,\n slots: MaskSlot[],\n _slotCharOption: string | null | undefined,\n): string {\n let result = ''\n let inputIndex = 0\n\n for (\n let slotIndex = 0;\n slotIndex < slots.length && inputIndex <= inputValue.length;\n slotIndex++\n ) {\n const slot = slots[slotIndex]\n\n if (slot.type === 'literal') {\n result += slot.char\n if (inputIndex < inputValue.length && inputValue[inputIndex] === slot.char) {\n inputIndex++\n }\n continue\n }\n\n if (inputIndex >= inputValue.length) {\n break\n }\n\n while (inputIndex < inputValue.length) {\n const ch = inputValue[inputIndex]\n inputIndex++\n\n if (slot.pattern!.test(ch)) {\n result += ch\n break\n }\n }\n\n if (result.length <= slotIndex) {\n break\n }\n }\n\n return result\n}\n\nfunction getResolvedOptions(options: UseMaskOptions, rawValue: string) {\n const tokens = { ...DEFAULT_TOKENS, ...options.tokens }\n let mask = options.mask\n let slotChar: string | null | undefined = options.slotChar === undefined ? '_' : options.slotChar\n let separate = options.separate ?? false\n\n if (options.modify) {\n const overrides = options.modify(rawValue)\n if (overrides) {\n if (overrides.mask !== undefined) {\n mask = overrides.mask\n }\n if (overrides.tokens !== undefined) {\n Object.assign(tokens, overrides.tokens)\n }\n if (overrides.slotChar !== undefined) {\n slotChar = overrides.slotChar\n }\n if (overrides.separate !== undefined) {\n separate = overrides.separate\n }\n }\n }\n\n const slots = parseMask(mask, tokens)\n return { slots, slotChar, separate, tokens, transform: options.transform }\n}\n\nexport function formatMask(raw: string, options: UseMaskOptions): string {\n const { slots, slotChar, transform } = getResolvedOptions(options, raw)\n return applyMaskToRaw(raw, slots, slotChar, transform)\n}\n\nexport function unformatMask(masked: string, options: UseMaskOptions): string {\n const { slots } = getResolvedOptions(options, '')\n return extractRaw(masked, slots)\n}\n\nexport function isMaskComplete(masked: string, options: UseMaskOptions): boolean {\n const { slots } = getResolvedOptions(options, '')\n return checkComplete(masked, slots)\n}\n\nexport function generatePattern(mode: 'full' | 'full-inexact', options: UseMaskOptions): string {\n const { slots } = getResolvedOptions(options, '')\n let pattern = ''\n\n for (const slot of slots) {\n if (slot.type === 'literal') {\n pattern += slot.char.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n } else {\n const src = slot.pattern!.source\n if (mode === 'full-inexact') {\n pattern += slot.optional ? `${src}?` : src\n } else {\n pattern += slot.optional ? `(${src})?` : `(${src})`\n }\n }\n }\n\n return pattern\n}\n\nfunction findNextEditablePosition(from: number, slots: MaskSlot[], value: string): number {\n let pos = from\n while (pos < slots.length && pos < value.length && slots[pos] && slots[pos].type === 'literal') {\n pos++\n }\n return pos\n}\n\nexport function useMask(options: UseMaskOptions): UseMaskReturnValue {\n let node: HTMLInputElement | null = null\n\n const maskedValue = ref('') as Ref<string>\n const rawValue = ref('') as Ref<string>\n const isComplete = ref(false) as Ref<boolean>\n\n let processed = ''\n let display = ''\n let rawInternal = ''\n let wasComplete = false\n let isFocused = false\n let undoStack: UndoState[] = []\n let redoStack: UndoState[] = []\n\n const applyValue = (input: {\n reprocessed: string\n newRaw: string\n displayValue: string\n resolvedSlots: MaskSlot[]\n cursorPos?: number\n notifyChange: boolean\n }) => {\n const { reprocessed, newRaw, displayValue, resolvedSlots, cursorPos, notifyChange } = input\n\n processed = reprocessed\n display = displayValue\n rawInternal = newRaw\n maskedValue.value = displayValue\n rawValue.value = newRaw\n\n if (node) {\n node.value = displayValue\n if (cursorPos !== undefined && document.activeElement === node) {\n const pos = Math.min(cursorPos, reprocessed.length)\n node.setSelectionRange(pos, pos)\n }\n }\n\n if (notifyChange && options.onChangeRaw) {\n options.onChangeRaw(newRaw, displayValue)\n }\n\n const complete = checkComplete(reprocessed, resolvedSlots)\n if (notifyChange && complete && !wasComplete && options.onComplete) {\n options.onComplete(displayValue, newRaw)\n }\n wasComplete = complete\n isComplete.value = complete\n }\n\n const updateValue = (newMasked: string, cursorPos?: number) => {\n const { slots } = getResolvedOptions(\n options,\n extractRaw(newMasked, getResolvedOptions(options, '').slots),\n )\n const raw = extractRaw(newMasked, slots)\n\n const { slots: resolvedSlots, slotChar } = getResolvedOptions(options, raw)\n\n const reprocessed = processInput(newMasked, resolvedSlots, slotChar)\n const newRaw = extractRaw(reprocessed, resolvedSlots)\n\n const showSlots = options.alwaysShowMask || isFocused\n const showOnFocus = options.showMaskOnFocus !== false\n const shouldShowSlots = showSlots && (showOnFocus || reprocessed.length > 0)\n\n const displayValue = buildDisplayValue(reprocessed, resolvedSlots, slotChar, shouldShowSlots)\n\n applyValue({ reprocessed, newRaw, displayValue, resolvedSlots, cursorPos, notifyChange: true })\n\n return { displayValue, newRaw, reprocessed, resolvedSlots }\n }\n\n const initializeInputValue = (inputNode: HTMLInputElement): boolean => {\n if (!inputNode.value) {\n return false\n }\n\n const { slots: initialSlots, slotChar: initialSlotChar } = getResolvedOptions(options, '')\n const initialProcessed = processInput(inputNode.value, initialSlots, initialSlotChar)\n const initialRaw = extractRaw(initialProcessed, initialSlots)\n const { slots: resolvedSlots, slotChar } = getResolvedOptions(options, initialRaw)\n const reprocessed = processInput(inputNode.value, resolvedSlots, slotChar)\n const newRaw = extractRaw(reprocessed, resolvedSlots)\n const showSlots = options.alwaysShowMask || isFocused\n const showOnFocus = options.showMaskOnFocus !== false\n const shouldShowSlots = showSlots && (showOnFocus || reprocessed.length > 0)\n const displayValue = buildDisplayValue(reprocessed, resolvedSlots, slotChar, shouldShowSlots)\n\n applyValue({ reprocessed, newRaw, displayValue, resolvedSlots, notifyChange: false })\n\n return true\n }\n\n const pushUndoState = () => {\n const selectionStart = node?.selectionStart ?? rawInternal.length\n const state: UndoState = { rawValue: rawInternal, selectionStart }\n const top = undoStack[undoStack.length - 1]\n if (top && top.rawValue === state.rawValue && top.selectionStart === state.selectionStart) {\n return\n }\n undoStack.push(state)\n if (undoStack.length > MAX_UNDO_HISTORY) {\n undoStack.shift()\n }\n redoStack = []\n }\n\n const applyHistoryState = (target: UndoState) => {\n const { slots, slotChar, transform } = getResolvedOptions(options, target.rawValue)\n const newMasked = applyMaskToRaw(target.rawValue, slots, slotChar, transform)\n updateValue(newMasked, target.selectionStart)\n }\n\n const handleInput = (e: Event) => {\n const input = e.target as HTMLInputElement\n\n const { slots: resolvedSlots, slotChar, transform } = getResolvedOptions(options, '')\n const prev = display\n const curr = input.value\n\n let prefixLen = 0\n const maxPrefix = Math.min(prev.length, curr.length)\n while (prefixLen < maxPrefix && prev[prefixLen] === curr[prefixLen]) {\n prefixLen++\n }\n\n let suffixLen = 0\n const maxSuffix = Math.min(prev.length - prefixLen, curr.length - prefixLen)\n while (\n suffixLen < maxSuffix &&\n prev[prev.length - 1 - suffixLen] === curr[curr.length - 1 - suffixLen]\n ) {\n suffixLen++\n }\n\n const insertedText = curr.slice(prefixLen, curr.length - suffixLen)\n const removedEnd = prev.length - suffixLen\n\n const beforeRaw = extractRaw(prev.slice(0, prefixLen), resolvedSlots.slice(0, prefixLen))\n const afterRaw = extractRaw(prev.slice(removedEnd), resolvedSlots.slice(removedEnd))\n const reformatted = applyMaskToRaw(\n beforeRaw + insertedText + afterRaw,\n resolvedSlots,\n slotChar,\n transform,\n )\n const maskedPrefix = applyMaskToRaw(\n beforeRaw + insertedText,\n resolvedSlots,\n slotChar,\n transform,\n )\n\n if (reformatted !== prev) {\n pushUndoState()\n }\n updateValue(reformatted, maskedPrefix.length)\n }\n\n const clampCursorToProcessed = (input: HTMLInputElement) => {\n const start = input.selectionStart ?? 0\n const end = input.selectionEnd ?? 0\n if (start !== end) {\n return\n }\n\n const { slots } = getResolvedOptions(options, '')\n const endPos =\n processed.length > 0\n ? findNextEditablePosition(processed.length, slots, processed)\n : findNextTokenIndex(slots, 0)\n const startPos = findNextTokenIndex(slots, 0)\n\n if (start > endPos || start < startPos) {\n input.setSelectionRange(endPos, endPos)\n }\n }\n\n const handleFocus = () => {\n isFocused = true\n const input = node\n\n if (!input) {\n return\n }\n\n const { slots, slotChar } = getResolvedOptions(options, '')\n const showOnFocus = options.showMaskOnFocus !== false\n\n if (showOnFocus || options.alwaysShowMask) {\n const nextDisplay = buildDisplayValue(processed, slots, slotChar, true)\n input.value = nextDisplay\n display = nextDisplay\n maskedValue.value = nextDisplay\n }\n\n requestAnimationFrame(() => {\n if (input === document.activeElement) {\n clampCursorToProcessed(input)\n }\n })\n }\n\n const handleMouseUp = () => {\n const input = node\n if (!input || input !== document.activeElement) {\n return\n }\n\n clampCursorToProcessed(input)\n }\n\n const handleMouseDown = () => {\n const input = node\n if (!input) {\n return\n }\n\n requestAnimationFrame(() => {\n if (input !== document.activeElement) {\n return\n }\n\n const start = input.selectionStart ?? 0\n const end = input.selectionEnd ?? 0\n if (start !== end) {\n return\n }\n\n const { slots } = getResolvedOptions(options, '')\n const endPos =\n processed.length > 0\n ? findNextEditablePosition(processed.length, slots, processed)\n : findNextTokenIndex(slots, 0)\n\n if (start > endPos) {\n input.setSelectionRange(endPos, endPos)\n }\n })\n }\n\n const handleBlur = () => {\n isFocused = false\n const input = node\n\n if (!input) {\n return\n }\n\n const { slots, slotChar } = getResolvedOptions(options, rawInternal)\n const expectedFocusDisplay = buildDisplayValue(processed, slots, slotChar, true)\n const nextProcessed =\n input.value === expectedFocusDisplay ? processed : processInput(input.value, slots, slotChar)\n const complete = checkComplete(nextProcessed, slots)\n\n if (options.autoClear && !complete && nextProcessed.length > 0) {\n input.value = ''\n processed = ''\n display = ''\n rawInternal = ''\n maskedValue.value = ''\n rawValue.value = ''\n wasComplete = false\n isComplete.value = false\n\n if (options.onChangeRaw) {\n options.onChangeRaw('', '')\n }\n\n if (options.alwaysShowMask) {\n const emptyDisplay = buildDisplayValue('', slots, slotChar, true)\n input.value = emptyDisplay\n display = emptyDisplay\n maskedValue.value = emptyDisplay\n }\n return\n }\n\n if (!options.alwaysShowMask && !complete) {\n if (extractRaw(nextProcessed, slots).length === 0) {\n input.value = ''\n processed = ''\n display = ''\n rawInternal = ''\n maskedValue.value = ''\n rawValue.value = ''\n wasComplete = false\n isComplete.value = false\n\n if (options.onChangeRaw) {\n options.onChangeRaw('', '')\n }\n return\n }\n\n const nextDisplay = buildDisplayValue(nextProcessed, slots, slotChar, false)\n input.value = nextDisplay\n display = nextDisplay\n maskedValue.value = nextDisplay\n }\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const input = e.target as HTMLInputElement\n\n const { slots, slotChar, transform } = getResolvedOptions(options, rawInternal)\n const start = input.selectionStart ?? 0\n const end = input.selectionEnd ?? 0\n\n const modifier = e.metaKey || (e.ctrlKey && !e.altKey)\n const key = e.key.toLowerCase()\n\n if (modifier && key === 'z' && !e.shiftKey) {\n e.preventDefault()\n const prev = undoStack.pop()\n if (!prev) {\n return\n }\n redoStack.push({ rawValue: rawInternal, selectionStart: input.selectionStart ?? 0 })\n applyHistoryState(prev)\n return\n }\n\n if (modifier && ((key === 'z' && e.shiftKey) || (key === 'y' && !e.shiftKey))) {\n e.preventDefault()\n const next = redoStack.pop()\n if (!next) {\n return\n }\n undoStack.push({ rawValue: rawInternal, selectionStart: input.selectionStart ?? 0 })\n applyHistoryState(next)\n return\n }\n\n if (e.key === 'Backspace') {\n e.preventDefault()\n\n if (e.metaKey || (e.ctrlKey && !e.altKey)) {\n const clampedStart = Math.min(start, processed.length)\n const afterRaw = extractRaw(processed.slice(clampedStart), slots.slice(clampedStart))\n const newValue = applyMaskToRaw(afterRaw, slots, slotChar, transform)\n pushUndoState()\n updateValue(newValue, 0)\n return\n }\n\n if (start !== end) {\n const clampedEnd = Math.min(end, processed.length)\n const before = processed.slice(0, start)\n const afterRaw = extractRaw(processed.slice(clampedEnd), slots.slice(clampedEnd))\n const newValue = applyMaskToRaw(\n extractRaw(before, slots) + afterRaw,\n slots,\n slotChar,\n transform,\n )\n pushUndoState()\n updateValue(newValue, start)\n return\n }\n\n if (start === 0) {\n return\n }\n\n let deletePos = start - 1\n while (deletePos >= 0 && slots[deletePos] && slots[deletePos].type === 'literal') {\n deletePos--\n }\n\n if (deletePos < 0) {\n return\n }\n\n const beforeRaw = extractRaw(processed.slice(0, deletePos), slots.slice(0, deletePos))\n const afterRaw = extractRaw(processed.slice(deletePos + 1), slots.slice(deletePos + 1))\n const newValue = applyMaskToRaw(beforeRaw + afterRaw, slots, slotChar, transform)\n pushUndoState()\n updateValue(newValue, deletePos)\n } else if (e.key === 'Delete') {\n e.preventDefault()\n\n if (start !== end) {\n const clampedEnd = Math.min(end, processed.length)\n const before = processed.slice(0, start)\n const afterRaw = extractRaw(processed.slice(clampedEnd), slots.slice(clampedEnd))\n const newValue = applyMaskToRaw(\n extractRaw(before, slots) + afterRaw,\n slots,\n slotChar,\n transform,\n )\n pushUndoState()\n updateValue(newValue, start)\n return\n }\n\n let deletePos = start\n while (deletePos < slots.length && slots[deletePos] && slots[deletePos].type === 'literal') {\n deletePos++\n }\n\n if (deletePos >= processed.length) {\n return\n }\n\n const beforeRaw = extractRaw(processed.slice(0, start), slots.slice(0, start))\n const afterRaw = extractRaw(processed.slice(deletePos + 1), slots.slice(deletePos + 1))\n const newValue = applyMaskToRaw(beforeRaw + afterRaw, slots, slotChar, transform)\n pushUndoState()\n updateValue(newValue, start)\n } else if (e.key === 'ArrowRight' && !e.shiftKey) {\n const nextPos = findNextEditablePosition(start + 1, slots, input.value)\n if (nextPos !== start + 1) {\n e.preventDefault()\n input.setSelectionRange(nextPos, nextPos)\n }\n } else if (e.key === 'ArrowLeft' && !e.shiftKey) {\n if (start > 0) {\n const prevToken = findPrevTokenIndex(slots, start - 1)\n if (prevToken >= 0 && prevToken !== start - 1) {\n e.preventDefault()\n input.setSelectionRange(prevToken + 1, prevToken + 1)\n }\n }\n } else if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n e.preventDefault()\n\n let insertPos = Math.min(start, processed.length)\n while (insertPos < slots.length && slots[insertPos] && slots[insertPos].type === 'literal') {\n insertPos++\n }\n\n if (insertPos >= slots.length) {\n return\n }\n\n const slot = slots[insertPos]\n const ch = transform ? transform(e.key) : e.key\n if (!slot.pattern!.test(ch)) {\n return\n }\n\n const beforeRaw = extractRaw(processed.slice(0, insertPos), slots.slice(0, insertPos))\n const afterRaw =\n start < end\n ? extractRaw(\n processed.slice(Math.min(end, processed.length)),\n slots.slice(Math.min(end, processed.length)),\n )\n : extractRaw(processed.slice(insertPos), slots.slice(insertPos))\n const newValue = applyMaskToRaw(beforeRaw + ch + afterRaw, slots, slotChar, transform)\n const newCursorPos = findNextEditablePosition(insertPos + 1, slots, newValue)\n pushUndoState()\n updateValue(newValue, newCursorPos)\n }\n }\n\n const handlePaste = (e: ClipboardEvent) => {\n e.preventDefault()\n const input = e.target as HTMLInputElement\n\n const pastedText = e.clipboardData?.getData('text') ?? ''\n const start = input.selectionStart ?? 0\n const end = input.selectionEnd ?? 0\n\n const { slots, slotChar, transform } = getResolvedOptions(options, '')\n const clampedStart = Math.min(start, processed.length)\n const clampedEnd = Math.min(end, processed.length)\n const beforeRaw = extractRaw(processed.slice(0, clampedStart), slots.slice(0, clampedStart))\n const afterRaw = extractRaw(processed.slice(clampedEnd), slots.slice(clampedEnd))\n const newValue = applyMaskToRaw(beforeRaw + pastedText + afterRaw, slots, slotChar, transform)\n\n pushUndoState()\n updateValue(newValue)\n\n const maskedPrefix = applyMaskToRaw(beforeRaw + pastedText, slots, slotChar, transform)\n const pasteEndPos = Math.min(maskedPrefix.length, slots.length)\n if (input === document.activeElement) {\n input.setSelectionRange(pasteEndPos, pasteEndPos)\n }\n }\n\n const setAriaAttributes = (input: HTMLInputElement) => {\n if (options.invalid) {\n input.setAttribute('aria-invalid', 'true')\n } else {\n input.removeAttribute('aria-invalid')\n }\n }\n\n const refCallback = (newNode: HTMLInputElement | null) => {\n const prevNode = node\n\n if (prevNode) {\n prevNode.removeEventListener('input', handleInput)\n prevNode.removeEventListener('focus', handleFocus)\n prevNode.removeEventListener('blur', handleBlur)\n prevNode.removeEventListener('mousedown', handleMouseDown)\n prevNode.removeEventListener('mouseup', handleMouseUp)\n prevNode.removeEventListener('keydown', handleKeyDown as EventListener)\n prevNode.removeEventListener('paste', handlePaste as EventListener)\n }\n\n node = newNode\n\n if (newNode) {\n newNode.addEventListener('input', handleInput)\n newNode.addEventListener('focus', handleFocus)\n newNode.addEventListener('blur', handleBlur)\n newNode.addEventListener('mousedown', handleMouseDown)\n newNode.addEventListener('mouseup', handleMouseUp)\n newNode.addEventListener('keydown', handleKeyDown as EventListener)\n newNode.addEventListener('paste', handlePaste as EventListener)\n\n setAriaAttributes(newNode)\n\n const hasInitialValue = initializeInputValue(newNode)\n\n if (options.alwaysShowMask && !hasInitialValue) {\n const { slots, slotChar } = getResolvedOptions(options, '')\n const displayValue = buildDisplayValue('', slots, slotChar, true)\n newNode.value = displayValue\n display = displayValue\n maskedValue.value = displayValue\n }\n }\n }\n\n watch(\n () => options.invalid,\n () => {\n if (node) {\n setAriaAttributes(node)\n }\n },\n )\n\n const reset = () => {\n processed = ''\n display = ''\n rawInternal = ''\n undoStack = []\n redoStack = []\n maskedValue.value = ''\n rawValue.value = ''\n wasComplete = false\n isComplete.value = false\n\n if (node) {\n if (options.alwaysShowMask) {\n const { slots, slotChar } = getResolvedOptions(options, '')\n const displayValue = buildDisplayValue('', slots, slotChar, true)\n node.value = displayValue\n display = displayValue\n maskedValue.value = displayValue\n } else {\n node.value = ''\n }\n }\n\n if (options.onChangeRaw) {\n options.onChangeRaw('', '')\n }\n }\n\n return {\n ref: refCallback,\n value: maskedValue,\n rawValue,\n isComplete,\n reset,\n }\n}\n","import { toValue, watch, type ComponentPublicInstance, type MaybeRefOrGetter, type Ref } from 'vue'\nimport { useUncontrolled } from '../use-uncontrolled/use-uncontrolled'\n\nexport interface UseRovingIndexInput {\n /** Total number of items in the group */\n total: MaybeRefOrGetter<number>\n\n /** Which arrow keys navigate, `'horizontal'` by default */\n orientation?: 'horizontal' | 'vertical' | 'both'\n\n /** Whether navigation wraps at boundaries, `true` by default */\n loop?: boolean\n\n /** Text direction, `'ltr'` by default */\n dir?: 'rtl' | 'ltr'\n\n /** Whether to click element when it receives focus via keyboard, `false` by default */\n activateOnFocus?: boolean\n\n /** Number of columns for grid (2D) navigation. When set, enables grid mode */\n columns?: MaybeRefOrGetter<number | undefined>\n\n /** Controlled focused index */\n focusedIndex?: MaybeRefOrGetter<number | undefined>\n\n /** Initial focused index for uncontrolled mode, first non-disabled item by default */\n initialIndex?: number\n\n /** Called when focused index changes */\n onFocusChange?: (index: number) => void\n\n /** Function to check if item at given index is disabled, `() => false` by default */\n isItemDisabled?: (index: number) => boolean\n}\n\nexport interface UseRovingIndexGetItemPropsInput {\n /** Index of the item in the group */\n index: number\n\n /** Called when item is clicked */\n onClick?: (event: MouseEvent) => void\n\n /** Called when keydown event fires on item */\n onKeyDown?: (event: KeyboardEvent) => void\n}\n\nexport interface UseRovingIndexReturnValue {\n /** Get props to spread on each navigable item */\n getItemProps: (options: UseRovingIndexGetItemPropsInput) => {\n tabIndex: 0 | -1\n onKeyDown: (event: KeyboardEvent) => void\n onClick: (event: MouseEvent) => void\n ref: (node: Element | ComponentPublicInstance | null) => void\n }\n\n /** Currently focused index */\n focusedIndex: Ref<number>\n\n /** Programmatically set focused index */\n setFocusedIndex: (index: number) => void\n}\n\nfunction findNextEnabled(\n current: number,\n total: number,\n isItemDisabled: (index: number) => boolean,\n loop: boolean,\n): number {\n for (let i = current + 1; i < total; i += 1) {\n if (!isItemDisabled(i)) {\n return i\n }\n }\n\n if (loop) {\n for (let i = 0; i < current; i += 1) {\n if (!isItemDisabled(i)) {\n return i\n }\n }\n }\n\n return current\n}\n\nfunction findPreviousEnabled(\n current: number,\n total: number,\n isItemDisabled: (index: number) => boolean,\n loop: boolean,\n): number {\n for (let i = current - 1; i >= 0; i -= 1) {\n if (!isItemDisabled(i)) {\n return i\n }\n }\n\n if (loop) {\n for (let i = total - 1; i > current; i -= 1) {\n if (!isItemDisabled(i)) {\n return i\n }\n }\n }\n\n return current\n}\n\nfunction findFirstEnabled(total: number, isItemDisabled: (index: number) => boolean): number {\n for (let i = 0; i < total; i += 1) {\n if (!isItemDisabled(i)) {\n return i\n }\n }\n\n return 0\n}\n\nfunction findLastEnabled(total: number, isItemDisabled: (index: number) => boolean): number {\n for (let i = total - 1; i >= 0; i -= 1) {\n if (!isItemDisabled(i)) {\n return i\n }\n }\n\n return 0\n}\n\nconst defaultIsItemDisabled = () => false\n\nexport function useRovingIndex(input: UseRovingIndexInput): UseRovingIndexReturnValue {\n const {\n total,\n orientation = 'horizontal',\n loop = true,\n dir = 'ltr',\n activateOnFocus = false,\n columns,\n focusedIndex,\n initialIndex,\n onFocusChange,\n isItemDisabled = defaultIsItemDisabled,\n } = input\n\n const itemRefs = new Map<number, HTMLElement>()\n const getColumns = () => toValue(columns)\n const getIsGrid = () => {\n const cols = getColumns()\n return typeof cols === 'number' && cols > 0\n }\n\n const resolvedInitialIndex =\n initialIndex !== undefined ? initialIndex : findFirstEnabled(toValue(total), isItemDisabled)\n\n const [activeIndex, setActiveIndex] = useUncontrolled<number>({\n value: focusedIndex,\n defaultValue: resolvedInitialIndex,\n finalValue: 0,\n onChange: onFocusChange,\n })\n\n watch(\n () => [toValue(total), activeIndex.value] as const,\n ([currentTotal, currentActive]) => {\n if (currentTotal === 0) {\n return\n }\n\n if (currentActive >= currentTotal) {\n setActiveIndex(findLastEnabled(currentTotal, isItemDisabled))\n } else if (isItemDisabled(currentActive)) {\n setActiveIndex(findFirstEnabled(currentTotal, isItemDisabled))\n }\n },\n { immediate: true },\n )\n\n const focusItem = (index: number) => {\n setActiveIndex(index)\n const element = itemRefs.get(index)\n if (element) {\n element.focus()\n if (activateOnFocus) {\n element.click()\n }\n }\n }\n\n const handleGridKeyDown = (event: KeyboardEvent, currentIndex: number) => {\n const cols = getColumns() as number\n const total_ = toValue(total)\n const row = Math.floor(currentIndex / cols)\n const col = currentIndex % cols\n const totalRows = Math.ceil(total_ / cols)\n let nextIndex: number | null = null\n\n const isRtl = dir === 'rtl'\n\n switch (event.key) {\n case 'ArrowRight': {\n const targetCol = isRtl ? col - 1 : col + 1\n if (targetCol >= 0 && targetCol < cols && row * cols + targetCol < total_) {\n const candidate = row * cols + targetCol\n if (!isItemDisabled(candidate)) {\n nextIndex = candidate\n }\n }\n break\n }\n\n case 'ArrowLeft': {\n const targetCol = isRtl ? col + 1 : col - 1\n if (targetCol >= 0 && targetCol < cols && row * cols + targetCol < total_) {\n const candidate = row * cols + targetCol\n if (!isItemDisabled(candidate)) {\n nextIndex = candidate\n }\n }\n break\n }\n\n case 'ArrowDown': {\n for (let r = row + 1; r < totalRows; r += 1) {\n const candidate = r * cols + col\n if (candidate < total_ && !isItemDisabled(candidate)) {\n nextIndex = candidate\n break\n }\n }\n break\n }\n\n case 'ArrowUp': {\n for (let r = row - 1; r >= 0; r -= 1) {\n const candidate = r * cols + col\n if (candidate < total_ && !isItemDisabled(candidate)) {\n nextIndex = candidate\n break\n }\n }\n break\n }\n\n case 'Home': {\n if (event.ctrlKey) {\n nextIndex = findFirstEnabled(total_, isItemDisabled)\n } else {\n const rowStart = row * cols\n for (let i = rowStart; i < rowStart + cols && i < total_; i += 1) {\n if (!isItemDisabled(i)) {\n nextIndex = i\n break\n }\n }\n }\n break\n }\n\n case 'End': {\n if (event.ctrlKey) {\n nextIndex = findLastEnabled(total_, isItemDisabled)\n } else {\n const rowStart = row * cols\n const rowEnd = Math.min(rowStart + cols, total_) - 1\n for (let i = rowEnd; i >= rowStart; i -= 1) {\n if (!isItemDisabled(i)) {\n nextIndex = i\n break\n }\n }\n }\n break\n }\n }\n\n if (nextIndex !== null && nextIndex !== currentIndex) {\n event.preventDefault()\n event.stopPropagation()\n focusItem(nextIndex)\n }\n }\n\n const handleListKeyDown = (event: KeyboardEvent, currentIndex: number) => {\n const total_ = toValue(total)\n const isRtl = dir === 'rtl'\n let nextIndex: number | null = null\n\n switch (event.key) {\n case 'ArrowRight': {\n if (orientation === 'horizontal' || orientation === 'both') {\n nextIndex = isRtl\n ? findPreviousEnabled(currentIndex, total_, isItemDisabled, loop)\n : findNextEnabled(currentIndex, total_, isItemDisabled, loop)\n }\n break\n }\n\n case 'ArrowLeft': {\n if (orientation === 'horizontal' || orientation === 'both') {\n nextIndex = isRtl\n ? findNextEnabled(currentIndex, total_, isItemDisabled, loop)\n : findPreviousEnabled(currentIndex, total_, isItemDisabled, loop)\n }\n break\n }\n\n case 'ArrowDown': {\n if (orientation === 'vertical' || orientation === 'both') {\n nextIndex = findNextEnabled(currentIndex, total_, isItemDisabled, loop)\n }\n break\n }\n\n case 'ArrowUp': {\n if (orientation === 'vertical' || orientation === 'both') {\n nextIndex = findPreviousEnabled(currentIndex, total_, isItemDisabled, loop)\n }\n break\n }\n\n case 'Home': {\n nextIndex = findFirstEnabled(total_, isItemDisabled)\n break\n }\n\n case 'End': {\n nextIndex = findLastEnabled(total_, isItemDisabled)\n break\n }\n }\n\n if (nextIndex !== null && nextIndex !== currentIndex) {\n event.preventDefault()\n event.stopPropagation()\n focusItem(nextIndex)\n }\n }\n\n const getItemProps = (options: UseRovingIndexGetItemPropsInput) => {\n const { index, onClick, onKeyDown } = options\n\n return {\n tabIndex: (index === activeIndex.value ? 0 : -1) as 0 | -1,\n\n ref: (node: Element | ComponentPublicInstance | null) => {\n const safeNode = node instanceof HTMLElement ? node : null\n if (safeNode) {\n itemRefs.set(index, safeNode)\n } else {\n itemRefs.delete(index)\n }\n },\n\n onKeyDown: (event: KeyboardEvent) => {\n onKeyDown?.(event)\n\n if (event.defaultPrevented) {\n return\n }\n\n if (getIsGrid()) {\n handleGridKeyDown(event, index)\n } else {\n handleListKeyDown(event, index)\n }\n },\n\n onClick: (event: MouseEvent) => {\n onClick?.(event)\n setActiveIndex(index)\n },\n }\n }\n\n return {\n getItemProps,\n focusedIndex: activeIndex,\n setFocusedIndex: setActiveIndex,\n }\n}\n","import { onBeforeUnmount, ref, type Ref } from 'vue'\n\ntype Vector2 = [number, number]\n\nexport interface UseDragState {\n /** Current pointer position [x, y] */\n xy: Vector2\n\n /** Position where the gesture started [x, y] */\n initial: Vector2\n\n /** Displacement from start [x, y], respects axis constraint */\n movement: Vector2\n\n /** Change since previous event [x, y] */\n delta: Vector2\n\n /** Absolute distance per axis [x, y] */\n distance: Vector2\n\n /** Movement direction per axis: -1, 0, or 1 */\n direction: Vector2\n\n /** Speed per axis in px/ms */\n velocity: Vector2\n\n /** Time since drag started in ms */\n elapsedTime: number\n\n /** `true` on the first handler call after the threshold is met */\n first: boolean\n\n /** `true` on the last handler call (pointer released or canceled) */\n last: boolean\n\n /** `true` while the gesture is ongoing */\n active: boolean\n\n /** `true` when the gesture qualifies as a tap (requires `filterTaps: true`) */\n tap: boolean\n\n /** `true` when the gesture was interrupted by a `pointercancel` event */\n canceled: boolean\n\n /** Function to programmatically cancel the current gesture */\n cancel: () => void\n\n /** The source `PointerEvent` */\n event: PointerEvent\n}\n\nexport interface UseDragOptions {\n /** Constrain movement to a specific axis. `'lock'` locks to whichever axis has more movement after `axisThreshold` is exceeded. */\n axis?: 'x' | 'y' | 'lock'\n\n /** Movement in px required to determine axis when `axis` is `'lock'`, `1` by default */\n axisThreshold?: number\n\n /** When `true`, the last state includes `tap: true` when total distance is below `tapThreshold`, `false` by default */\n filterTaps?: boolean\n\n /** Max displacement in px to still be considered a tap, `3` by default */\n tapThreshold?: number\n\n /** Minimum displacement in px before the drag activates. Can be a number (both axes) or `[x, y]`. `0` by default */\n threshold?: number | Vector2\n\n /** Enable or disable the hook, `true` by default */\n enabled?: boolean\n}\n\nexport interface UseDragReturnValue<T extends HTMLElement = any> {\n /** Ref callback to attach to the draggable element */\n ref: (node: T | null) => void\n\n /** `true` while the element is being dragged */\n active: Ref<boolean>\n}\n\nconst VELOCITY_DECAY_MS = 100\n\nfunction sign(n: number): -1 | 0 | 1 {\n if (n > 0) {\n return 1\n }\n if (n < 0) {\n return -1\n }\n return 0\n}\n\nfunction getThresholdVector(threshold: number | Vector2 | undefined): Vector2 {\n const t = threshold ?? 0\n if (typeof t === 'number') {\n return [t, t]\n }\n return t\n}\n\ninterface DragInternalState {\n isActive: boolean\n pointerId: number\n startXY: Vector2\n prevXY: Vector2\n startTimestamp: number\n prevTimestamp: number\n thresholdMet: boolean\n firstFired: boolean\n lockedAxis: 'x' | 'y' | null\n canceled: boolean\n lastVelocity: Vector2\n}\n\nfunction createInitialState(): DragInternalState {\n return {\n isActive: false,\n pointerId: -1,\n startXY: [0, 0],\n prevXY: [0, 0],\n startTimestamp: 0,\n prevTimestamp: 0,\n thresholdMet: false,\n firstFired: false,\n lockedAxis: null,\n canceled: false,\n lastVelocity: [0, 0],\n }\n}\n\nexport function useDrag<T extends HTMLElement = any>(\n handler: (state: UseDragState) => void,\n options: UseDragOptions = {},\n): UseDragReturnValue<T> {\n const active = ref(false) as Ref<boolean>\n\n const state = createInitialState()\n let node: T | null = null\n let documentController: AbortController | null = null\n let cleanupNode: (() => void) | undefined\n\n const applyAxisConstraint = (v: Vector2): Vector2 => {\n if (options.axis === 'x') {\n return [v[0], 0]\n }\n if (options.axis === 'y') {\n return [0, v[1]]\n }\n if (options.axis === 'lock') {\n if (state.lockedAxis === null) {\n const t = options.axisThreshold ?? 1\n if (Math.abs(v[0]) > t || Math.abs(v[1]) > t) {\n state.lockedAxis = Math.abs(v[0]) >= Math.abs(v[1]) ? 'x' : 'y'\n }\n }\n if (state.lockedAxis === 'x') {\n return [v[0], 0]\n }\n if (state.lockedAxis === 'y') {\n return [0, v[1]]\n }\n }\n return v\n }\n\n const resetDrag = () => {\n state.isActive = false\n state.pointerId = -1\n state.thresholdMet = false\n state.firstFired = false\n state.lockedAxis = null\n state.canceled = false\n active.value = false\n document.body.style.userSelect = ''\n document.body.style.webkitUserSelect = ''\n documentController?.abort()\n documentController = null\n }\n\n const cancel = () => {\n if (state.isActive) {\n state.canceled = true\n resetDrag()\n }\n }\n\n const activateDrag = () => {\n active.value = true\n document.body.style.userSelect = 'none'\n document.body.style.webkitUserSelect = 'none'\n }\n\n const onPointerDown = (event: PointerEvent) => {\n if (options.enabled === false) {\n return\n }\n if (event.button !== 0) {\n return\n }\n if (state.isActive) {\n return\n }\n\n state.isActive = true\n state.pointerId = event.pointerId\n state.startXY = [event.clientX, event.clientY]\n state.prevXY = [event.clientX, event.clientY]\n state.startTimestamp = event.timeStamp\n state.prevTimestamp = event.timeStamp\n state.thresholdMet = false\n state.firstFired = false\n state.lockedAxis = null\n state.canceled = false\n state.lastVelocity = [0, 0]\n\n const [tx, ty] = getThresholdVector(options.threshold)\n if (tx === 0 && ty === 0) {\n state.thresholdMet = true\n state.firstFired = true\n activateDrag()\n\n handler({\n xy: [event.clientX, event.clientY],\n initial: [event.clientX, event.clientY],\n movement: [0, 0],\n delta: [0, 0],\n distance: [0, 0],\n direction: [0, 0],\n velocity: [0, 0],\n elapsedTime: 0,\n first: true,\n last: false,\n active: true,\n tap: false,\n canceled: false,\n cancel,\n event,\n })\n }\n\n documentController?.abort()\n documentController = new AbortController()\n const sig = documentController.signal\n\n document.addEventListener('pointermove', onPointerMove, { signal: sig })\n document.addEventListener('pointerup', onPointerUp, { signal: sig })\n document.addEventListener('pointercancel', onPointerCancel, { signal: sig })\n }\n\n const onPointerMove = (event: PointerEvent) => {\n if (!state.isActive || event.pointerId !== state.pointerId) {\n return\n }\n\n const rawMovement: Vector2 = [\n event.clientX - state.startXY[0],\n event.clientY - state.startXY[1],\n ]\n\n if (!state.thresholdMet) {\n const [tx, ty] = getThresholdVector(options.threshold)\n if (Math.abs(rawMovement[0]) < tx && Math.abs(rawMovement[1]) < ty) {\n state.prevXY = [event.clientX, event.clientY]\n state.prevTimestamp = event.timeStamp\n return\n }\n state.thresholdMet = true\n activateDrag()\n }\n\n const movement = applyAxisConstraint(rawMovement)\n const rawDelta: Vector2 = [event.clientX - state.prevXY[0], event.clientY - state.prevXY[1]]\n const delta = applyAxisConstraint(rawDelta)\n const timeDelta = event.timeStamp - state.prevTimestamp\n const velocity: Vector2 =\n timeDelta > 0\n ? [Math.abs(delta[0]) / timeDelta, Math.abs(delta[1]) / timeDelta]\n : state.lastVelocity\n\n state.lastVelocity = velocity\n const isFirst = !state.firstFired\n state.firstFired = true\n state.prevXY = [event.clientX, event.clientY]\n state.prevTimestamp = event.timeStamp\n\n handler({\n xy: [event.clientX, event.clientY],\n initial: [...state.startXY],\n movement,\n delta,\n distance: [Math.abs(movement[0]), Math.abs(movement[1])],\n direction: [sign(delta[0]), sign(delta[1])],\n velocity,\n elapsedTime: event.timeStamp - state.startTimestamp,\n first: isFirst,\n last: false,\n active: true,\n tap: false,\n canceled: false,\n cancel,\n event,\n })\n }\n\n const onPointerUp = (event: PointerEvent) => {\n if (!state.isActive || event.pointerId !== state.pointerId) {\n return\n }\n\n if (!state.thresholdMet) {\n if (options.filterTaps) {\n const rawMov: Vector2 = [event.clientX - state.startXY[0], event.clientY - state.startXY[1]]\n const mov = applyAxisConstraint(rawMov)\n const dist: Vector2 = [Math.abs(mov[0]), Math.abs(mov[1])]\n const maxDist = Math.max(dist[0], dist[1])\n const isTap = maxDist < (options.tapThreshold ?? 3)\n\n handler({\n xy: [event.clientX, event.clientY],\n initial: [...state.startXY],\n movement: mov,\n delta: mov,\n distance: dist,\n direction: [sign(mov[0]), sign(mov[1])],\n velocity: [0, 0],\n elapsedTime: event.timeStamp - state.startTimestamp,\n first: true,\n last: true,\n active: false,\n tap: isTap,\n canceled: false,\n cancel,\n event,\n })\n }\n resetDrag()\n return\n }\n\n const rawMovement: Vector2 = [\n event.clientX - state.startXY[0],\n event.clientY - state.startXY[1],\n ]\n const movement = applyAxisConstraint(rawMovement)\n const distance: Vector2 = [Math.abs(movement[0]), Math.abs(movement[1])]\n const rawDelta: Vector2 = [event.clientX - state.prevXY[0], event.clientY - state.prevXY[1]]\n const delta = applyAxisConstraint(rawDelta)\n\n const timeSinceLastMove = event.timeStamp - state.prevTimestamp\n const velocity: Vector2 = timeSinceLastMove > VELOCITY_DECAY_MS ? [0, 0] : state.lastVelocity\n\n const maxDistance = Math.max(distance[0], distance[1])\n const tap = options.filterTaps === true && maxDistance < (options.tapThreshold ?? 3)\n\n handler({\n xy: [event.clientX, event.clientY],\n initial: [...state.startXY],\n movement,\n delta,\n distance,\n direction: [sign(delta[0]), sign(delta[1])],\n velocity,\n elapsedTime: event.timeStamp - state.startTimestamp,\n first: !state.firstFired,\n last: true,\n active: false,\n tap,\n canceled: false,\n cancel,\n event,\n })\n\n resetDrag()\n }\n\n const onPointerCancel = (event: PointerEvent) => {\n if (!state.isActive || event.pointerId !== state.pointerId) {\n return\n }\n\n const rawMovement: Vector2 = [\n event.clientX - state.startXY[0],\n event.clientY - state.startXY[1],\n ]\n const movement = applyAxisConstraint(rawMovement)\n\n handler({\n xy: [event.clientX, event.clientY],\n initial: [...state.startXY],\n movement,\n delta: [0, 0],\n distance: [Math.abs(movement[0]), Math.abs(movement[1])],\n direction: [0, 0],\n velocity: [0, 0],\n elapsedTime: event.timeStamp - state.startTimestamp,\n first: !state.firstFired,\n last: true,\n active: false,\n tap: false,\n canceled: true,\n cancel,\n event,\n })\n\n resetDrag()\n }\n\n const refCallback = (newNode: T | null) => {\n cleanupNode?.()\n cleanupNode = undefined\n node = newNode\n\n if (!node) {\n return\n }\n\n const elementController = new AbortController()\n node.addEventListener('pointerdown', onPointerDown, { signal: elementController.signal })\n\n cleanupNode = () => {\n elementController.abort()\n documentController?.abort()\n documentController = null\n if (state.isActive) {\n state.isActive = false\n active.value = false\n document.body.style.userSelect = ''\n document.body.style.webkitUserSelect = ''\n }\n }\n }\n\n onBeforeUnmount(() => {\n cleanupNode?.()\n })\n\n return { ref: refCallback, active }\n}\n","import {\n computed,\n onBeforeUnmount,\n ref,\n type ComponentPublicInstance,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue'\nimport { useUncontrolled } from '../use-uncontrolled/use-uncontrolled'\n\nexport interface UseSplitterPanel {\n /** Initial size as percentage (0-100). All panels must sum to 100. */\n defaultSize: number\n /** Minimum size percentage, `0` by default */\n min?: number\n /** Maximum size percentage, `100` by default */\n max?: number\n /** Whether this panel can be collapsed, `false` by default */\n collapsible?: boolean\n /** Size below which the panel snaps to collapsed (percentage), defaults to `min` */\n collapseThreshold?: number\n}\n\nexport interface UseSplitterRedistributeInput {\n /** Current sizes before applying delta */\n sizes: number[]\n /** Panel configurations */\n panels: UseSplitterPanel[]\n /** Index of the handle being dragged */\n handleIndex: number\n /** Requested size change in percentage (positive = grow before-panel) */\n delta: number\n}\n\nexport type UseSplitterRedistributeFn = (input: UseSplitterRedistributeInput) => number[]\n\nexport interface UseSplitterOptions {\n /** Panel configuration array (minimum 2 panels) */\n panels: UseSplitterPanel[]\n /** Layout direction, `'horizontal'` by default */\n orientation?: 'horizontal' | 'vertical'\n /** Controlled sizes (percentages summing to 100) */\n sizes?: MaybeRefOrGetter<number[] | undefined>\n /** Called during resize with updated sizes */\n onSizeChange?: (sizes: number[]) => void\n /** Called when drag starts */\n onResizeStart?: (handleIndex: number) => void\n /** Called when drag ends */\n onResizeEnd?: (handleIndex: number, sizes: number[]) => void\n /** Called when a panel collapses or expands */\n onCollapseChange?: (panelIndex: number, collapsed: boolean) => void\n /** How to borrow space from non-adjacent panels when the immediate neighbor is at its min/max.\n * `'nearest'` takes from the nearest panel in the drag direction first.\n * `'equal'` distributes equally among all panels in the drag direction.\n * A function receives sizes, panels, handleIndex and delta, and returns new sizes.\n * When not set, only the two adjacent panels are affected. */\n redistribute?: 'nearest' | 'equal' | UseSplitterRedistributeFn\n /** Keyboard step size in percentage, `1` by default */\n step?: number\n /** Shift+arrow step size in percentage, `10` by default */\n shiftStep?: number\n /** Text direction for keyboard nav, `'ltr'` by default */\n dir?: 'ltr' | 'rtl'\n /** Restore the two panels adjacent to a handle to their default ratio (preserving their combined size) when the handle is double-clicked, `true` by default */\n resetOnDoubleClick?: boolean\n /** Enable/disable the hook, `true` by default */\n enabled?: boolean\n}\n\nexport interface UseSplitterReturnValue {\n /** Ref callback for the container element */\n ref: (node: Element | ComponentPublicInstance | null) => void\n /** Current panel sizes as percentages */\n sizes: Ref<number[]>\n /** Which panels are currently collapsed */\n collapsed: Ref<boolean[]>\n /** Index of handle being dragged, or -1 */\n activeHandle: Ref<number>\n /** Get props to spread on each resize handle */\n getHandleProps: (input: { index: number }) => {\n ref: (node: Element | ComponentPublicInstance | null) => void\n role: 'separator'\n 'aria-orientation': 'horizontal' | 'vertical'\n 'aria-valuenow': number\n 'aria-valuemin': number\n 'aria-valuemax': number\n tabIndex: number\n onKeyDown: (event: KeyboardEvent) => void\n onDoubleClick: (event: MouseEvent) => void\n 'data-active': boolean | undefined\n 'data-orientation': 'horizontal' | 'vertical'\n }\n /** Programmatically set sizes */\n setSizes: (sizes: number[]) => void\n /** Collapse a panel */\n collapse: (panelIndex: number) => void\n /** Expand a collapsed panel */\n expand: (panelIndex: number) => void\n /** Toggle collapse of a panel */\n toggleCollapse: (panelIndex: number) => void\n /** Reset the two panels adjacent to a handle to their default ratio, preserving\n * their combined size */\n reset: (handleIndex: number) => void\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max)\n}\n\nfunction getMin(panel: UseSplitterPanel): number {\n return panel.min ?? 0\n}\n\nfunction getMax(panel: UseSplitterPanel): number {\n return panel.max ?? 100\n}\n\nfunction getCollapseThreshold(panel: UseSplitterPanel): number {\n return panel.collapseThreshold ?? getMin(panel)\n}\n\ninterface SplitterInternalState {\n isDragging: boolean\n handleIndex: number\n startPointer: number\n containerSize: number\n startSizes: number[]\n preCollapseSizes: number[]\n}\n\nfunction createInitialInternalState(): SplitterInternalState {\n return {\n isDragging: false,\n handleIndex: -1,\n startPointer: 0,\n containerSize: 0,\n startSizes: [],\n preCollapseSizes: [],\n }\n}\n\nfunction checkCollapse(\n sizes: number[],\n panels: UseSplitterPanel[],\n handleIndex: number,\n delta: number,\n): number[] | null {\n const beforeIdx = handleIndex\n const afterIdx = handleIndex + 1\n const beforePanel = panels[beforeIdx]\n const afterPanel = panels[afterIdx]\n\n const rawBefore = sizes[beforeIdx] + delta\n const rawAfter = sizes[afterIdx] - delta\n\n if (\n beforePanel.collapsible &&\n rawBefore < getCollapseThreshold(beforePanel) &&\n rawBefore < sizes[beforeIdx]\n ) {\n const result = [...sizes]\n result[afterIdx] += result[beforeIdx]\n result[beforeIdx] = 0\n return result\n }\n\n if (\n afterPanel.collapsible &&\n rawAfter < getCollapseThreshold(afterPanel) &&\n rawAfter < sizes[afterIdx]\n ) {\n const result = [...sizes]\n result[beforeIdx] += result[afterIdx]\n result[afterIdx] = 0\n return result\n }\n\n return null\n}\n\nfunction applyAdjacentOnly(\n sizes: number[],\n panels: UseSplitterPanel[],\n handleIndex: number,\n delta: number,\n): number[] {\n const result = [...sizes]\n const beforeIdx = handleIndex\n const afterIdx = handleIndex + 1\n\n const total = result[beforeIdx] + result[afterIdx]\n const effectiveBeforeMax = Math.min(getMax(panels[beforeIdx]), total - getMin(panels[afterIdx]))\n const effectiveBeforeMin = Math.max(getMin(panels[beforeIdx]), total - getMax(panels[afterIdx]))\n const newBefore = clamp(result[beforeIdx] + delta, effectiveBeforeMin, effectiveBeforeMax)\n result[beforeIdx] = newBefore\n result[afterIdx] = total - newBefore\n return result\n}\n\nfunction redistributeNearest(\n sizes: number[],\n panels: UseSplitterPanel[],\n handleIndex: number,\n delta: number,\n): number[] {\n const result = [...sizes]\n\n if (delta > 0) {\n const growIdx = handleIndex\n const maxGrow = getMax(panels[growIdx]) - result[growIdx]\n const wantedGrow = Math.min(delta, maxGrow)\n\n let taken = 0\n for (let i = handleIndex + 1; i < result.length && taken < wantedGrow; i += 1) {\n const canGive = result[i] - getMin(panels[i])\n const take = Math.min(canGive, wantedGrow - taken)\n result[i] -= take\n taken += take\n }\n\n result[growIdx] += taken\n } else if (delta < 0) {\n const growIdx = handleIndex + 1\n const maxGrow = getMax(panels[growIdx]) - result[growIdx]\n const wantedGrow = Math.min(Math.abs(delta), maxGrow)\n\n let taken = 0\n for (let i = handleIndex; i >= 0 && taken < wantedGrow; i -= 1) {\n const canGive = result[i] - getMin(panels[i])\n const take = Math.min(canGive, wantedGrow - taken)\n result[i] -= take\n taken += take\n }\n\n result[growIdx] += taken\n }\n\n return result\n}\n\nfunction redistributeEqual(\n sizes: number[],\n panels: UseSplitterPanel[],\n handleIndex: number,\n delta: number,\n): number[] {\n const result = [...sizes]\n\n if (delta > 0) {\n const growIdx = handleIndex\n const maxGrow = getMax(panels[growIdx]) - result[growIdx]\n const wantedGrow = Math.min(delta, maxGrow)\n\n const donors: number[] = []\n for (let i = handleIndex + 1; i < result.length; i += 1) {\n if (result[i] > getMin(panels[i])) {\n donors.push(i)\n }\n }\n\n let remaining = wantedGrow\n while (remaining > 0.001 && donors.length > 0) {\n const perDonor = remaining / donors.length\n const exhausted: number[] = []\n\n for (let d = 0; d < donors.length; d += 1) {\n const idx = donors[d]\n const canGive = result[idx] - getMin(panels[idx])\n const take = Math.min(canGive, perDonor)\n result[idx] -= take\n remaining -= take\n if (canGive <= perDonor + 0.001) {\n exhausted.push(d)\n }\n }\n\n for (let i = exhausted.length - 1; i >= 0; i -= 1) {\n donors.splice(exhausted[i], 1)\n }\n\n if (exhausted.length === 0) {\n break\n }\n }\n\n result[growIdx] += wantedGrow - remaining\n } else if (delta < 0) {\n const growIdx = handleIndex + 1\n const maxGrow = getMax(panels[growIdx]) - result[growIdx]\n const wantedGrow = Math.min(Math.abs(delta), maxGrow)\n\n const donors: number[] = []\n for (let i = handleIndex; i >= 0; i -= 1) {\n if (result[i] > getMin(panels[i])) {\n donors.push(i)\n }\n }\n\n let remaining = wantedGrow\n while (remaining > 0.001 && donors.length > 0) {\n const perDonor = remaining / donors.length\n const exhausted: number[] = []\n\n for (let d = 0; d < donors.length; d += 1) {\n const idx = donors[d]\n const canGive = result[idx] - getMin(panels[idx])\n const take = Math.min(canGive, perDonor)\n result[idx] -= take\n remaining -= take\n if (canGive <= perDonor + 0.001) {\n exhausted.push(d)\n }\n }\n\n for (let i = exhausted.length - 1; i >= 0; i -= 1) {\n donors.splice(exhausted[i], 1)\n }\n\n if (exhausted.length === 0) {\n break\n }\n }\n\n result[growIdx] += wantedGrow - remaining\n }\n\n return result\n}\n\nfunction applyConstraints(\n sizes: number[],\n panels: UseSplitterPanel[],\n handleIndex: number,\n delta: number,\n redistribute?: 'nearest' | 'equal' | UseSplitterRedistributeFn,\n): number[] {\n if (typeof redistribute === 'function') {\n return redistribute({ sizes: [...sizes], panels, handleIndex, delta })\n }\n\n if (redistribute === 'nearest' || redistribute === 'equal') {\n const strategy = redistribute === 'nearest' ? redistributeNearest : redistributeEqual\n const result = strategy(sizes, panels, handleIndex, delta)\n\n const beforeIdx = handleIndex\n const afterIdx = handleIndex + 1\n const beforePanel = panels[beforeIdx]\n const afterPanel = panels[afterIdx]\n\n if (\n beforePanel.collapsible &&\n result[beforeIdx] < getCollapseThreshold(beforePanel) &&\n result[beforeIdx] < sizes[beforeIdx]\n ) {\n const freed = result[beforeIdx]\n result[afterIdx] += freed\n result[beforeIdx] = 0\n } else if (\n afterPanel.collapsible &&\n result[afterIdx] < getCollapseThreshold(afterPanel) &&\n result[afterIdx] < sizes[afterIdx]\n ) {\n const freed = result[afterIdx]\n result[beforeIdx] += freed\n result[afterIdx] = 0\n }\n\n return result\n }\n\n const collapsedResult = checkCollapse(sizes, panels, handleIndex, delta)\n if (collapsedResult) {\n return collapsedResult\n }\n\n return applyAdjacentOnly(sizes, panels, handleIndex, delta)\n}\n\nexport function useSplitter<T extends HTMLElement = any>(\n options: UseSplitterOptions,\n): UseSplitterReturnValue {\n const {\n panels,\n orientation = 'horizontal',\n sizes: controlledSizes,\n onSizeChange,\n onResizeStart,\n onResizeEnd,\n onCollapseChange,\n redistribute,\n step = 1,\n shiftStep = 10,\n dir = 'ltr',\n resetOnDoubleClick = true,\n enabled = true,\n } = options\n\n const defaultSizes = panels.map((p) => p.defaultSize)\n\n const [currentSizes, setCurrentSizesRaw] = useUncontrolled<number[]>({\n value: controlledSizes,\n defaultValue: defaultSizes,\n finalValue: defaultSizes,\n onChange: onSizeChange,\n })\n\n const activeHandle = ref(-1) as Ref<number>\n\n const internalState: SplitterInternalState = createInitialInternalState()\n let containerNode: T | null = null\n let documentController: AbortController | null = null\n let frame = 0\n let preCollapseSizes: number[] = [...defaultSizes]\n\n const collapsed = computed(() => currentSizes.value.map((size) => size === 0)) as Ref<boolean[]>\n\n const updateSizes = (newSizes: number[]) => {\n setCurrentSizesRaw(newSizes)\n }\n\n const collapsePanel = (panelIndex: number) => {\n if (!panels[panelIndex]?.collapsible) {\n return\n }\n const sizesNow = currentSizes.value\n if (sizesNow[panelIndex] === 0) {\n return\n }\n\n preCollapseSizes = [...sizesNow]\n const newSizes = [...sizesNow]\n const freedSize = newSizes[panelIndex]\n newSizes[panelIndex] = 0\n\n const neighbor = panelIndex === 0 ? 1 : panelIndex - 1\n newSizes[neighbor] += freedSize\n\n updateSizes(newSizes)\n onCollapseChange?.(panelIndex, true)\n }\n\n const expandPanel = (panelIndex: number) => {\n if (!panels[panelIndex]?.collapsible) {\n return\n }\n const sizesNow = currentSizes.value\n if (sizesNow[panelIndex] !== 0) {\n return\n }\n\n const restoreSize = preCollapseSizes[panelIndex] || panels[panelIndex].defaultSize\n const newSizes = [...sizesNow]\n\n const neighbor = panelIndex === 0 ? 1 : panelIndex - 1\n const available = Math.max(0, newSizes[neighbor] - getMin(panels[neighbor]))\n const actualRestore = Math.min(restoreSize, available)\n\n if (actualRestore <= 0) {\n return\n }\n\n newSizes[panelIndex] = actualRestore\n newSizes[neighbor] -= actualRestore\n\n updateSizes(newSizes)\n onCollapseChange?.(panelIndex, false)\n }\n\n const toggleCollapsePanel = (panelIndex: number) => {\n if (currentSizes.value[panelIndex] === 0) {\n expandPanel(panelIndex)\n } else {\n collapsePanel(panelIndex)\n }\n }\n\n const emitCollapseTransitions = (\n prev: number[],\n next: number[],\n indices: number[],\n preCollapseSnapshot: number[],\n ) => {\n for (const idx of indices) {\n const wasCollapsed = prev[idx] === 0\n const nowCollapsed = next[idx] === 0\n if (!wasCollapsed && nowCollapsed) {\n preCollapseSizes = [...preCollapseSnapshot]\n onCollapseChange?.(idx, true)\n } else if (wasCollapsed && !nowCollapsed) {\n onCollapseChange?.(idx, false)\n }\n }\n }\n\n const reset = (handleIndex: number) => {\n const prev = currentSizes.value\n\n const beforeIdx = handleIndex\n const afterIdx = handleIndex + 1\n if (beforeIdx < 0 || afterIdx >= prev.length) {\n return\n }\n\n const total = prev[beforeIdx] + prev[afterIdx]\n const defBefore = panels[beforeIdx].defaultSize\n const defAfter = panels[afterIdx].defaultSize\n const defTotal = defBefore + defAfter\n const targetBefore = defTotal === 0 ? total / 2 : total * (defBefore / defTotal)\n\n const next = applyAdjacentOnly(prev, panels, beforeIdx, targetBefore - prev[beforeIdx])\n emitCollapseTransitions(prev, next, [beforeIdx, afterIdx], prev)\n updateSizes(next)\n }\n\n const containerRefCallback = (node: Element | ComponentPublicInstance | null) => {\n containerNode = node instanceof HTMLElement ? (node as T) : null\n }\n\n const handleRefCallbacks = new Map<\n number,\n (node: Element | ComponentPublicInstance | null) => void\n >()\n const handleElementControllers = new Map<number, AbortController>()\n\n const getHandleRefCallback = (\n handleIndex: number,\n ): ((node: Element | ComponentPublicInstance | null) => void) => {\n const cached = handleRefCallbacks.get(handleIndex)\n if (cached) {\n return cached\n }\n\n const callback = (rawNode: Element | ComponentPublicInstance | null) => {\n const existingController = handleElementControllers.get(handleIndex)\n if (existingController) {\n existingController.abort()\n handleElementControllers.delete(handleIndex)\n }\n\n const node = rawNode instanceof HTMLElement ? rawNode : null\n\n if (!node) {\n return\n }\n\n const elementController = new AbortController()\n handleElementControllers.set(handleIndex, elementController)\n\n const flushResize = (pointerEvent: PointerEvent) => {\n const s = internalState\n if (!s.containerSize) {\n return\n }\n const isHorizontal = orientation === 'horizontal'\n const isRtl = isHorizontal && dir === 'rtl'\n const pointerPos = isHorizontal ? pointerEvent.clientX : pointerEvent.clientY\n const pixelDelta = pointerPos - s.startPointer\n const percentDelta = ((isRtl ? -pixelDelta : pixelDelta) / s.containerSize) * 100\n\n const newSizes = applyConstraints(\n s.startSizes,\n panels,\n s.handleIndex,\n percentDelta,\n redistribute,\n )\n\n const prevSizes = currentSizes.value\n emitCollapseTransitions(\n prevSizes,\n newSizes,\n [s.handleIndex, s.handleIndex + 1],\n s.startSizes,\n )\n\n setCurrentSizesRaw(newSizes)\n }\n\n const onPointerMove = (event: PointerEvent) => {\n const s = internalState\n if (!s.isDragging) {\n return\n }\n\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n flushResize(event)\n })\n }\n\n const onPointerUp = (event: PointerEvent) => {\n const s = internalState\n if (!s.isDragging) {\n return\n }\n\n cancelAnimationFrame(frame)\n flushResize(event)\n\n s.isDragging = false\n const finishedHandle = s.handleIndex\n s.handleIndex = -1\n\n activeHandle.value = -1\n document.body.style.userSelect = ''\n document.body.style.webkitUserSelect = ''\n document.body.style.cursor = ''\n\n documentController?.abort()\n documentController = null\n\n onResizeEnd?.(finishedHandle, [...currentSizes.value])\n }\n\n const onPointerDown = (event: PointerEvent) => {\n if (enabled === false) {\n return\n }\n if (event.button !== 0) {\n return\n }\n\n const container = containerNode\n if (!container) {\n return\n }\n\n const rect = container.getBoundingClientRect()\n const isHorizontal = orientation === 'horizontal'\n const containerSize = isHorizontal ? rect.width : rect.height\n const pointerPos = isHorizontal ? event.clientX : event.clientY\n\n internalState.isDragging = true\n internalState.handleIndex = handleIndex\n internalState.startPointer = pointerPos\n internalState.containerSize = containerSize\n internalState.startSizes = [...currentSizes.value]\n internalState.preCollapseSizes = [...preCollapseSizes]\n\n activeHandle.value = handleIndex\n document.body.style.userSelect = 'none'\n document.body.style.webkitUserSelect = 'none'\n document.body.style.cursor = isHorizontal ? 'col-resize' : 'row-resize'\n\n onResizeStart?.(handleIndex)\n\n documentController?.abort()\n documentController = new AbortController()\n const sig = documentController.signal\n\n document.addEventListener('pointermove', onPointerMove, { signal: sig })\n document.addEventListener('pointerup', onPointerUp, { signal: sig })\n document.addEventListener('pointercancel', onPointerUp, { signal: sig })\n }\n\n node.addEventListener('pointerdown', onPointerDown, { signal: elementController.signal })\n }\n\n handleRefCallbacks.set(handleIndex, callback)\n return callback\n }\n\n const getHandleProps = (input: { index: number }) => {\n const { index } = input\n const orient = orientation\n const beforeSize = currentSizes.value[index] ?? 0\n const beforePanel = panels[index]\n const afterPanel = panels[index + 1]\n\n return {\n ref: getHandleRefCallback(index),\n role: 'separator' as const,\n 'aria-orientation': orient,\n 'aria-valuenow': Math.round(beforeSize),\n 'aria-valuemin': Math.round(getMin(beforePanel)),\n 'aria-valuemax': Math.round(getMax(beforePanel)),\n tabIndex: 0,\n onKeyDown: (event: KeyboardEvent) => {\n if (!enabled) {\n return\n }\n\n const isHorizontal = orient === 'horizontal'\n const isRtl = dir === 'rtl'\n\n let delta = 0\n const currentStep = event.shiftKey ? shiftStep : step\n\n switch (event.key) {\n case 'ArrowLeft': {\n if (!isHorizontal) {\n return\n }\n delta = isRtl ? currentStep : -currentStep\n break\n }\n case 'ArrowRight': {\n if (!isHorizontal) {\n return\n }\n delta = isRtl ? -currentStep : currentStep\n break\n }\n case 'ArrowUp': {\n if (isHorizontal) {\n return\n }\n delta = -currentStep\n break\n }\n case 'ArrowDown': {\n if (isHorizontal) {\n return\n }\n delta = currentStep\n break\n }\n case 'Home': {\n delta = -(currentSizes.value[index] - getMin(beforePanel))\n break\n }\n case 'End': {\n delta = getMax(beforePanel) - currentSizes.value[index]\n break\n }\n case 'Enter': {\n const beforeCollapsible = beforePanel?.collapsible\n const afterCollapsible = afterPanel?.collapsible\n\n if (beforeCollapsible && currentSizes.value[index] <= currentSizes.value[index + 1]) {\n toggleCollapsePanel(index)\n event.preventDefault()\n return\n }\n if (afterCollapsible) {\n toggleCollapsePanel(index + 1)\n event.preventDefault()\n return\n }\n if (beforeCollapsible) {\n toggleCollapsePanel(index)\n event.preventDefault()\n return\n }\n return\n }\n default:\n return\n }\n\n event.preventDefault()\n\n if (delta !== 0) {\n const newSizes = applyConstraints(currentSizes.value, panels, index, delta, redistribute)\n emitCollapseTransitions(\n currentSizes.value,\n newSizes,\n [index, index + 1],\n currentSizes.value,\n )\n updateSizes(newSizes)\n }\n },\n onDoubleClick: () => {\n if (!enabled || !resetOnDoubleClick) {\n return\n }\n reset(index)\n },\n 'data-active': activeHandle.value === index || undefined,\n 'data-orientation': orient,\n }\n }\n\n onBeforeUnmount(() => {\n documentController?.abort()\n documentController = null\n handleElementControllers.forEach((controller) => controller.abort())\n handleElementControllers.clear()\n cancelAnimationFrame(frame)\n\n if (internalState.isDragging) {\n internalState.isDragging = false\n document.body.style.userSelect = ''\n document.body.style.webkitUserSelect = ''\n document.body.style.cursor = ''\n }\n })\n\n return {\n ref: containerRefCallback,\n sizes: currentSizes,\n collapsed,\n activeHandle,\n getHandleProps,\n setSizes: updateSizes,\n collapse: collapsePanel,\n expand: expandPanel,\n toggleCollapse: toggleCollapsePanel,\n reset,\n }\n}\n"],"mappings":"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"}
|