@mantine_hooks-umd

UMD of @mantine/hooks

このスクリプトは単体で利用できません。右のようなメタデータを含むスクリプトから、ライブラリとして読み込まれます: // @require https://update.greasyfork.org/scripts/499180/1402241/%40mantine_hooks-umd.js

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name          @mantine_hooks-umd
// @namespace     flomk.userscripts
// @version       1.0
// @description   UMD of @mantine/hooks
// @author        flomk
// ==/UserScript==
(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
    typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.MantineHooks = {}, global.React));
})(this, (function (exports, React) { 'use strict';

    /* esm.sh - esbuild bundle(@mantine/hooks@7.11.0) es2022 development */
    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/utils/clamp/clamp.mjs
    function clamp(value, min, max) {
        if (min === void 0 && max === void 0) {
            return value;
        }
        if (min !== void 0 && max === void 0) {
            return Math.max(value, min);
        }
        if (min === void 0 && max !== void 0) {
            return Math.min(value, max);
        }
        return Math.min(Math.max(value, min), max);
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/utils/lower-first/lower-first.mjs
    function lowerFirst(value) {
        return typeof value !== "string" ? "" : value.charAt(0).toLowerCase() + value.slice(1);
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/utils/random-id/random-id.mjs
    function randomId() {
        return `mantine-${Math.random().toString(36).slice(2, 11)}`;
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/utils/range/range.mjs
    function range(start, end) {
        const length = Math.abs(end - start) + 1;
        const reversed = start > end;
        if (!reversed) {
            return Array.from({ length }, (_, index) => index + start);
        }
        return Array.from({ length }, (_, index) => start - index);
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/utils/shallow-equal/shallow-equal.mjs
    function shallowEqual(a, b) {
        if (a === b) {
            return true;
        }
        if (!(a instanceof Object) || !(b instanceof Object)) {
            return false;
        }
        const keys = Object.keys(a);
        const { length } = keys;
        if (length !== Object.keys(b).length) {
            return false;
        }
        for (let i = 0; i < length; i += 1) {
            const key = keys[i];
            if (!(key in b)) {
                return false;
            }
            if (a[key] !== b[key]) {
                return false;
            }
        }
        return true;
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/utils/upper-first/upper-first.mjs
    function upperFirst(value) {
        return typeof value !== "string" ? "" : value.charAt(0).toUpperCase() + value.slice(1);
    }
    function useCallbackRef(callback) {
        const callbackRef = React.useRef(callback);
        React.useEffect(() => {
            callbackRef.current = callback;
        });
        return React.useMemo(() => (...args) => callbackRef.current?.(...args), []);
    }
    function useDebouncedCallback(callback, delay) {
        const handleCallback = useCallbackRef(callback);
        const debounceTimerRef = React.useRef(0);
        React.useEffect(() => () => window.clearTimeout(debounceTimerRef.current), []);
        return React.useCallback(
            (...args) => {
                window.clearTimeout(debounceTimerRef.current);
                debounceTimerRef.current = window.setTimeout(() => handleCallback(...args), delay);
            },
            [handleCallback, delay]
        );
    }
    var DEFAULT_EVENTS = ["mousedown", "touchstart"];
    function useClickOutside(handler, events, nodes) {
        const ref = React.useRef();
        React.useEffect(() => {
            const listener = (event) => {
                const { target } = event ?? {};
                if (Array.isArray(nodes)) {
                    const shouldIgnore = target?.hasAttribute("data-ignore-outside-clicks") || !document.body.contains(target) && target.tagName !== "HTML";
                    const shouldTrigger = nodes.every((node) => !!node && !event.composedPath().includes(node));
                    shouldTrigger && !shouldIgnore && handler();
                } else if (ref.current && !ref.current.contains(target)) {
                    handler();
                }
            };
            (events || DEFAULT_EVENTS).forEach((fn) => document.addEventListener(fn, listener));
            return () => {
                (events || DEFAULT_EVENTS).forEach((fn) => document.removeEventListener(fn, listener));
            };
        }, [ref, handler, nodes]);
        return ref;
    }
    function useClipboard({ timeout = 2e3 } = {}) {
        const [error, setError] = React.useState(null);
        const [copied, setCopied] = React.useState(false);
        const [copyTimeout, setCopyTimeout] = React.useState(null);
        const handleCopyResult = (value) => {
            window.clearTimeout(copyTimeout);
            setCopyTimeout(window.setTimeout(() => setCopied(false), timeout));
            setCopied(value);
        };
        const copy = (valueToCopy) => {
            if ("clipboard" in navigator) {
                navigator.clipboard.writeText(valueToCopy).then(() => handleCopyResult(true)).catch((err) => setError(err));
            } else {
                setError(new Error("useClipboard: navigator.clipboard is not supported"));
            }
        };
        const reset = () => {
            setCopied(false);
            setError(null);
            window.clearTimeout(copyTimeout);
        };
        return { copy, reset, error, copied };
    }
    function attachMediaListener(query, callback) {
        try {
            query.addEventListener("change", callback);
            return () => query.removeEventListener("change", callback);
        } catch (e) {
            query.addListener(callback);
            return () => query.removeListener(callback);
        }
    }
    function getInitialValue(query, initialValue) {
        if (typeof initialValue === "boolean") {
            return initialValue;
        }
        if (typeof window !== "undefined" && "matchMedia" in window) {
            return window.matchMedia(query).matches;
        }
        return false;
    }
    function useMediaQuery(query, initialValue, { getInitialValueInEffect } = {
        getInitialValueInEffect: true
    }) {
        const [matches, setMatches] = React.useState(
            getInitialValueInEffect ? initialValue : getInitialValue(query)
        );
        const queryRef = React.useRef();
        React.useEffect(() => {
            if ("matchMedia" in window) {
                queryRef.current = window.matchMedia(query);
                setMatches(queryRef.current.matches);
                return attachMediaListener(queryRef.current, (event) => setMatches(event.matches));
            }
            return void 0;
        }, [query]);
        return matches;
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-color-scheme/use-color-scheme.mjs
    function useColorScheme(initialValue, options) {
        return useMediaQuery("(prefers-color-scheme: dark)", initialValue === "dark", options) ? "dark" : "light";
    }
    var DEFAULT_OPTIONS = {
        min: -Infinity,
        max: Infinity
    };
    function useCounter(initialValue = 0, options) {
        const { min, max } = { ...DEFAULT_OPTIONS, ...options };
        const [count, setCount] = React.useState(clamp(initialValue, min, max));
        const increment = () => setCount((current) => clamp(current + 1, min, max));
        const decrement = () => setCount((current) => clamp(current - 1, min, max));
        const set = (value) => setCount(clamp(value, min, max));
        const reset = () => setCount(clamp(initialValue, min, max));
        return [count, { increment, decrement, set, reset }];
    }
    function useDebouncedState(defaultValue, wait, options = { leading: false }) {
        const [value, setValue] = React.useState(defaultValue);
        const timeoutRef = React.useRef(null);
        const leadingRef = React.useRef(true);
        const clearTimeout2 = () => window.clearTimeout(timeoutRef.current);
        React.useEffect(() => clearTimeout2, []);
        const debouncedSetValue = React.useCallback(
            (newValue) => {
                clearTimeout2();
                if (leadingRef.current && options.leading) {
                    setValue(newValue);
                } else {
                    timeoutRef.current = window.setTimeout(() => {
                        leadingRef.current = true;
                        setValue(newValue);
                    }, wait);
                }
                leadingRef.current = false;
            },
            [options.leading]
        );
        return [value, debouncedSetValue];
    }
    function useDebouncedValue(value, wait, options = { leading: false }) {
        const [_value, setValue] = React.useState(value);
        const mountedRef = React.useRef(false);
        const timeoutRef = React.useRef(null);
        const cooldownRef = React.useRef(false);
        const cancel = () => window.clearTimeout(timeoutRef.current);
        React.useEffect(() => {
            if (mountedRef.current) {
                if (!cooldownRef.current && options.leading) {
                    cooldownRef.current = true;
                    setValue(value);
                } else {
                    cancel();
                    timeoutRef.current = window.setTimeout(() => {
                        cooldownRef.current = false;
                        setValue(value);
                    }, wait);
                }
            }
        }, [value, options.leading, wait]);
        React.useEffect(() => {
            mountedRef.current = true;
            return cancel;
        }, []);
        return [_value, cancel];
    }
    var useIsomorphicEffect = typeof document !== "undefined" ? React.useLayoutEffect : React.useEffect;

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-document-title/use-document-title.mjs
    function useDocumentTitle(title) {
        useIsomorphicEffect(() => {
            if (typeof title === "string" && title.trim().length > 0) {
                document.title = title.trim();
            }
        }, [title]);
    }
    function useDocumentVisibility() {
        const [documentVisibility, setDocumentVisibility] = React.useState("visible");
        React.useEffect(() => {
            const listener = () => setDocumentVisibility(document.visibilityState);
            document.addEventListener("visibilitychange", listener);
            return () => document.removeEventListener("visibilitychange", listener);
        }, []);
        return documentVisibility;
    }
    function useDidUpdate(fn, dependencies) {
        const mounted = React.useRef(false);
        React.useEffect(
            () => () => {
                mounted.current = false;
            },
            []
        );
        React.useEffect(() => {
            if (mounted.current) {
                return fn();
            }
            mounted.current = true;
            return void 0;
        }, dependencies);
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-focus-return/use-focus-return.mjs
    function useFocusReturn({ opened, shouldReturnFocus = true }) {
        const lastActiveElement = React.useRef();
        const returnFocus = () => {
            if (lastActiveElement.current && "focus" in lastActiveElement.current && typeof lastActiveElement.current.focus === "function") {
                lastActiveElement.current?.focus({ preventScroll: true });
            }
        };
        useDidUpdate(() => {
            let timeout = -1;
            const clearFocusTimeout = (event) => {
                if (event.key === "Tab") {
                    window.clearTimeout(timeout);
                }
            };
            document.addEventListener("keydown", clearFocusTimeout);
            if (opened) {
                lastActiveElement.current = document.activeElement;
            } else if (shouldReturnFocus) {
                timeout = window.setTimeout(returnFocus, 10);
            }
            return () => {
                window.clearTimeout(timeout);
                document.removeEventListener("keydown", clearFocusTimeout);
            };
        }, [opened, shouldReturnFocus]);
        return returnFocus;
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-focus-trap/create-aria-hider.mjs
    function createAriaHider(containerNode, selector = "body > :not(script)") {
        const id = randomId();
        const rootNodes = Array.from(
            document.querySelectorAll(selector)
        ).map((node) => {
            if (node?.shadowRoot?.contains(containerNode) || node.contains(containerNode)) {
                return void 0;
            }
            const ariaHidden = node.getAttribute("aria-hidden");
            const prevAriaHidden = node.getAttribute("data-hidden");
            const prevFocusId = node.getAttribute("data-focus-id");
            node.setAttribute("data-focus-id", id);
            if (ariaHidden === null || ariaHidden === "false") {
                node.setAttribute("aria-hidden", "true");
            } else if (!prevAriaHidden && !prevFocusId) {
                node.setAttribute("data-hidden", ariaHidden);
            }
            return {
                node,
                ariaHidden: prevAriaHidden || null
            };
        });
        return () => {
            rootNodes.forEach((item) => {
                if (!item || id !== item.node.getAttribute("data-focus-id")) {
                    return;
                }
                if (item.ariaHidden === null) {
                    item.node.removeAttribute("aria-hidden");
                } else {
                    item.node.setAttribute("aria-hidden", item.ariaHidden);
                }
                item.node.removeAttribute("data-focus-id");
                item.node.removeAttribute("data-hidden");
            });
        };
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-focus-trap/tabbable.mjs
    var TABBABLE_NODES = /input|select|textarea|button|object/;
    var FOCUS_SELECTOR = "a, input, select, textarea, button, object, [tabindex]";
    function hidden(element) {
        if (false) {
            return false;
        }
        return element.style.display === "none";
    }
    function visible(element) {
        const isHidden = element.getAttribute("aria-hidden") || element.getAttribute("hidden") || element.getAttribute("type") === "hidden";
        if (isHidden) {
            return false;
        }
        let parentElement = element;
        while (parentElement) {
            if (parentElement === document.body || parentElement.nodeType === 11) {
                break;
            }
            if (hidden(parentElement)) {
                return false;
            }
            parentElement = parentElement.parentNode;
        }
        return true;
    }
    function getElementTabIndex(element) {
        let tabIndex = element.getAttribute("tabindex");
        if (tabIndex === null) {
            tabIndex = void 0;
        }
        return parseInt(tabIndex, 10);
    }
    function focusable(element) {
        const nodeName = element.nodeName.toLowerCase();
        const isTabIndexNotNaN = !Number.isNaN(getElementTabIndex(element));
        const res = (
            // @ts-expect-error function accepts any html element but if it is a button, it should not be disabled to trigger the condition
            TABBABLE_NODES.test(nodeName) && !element.disabled || (element instanceof HTMLAnchorElement ? element.href || isTabIndexNotNaN : isTabIndexNotNaN)
        );
        return res && visible(element);
    }
    function tabbable(element) {
        const tabIndex = getElementTabIndex(element);
        const isTabIndexNaN = Number.isNaN(tabIndex);
        return (isTabIndexNaN || tabIndex >= 0) && focusable(element);
    }
    function findTabbableDescendants(element) {
        return Array.from(element.querySelectorAll(FOCUS_SELECTOR)).filter(tabbable);
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-focus-trap/scope-tab.mjs
    function scopeTab(node, event) {
        const tabbable2 = findTabbableDescendants(node);
        if (!tabbable2.length) {
            event.preventDefault();
            return;
        }
        const finalTabbable = tabbable2[event.shiftKey ? 0 : tabbable2.length - 1];
        const root = node.getRootNode();
        let leavingFinalTabbable = finalTabbable === root.activeElement || node === root.activeElement;
        const activeElement = root.activeElement;
        const activeElementIsRadio = activeElement.tagName === "INPUT" && activeElement.getAttribute("type") === "radio";
        if (activeElementIsRadio) {
            const activeRadioGroup = tabbable2.filter(
                (element) => element.getAttribute("type") === "radio" && element.getAttribute("name") === activeElement.getAttribute("name")
            );
            leavingFinalTabbable = activeRadioGroup.includes(finalTabbable);
        }
        if (!leavingFinalTabbable) {
            return;
        }
        event.preventDefault();
        const target = tabbable2[event.shiftKey ? tabbable2.length - 1 : 0];
        if (target) {
            target.focus();
        }
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-focus-trap/use-focus-trap.mjs
    function useFocusTrap(active = true) {
        const ref = React.useRef();
        const restoreAria = React.useRef(null);
        const focusNode = (node) => {
            let focusElement = node.querySelector("[data-autofocus]");
            if (!focusElement) {
                const children = Array.from(node.querySelectorAll(FOCUS_SELECTOR));
                focusElement = children.find(tabbable) || children.find(focusable) || null;
                if (!focusElement && focusable(node))
                    focusElement = node;
            }
            if (focusElement) {
                focusElement.focus({ preventScroll: true });
            } else if (true) {
                console.warn(
                    "[@mantine/hooks/use-focus-trap] Failed to find focusable element within provided node",
                    node
                );
            }
        };
        const setRef = React.useCallback(
            (node) => {
                if (!active) {
                    return;
                }
                if (node === null) {
                    if (restoreAria.current) {
                        restoreAria.current();
                        restoreAria.current = null;
                    }
                    return;
                }
                restoreAria.current = createAriaHider(node);
                if (ref.current === node) {
                    return;
                }
                if (node) {
                    setTimeout(() => {
                        if (node.getRootNode()) {
                            focusNode(node);
                        } else if (true) {
                            console.warn("[@mantine/hooks/use-focus-trap] Ref node is not part of the dom", node);
                        }
                    });
                    ref.current = node;
                } else {
                    ref.current = null;
                }
            },
            [active]
        );
        React.useEffect(() => {
            if (!active) {
                return void 0;
            }
            ref.current && setTimeout(() => focusNode(ref.current));
            const handleKeyDown = (event) => {
                if (event.key === "Tab" && ref.current) {
                    scopeTab(ref.current, event);
                }
            };
            document.addEventListener("keydown", handleKeyDown);
            return () => {
                document.removeEventListener("keydown", handleKeyDown);
                if (restoreAria.current) {
                    restoreAria.current();
                }
            };
        }, [active]);
        return setRef;
    }
    var reducer = (value) => (value + 1) % 1e6;
    function useForceUpdate() {
        const [, update] = React.useReducer(reducer, 0);
        return update;
    }
    var __useId = React["useId".toString()] || (() => void 0);
    function useReactId() {
        const id = __useId();
        return id ? `mantine-${id.replace(/:/g, "")}` : "";
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-id/use-id.mjs
    function useId(staticId) {
        const reactId = useReactId();
        const [uuid, setUuid] = React.useState(reactId);
        useIsomorphicEffect(() => {
            setUuid(randomId());
        }, []);
        if (typeof staticId === "string") {
            return staticId;
        }
        if (typeof window === "undefined") {
            return reactId;
        }
        return uuid;
    }
    var DEFAULT_EVENTS2 = [
        "keypress",
        "mousemove",
        "touchmove",
        "click",
        "scroll"
    ];
    var DEFAULT_OPTIONS2 = {
        events: DEFAULT_EVENTS2,
        initialState: true
    };
    function useIdle(timeout, options) {
        const { events, initialState } = { ...DEFAULT_OPTIONS2, ...options };
        const [idle, setIdle] = React.useState(initialState);
        const timer = React.useRef();
        React.useEffect(() => {
            const handleEvents = () => {
                setIdle(false);
                if (timer.current) {
                    window.clearTimeout(timer.current);
                }
                timer.current = window.setTimeout(() => {
                    setIdle(true);
                }, timeout);
            };
            events.forEach((event) => document.addEventListener(event, handleEvents));
            return () => {
                events.forEach((event) => document.removeEventListener(event, handleEvents));
            };
        }, [timeout]);
        return idle;
    }
    function useInterval(fn, interval) {
        const [active, setActive] = React.useState(false);
        const intervalRef = React.useRef();
        const fnRef = React.useRef();
        React.useEffect(() => {
            fnRef.current = fn;
        }, [fn]);
        const start = () => {
            setActive((old) => {
                if (!old && !intervalRef.current) {
                    intervalRef.current = window.setInterval(fnRef.current, interval);
                }
                return true;
            });
        };
        const stop = () => {
            setActive(false);
            window.clearInterval(intervalRef.current);
            intervalRef.current = void 0;
        };
        const toggle = () => {
            if (active) {
                stop();
            } else {
                start();
            }
        };
        return { start, stop, toggle, active };
    }
    function useListState(initialValue = []) {
        const [state, setState] = React.useState(initialValue);
        const append = (...items) => setState((current) => [...current, ...items]);
        const prepend = (...items) => setState((current) => [...items, ...current]);
        const insert = (index, ...items) => setState((current) => [...current.slice(0, index), ...items, ...current.slice(index)]);
        const apply = (fn) => setState((current) => current.map((item, index) => fn(item, index)));
        const remove = (...indices) => setState((current) => current.filter((_, index) => !indices.includes(index)));
        const pop = () => setState((current) => {
            const cloned = [...current];
            cloned.pop();
            return cloned;
        });
        const shift = () => setState((current) => {
            const cloned = [...current];
            cloned.shift();
            return cloned;
        });
        const reorder = ({ from, to }) => setState((current) => {
            const cloned = [...current];
            const item = current[from];
            cloned.splice(from, 1);
            cloned.splice(to, 0, item);
            return cloned;
        });
        const swap = ({ from, to }) => setState((current) => {
            const cloned = [...current];
            const fromItem = cloned[from];
            const toItem = cloned[to];
            cloned.splice(to, 1, fromItem);
            cloned.splice(from, 1, toItem);
            return cloned;
        });
        const setItem = (index, item) => setState((current) => {
            const cloned = [...current];
            cloned[index] = item;
            return cloned;
        });
        const setItemProp = (index, prop, value) => setState((current) => {
            const cloned = [...current];
            cloned[index] = { ...cloned[index], [prop]: value };
            return cloned;
        });
        const applyWhere = (condition, fn) => setState(
            (current) => current.map((item, index) => condition(item, index) ? fn(item, index) : item)
        );
        const filter = (fn) => {
            setState((current) => current.filter(fn));
        };
        return [
            state,
            {
                setState,
                append,
                prepend,
                insert,
                pop,
                shift,
                apply,
                applyWhere,
                remove,
                reorder,
                swap,
                setItem,
                setItemProp,
                filter
            }
        ];
    }
    function useWindowEvent(type, listener, options) {
        React.useEffect(() => {
            window.addEventListener(type, listener, options);
            return () => window.removeEventListener(type, listener, options);
        }, [type, listener]);
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-local-storage/create-storage.mjs
    function serializeJSON(value, hookName = "use-local-storage") {
        try {
            return JSON.stringify(value);
        } catch (error) {
            throw new Error(`@mantine/hooks ${hookName}: Failed to serialize the value`);
        }
    }
    function deserializeJSON(value) {
        try {
            return value && JSON.parse(value);
        } catch {
            return value;
        }
    }
    function createStorageHandler(type) {
        const getItem = (key) => {
            try {
                return window[type].getItem(key);
            } catch (error) {
                console.warn("use-local-storage: Failed to get value from storage, localStorage is blocked");
                return null;
            }
        };
        const setItem = (key, value) => {
            try {
                window[type].setItem(key, value);
            } catch (error) {
                console.warn("use-local-storage: Failed to set value to storage, localStorage is blocked");
            }
        };
        const removeItem = (key) => {
            try {
                window[type].removeItem(key);
            } catch (error) {
                console.warn(
                    "use-local-storage: Failed to remove value from storage, localStorage is blocked"
                );
            }
        };
        return { getItem, setItem, removeItem };
    }
    function createStorage(type, hookName) {
        const eventName = type === "localStorage" ? "mantine-local-storage" : "mantine-session-storage";
        const { getItem, setItem, removeItem } = createStorageHandler(type);
        return function useStorage({
            key,
            defaultValue,
            getInitialValueInEffect = true,
            deserialize = deserializeJSON,
            serialize = (value) => serializeJSON(value, hookName)
        }) {
            const readStorageValue = React.useCallback(
                (skipStorage) => {
                    let storageBlockedOrSkipped;
                    try {
                        storageBlockedOrSkipped = typeof window === "undefined" || !(type in window) || window[type] === null || !!skipStorage;
                    } catch (_e) {
                        storageBlockedOrSkipped = true;
                    }
                    if (storageBlockedOrSkipped) {
                        return defaultValue;
                    }
                    const storageValue = getItem(key);
                    return storageValue !== null ? deserialize(storageValue) : defaultValue;
                },
                [key, defaultValue]
            );
            const [value, setValue] = React.useState(readStorageValue(getInitialValueInEffect));
            const setStorageValue = React.useCallback(
                (val) => {
                    if (val instanceof Function) {
                        setValue((current) => {
                            const result = val(current);
                            setItem(key, serialize(result));
                            window.dispatchEvent(
                                new CustomEvent(eventName, { detail: { key, value: val(current) } })
                            );
                            return result;
                        });
                    } else {
                        setItem(key, serialize(val));
                        window.dispatchEvent(new CustomEvent(eventName, { detail: { key, value: val } }));
                        setValue(val);
                    }
                },
                [key]
            );
            const removeStorageValue = React.useCallback(() => {
                removeItem(key);
                window.dispatchEvent(new CustomEvent(eventName, { detail: { key, value: defaultValue } }));
            }, []);
            useWindowEvent("storage", (event) => {
                if (event.storageArea === window[type] && event.key === key) {
                    setValue(deserialize(event.newValue ?? void 0));
                }
            });
            useWindowEvent(eventName, (event) => {
                if (event.detail.key === key) {
                    setValue(event.detail.value);
                }
            });
            React.useEffect(() => {
                if (defaultValue !== void 0 && value === void 0) {
                    setStorageValue(defaultValue);
                }
            }, [defaultValue, value, setStorageValue]);
            React.useEffect(() => {
                const val = readStorageValue();
                val !== void 0 && setStorageValue(val);
            }, []);
            return [value === void 0 ? defaultValue : value, setStorageValue, removeStorageValue];
        };
    }
    function readValue(type) {
        const { getItem } = createStorageHandler(type);
        return function read({
            key,
            defaultValue,
            deserialize = deserializeJSON
        }) {
            let storageBlockedOrSkipped;
            try {
                storageBlockedOrSkipped = typeof window === "undefined" || !(type in window) || window[type] === null;
            } catch (_e) {
                storageBlockedOrSkipped = true;
            }
            if (storageBlockedOrSkipped) {
                return defaultValue;
            }
            const storageValue = getItem(key);
            return storageValue !== null ? deserialize(storageValue) : defaultValue;
        };
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-local-storage/use-local-storage.mjs
    function useLocalStorage(props) {
        return createStorage("localStorage", "use-local-storage")(props);
    }
    var readLocalStorageValue = readValue("localStorage");

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-session-storage/use-session-storage.mjs
    function useSessionStorage(props) {
        return createStorage("sessionStorage", "use-session-storage")(props);
    }
    var readSessionStorageValue = readValue("sessionStorage");
    function assignRef(ref, value) {
        if (typeof ref === "function") {
            ref(value);
        } else if (typeof ref === "object" && ref !== null && "current" in ref) {
            ref.current = value;
        }
    }
    function mergeRefs(...refs) {
        return (node) => {
            refs.forEach((ref) => assignRef(ref, node));
        };
    }
    function useMergedRef(...refs) {
        return React.useCallback(mergeRefs(...refs), refs);
    }
    function useMouse(options = { resetOnExit: false }) {
        const [position, setPosition] = React.useState({ x: 0, y: 0 });
        const ref = React.useRef();
        const setMousePosition = (event) => {
            if (ref.current) {
                const rect = event.currentTarget.getBoundingClientRect();
                const x = Math.max(
                    0,
                    Math.round(event.pageX - rect.left - (window.pageXOffset || window.scrollX))
                );
                const y = Math.max(
                    0,
                    Math.round(event.pageY - rect.top - (window.pageYOffset || window.scrollY))
                );
                setPosition({ x, y });
            } else {
                setPosition({ x: event.clientX, y: event.clientY });
            }
        };
        const resetMousePosition = () => setPosition({ x: 0, y: 0 });
        React.useEffect(() => {
            const element = ref?.current ? ref.current : document;
            element.addEventListener("mousemove", setMousePosition);
            if (options.resetOnExit)
                element.addEventListener("mouseleave", resetMousePosition);
            return () => {
                element.removeEventListener("mousemove", setMousePosition);
                if (options.resetOnExit)
                    element.removeEventListener("mouseleave", resetMousePosition);
            };
        }, [ref.current]);
        return { ref, ...position };
    }
    function clampUseMovePosition(position) {
        return {
            x: clamp(position.x, 0, 1),
            y: clamp(position.y, 0, 1)
        };
    }
    function useMove(onChange, handlers, dir = "ltr") {
        const ref = React.useRef(null);
        const mounted = React.useRef(false);
        const isSliding = React.useRef(false);
        const frame = React.useRef(0);
        const [active, setActive] = React.useState(false);
        React.useEffect(() => {
            mounted.current = true;
        }, []);
        React.useEffect(() => {
            const onScrub = ({ x, y }) => {
                cancelAnimationFrame(frame.current);
                frame.current = requestAnimationFrame(() => {
                    if (mounted.current && ref.current) {
                        ref.current.style.userSelect = "none";
                        const rect = ref.current.getBoundingClientRect();
                        if (rect.width && rect.height) {
                            const _x = clamp((x - rect.left) / rect.width, 0, 1);
                            onChange({
                                x: dir === "ltr" ? _x : 1 - _x,
                                y: clamp((y - rect.top) / rect.height, 0, 1)
                            });
                        }
                    }
                });
            };
            const bindEvents = () => {
                document.addEventListener("mousemove", onMouseMove);
                document.addEventListener("mouseup", stopScrubbing);
                document.addEventListener("touchmove", onTouchMove);
                document.addEventListener("touchend", stopScrubbing);
            };
            const unbindEvents = () => {
                document.removeEventListener("mousemove", onMouseMove);
                document.removeEventListener("mouseup", stopScrubbing);
                document.removeEventListener("touchmove", onTouchMove);
                document.removeEventListener("touchend", stopScrubbing);
            };
            const startScrubbing = () => {
                if (!isSliding.current && mounted.current) {
                    isSliding.current = true;
                    typeof handlers?.onScrubStart === "function" && handlers.onScrubStart();
                    setActive(true);
                    bindEvents();
                }
            };
            const stopScrubbing = () => {
                if (isSliding.current && mounted.current) {
                    isSliding.current = false;
                    setActive(false);
                    unbindEvents();
                    setTimeout(() => {
                        typeof handlers?.onScrubEnd === "function" && handlers.onScrubEnd();
                    }, 0);
                }
            };
            const onMouseDown = (event) => {
                startScrubbing();
                event.preventDefault();
                onMouseMove(event);
            };
            const onMouseMove = (event) => onScrub({ x: event.clientX, y: event.clientY });
            const onTouchStart = (event) => {
                if (event.cancelable) {
                    event.preventDefault();
                }
                startScrubbing();
                onTouchMove(event);
            };
            const onTouchMove = (event) => {
                if (event.cancelable) {
                    event.preventDefault();
                }
                onScrub({ x: event.changedTouches[0].clientX, y: event.changedTouches[0].clientY });
            };
            ref.current?.addEventListener("mousedown", onMouseDown);
            ref.current?.addEventListener("touchstart", onTouchStart, { passive: false });
            return () => {
                if (ref.current) {
                    ref.current.removeEventListener("mousedown", onMouseDown);
                    ref.current.removeEventListener("touchstart", onTouchStart);
                }
            };
        }, [dir, onChange]);
        return { ref, active };
    }
    function useUncontrolled({
        value,
        defaultValue,
        finalValue,
        onChange = () => {
        }
    }) {
        const [uncontrolledValue, setUncontrolledValue] = React.useState(
            defaultValue !== void 0 ? defaultValue : finalValue
        );
        const handleUncontrolledChange = (val, ...payload) => {
            setUncontrolledValue(val);
            onChange?.(val, ...payload);
        };
        if (value !== void 0) {
            return [value, onChange, true];
        }
        return [uncontrolledValue, handleUncontrolledChange, false];
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-pagination/use-pagination.mjs
    function range2(start, end) {
        const length = end - start + 1;
        return Array.from({ length }, (_, index) => index + start);
    }
    var DOTS = "dots";
    function usePagination({
        total,
        siblings = 1,
        boundaries = 1,
        page,
        initialPage = 1,
        onChange
    }) {
        const _total = Math.max(Math.trunc(total), 0);
        const [activePage, setActivePage] = useUncontrolled({
            value: page,
            onChange,
            defaultValue: initialPage,
            finalValue: initialPage
        });
        const setPage = (pageNumber) => {
            if (pageNumber <= 0) {
                setActivePage(1);
            } else if (pageNumber > _total) {
                setActivePage(_total);
            } else {
                setActivePage(pageNumber);
            }
        };
        const next = () => setPage(activePage + 1);
        const previous = () => setPage(activePage - 1);
        const first = () => setPage(1);
        const last = () => setPage(_total);
        const paginationRange = React.useMemo(() => {
            const totalPageNumbers = siblings * 2 + 3 + boundaries * 2;
            if (totalPageNumbers >= _total) {
                return range2(1, _total);
            }
            const leftSiblingIndex = Math.max(activePage - siblings, boundaries);
            const rightSiblingIndex = Math.min(activePage + siblings, _total - boundaries);
            const shouldShowLeftDots = leftSiblingIndex > boundaries + 2;
            const shouldShowRightDots = rightSiblingIndex < _total - (boundaries + 1);
            if (!shouldShowLeftDots && shouldShowRightDots) {
                const leftItemCount = siblings * 2 + boundaries + 2;
                return [...range2(1, leftItemCount), DOTS, ...range2(_total - (boundaries - 1), _total)];
            }
            if (shouldShowLeftDots && !shouldShowRightDots) {
                const rightItemCount = boundaries + 1 + 2 * siblings;
                return [...range2(1, boundaries), DOTS, ...range2(_total - rightItemCount, _total)];
            }
            return [
                ...range2(1, boundaries),
                DOTS,
                ...range2(leftSiblingIndex, rightSiblingIndex),
                DOTS,
                ...range2(_total - boundaries + 1, _total)
            ];
        }, [_total, siblings, activePage]);
        return {
            range: paginationRange,
            active: activePage,
            setPage,
            next,
            previous,
            first,
            last
        };
    }
    function useQueue({ initialValues = [], limit }) {
        const [{ state, queue }, setState] = React.useState({
            state: initialValues.slice(0, limit),
            queue: initialValues.slice(limit)
        });
        const add = (...items) => setState((current) => {
            const results = [...current.state, ...current.queue, ...items];
            return {
                state: results.slice(0, limit),
                queue: results.slice(limit)
            };
        });
        const update = (fn) => setState((current) => {
            const results = fn([...current.state, ...current.queue]);
            return {
                state: results.slice(0, limit),
                queue: results.slice(limit)
            };
        });
        const cleanQueue = () => setState((current) => ({ state: current.state, queue: [] }));
        return {
            state,
            queue,
            add,
            update,
            cleanQueue
        };
    }
    function usePageLeave(onPageLeave) {
        React.useEffect(() => {
            document.documentElement.addEventListener("mouseleave", onPageLeave);
            return () => document.documentElement.removeEventListener("mouseleave", onPageLeave);
        }, []);
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-reduced-motion/use-reduced-motion.mjs
    function useReducedMotion(initialValue, options) {
        return useMediaQuery("(prefers-reduced-motion: reduce)", initialValue, options);
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-scroll-into-view/utils/ease-in-out-quad.mjs
    var easeInOutQuad = (t) => t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-scroll-into-view/utils/get-relative-position.mjs
    var getRelativePosition = ({
        axis,
        target,
        parent,
        alignment,
        offset,
        isList
    }) => {
        if (!target || !parent && typeof document === "undefined") {
            return 0;
        }
        const isCustomParent = !!parent;
        const parentElement = parent || document.body;
        const parentPosition = parentElement.getBoundingClientRect();
        const targetPosition = target.getBoundingClientRect();
        const getDiff = (property) => targetPosition[property] - parentPosition[property];
        if (axis === "y") {
            const diff = getDiff("top");
            if (diff === 0)
                return 0;
            if (alignment === "start") {
                const distance = diff - offset;
                const shouldScroll = distance <= targetPosition.height * (isList ? 0 : 1) || !isList;
                return shouldScroll ? distance : 0;
            }
            const parentHeight = isCustomParent ? parentPosition.height : window.innerHeight;
            if (alignment === "end") {
                const distance = diff + offset - parentHeight + targetPosition.height;
                const shouldScroll = distance >= -targetPosition.height * (isList ? 0 : 1) || !isList;
                return shouldScroll ? distance : 0;
            }
            if (alignment === "center") {
                return diff - parentHeight / 2 + targetPosition.height / 2;
            }
            return 0;
        }
        if (axis === "x") {
            const diff = getDiff("left");
            if (diff === 0)
                return 0;
            if (alignment === "start") {
                const distance = diff - offset;
                const shouldScroll = distance <= targetPosition.width || !isList;
                return shouldScroll ? distance : 0;
            }
            const parentWidth = isCustomParent ? parentPosition.width : window.innerWidth;
            if (alignment === "end") {
                const distance = diff + offset - parentWidth + targetPosition.width;
                const shouldScroll = distance >= -targetPosition.width || !isList;
                return shouldScroll ? distance : 0;
            }
            if (alignment === "center") {
                return diff - parentWidth / 2 + targetPosition.width / 2;
            }
            return 0;
        }
        return 0;
    };

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-scroll-into-view/utils/get-scroll-start.mjs
    var getScrollStart = ({ axis, parent }) => {
        if (!parent && typeof document === "undefined") {
            return 0;
        }
        const method = axis === "y" ? "scrollTop" : "scrollLeft";
        if (parent) {
            return parent[method];
        }
        const { body, documentElement } = document;
        return body[method] + documentElement[method];
    };

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-scroll-into-view/utils/set-scroll-param.mjs
    var setScrollParam = ({ axis, parent, distance }) => {
        if (!parent && typeof document === "undefined") {
            return;
        }
        const method = axis === "y" ? "scrollTop" : "scrollLeft";
        if (parent) {
            parent[method] = distance;
        } else {
            const { body, documentElement } = document;
            body[method] = distance;
            documentElement[method] = distance;
        }
    };

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-scroll-into-view/use-scroll-into-view.mjs
    function useScrollIntoView({
        duration = 1250,
        axis = "y",
        onScrollFinish,
        easing = easeInOutQuad,
        offset = 0,
        cancelable = true,
        isList = false
    } = {}) {
        const frameID = React.useRef(0);
        const startTime = React.useRef(0);
        const shouldStop = React.useRef(false);
        const scrollableRef = React.useRef(null);
        const targetRef = React.useRef(null);
        const reducedMotion = useReducedMotion();
        const cancel = () => {
            if (frameID.current) {
                cancelAnimationFrame(frameID.current);
            }
        };
        const scrollIntoView = React.useCallback(
            ({ alignment = "start" } = {}) => {
                shouldStop.current = false;
                if (frameID.current) {
                    cancel();
                }
                const start = getScrollStart({ parent: scrollableRef.current, axis }) ?? 0;
                const change = getRelativePosition({
                    parent: scrollableRef.current,
                    target: targetRef.current,
                    axis,
                    alignment,
                    offset,
                    isList
                }) - (scrollableRef.current ? 0 : start);
                function animateScroll() {
                    if (startTime.current === 0) {
                        startTime.current = performance.now();
                    }
                    const now = performance.now();
                    const elapsed = now - startTime.current;
                    const t = reducedMotion || duration === 0 ? 1 : elapsed / duration;
                    const distance = start + change * easing(t);
                    setScrollParam({
                        parent: scrollableRef.current,
                        axis,
                        distance
                    });
                    if (!shouldStop.current && t < 1) {
                        frameID.current = requestAnimationFrame(animateScroll);
                    } else {
                        typeof onScrollFinish === "function" && onScrollFinish();
                        startTime.current = 0;
                        frameID.current = 0;
                        cancel();
                    }
                }
                animateScroll();
            },
            [axis, duration, easing, isList, offset, onScrollFinish, reducedMotion]
        );
        const handleStop = () => {
            if (cancelable) {
                shouldStop.current = true;
            }
        };
        useWindowEvent("wheel", handleStop, {
            passive: true
        });
        useWindowEvent("touchmove", handleStop, {
            passive: true
        });
        React.useEffect(() => cancel, []);
        return {
            scrollableRef,
            targetRef,
            scrollIntoView,
            cancel
        };
    }
    var defaultState = {
        x: 0,
        y: 0,
        width: 0,
        height: 0,
        top: 0,
        left: 0,
        bottom: 0,
        right: 0
    };
    function useResizeObserver(options) {
        const frameID = React.useRef(0);
        const ref = React.useRef(null);
        const [rect, setRect] = React.useState(defaultState);
        const observer = React.useMemo(
            () => typeof window !== "undefined" ? new ResizeObserver((entries) => {
                const entry = entries[0];
                if (entry) {
                    cancelAnimationFrame(frameID.current);
                    frameID.current = requestAnimationFrame(() => {
                        if (ref.current) {
                            setRect(entry.contentRect);
                        }
                    });
                }
            }) : null,
            []
        );
        React.useEffect(() => {
            if (ref.current) {
                observer?.observe(ref.current, options);
            }
            return () => {
                observer?.disconnect();
                if (frameID.current) {
                    cancelAnimationFrame(frameID.current);
                }
            };
        }, [ref.current]);
        return [ref, rect];
    }
    function useElementSize(options) {
        const [ref, { width, height }] = useResizeObserver(options);
        return { ref, width, height };
    }
    function shallowCompare(prevValue, currValue) {
        if (!prevValue || !currValue) {
            return false;
        }
        if (prevValue === currValue) {
            return true;
        }
        if (prevValue.length !== currValue.length) {
            return false;
        }
        for (let i = 0; i < prevValue.length; i += 1) {
            if (!shallowEqual(prevValue[i], currValue[i])) {
                return false;
            }
        }
        return true;
    }
    function useShallowCompare(dependencies) {
        const ref = React.useRef([]);
        const updateRef = React.useRef(0);
        if (!shallowCompare(ref.current, dependencies)) {
            ref.current = dependencies;
            updateRef.current += 1;
        }
        return [updateRef.current];
    }
    function useShallowEffect(cb, dependencies) {
        React.useEffect(cb, useShallowCompare(dependencies));
    }
    function useToggle(options = [false, true]) {
        const [[option], toggle] = React.useReducer((state, action) => {
            const value = action instanceof Function ? action(state[0]) : action;
            const index = Math.abs(state.indexOf(value));
            return state.slice(index).concat(state.slice(0, index));
        }, options);
        return [option, toggle];
    }
    var eventListerOptions = {
        passive: true
    };
    function useViewportSize() {
        const [windowSize, setWindowSize] = React.useState({
            width: 0,
            height: 0
        });
        const setSize = React.useCallback(() => {
            setWindowSize({ width: window.innerWidth || 0, height: window.innerHeight || 0 });
        }, []);
        useWindowEvent("resize", setSize, eventListerOptions);
        useWindowEvent("orientationchange", setSize, eventListerOptions);
        React.useEffect(setSize, []);
        return windowSize;
    }
    function getScrollPosition() {
        return typeof window !== "undefined" ? { x: window.pageXOffset, y: window.pageYOffset } : { x: 0, y: 0 };
    }
    function scrollTo({ x, y }) {
        if (typeof window !== "undefined") {
            const scrollOptions = { behavior: "smooth" };
            if (typeof x === "number") {
                scrollOptions.left = x;
            }
            if (typeof y === "number") {
                scrollOptions.top = y;
            }
            window.scrollTo(scrollOptions);
        }
    }
    function useWindowScroll() {
        const [position, setPosition] = React.useState({ x: 0, y: 0 });
        useWindowEvent("scroll", () => setPosition(getScrollPosition()));
        useWindowEvent("resize", () => setPosition(getScrollPosition()));
        React.useEffect(() => {
            setPosition(getScrollPosition());
        }, []);
        return [position, scrollTo];
    }
    function useIntersection(options) {
        const [entry, setEntry] = React.useState(null);
        const observer = React.useRef(null);
        const ref = React.useCallback(
            (element) => {
                if (observer.current) {
                    observer.current.disconnect();
                    observer.current = null;
                }
                if (element === null) {
                    setEntry(null);
                    return;
                }
                observer.current = new IntersectionObserver(([_entry]) => {
                    setEntry(_entry);
                }, options);
                observer.current.observe(element);
            },
            [options?.rootMargin, options?.root, options?.threshold]
        );
        return { ref, entry };
    }
    function useHash({ getInitialValueInEffect = true } = {}) {
        const [hash, setHashValue] = React.useState(
            getInitialValueInEffect ? "" : window.location.hash || ""
        );
        const setHash = (value) => {
            const valueWithHash = value.startsWith("#") ? value : `#${value}`;
            window.location.hash = valueWithHash;
            setHashValue(valueWithHash);
        };
        useWindowEvent("hashchange", () => {
            const newHash = window.location.hash;
            if (hash !== newHash) {
                setHashValue(newHash);
            }
        });
        React.useEffect(() => {
            if (getInitialValueInEffect) {
                setHashValue(window.location.hash);
            }
        }, []);
        return [hash, setHash];
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-hotkeys/parse-hotkey.mjs
    function parseHotkey(hotkey) {
        const keys = hotkey.toLowerCase().split("+").map((part) => part.trim());
        const modifiers = {
            alt: keys.includes("alt"),
            ctrl: keys.includes("ctrl"),
            meta: keys.includes("meta"),
            mod: keys.includes("mod"),
            shift: keys.includes("shift")
        };
        const reservedKeys = ["alt", "ctrl", "meta", "shift", "mod"];
        const freeKey = keys.find((key) => !reservedKeys.includes(key));
        return {
            ...modifiers,
            key: freeKey
        };
    }
    function isExactHotkey(hotkey, event) {
        const { alt, ctrl, meta, mod, shift, key } = hotkey;
        const { altKey, ctrlKey, metaKey, shiftKey, key: pressedKey } = event;
        if (alt !== altKey) {
            return false;
        }
        if (mod) {
            if (!ctrlKey && !metaKey) {
                return false;
            }
        } else {
            if (ctrl !== ctrlKey) {
                return false;
            }
            if (meta !== metaKey) {
                return false;
            }
        }
        if (shift !== shiftKey) {
            return false;
        }
        if (key && (pressedKey.toLowerCase() === key.toLowerCase() || event.code.replace("Key", "").toLowerCase() === key.toLowerCase())) {
            return true;
        }
        return false;
    }
    function getHotkeyMatcher(hotkey) {
        return (event) => isExactHotkey(parseHotkey(hotkey), event);
    }
    function getHotkeyHandler(hotkeys) {
        return (event) => {
            const _event = "nativeEvent" in event ? event.nativeEvent : event;
            hotkeys.forEach(([hotkey, handler, options = { preventDefault: true }]) => {
                if (getHotkeyMatcher(hotkey)(_event)) {
                    if (options.preventDefault) {
                        event.preventDefault();
                    }
                    handler(_event);
                }
            });
        };
    }

    // ../esmd/npm/@mantine/hooks@7.11.0/node_modules/.pnpm/@mantine+hooks@7.11.0_react@18.3.1/node_modules/@mantine/hooks/esm/use-hotkeys/use-hotkeys.mjs
    function shouldFireEvent(event, tagsToIgnore, triggerOnContentEditable = false) {
        if (event.target instanceof HTMLElement) {
            if (triggerOnContentEditable) {
                return !tagsToIgnore.includes(event.target.tagName);
            }
            return !event.target.isContentEditable && !tagsToIgnore.includes(event.target.tagName);
        }
        return true;
    }
    function useHotkeys(hotkeys, tagsToIgnore = ["INPUT", "TEXTAREA", "SELECT"], triggerOnContentEditable = false) {
        React.useEffect(() => {
            const keydownListener = (event) => {
                hotkeys.forEach(([hotkey, handler, options = { preventDefault: true }]) => {
                    if (getHotkeyMatcher(hotkey)(event) && shouldFireEvent(event, tagsToIgnore, triggerOnContentEditable)) {
                        if (options.preventDefault) {
                            event.preventDefault();
                        }
                        handler(event);
                    }
                });
            };
            document.documentElement.addEventListener("keydown", keydownListener);
            return () => document.documentElement.removeEventListener("keydown", keydownListener);
        }, [hotkeys]);
    }
    function getFullscreenElement() {
        const _document = window.document;
        const fullscreenElement = _document.fullscreenElement || _document.webkitFullscreenElement || _document.mozFullScreenElement || _document.msFullscreenElement;
        return fullscreenElement;
    }
    async function exitFullscreen() {
        const _document = window.document;
        if (typeof _document.exitFullscreen === "function")
            return _document.exitFullscreen();
        if (typeof _document.msExitFullscreen === "function")
            return _document.msExitFullscreen();
        if (typeof _document.webkitExitFullscreen === "function")
            return _document.webkitExitFullscreen();
        if (typeof _document.mozCancelFullScreen === "function")
            return _document.mozCancelFullScreen();
        return null;
    }
    async function enterFullScreen(element) {
        const _element = element;
        return _element.requestFullscreen?.() || _element.msRequestFullscreen?.() || _element.webkitEnterFullscreen?.() || _element.webkitRequestFullscreen?.() || _element.mozRequestFullscreen?.();
    }
    var prefixes = ["", "webkit", "moz", "ms"];
    function addEvents(element, {
        onFullScreen,
        onError
    }) {
        prefixes.forEach((prefix) => {
            element.addEventListener(`${prefix}fullscreenchange`, onFullScreen);
            element.addEventListener(`${prefix}fullscreenerror`, onError);
        });
        return () => {
            prefixes.forEach((prefix) => {
                element.removeEventListener(`${prefix}fullscreenchange`, onFullScreen);
                element.removeEventListener(`${prefix}fullscreenerror`, onError);
            });
        };
    }
    function useFullscreen() {
        const [fullscreen, setFullscreen] = React.useState(false);
        const _ref = React.useRef();
        const handleFullscreenChange = React.useCallback(
            (event) => {
                setFullscreen(event.target === getFullscreenElement());
            },
            [setFullscreen]
        );
        const handleFullscreenError = React.useCallback(
            (event) => {
                setFullscreen(false);
                console.error(
                    `[@mantine/hooks] use-fullscreen: Error attempting full-screen mode method: ${event} (${event.target})`
                );
            },
            [setFullscreen]
        );
        const toggle = React.useCallback(async () => {
            if (!getFullscreenElement()) {
                await enterFullScreen(_ref.current);
            } else {
                await exitFullscreen();
            }
        }, []);
        const ref = React.useCallback((element) => {
            if (element === null) {
                _ref.current = window.document.documentElement;
            } else {
                _ref.current = element;
            }
        }, []);
        React.useEffect(() => {
            if (!_ref.current && window.document) {
                _ref.current = window.document.documentElement;
                return addEvents(_ref.current, {
                    onFullScreen: handleFullscreenChange,
                    onError: handleFullscreenError
                });
            }
            if (_ref.current) {
                return addEvents(_ref.current, {
                    onFullScreen: handleFullscreenChange,
                    onError: handleFullscreenError
                });
            }
            return void 0;
        }, []);
        return { ref, toggle, fullscreen };
    }
    function useLogger(componentName, props) {
        React.useEffect(() => {
            console.log(`${componentName} mounted`, ...props);
            return () => console.log(`${componentName} unmounted`);
        }, []);
        useDidUpdate(() => {
            console.log(`${componentName} updated`, ...props);
        }, props);
        return null;
    }
    function useHover() {
        const [hovered, setHovered] = React.useState(false);
        const ref = React.useRef(null);
        const onMouseEnter = React.useCallback(() => setHovered(true), []);
        const onMouseLeave = React.useCallback(() => setHovered(false), []);
        React.useEffect(() => {
            if (ref.current) {
                ref.current.addEventListener("mouseenter", onMouseEnter);
                ref.current.addEventListener("mouseleave", onMouseLeave);
                return () => {
                    ref.current?.removeEventListener("mouseenter", onMouseEnter);
                    ref.current?.removeEventListener("mouseleave", onMouseLeave);
                };
            }
            return void 0;
        }, []);
        return { ref, hovered };
    }
    function useValidatedState(initialValue, validation, initialValidationState) {
        const [value, setValue] = React.useState(initialValue);
        const [lastValidValue, setLastValidValue] = React.useState(
            validation(initialValue) ? initialValue : void 0
        );
        const [valid, setValid] = React.useState(
            typeof initialValidationState === "boolean" ? initialValidationState : validation(initialValue)
        );
        const onChange = (val) => {
            if (validation(val)) {
                setLastValidValue(val);
                setValid(true);
            } else {
                setValid(false);
            }
            setValue(val);
        };
        return [{ value, lastValidValue, valid }, onChange];
    }
    function getOS() {
        if (typeof window === "undefined") {
            return "undetermined";
        }
        const { userAgent } = window.navigator;
        const macosPlatforms = /(Macintosh)|(MacIntel)|(MacPPC)|(Mac68K)/i;
        const windowsPlatforms = /(Win32)|(Win64)|(Windows)|(WinCE)/i;
        const iosPlatforms = /(iPhone)|(iPad)|(iPod)/i;
        if (macosPlatforms.test(userAgent)) {
            return "macos";
        }
        if (iosPlatforms.test(userAgent)) {
            return "ios";
        }
        if (windowsPlatforms.test(userAgent)) {
            return "windows";
        }
        if (/Android/i.test(userAgent)) {
            return "android";
        }
        if (/Linux/i.test(userAgent)) {
            return "linux";
        }
        return "undetermined";
    }
    function useOs(options = { getValueInEffect: true }) {
        const [value, setValue] = React.useState(options.getValueInEffect ? "undetermined" : getOS());
        useIsomorphicEffect(() => {
            if (options.getValueInEffect) {
                setValue(getOS);
            }
        }, []);
        return value;
    }
    function useSetState(initialState) {
        const [state, _setState] = React.useState(initialState);
        const setState = React.useCallback(
            (statePartial) => _setState((current) => ({
                ...current,
                ...typeof statePartial === "function" ? statePartial(current) : statePartial
            })),
            []
        );
        return [state, setState];
    }
    function getInputOnChange(setValue) {
        return (val) => {
            if (!val) {
                setValue(val);
            } else if (typeof val === "function") {
                setValue(val);
            } else if (typeof val === "object" && "nativeEvent" in val) {
                const { currentTarget } = val;
                if (currentTarget.type === "checkbox") {
                    setValue(currentTarget.checked);
                } else {
                    setValue(currentTarget.value);
                }
            } else {
                setValue(val);
            }
        };
    }
    function useInputState(initialState) {
        const [value, setValue] = React.useState(initialState);
        return [value, getInputOnChange(setValue)];
    }
    function useEventListener(type, listener, options) {
        const ref = React.useRef();
        React.useEffect(() => {
            if (ref.current) {
                ref.current.addEventListener(type, listener, options);
                return () => ref.current?.removeEventListener(type, listener, options);
            }
            return void 0;
        }, [listener, options]);
        return ref;
    }
    function useDisclosure(initialState = false, callbacks) {
        const { onOpen, onClose } = callbacks || {};
        const [opened, setOpened] = React.useState(initialState);
        const open = React.useCallback(() => {
            setOpened((isOpened) => {
                if (!isOpened) {
                    onOpen?.();
                    return true;
                }
                return isOpened;
            });
        }, [onOpen]);
        const close = React.useCallback(() => {
            setOpened((isOpened) => {
                if (isOpened) {
                    onClose?.();
                    return false;
                }
                return isOpened;
            });
        }, [onClose]);
        const toggle = React.useCallback(() => {
            opened ? close() : open();
        }, [close, open, opened]);
        return [opened, { open, close, toggle }];
    }
    function containsRelatedTarget(event) {
        if (event.currentTarget instanceof HTMLElement && event.relatedTarget instanceof HTMLElement) {
            return event.currentTarget.contains(event.relatedTarget);
        }
        return false;
    }
    function useFocusWithin({
        onBlur,
        onFocus
    } = {}) {
        const ref = React.useRef();
        const [focused, _setFocused] = React.useState(false);
        const focusedRef = React.useRef(false);
        const setFocused = (value) => {
            _setFocused(value);
            focusedRef.current = value;
        };
        const handleFocusIn = (event) => {
            if (!focusedRef.current) {
                setFocused(true);
                onFocus?.(event);
            }
        };
        const handleFocusOut = (event) => {
            if (focusedRef.current && !containsRelatedTarget(event)) {
                setFocused(false);
                onBlur?.(event);
            }
        };
        React.useEffect(() => {
            if (ref.current) {
                ref.current.addEventListener("focusin", handleFocusIn);
                ref.current.addEventListener("focusout", handleFocusOut);
                return () => {
                    ref.current?.removeEventListener("focusin", handleFocusIn);
                    ref.current?.removeEventListener("focusout", handleFocusOut);
                };
            }
            return void 0;
        }, [handleFocusIn, handleFocusOut]);
        return { ref, focused };
    }
    function getConnection() {
        if (typeof navigator === "undefined") {
            return {};
        }
        const _navigator = navigator;
        const connection = _navigator.connection || _navigator.mozConnection || _navigator.webkitConnection;
        if (!connection) {
            return {};
        }
        return {
            downlink: connection?.downlink,
            downlinkMax: connection?.downlinkMax,
            effectiveType: connection?.effectiveType,
            rtt: connection?.rtt,
            saveData: connection?.saveData,
            type: connection?.type
        };
    }
    function useNetwork() {
        const [status, setStatus] = React.useState({
            online: true
        });
        const handleConnectionChange = React.useCallback(
            () => setStatus((current) => ({ ...current, ...getConnection() })),
            []
        );
        useWindowEvent("online", () => setStatus({ online: true, ...getConnection() }));
        useWindowEvent("offline", () => setStatus({ online: false, ...getConnection() }));
        React.useEffect(() => {
            const _navigator = navigator;
            if (_navigator.connection) {
                setStatus({ online: _navigator.onLine, ...getConnection() });
                _navigator.connection.addEventListener("change", handleConnectionChange);
                return () => _navigator.connection.removeEventListener("change", handleConnectionChange);
            }
            if (typeof _navigator.onLine === "boolean") {
                setStatus((current) => ({ ...current, online: _navigator.onLine }));
            }
            return void 0;
        }, []);
        return status;
    }
    function useTimeout(callback, delay, options = { autoInvoke: false }) {
        const timeoutRef = React.useRef(null);
        const start = React.useCallback(
            (...callbackParams) => {
                if (!timeoutRef.current) {
                    timeoutRef.current = window.setTimeout(() => {
                        callback(callbackParams);
                        timeoutRef.current = null;
                    }, delay);
                }
            },
            [delay]
        );
        const clear = React.useCallback(() => {
            if (timeoutRef.current) {
                window.clearTimeout(timeoutRef.current);
                timeoutRef.current = null;
            }
        }, []);
        React.useEffect(() => {
            if (options.autoInvoke) {
                start();
            }
            return clear;
        }, [clear, start]);
        return { start, clear };
    }
    function useTextSelection() {
        const forceUpdate = useForceUpdate();
        const [selection, setSelection] = React.useState(null);
        const handleSelectionChange = () => {
            setSelection(document.getSelection());
            forceUpdate();
        };
        React.useEffect(() => {
            setSelection(document.getSelection());
            document.addEventListener("selectionchange", handleSelectionChange);
            return () => document.removeEventListener("selectionchange", handleSelectionChange);
        }, []);
        return selection;
    }
    function usePrevious(value) {
        const ref = React.useRef();
        React.useEffect(() => {
            ref.current = value;
        }, [value]);
        return ref.current;
    }
    var MIME_TYPES = {
        ico: "image/x-icon",
        png: "image/png",
        svg: "image/svg+xml",
        gif: "image/gif"
    };
    function useFavicon(url) {
        const link = React.useRef();
        useIsomorphicEffect(() => {
            if (!url) {
                return;
            }
            if (!link.current) {
                const existingElements = document.querySelectorAll('link[rel*="icon"]');
                existingElements.forEach((element2) => document.head.removeChild(element2));
                const element = document.createElement("link");
                element.rel = "shortcut icon";
                link.current = element;
                document.querySelector("head").appendChild(element);
            }
            const splittedUrl = url.split(".");
            link.current.setAttribute(
                "type",
                MIME_TYPES[splittedUrl[splittedUrl.length - 1].toLowerCase()]
            );
            link.current.setAttribute("href", url);
        }, [url]);
    }
    var isFixed = (current, fixedAt) => current <= fixedAt;
    var isPinnedOrReleased = (current, fixedAt, isCurrentlyPinnedRef, isScrollingUp, onPin, onRelease) => {
        const isInFixedPosition = isFixed(current, fixedAt);
        if (isInFixedPosition && !isCurrentlyPinnedRef.current) {
            isCurrentlyPinnedRef.current = true;
            onPin?.();
        } else if (!isInFixedPosition && isScrollingUp && !isCurrentlyPinnedRef.current) {
            isCurrentlyPinnedRef.current = true;
            onPin?.();
        } else if (!isInFixedPosition && isCurrentlyPinnedRef.current) {
            isCurrentlyPinnedRef.current = false;
            onRelease?.();
        }
    };
    var useScrollDirection = () => {
        const [lastScrollTop, setLastScrollTop] = React.useState(0);
        const [isScrollingUp, setIsScrollingUp] = React.useState(false);
        const [isResizing, setIsResizing] = React.useState(false);
        React.useEffect(() => {
            let resizeTimer;
            const onResize = () => {
                setIsResizing(true);
                clearTimeout(resizeTimer);
                resizeTimer = setTimeout(() => {
                    setIsResizing(false);
                }, 300);
            };
            const onScroll = () => {
                if (isResizing) {
                    return;
                }
                const currentScrollTop = window.pageYOffset || document.documentElement.scrollTop;
                setIsScrollingUp(currentScrollTop < lastScrollTop);
                setLastScrollTop(currentScrollTop);
            };
            window.addEventListener("scroll", onScroll);
            window.addEventListener("resize", onResize);
            return () => {
                window.removeEventListener("scroll", onScroll);
                window.removeEventListener("resize", onResize);
            };
        }, [lastScrollTop, isResizing]);
        return isScrollingUp;
    };
    function useHeadroom({ fixedAt = 0, onPin, onFix, onRelease } = {}) {
        const isCurrentlyPinnedRef = React.useRef(false);
        const isScrollingUp = useScrollDirection();
        const [{ y: scrollPosition }] = useWindowScroll();
        useIsomorphicEffect(() => {
            isPinnedOrReleased(
                scrollPosition,
                fixedAt,
                isCurrentlyPinnedRef,
                isScrollingUp,
                onPin,
                onRelease
            );
        }, [scrollPosition]);
        useIsomorphicEffect(() => {
            if (isFixed(scrollPosition, fixedAt)) {
                onFix?.();
            }
        }, [scrollPosition, fixedAt, onFix]);
        if (isFixed(scrollPosition, fixedAt) || isScrollingUp) {
            return true;
        }
        return false;
    }
    function useEyeDropper() {
        const [supported, setSupported] = React.useState(false);
        useIsomorphicEffect(() => {
            setSupported(typeof window !== "undefined" && "EyeDropper" in window);
        }, []);
        const open = React.useCallback(
            (options = {}) => {
                if (supported) {
                    const eyeDropper = new window.EyeDropper();
                    return eyeDropper.open(options);
                }
                return Promise.resolve(void 0);
            },
            [supported]
        );
        return { supported, open };
    }
    function useInViewport() {
        const ref = React.useRef(null);
        const [inViewport, setInViewport] = React.useState(false);
        const observer = React.useMemo(() => {
            if (typeof IntersectionObserver === "undefined") {
                return null;
            }
            return new IntersectionObserver(([entry]) => setInViewport(entry.isIntersecting));
        }, [ref]);
        React.useEffect(() => {
            if (ref.current && observer) {
                observer.observe(ref.current);
                return () => observer.disconnect();
            }
            return () => null;
        }, []);
        return { ref, inViewport };
    }
    function useMutationObserver(callback, options, target) {
        const observer = React.useRef();
        const ref = React.useRef(null);
        React.useEffect(() => {
            const targetElement = typeof target === "function" ? target() : target;
            if (targetElement || ref.current) {
                observer.current = new MutationObserver(callback);
                observer.current.observe(targetElement || ref.current, options);
            }
            return () => {
                observer.current?.disconnect();
            };
        }, [callback, options]);
        return ref;
    }
    function useMounted() {
        const [mounted, setMounted] = React.useState(false);
        React.useEffect(() => setMounted(true), []);
        return mounted;
    }
    function useStateHistory(initialValue) {
        const [state, setState] = React.useState({
            history: [initialValue],
            current: 0
        });
        const set = React.useCallback(
            (val) => setState((currentState) => {
                const nextState = [...currentState.history.slice(0, currentState.current + 1), val];
                return {
                    history: nextState,
                    current: nextState.length - 1
                };
            }),
            []
        );
        const back = React.useCallback(
            (steps = 1) => setState((currentState) => ({
                history: currentState.history,
                current: Math.max(0, currentState.current - steps)
            })),
            []
        );
        const forward = React.useCallback(
            (steps = 1) => setState((currentState) => ({
                history: currentState.history,
                current: Math.min(currentState.history.length - 1, currentState.current + steps)
            })),
            []
        );
        const handlers = React.useMemo(() => ({ set, forward, back }), []);
        return [state.history[state.current], handlers, state];
    }
    function useMap(initialState) {
        const mapRef = React.useRef(new Map(initialState));
        const forceUpdate = useForceUpdate();
        mapRef.current.set = (...args) => {
            Map.prototype.set.apply(mapRef.current, args);
            forceUpdate();
            return mapRef.current;
        };
        mapRef.current.clear = (...args) => {
            Map.prototype.clear.apply(mapRef.current, args);
            forceUpdate();
        };
        mapRef.current.delete = (...args) => {
            const res = Map.prototype.delete.apply(mapRef.current, args);
            forceUpdate();
            return res;
        };
        return mapRef.current;
    }
    function useSet(values) {
        const setRef = React.useRef(new Set(values));
        const forceUpdate = useForceUpdate();
        setRef.current.add = (...args) => {
            const res = Set.prototype.add.apply(setRef.current, args);
            forceUpdate();
            return res;
        };
        setRef.current.clear = (...args) => {
            Set.prototype.clear.apply(setRef.current, args);
            forceUpdate();
        };
        setRef.current.delete = (...args) => {
            const res = Set.prototype.delete.apply(setRef.current, args);
            forceUpdate();
            return res;
        };
        return setRef.current;
    }
    function useThrottledCallbackWithClearTimeout(callback, wait) {
        const handleCallback = useCallbackRef(callback);
        const latestInArgsRef = React.useRef();
        const latestOutArgsRef = React.useRef();
        const active = React.useRef(true);
        const waitRef = React.useRef(wait);
        const timeoutRef = React.useRef(-1);
        const clearTimeout2 = () => window.clearTimeout(timeoutRef.current);
        const callThrottledCallback = React.useCallback(
            (...args) => {
                handleCallback(...args);
                latestInArgsRef.current = args;
                latestOutArgsRef.current = args;
                active.current = false;
            },
            [handleCallback]
        );
        const timerCallback = React.useCallback(() => {
            if (latestInArgsRef.current && latestInArgsRef.current !== latestOutArgsRef.current) {
                callThrottledCallback(...latestInArgsRef.current);
                timeoutRef.current = window.setTimeout(timerCallback, waitRef.current);
            } else {
                active.current = true;
            }
        }, [callThrottledCallback]);
        const throttled = React.useCallback(
            (...args) => {
                if (active.current) {
                    callThrottledCallback(...args);
                    timeoutRef.current = window.setTimeout(timerCallback, waitRef.current);
                } else {
                    latestInArgsRef.current = args;
                }
            },
            [callThrottledCallback, timerCallback]
        );
        React.useEffect(() => {
            waitRef.current = wait;
        }, [wait]);
        return [throttled, clearTimeout2];
    }
    function useThrottledCallback(callback, wait) {
        return useThrottledCallbackWithClearTimeout(callback, wait)[0];
    }
    function useThrottledState(defaultValue, wait) {
        const [value, setValue] = React.useState(defaultValue);
        const [setThrottledValue, clearTimeout2] = useThrottledCallbackWithClearTimeout(setValue, wait);
        React.useEffect(() => clearTimeout2, []);
        return [value, setThrottledValue];
    }
    function useThrottledValue(value, wait) {
        const [throttledValue, setThrottledValue] = React.useState(value);
        const valueRef = React.useRef(value);
        const [throttledSetValue, clearTimeout2] = useThrottledCallbackWithClearTimeout(
            setThrottledValue,
            wait
        );
        React.useEffect(() => {
            if (value !== valueRef.current) {
                valueRef.current = value;
                throttledSetValue(value);
            }
        }, [throttledSetValue, value]);
        React.useEffect(() => clearTimeout2, []);
        return throttledValue;
    }
    function useIsFirstRender() {
        const renderRef = React.useRef(true);
        if (renderRef.current === true) {
            renderRef.current = false;
            return true;
        }
        return renderRef.current;
    }
    function useOrientation() {
        const [orientation, setOrientation] = React.useState({ angle: 0, type: "landscape-primary" });
        const handleOrientationChange = (event) => {
            const target = event.currentTarget;
            setOrientation({ angle: target?.angle || 0, type: target?.type || "landscape-primary" });
        };
        useIsomorphicEffect(() => {
            window.screen.orientation?.addEventListener("change", handleOrientationChange);
            return () => window.screen.orientation?.removeEventListener("change", handleOrientationChange);
        }, []);
        return orientation;
    }
    function useFetch(url, { autoInvoke = true, ...options } = {}) {
        const [data, setData] = React.useState(null);
        const [loading, setLoading] = React.useState(false);
        const [error, setError] = React.useState(null);
        const controller = React.useRef(null);
        const refetch = React.useCallback(() => {
            if (!url) {
                return;
            }
            if (controller.current) {
                controller.current.abort();
            }
            controller.current = new AbortController();
            setLoading(true);
            return fetch(url, { signal: controller.current.signal, ...options }).then((res) => res.json()).then((res) => {
                setData(res);
                setLoading(false);
                return res;
            }).catch((err) => {
                setLoading(false);
                if (err.name !== "AbortError") {
                    setError(err);
                }
                return err;
            });
        }, [url]);
        const abort = React.useCallback(() => {
            if (controller.current) {
                controller.current?.abort("");
            }
        }, []);
        React.useEffect(() => {
            if (autoInvoke) {
                refetch();
            }
            return () => {
                if (controller.current) {
                    controller.current.abort("");
                }
            };
        }, [refetch, autoInvoke]);
        return { data, loading, error, refetch, abort };
    }

    exports.assignRef = assignRef;
    exports.clamp = clamp;
    exports.clampUseMovePosition = clampUseMovePosition;
    exports.getHotkeyHandler = getHotkeyHandler;
    exports.lowerFirst = lowerFirst;
    exports.mergeRefs = mergeRefs;
    exports.randomId = randomId;
    exports.range = range;
    exports.readLocalStorageValue = readLocalStorageValue;
    exports.readSessionStorageValue = readSessionStorageValue;
    exports.shallowEqual = shallowEqual;
    exports.upperFirst = upperFirst;
    exports.useCallbackRef = useCallbackRef;
    exports.useClickOutside = useClickOutside;
    exports.useClipboard = useClipboard;
    exports.useColorScheme = useColorScheme;
    exports.useCounter = useCounter;
    exports.useDebouncedCallback = useDebouncedCallback;
    exports.useDebouncedState = useDebouncedState;
    exports.useDebouncedValue = useDebouncedValue;
    exports.useDidUpdate = useDidUpdate;
    exports.useDisclosure = useDisclosure;
    exports.useDocumentTitle = useDocumentTitle;
    exports.useDocumentVisibility = useDocumentVisibility;
    exports.useElementSize = useElementSize;
    exports.useEventListener = useEventListener;
    exports.useEyeDropper = useEyeDropper;
    exports.useFavicon = useFavicon;
    exports.useFetch = useFetch;
    exports.useFocusReturn = useFocusReturn;
    exports.useFocusTrap = useFocusTrap;
    exports.useFocusWithin = useFocusWithin;
    exports.useForceUpdate = useForceUpdate;
    exports.useFullscreen = useFullscreen;
    exports.useHash = useHash;
    exports.useHeadroom = useHeadroom;
    exports.useHotkeys = useHotkeys;
    exports.useHover = useHover;
    exports.useId = useId;
    exports.useIdle = useIdle;
    exports.useInViewport = useInViewport;
    exports.useInputState = useInputState;
    exports.useIntersection = useIntersection;
    exports.useInterval = useInterval;
    exports.useIsFirstRender = useIsFirstRender;
    exports.useIsomorphicEffect = useIsomorphicEffect;
    exports.useListState = useListState;
    exports.useLocalStorage = useLocalStorage;
    exports.useLogger = useLogger;
    exports.useMap = useMap;
    exports.useMediaQuery = useMediaQuery;
    exports.useMergedRef = useMergedRef;
    exports.useMounted = useMounted;
    exports.useMouse = useMouse;
    exports.useMove = useMove;
    exports.useMutationObserver = useMutationObserver;
    exports.useNetwork = useNetwork;
    exports.useOrientation = useOrientation;
    exports.useOs = useOs;
    exports.usePageLeave = usePageLeave;
    exports.usePagination = usePagination;
    exports.usePrevious = usePrevious;
    exports.useQueue = useQueue;
    exports.useReducedMotion = useReducedMotion;
    exports.useResizeObserver = useResizeObserver;
    exports.useScrollIntoView = useScrollIntoView;
    exports.useSessionStorage = useSessionStorage;
    exports.useSet = useSet;
    exports.useSetState = useSetState;
    exports.useShallowEffect = useShallowEffect;
    exports.useStateHistory = useStateHistory;
    exports.useTextSelection = useTextSelection;
    exports.useThrottledCallback = useThrottledCallback;
    exports.useThrottledState = useThrottledState;
    exports.useThrottledValue = useThrottledValue;
    exports.useTimeout = useTimeout;
    exports.useToggle = useToggle;
    exports.useUncontrolled = useUncontrolled;
    exports.useValidatedState = useValidatedState;
    exports.useViewportSize = useViewportSize;
    exports.useWindowEvent = useWindowEvent;
    exports.useWindowScroll = useWindowScroll;

}));