@mantine/hooks 9.1.1 → 9.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/index.cjs +2 -0
- package/cjs/use-click-outside/use-click-outside.cjs.map +1 -1
- package/cjs/use-clipboard/use-clipboard.cjs.map +1 -1
- package/cjs/use-collapse/use-collapse.cjs.map +1 -1
- package/cjs/use-collapse/use-horizontal-collapse.cjs.map +1 -1
- package/cjs/use-color-scheme/use-color-scheme.cjs.map +1 -1
- package/cjs/use-counter/use-counter.cjs.map +1 -1
- package/cjs/use-debounced-callback/use-debounced-callback.cjs.map +1 -1
- package/cjs/use-debounced-state/use-debounced-state.cjs.map +1 -1
- package/cjs/use-debounced-value/use-debounced-value.cjs +3 -0
- package/cjs/use-debounced-value/use-debounced-value.cjs.map +1 -1
- package/cjs/use-did-update/use-did-update.cjs.map +1 -1
- package/cjs/use-disclosure/use-disclosure.cjs.map +1 -1
- package/cjs/use-document-title/use-document-title.cjs.map +1 -1
- package/cjs/use-document-visibility/use-document-visibility.cjs.map +1 -1
- package/cjs/use-drag/use-drag.cjs +266 -0
- package/cjs/use-drag/use-drag.cjs.map +1 -0
- package/cjs/use-event-listener/use-event-listener.cjs.map +1 -1
- package/cjs/use-eye-dropper/use-eye-dropper.cjs.map +1 -1
- package/cjs/use-favicon/use-favicon.cjs.map +1 -1
- package/cjs/use-fetch/use-fetch.cjs.map +1 -1
- package/cjs/use-file-dialog/use-file-dialog.cjs.map +1 -1
- package/cjs/use-floating-window/use-floating-window.cjs.map +1 -1
- package/cjs/use-focus-return/use-focus-return.cjs.map +1 -1
- package/cjs/use-focus-trap/scope-tab.cjs.map +1 -1
- package/cjs/use-focus-trap/tabbable.cjs.map +1 -1
- package/cjs/use-focus-trap/use-focus-trap.cjs.map +1 -1
- package/cjs/use-focus-within/use-focus-within.cjs.map +1 -1
- package/cjs/use-force-update/use-force-update.cjs.map +1 -1
- package/cjs/use-fullscreen/use-fullscreen.cjs.map +1 -1
- package/cjs/use-hash/use-hash.cjs.map +1 -1
- package/cjs/use-headroom/use-headroom.cjs.map +1 -1
- package/cjs/use-hotkeys/parse-hotkey.cjs.map +1 -1
- package/cjs/use-hotkeys/use-hotkeys.cjs.map +1 -1
- package/cjs/use-hover/use-hover.cjs.map +1 -1
- package/cjs/use-id/use-id.cjs.map +1 -1
- package/cjs/use-idle/use-idle.cjs.map +1 -1
- package/cjs/use-in-viewport/use-in-viewport.cjs.map +1 -1
- package/cjs/use-input-state/use-input-state.cjs.map +1 -1
- package/cjs/use-intersection/use-intersection.cjs.map +1 -1
- package/cjs/use-interval/use-interval.cjs.map +1 -1
- package/cjs/use-is-first-render/use-is-first-render.cjs.map +1 -1
- package/cjs/use-list-state/use-list-state.cjs.map +1 -1
- package/cjs/use-local-storage/create-storage.cjs.map +1 -1
- package/cjs/use-local-storage/use-local-storage.cjs.map +1 -1
- package/cjs/use-logger/use-logger.cjs.map +1 -1
- package/cjs/use-long-press/use-long-press.cjs.map +1 -1
- package/cjs/use-map/use-map.cjs.map +1 -1
- package/cjs/use-mask/use-mask.cjs.map +1 -1
- package/cjs/use-media-query/use-media-query.cjs.map +1 -1
- package/cjs/use-merged-ref/use-merged-ref.cjs.map +1 -1
- package/cjs/use-mounted/use-mounted.cjs.map +1 -1
- package/cjs/use-mouse/use-mouse.cjs.map +1 -1
- package/cjs/use-move/use-move.cjs.map +1 -1
- package/cjs/use-mutation-observer/use-mutation-observer.cjs.map +1 -1
- package/cjs/use-network/use-network.cjs.map +1 -1
- package/cjs/use-orientation/use-orientation.cjs.map +1 -1
- package/cjs/use-os/use-os.cjs.map +1 -1
- package/cjs/use-page-leave/use-page-leave.cjs.map +1 -1
- package/cjs/use-pagination/use-pagination.cjs.map +1 -1
- package/cjs/use-previous/use-previous.cjs.map +1 -1
- package/cjs/use-queue/use-queue.cjs.map +1 -1
- package/cjs/use-radial-move/use-radial-move.cjs +12 -4
- package/cjs/use-radial-move/use-radial-move.cjs.map +1 -1
- package/cjs/use-reduced-motion/use-reduced-motion.cjs.map +1 -1
- package/cjs/use-resize-observer/use-resize-observer.cjs.map +1 -1
- package/cjs/use-roving-index/use-roving-index.cjs.map +1 -1
- package/cjs/use-scroll-direction/use-scroll-direction.cjs.map +1 -1
- package/cjs/use-scroll-into-view/use-scroll-into-view.cjs.map +1 -1
- package/cjs/use-scroll-spy/use-scroll-spy.cjs.map +1 -1
- package/cjs/use-scroller/use-scroller.cjs.map +1 -1
- package/cjs/use-selection/use-selection.cjs.map +1 -1
- package/cjs/use-session-storage/use-session-storage.cjs.map +1 -1
- package/cjs/use-set/use-set.cjs.map +1 -1
- package/cjs/use-set-state/use-set-state.cjs.map +1 -1
- package/cjs/use-shallow-effect/use-shallow-effect.cjs.map +1 -1
- package/cjs/use-state-history/use-state-history.cjs.map +1 -1
- package/cjs/use-text-selection/use-text-selection.cjs.map +1 -1
- package/cjs/use-throttled-callback/use-throttled-callback.cjs.map +1 -1
- package/cjs/use-throttled-state/use-throttled-state.cjs.map +1 -1
- package/cjs/use-throttled-value/use-throttled-value.cjs.map +1 -1
- package/cjs/use-timeout/use-timeout.cjs.map +1 -1
- package/cjs/use-toggle/use-toggle.cjs.map +1 -1
- package/cjs/use-uncontrolled/use-uncontrolled.cjs.map +1 -1
- package/cjs/use-validated-state/use-validated-state.cjs.map +1 -1
- package/cjs/use-viewport-size/use-viewport-size.cjs.map +1 -1
- package/cjs/use-window-event/use-window-event.cjs.map +1 -1
- package/cjs/use-window-scroll/use-window-scroll.cjs.map +1 -1
- package/cjs/utils/clamp/clamp.cjs.map +1 -1
- package/cjs/utils/lower-first/lower-first.cjs.map +1 -1
- package/cjs/utils/random-id/random-id.cjs.map +1 -1
- package/cjs/utils/range/range.cjs.map +1 -1
- package/cjs/utils/shallow-equal/shallow-equal.cjs.map +1 -1
- package/cjs/utils/upper-first/upper-first.cjs.map +1 -1
- package/cjs/utils/use-callback-ref/use-callback-ref.cjs.map +1 -1
- package/esm/index.mjs +2 -1
- package/esm/use-click-outside/use-click-outside.mjs.map +1 -1
- package/esm/use-clipboard/use-clipboard.mjs.map +1 -1
- package/esm/use-collapse/use-collapse.mjs.map +1 -1
- package/esm/use-collapse/use-horizontal-collapse.mjs.map +1 -1
- package/esm/use-color-scheme/use-color-scheme.mjs.map +1 -1
- package/esm/use-counter/use-counter.mjs.map +1 -1
- package/esm/use-debounced-callback/use-debounced-callback.mjs.map +1 -1
- package/esm/use-debounced-state/use-debounced-state.mjs.map +1 -1
- package/esm/use-debounced-value/use-debounced-value.mjs +3 -0
- package/esm/use-debounced-value/use-debounced-value.mjs.map +1 -1
- package/esm/use-did-update/use-did-update.mjs.map +1 -1
- package/esm/use-disclosure/use-disclosure.mjs.map +1 -1
- package/esm/use-document-title/use-document-title.mjs.map +1 -1
- package/esm/use-document-visibility/use-document-visibility.mjs.map +1 -1
- package/esm/use-drag/use-drag.mjs +266 -0
- package/esm/use-drag/use-drag.mjs.map +1 -0
- package/esm/use-event-listener/use-event-listener.mjs.map +1 -1
- package/esm/use-eye-dropper/use-eye-dropper.mjs.map +1 -1
- package/esm/use-favicon/use-favicon.mjs.map +1 -1
- package/esm/use-fetch/use-fetch.mjs.map +1 -1
- package/esm/use-file-dialog/use-file-dialog.mjs.map +1 -1
- package/esm/use-floating-window/use-floating-window.mjs.map +1 -1
- package/esm/use-focus-return/use-focus-return.mjs.map +1 -1
- package/esm/use-focus-trap/scope-tab.mjs.map +1 -1
- package/esm/use-focus-trap/tabbable.mjs.map +1 -1
- package/esm/use-focus-trap/use-focus-trap.mjs.map +1 -1
- package/esm/use-focus-within/use-focus-within.mjs.map +1 -1
- package/esm/use-force-update/use-force-update.mjs.map +1 -1
- package/esm/use-fullscreen/use-fullscreen.mjs.map +1 -1
- package/esm/use-hash/use-hash.mjs.map +1 -1
- package/esm/use-headroom/use-headroom.mjs.map +1 -1
- package/esm/use-hotkeys/parse-hotkey.mjs.map +1 -1
- package/esm/use-hotkeys/use-hotkeys.mjs.map +1 -1
- package/esm/use-hover/use-hover.mjs.map +1 -1
- package/esm/use-id/use-id.mjs.map +1 -1
- package/esm/use-idle/use-idle.mjs.map +1 -1
- package/esm/use-in-viewport/use-in-viewport.mjs.map +1 -1
- package/esm/use-input-state/use-input-state.mjs.map +1 -1
- package/esm/use-intersection/use-intersection.mjs.map +1 -1
- package/esm/use-interval/use-interval.mjs.map +1 -1
- package/esm/use-is-first-render/use-is-first-render.mjs.map +1 -1
- package/esm/use-list-state/use-list-state.mjs.map +1 -1
- package/esm/use-local-storage/create-storage.mjs.map +1 -1
- package/esm/use-local-storage/use-local-storage.mjs.map +1 -1
- package/esm/use-logger/use-logger.mjs.map +1 -1
- package/esm/use-long-press/use-long-press.mjs.map +1 -1
- package/esm/use-map/use-map.mjs.map +1 -1
- package/esm/use-mask/use-mask.mjs.map +1 -1
- package/esm/use-media-query/use-media-query.mjs.map +1 -1
- package/esm/use-merged-ref/use-merged-ref.mjs.map +1 -1
- package/esm/use-mounted/use-mounted.mjs.map +1 -1
- package/esm/use-mouse/use-mouse.mjs.map +1 -1
- package/esm/use-move/use-move.mjs.map +1 -1
- package/esm/use-mutation-observer/use-mutation-observer.mjs.map +1 -1
- package/esm/use-network/use-network.mjs.map +1 -1
- package/esm/use-orientation/use-orientation.mjs.map +1 -1
- package/esm/use-os/use-os.mjs.map +1 -1
- package/esm/use-page-leave/use-page-leave.mjs.map +1 -1
- package/esm/use-pagination/use-pagination.mjs.map +1 -1
- package/esm/use-previous/use-previous.mjs.map +1 -1
- package/esm/use-queue/use-queue.mjs.map +1 -1
- package/esm/use-radial-move/use-radial-move.mjs +13 -5
- package/esm/use-radial-move/use-radial-move.mjs.map +1 -1
- package/esm/use-reduced-motion/use-reduced-motion.mjs.map +1 -1
- package/esm/use-resize-observer/use-resize-observer.mjs.map +1 -1
- package/esm/use-roving-index/use-roving-index.mjs.map +1 -1
- package/esm/use-scroll-direction/use-scroll-direction.mjs.map +1 -1
- package/esm/use-scroll-into-view/use-scroll-into-view.mjs.map +1 -1
- package/esm/use-scroll-spy/use-scroll-spy.mjs.map +1 -1
- package/esm/use-scroller/use-scroller.mjs.map +1 -1
- package/esm/use-selection/use-selection.mjs.map +1 -1
- package/esm/use-session-storage/use-session-storage.mjs.map +1 -1
- package/esm/use-set/use-set.mjs.map +1 -1
- package/esm/use-set-state/use-set-state.mjs.map +1 -1
- package/esm/use-shallow-effect/use-shallow-effect.mjs.map +1 -1
- package/esm/use-state-history/use-state-history.mjs.map +1 -1
- package/esm/use-text-selection/use-text-selection.mjs.map +1 -1
- package/esm/use-throttled-callback/use-throttled-callback.mjs.map +1 -1
- package/esm/use-throttled-state/use-throttled-state.mjs.map +1 -1
- package/esm/use-throttled-value/use-throttled-value.mjs.map +1 -1
- package/esm/use-timeout/use-timeout.mjs.map +1 -1
- package/esm/use-toggle/use-toggle.mjs.map +1 -1
- package/esm/use-uncontrolled/use-uncontrolled.mjs.map +1 -1
- package/esm/use-validated-state/use-validated-state.mjs.map +1 -1
- package/esm/use-viewport-size/use-viewport-size.mjs.map +1 -1
- package/esm/use-window-event/use-window-event.mjs.map +1 -1
- package/esm/use-window-scroll/use-window-scroll.mjs.map +1 -1
- package/esm/utils/clamp/clamp.mjs.map +1 -1
- package/esm/utils/lower-first/lower-first.mjs.map +1 -1
- package/esm/utils/random-id/random-id.mjs.map +1 -1
- package/esm/utils/range/range.mjs.map +1 -1
- package/esm/utils/shallow-equal/shallow-equal.mjs.map +1 -1
- package/esm/utils/upper-first/upper-first.mjs.map +1 -1
- package/esm/utils/use-callback-ref/use-callback-ref.mjs.map +1 -1
- package/lib/index.d.mts +2 -0
- package/lib/index.d.ts +2 -0
- package/lib/use-drag/use-drag.d.ts +60 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-fullscreen.mjs","names":[],"sources":["../../src/use-fullscreen/use-fullscreen.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nfunction getFullscreenElement(): HTMLElement | null {\n const _document = window.document as any;\n\n const fullscreenElement =\n _document.fullscreenElement ||\n _document.webkitFullscreenElement ||\n _document.mozFullScreenElement ||\n _document.msFullscreenElement;\n\n return fullscreenElement;\n}\n\nfunction exitFullscreen() {\n const _document = window.document as any;\n\n if (typeof _document.exitFullscreen === 'function') {\n return _document.exitFullscreen();\n }\n if (typeof _document.msExitFullscreen === 'function') {\n return _document.msExitFullscreen();\n }\n if (typeof _document.webkitExitFullscreen === 'function') {\n return _document.webkitExitFullscreen();\n }\n if (typeof _document.mozCancelFullScreen === 'function') {\n return _document.mozCancelFullScreen();\n }\n\n return null;\n}\n\nfunction enterFullScreen(element: HTMLElement) {\n const _element = element as any;\n\n return (\n _element.requestFullscreen?.() ||\n _element.msRequestFullscreen?.() ||\n _element.webkitEnterFullscreen?.() ||\n _element.webkitRequestFullscreen?.() ||\n _element.mozRequestFullscreen?.()\n );\n}\n\nconst prefixes = ['', 'webkit', 'moz', 'ms'];\n\ninterface FullscreenEvents {\n onFullScreen: (event: Event) => void;\n onError: (event: Event) => void;\n}\n\nfunction addEvents(element: HTMLElement, events: FullscreenEvents) {\n const { onFullScreen, onError } = events;\n prefixes.forEach((prefix) => {\n element.addEventListener(`${prefix}fullscreenchange`, onFullScreen);\n element.addEventListener(`${prefix}fullscreenerror`, onError);\n });\n\n return () => removeEvents(element, events);\n}\n\nfunction removeEvents(element: HTMLElement, { onFullScreen, onError }: FullscreenEvents) {\n prefixes.forEach((prefix) => {\n element.removeEventListener(`${prefix}fullscreenchange`, onFullScreen);\n element.removeEventListener(`${prefix}fullscreenerror`, onError);\n });\n}\n\nexport interface UseFullscreenElementReturnValue<T extends HTMLElement = any> {\n ref: React.RefCallback<T | null>;\n toggle: () => Promise<void>;\n fullscreen: boolean;\n}\n\nexport function useFullscreenElement<\n T extends HTMLElement = any,\n>(): UseFullscreenElementReturnValue<T> {\n const [fullscreen, setFullscreen] = useState<boolean>(false);\n const refElement = useRef<T | null>(null);\n const prevNodeRef = useRef<T | null>(null);\n\n const handleFullscreenChange = useCallback(() => {\n setFullscreen(refElement.current === getFullscreenElement());\n }, []);\n\n const handleFullscreenError = useCallback(() => {\n setFullscreen(false);\n }, []);\n\n const toggle = useCallback(async () => {\n if (!getFullscreenElement() && refElement.current) {\n await enterFullScreen(refElement.current);\n } else {\n await exitFullscreen();\n }\n }, []);\n\n const refCallback: React.RefCallback<T | null> = useCallback((node) => {\n if (prevNodeRef.current && prevNodeRef.current !== node) {\n removeEvents(prevNodeRef.current, {\n onFullScreen: handleFullscreenChange,\n onError: handleFullscreenError,\n });\n }\n\n if (node) {\n addEvents(node, {\n onFullScreen: handleFullscreenChange,\n onError: handleFullscreenError,\n });\n }\n\n refElement.current = node;\n prevNodeRef.current = node;\n }, []);\n\n return { ref: refCallback, toggle, fullscreen };\n}\n\nexport interface UseFullscreenDocumentReturnValue {\n toggle: () => Promise<void>;\n fullscreen: boolean;\n}\n\nexport function useFullscreenDocument(): UseFullscreenDocumentReturnValue {\n const [fullscreen, setFullscreen] = useState<boolean>(false);\n\n const handleFullscreenChange = useCallback(() => {\n setFullscreen(getFullscreenElement() === window.document.documentElement);\n }, []);\n\n const handleFullscreenError = useCallback(() => {\n setFullscreen(false);\n }, []);\n\n const toggle = useCallback(async () => {\n if (!getFullscreenElement()) {\n await enterFullScreen(window.document.documentElement);\n } else {\n await exitFullscreen();\n }\n }, []);\n\n useEffect(() => {\n return addEvents(window.document.documentElement, {\n onFullScreen: handleFullscreenChange,\n onError: handleFullscreenError,\n });\n }, []);\n\n return { toggle, fullscreen };\n}\n"],"mappings":";;;AAEA,SAAS,uBAA2C;CAClD,MAAM,YAAY,OAAO;
|
|
1
|
+
{"version":3,"file":"use-fullscreen.mjs","names":[],"sources":["../../src/use-fullscreen/use-fullscreen.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nfunction getFullscreenElement(): HTMLElement | null {\n const _document = window.document as any;\n\n const fullscreenElement =\n _document.fullscreenElement ||\n _document.webkitFullscreenElement ||\n _document.mozFullScreenElement ||\n _document.msFullscreenElement;\n\n return fullscreenElement;\n}\n\nfunction exitFullscreen() {\n const _document = window.document as any;\n\n if (typeof _document.exitFullscreen === 'function') {\n return _document.exitFullscreen();\n }\n if (typeof _document.msExitFullscreen === 'function') {\n return _document.msExitFullscreen();\n }\n if (typeof _document.webkitExitFullscreen === 'function') {\n return _document.webkitExitFullscreen();\n }\n if (typeof _document.mozCancelFullScreen === 'function') {\n return _document.mozCancelFullScreen();\n }\n\n return null;\n}\n\nfunction enterFullScreen(element: HTMLElement) {\n const _element = element as any;\n\n return (\n _element.requestFullscreen?.() ||\n _element.msRequestFullscreen?.() ||\n _element.webkitEnterFullscreen?.() ||\n _element.webkitRequestFullscreen?.() ||\n _element.mozRequestFullscreen?.()\n );\n}\n\nconst prefixes = ['', 'webkit', 'moz', 'ms'];\n\ninterface FullscreenEvents {\n onFullScreen: (event: Event) => void;\n onError: (event: Event) => void;\n}\n\nfunction addEvents(element: HTMLElement, events: FullscreenEvents) {\n const { onFullScreen, onError } = events;\n prefixes.forEach((prefix) => {\n element.addEventListener(`${prefix}fullscreenchange`, onFullScreen);\n element.addEventListener(`${prefix}fullscreenerror`, onError);\n });\n\n return () => removeEvents(element, events);\n}\n\nfunction removeEvents(element: HTMLElement, { onFullScreen, onError }: FullscreenEvents) {\n prefixes.forEach((prefix) => {\n element.removeEventListener(`${prefix}fullscreenchange`, onFullScreen);\n element.removeEventListener(`${prefix}fullscreenerror`, onError);\n });\n}\n\nexport interface UseFullscreenElementReturnValue<T extends HTMLElement = any> {\n ref: React.RefCallback<T | null>;\n toggle: () => Promise<void>;\n fullscreen: boolean;\n}\n\nexport function useFullscreenElement<\n T extends HTMLElement = any,\n>(): UseFullscreenElementReturnValue<T> {\n const [fullscreen, setFullscreen] = useState<boolean>(false);\n const refElement = useRef<T | null>(null);\n const prevNodeRef = useRef<T | null>(null);\n\n const handleFullscreenChange = useCallback(() => {\n setFullscreen(refElement.current === getFullscreenElement());\n }, []);\n\n const handleFullscreenError = useCallback(() => {\n setFullscreen(false);\n }, []);\n\n const toggle = useCallback(async () => {\n if (!getFullscreenElement() && refElement.current) {\n await enterFullScreen(refElement.current);\n } else {\n await exitFullscreen();\n }\n }, []);\n\n const refCallback: React.RefCallback<T | null> = useCallback((node) => {\n if (prevNodeRef.current && prevNodeRef.current !== node) {\n removeEvents(prevNodeRef.current, {\n onFullScreen: handleFullscreenChange,\n onError: handleFullscreenError,\n });\n }\n\n if (node) {\n addEvents(node, {\n onFullScreen: handleFullscreenChange,\n onError: handleFullscreenError,\n });\n }\n\n refElement.current = node;\n prevNodeRef.current = node;\n }, []);\n\n return { ref: refCallback, toggle, fullscreen };\n}\n\nexport interface UseFullscreenDocumentReturnValue {\n toggle: () => Promise<void>;\n fullscreen: boolean;\n}\n\nexport function useFullscreenDocument(): UseFullscreenDocumentReturnValue {\n const [fullscreen, setFullscreen] = useState<boolean>(false);\n\n const handleFullscreenChange = useCallback(() => {\n setFullscreen(getFullscreenElement() === window.document.documentElement);\n }, []);\n\n const handleFullscreenError = useCallback(() => {\n setFullscreen(false);\n }, []);\n\n const toggle = useCallback(async () => {\n if (!getFullscreenElement()) {\n await enterFullScreen(window.document.documentElement);\n } else {\n await exitFullscreen();\n }\n }, []);\n\n useEffect(() => {\n return addEvents(window.document.documentElement, {\n onFullScreen: handleFullscreenChange,\n onError: handleFullscreenError,\n });\n }, []);\n\n return { toggle, fullscreen };\n}\n"],"mappings":";;;AAEA,SAAS,uBAA2C;CAClD,MAAM,YAAY,OAAO;CAQzB,OALE,UAAU,qBACV,UAAU,2BACV,UAAU,wBACV,UAAU;AAGd;AAEA,SAAS,iBAAiB;CACxB,MAAM,YAAY,OAAO;CAEzB,IAAI,OAAO,UAAU,mBAAmB,YACtC,OAAO,UAAU,eAAe;CAElC,IAAI,OAAO,UAAU,qBAAqB,YACxC,OAAO,UAAU,iBAAiB;CAEpC,IAAI,OAAO,UAAU,yBAAyB,YAC5C,OAAO,UAAU,qBAAqB;CAExC,IAAI,OAAO,UAAU,wBAAwB,YAC3C,OAAO,UAAU,oBAAoB;CAGvC,OAAO;AACT;AAEA,SAAS,gBAAgB,SAAsB;CAC7C,MAAM,WAAW;CAEjB,OACE,SAAS,oBAAoB,KAC7B,SAAS,sBAAsB,KAC/B,SAAS,wBAAwB,KACjC,SAAS,0BAA0B,KACnC,SAAS,uBAAuB;AAEpC;AAEA,MAAM,WAAW;CAAC;CAAI;CAAU;CAAO;AAAI;AAO3C,SAAS,UAAU,SAAsB,QAA0B;CACjE,MAAM,EAAE,cAAc,YAAY;CAClC,SAAS,SAAS,WAAW;EAC3B,QAAQ,iBAAiB,GAAG,OAAO,mBAAmB,YAAY;EAClE,QAAQ,iBAAiB,GAAG,OAAO,kBAAkB,OAAO;CAC9D,CAAC;CAED,aAAa,aAAa,SAAS,MAAM;AAC3C;AAEA,SAAS,aAAa,SAAsB,EAAE,cAAc,WAA6B;CACvF,SAAS,SAAS,WAAW;EAC3B,QAAQ,oBAAoB,GAAG,OAAO,mBAAmB,YAAY;EACrE,QAAQ,oBAAoB,GAAG,OAAO,kBAAkB,OAAO;CACjE,CAAC;AACH;AAQA,SAAgB,uBAEwB;CACtC,MAAM,CAAC,YAAY,iBAAiB,SAAkB,KAAK;CAC3D,MAAM,aAAa,OAAiB,IAAI;CACxC,MAAM,cAAc,OAAiB,IAAI;CAEzC,MAAM,yBAAyB,kBAAkB;EAC/C,cAAc,WAAW,YAAY,qBAAqB,CAAC;CAC7D,GAAG,CAAC,CAAC;CAEL,MAAM,wBAAwB,kBAAkB;EAC9C,cAAc,KAAK;CACrB,GAAG,CAAC,CAAC;CAEL,MAAM,SAAS,YAAY,YAAY;EACrC,IAAI,CAAC,qBAAqB,KAAK,WAAW,SACxC,MAAM,gBAAgB,WAAW,OAAO;OAExC,MAAM,eAAe;CAEzB,GAAG,CAAC,CAAC;CAqBL,OAAO;EAAE,KAnBwC,aAAa,SAAS;GACrE,IAAI,YAAY,WAAW,YAAY,YAAY,MACjD,aAAa,YAAY,SAAS;IAChC,cAAc;IACd,SAAS;GACX,CAAC;GAGH,IAAI,MACF,UAAU,MAAM;IACd,cAAc;IACd,SAAS;GACX,CAAC;GAGH,WAAW,UAAU;GACrB,YAAY,UAAU;EACxB,GAAG,CAAC,CAEoB;EAAG;EAAQ;CAAW;AAChD;AAOA,SAAgB,wBAA0D;CACxE,MAAM,CAAC,YAAY,iBAAiB,SAAkB,KAAK;CAE3D,MAAM,yBAAyB,kBAAkB;EAC/C,cAAc,qBAAqB,MAAM,OAAO,SAAS,eAAe;CAC1E,GAAG,CAAC,CAAC;CAEL,MAAM,wBAAwB,kBAAkB;EAC9C,cAAc,KAAK;CACrB,GAAG,CAAC,CAAC;CAEL,MAAM,SAAS,YAAY,YAAY;EACrC,IAAI,CAAC,qBAAqB,GACxB,MAAM,gBAAgB,OAAO,SAAS,eAAe;OAErD,MAAM,eAAe;CAEzB,GAAG,CAAC,CAAC;CAEL,gBAAgB;EACd,OAAO,UAAU,OAAO,SAAS,iBAAiB;GAChD,cAAc;GACd,SAAS;EACX,CAAC;CACH,GAAG,CAAC,CAAC;CAEL,OAAO;EAAE;EAAQ;CAAW;AAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-hash.mjs","names":[],"sources":["../../src/use-hash/use-hash.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useWindowEvent } from '../use-window-event/use-window-event';\n\nexport interface UseHashInput {\n getInitialValueInEffect?: boolean;\n}\n\nexport type UseHashReturnValue = [string, (value: string) => void];\n\nexport function useHash({ getInitialValueInEffect = true }: UseHashInput = {}): UseHashReturnValue {\n const [hash, setHash] = useState<string>(\n getInitialValueInEffect ? '' : window.location.hash || ''\n );\n\n const setHashHandler = (value: string) => {\n const valueWithHash = value.startsWith('#') ? value : `#${value}`;\n window.location.hash = valueWithHash;\n setHash(valueWithHash);\n };\n\n useWindowEvent('hashchange', () => {\n const newHash = window.location.hash;\n if (hash !== newHash) {\n setHash(newHash);\n }\n });\n\n useEffect(() => {\n if (getInitialValueInEffect) {\n setHash(window.location.hash);\n }\n }, []);\n\n return [hash, setHashHandler];\n}\n\nexport namespace useHash {\n export type Options = UseHashInput;\n export type ReturnValue = UseHashReturnValue;\n}\n"],"mappings":";;;;AASA,SAAgB,QAAQ,EAAE,0BAA0B,SAAuB,
|
|
1
|
+
{"version":3,"file":"use-hash.mjs","names":[],"sources":["../../src/use-hash/use-hash.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useWindowEvent } from '../use-window-event/use-window-event';\n\nexport interface UseHashInput {\n getInitialValueInEffect?: boolean;\n}\n\nexport type UseHashReturnValue = [string, (value: string) => void];\n\nexport function useHash({ getInitialValueInEffect = true }: UseHashInput = {}): UseHashReturnValue {\n const [hash, setHash] = useState<string>(\n getInitialValueInEffect ? '' : window.location.hash || ''\n );\n\n const setHashHandler = (value: string) => {\n const valueWithHash = value.startsWith('#') ? value : `#${value}`;\n window.location.hash = valueWithHash;\n setHash(valueWithHash);\n };\n\n useWindowEvent('hashchange', () => {\n const newHash = window.location.hash;\n if (hash !== newHash) {\n setHash(newHash);\n }\n });\n\n useEffect(() => {\n if (getInitialValueInEffect) {\n setHash(window.location.hash);\n }\n }, []);\n\n return [hash, setHashHandler];\n}\n\nexport namespace useHash {\n export type Options = UseHashInput;\n export type ReturnValue = UseHashReturnValue;\n}\n"],"mappings":";;;;AASA,SAAgB,QAAQ,EAAE,0BAA0B,SAAuB,CAAC,GAAuB;CACjG,MAAM,CAAC,MAAM,WAAW,SACtB,0BAA0B,KAAK,OAAO,SAAS,QAAQ,EACzD;CAEA,MAAM,kBAAkB,UAAkB;EACxC,MAAM,gBAAgB,MAAM,WAAW,GAAG,IAAI,QAAQ,IAAI;EAC1D,OAAO,SAAS,OAAO;EACvB,QAAQ,aAAa;CACvB;CAEA,eAAe,oBAAoB;EACjC,MAAM,UAAU,OAAO,SAAS;EAChC,IAAI,SAAS,SACX,QAAQ,OAAO;CAEnB,CAAC;CAED,gBAAgB;EACd,IAAI,yBACF,QAAQ,OAAO,SAAS,IAAI;CAEhC,GAAG,CAAC,CAAC;CAEL,OAAO,CAAC,MAAM,cAAc;AAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-headroom.mjs","names":[],"sources":["../../src/use-headroom/use-headroom.ts"],"sourcesContent":["import { useEffectEvent, useRef } from 'react';\nimport { useIsomorphicEffect } from '../use-isomorphic-effect/use-isomorphic-effect';\nimport { useScrollDirection } from '../use-scroll-direction/use-scroll-direction';\nimport { useWindowScroll } from '../use-window-scroll/use-window-scroll';\n\nexport { useScrollDirection } from '../use-scroll-direction/use-scroll-direction';\n\nexport const isFixed = (current: number, fixedAt: number) => current <= fixedAt;\nexport const isPinned = (current: number, previous: number) => current <= previous;\nexport const isReleased = (current: number, previous: number, fixedAt: number) =>\n !isPinned(current, previous) && !isFixed(current, fixedAt);\n\nexport const isPinnedOrReleased = (\n current: number,\n fixedAt: number,\n isCurrentlyPinnedRef: React.RefObject<boolean>,\n isScrollingUp: boolean,\n onPin?: () => void,\n onRelease?: () => void\n) => {\n const isInFixedPosition = isFixed(current, fixedAt);\n if (isInFixedPosition && !isCurrentlyPinnedRef.current) {\n isCurrentlyPinnedRef.current = true;\n onPin?.();\n } else if (!isInFixedPosition && isScrollingUp && !isCurrentlyPinnedRef.current) {\n isCurrentlyPinnedRef.current = true;\n onPin?.();\n } else if (!isInFixedPosition && !isScrollingUp && isCurrentlyPinnedRef.current) {\n isCurrentlyPinnedRef.current = false;\n onRelease?.();\n }\n};\n\nexport interface UseHeadroomInput {\n /** Number in px at which element should be fixed */\n fixedAt?: number;\n\n /** Number of px to scroll to fully reveal or hide the element, 100 by default */\n scrollDistance?: number;\n\n /** Called when element is pinned */\n onPin?: () => void;\n\n /** Called when element is at fixed position */\n onFix?: () => void;\n\n /** Called when element is unpinned */\n onRelease?: () => void;\n}\n\nexport interface UseHeadroomReturnValue {\n /** True when the element is at least partially visible */\n pinned: boolean;\n\n /** Reveal progress: 0 = fully hidden, 1 = fully visible */\n scrollProgress: number;\n}\n\nexport function useHeadroom({\n fixedAt = 0,\n scrollDistance = 100,\n onPin,\n onFix,\n onRelease,\n}: UseHeadroomInput = {}): UseHeadroomReturnValue {\n const isCurrentlyPinnedRef = useRef(false);\n const scrollDirection = useScrollDirection();\n const isScrollingUp = scrollDirection === 'up';\n const [{ y: scrollPosition }] = useWindowScroll();\n\n const onPinEvent = useEffectEvent(() => onPin?.());\n const onReleaseEvent = useEffectEvent(() => onRelease?.());\n const onFixEvent = useEffectEvent(() => onFix?.());\n\n useIsomorphicEffect(() => {\n isPinnedOrReleased(\n scrollPosition,\n fixedAt,\n isCurrentlyPinnedRef,\n isScrollingUp,\n onPinEvent,\n onReleaseEvent\n );\n }, [scrollPosition, fixedAt, isScrollingUp]);\n\n const wasFixedRef = useRef(false);\n\n useIsomorphicEffect(() => {\n const currentlyInFixedZone = isFixed(scrollPosition, fixedAt);\n if (currentlyInFixedZone && !wasFixedRef.current) {\n onFixEvent();\n }\n wasFixedRef.current = currentlyInFixedZone;\n }, [scrollPosition, fixedAt]);\n\n // Refs for scroll-progress tracking. Mutated during render (safe for refs).\n const currentlyFixed = isFixed(scrollPosition, fixedAt);\n const prevIsFixedRef = useRef(currentlyFixed);\n const directionChangeScrollYRef = useRef(scrollPosition);\n const progressAtDirectionChangeRef = useRef(currentlyFixed ? 1 : 0);\n const prevIsScrollingUpRef = useRef(isScrollingUp);\n\n // Detect fixed-zone transitions first. When leaving the fixed zone the baseline\n // is anchored at fixedAt (not the current scroll position) so the delta is measured\n // from where the element was last fully visible, regardless of how scroll position\n // was initialised on the first render.\n if (prevIsFixedRef.current !== currentlyFixed) {\n prevIsFixedRef.current = currentlyFixed;\n\n if (!currentlyFixed) {\n directionChangeScrollYRef.current = fixedAt;\n progressAtDirectionChangeRef.current = 1;\n } else {\n directionChangeScrollYRef.current = scrollPosition;\n progressAtDirectionChangeRef.current = 1;\n }\n\n prevIsScrollingUpRef.current = isScrollingUp;\n }\n\n // When scroll direction changes outside the fixed zone, save the current progress\n // so the next direction accumulates from that point (handles partial reveals).\n if (!currentlyFixed && prevIsScrollingUpRef.current !== isScrollingUp) {\n const transitionDelta = Math.abs(scrollPosition - directionChangeScrollYRef.current);\n const transitionProgress = prevIsScrollingUpRef.current\n ? Math.min(progressAtDirectionChangeRef.current + transitionDelta / scrollDistance, 1)\n : Math.max(progressAtDirectionChangeRef.current - transitionDelta / scrollDistance, 0);\n\n prevIsScrollingUpRef.current = isScrollingUp;\n directionChangeScrollYRef.current = scrollPosition;\n progressAtDirectionChangeRef.current = transitionProgress;\n }\n\n let scrollProgress: number;\n\n if (currentlyFixed) {\n scrollProgress = 1;\n } else {\n const scrollDelta = Math.abs(scrollPosition - directionChangeScrollYRef.current);\n\n if (isScrollingUp) {\n scrollProgress = Math.min(\n progressAtDirectionChangeRef.current + scrollDelta / scrollDistance,\n 1\n );\n } else {\n scrollProgress = Math.max(\n progressAtDirectionChangeRef.current - scrollDelta / scrollDistance,\n 0\n );\n }\n }\n\n return { pinned: scrollProgress > 0, scrollProgress };\n}\n\nexport namespace useHeadroom {\n export type Input = UseHeadroomInput;\n export type ReturnValue = UseHeadroomReturnValue;\n}\n"],"mappings":";;;;;;AAOA,MAAa,WAAW,SAAiB,YAAoB,WAAW;AAKxE,MAAa,sBACX,SACA,SACA,sBACA,eACA,OACA,cACG;CACH,MAAM,oBAAoB,QAAQ,SAAS,
|
|
1
|
+
{"version":3,"file":"use-headroom.mjs","names":[],"sources":["../../src/use-headroom/use-headroom.ts"],"sourcesContent":["import { useEffectEvent, useRef } from 'react';\nimport { useIsomorphicEffect } from '../use-isomorphic-effect/use-isomorphic-effect';\nimport { useScrollDirection } from '../use-scroll-direction/use-scroll-direction';\nimport { useWindowScroll } from '../use-window-scroll/use-window-scroll';\n\nexport { useScrollDirection } from '../use-scroll-direction/use-scroll-direction';\n\nexport const isFixed = (current: number, fixedAt: number) => current <= fixedAt;\nexport const isPinned = (current: number, previous: number) => current <= previous;\nexport const isReleased = (current: number, previous: number, fixedAt: number) =>\n !isPinned(current, previous) && !isFixed(current, fixedAt);\n\nexport const isPinnedOrReleased = (\n current: number,\n fixedAt: number,\n isCurrentlyPinnedRef: React.RefObject<boolean>,\n isScrollingUp: boolean,\n onPin?: () => void,\n onRelease?: () => void\n) => {\n const isInFixedPosition = isFixed(current, fixedAt);\n if (isInFixedPosition && !isCurrentlyPinnedRef.current) {\n isCurrentlyPinnedRef.current = true;\n onPin?.();\n } else if (!isInFixedPosition && isScrollingUp && !isCurrentlyPinnedRef.current) {\n isCurrentlyPinnedRef.current = true;\n onPin?.();\n } else if (!isInFixedPosition && !isScrollingUp && isCurrentlyPinnedRef.current) {\n isCurrentlyPinnedRef.current = false;\n onRelease?.();\n }\n};\n\nexport interface UseHeadroomInput {\n /** Number in px at which element should be fixed */\n fixedAt?: number;\n\n /** Number of px to scroll to fully reveal or hide the element, 100 by default */\n scrollDistance?: number;\n\n /** Called when element is pinned */\n onPin?: () => void;\n\n /** Called when element is at fixed position */\n onFix?: () => void;\n\n /** Called when element is unpinned */\n onRelease?: () => void;\n}\n\nexport interface UseHeadroomReturnValue {\n /** True when the element is at least partially visible */\n pinned: boolean;\n\n /** Reveal progress: 0 = fully hidden, 1 = fully visible */\n scrollProgress: number;\n}\n\nexport function useHeadroom({\n fixedAt = 0,\n scrollDistance = 100,\n onPin,\n onFix,\n onRelease,\n}: UseHeadroomInput = {}): UseHeadroomReturnValue {\n const isCurrentlyPinnedRef = useRef(false);\n const scrollDirection = useScrollDirection();\n const isScrollingUp = scrollDirection === 'up';\n const [{ y: scrollPosition }] = useWindowScroll();\n\n const onPinEvent = useEffectEvent(() => onPin?.());\n const onReleaseEvent = useEffectEvent(() => onRelease?.());\n const onFixEvent = useEffectEvent(() => onFix?.());\n\n useIsomorphicEffect(() => {\n isPinnedOrReleased(\n scrollPosition,\n fixedAt,\n isCurrentlyPinnedRef,\n isScrollingUp,\n onPinEvent,\n onReleaseEvent\n );\n }, [scrollPosition, fixedAt, isScrollingUp]);\n\n const wasFixedRef = useRef(false);\n\n useIsomorphicEffect(() => {\n const currentlyInFixedZone = isFixed(scrollPosition, fixedAt);\n if (currentlyInFixedZone && !wasFixedRef.current) {\n onFixEvent();\n }\n wasFixedRef.current = currentlyInFixedZone;\n }, [scrollPosition, fixedAt]);\n\n // Refs for scroll-progress tracking. Mutated during render (safe for refs).\n const currentlyFixed = isFixed(scrollPosition, fixedAt);\n const prevIsFixedRef = useRef(currentlyFixed);\n const directionChangeScrollYRef = useRef(scrollPosition);\n const progressAtDirectionChangeRef = useRef(currentlyFixed ? 1 : 0);\n const prevIsScrollingUpRef = useRef(isScrollingUp);\n\n // Detect fixed-zone transitions first. When leaving the fixed zone the baseline\n // is anchored at fixedAt (not the current scroll position) so the delta is measured\n // from where the element was last fully visible, regardless of how scroll position\n // was initialised on the first render.\n if (prevIsFixedRef.current !== currentlyFixed) {\n prevIsFixedRef.current = currentlyFixed;\n\n if (!currentlyFixed) {\n directionChangeScrollYRef.current = fixedAt;\n progressAtDirectionChangeRef.current = 1;\n } else {\n directionChangeScrollYRef.current = scrollPosition;\n progressAtDirectionChangeRef.current = 1;\n }\n\n prevIsScrollingUpRef.current = isScrollingUp;\n }\n\n // When scroll direction changes outside the fixed zone, save the current progress\n // so the next direction accumulates from that point (handles partial reveals).\n if (!currentlyFixed && prevIsScrollingUpRef.current !== isScrollingUp) {\n const transitionDelta = Math.abs(scrollPosition - directionChangeScrollYRef.current);\n const transitionProgress = prevIsScrollingUpRef.current\n ? Math.min(progressAtDirectionChangeRef.current + transitionDelta / scrollDistance, 1)\n : Math.max(progressAtDirectionChangeRef.current - transitionDelta / scrollDistance, 0);\n\n prevIsScrollingUpRef.current = isScrollingUp;\n directionChangeScrollYRef.current = scrollPosition;\n progressAtDirectionChangeRef.current = transitionProgress;\n }\n\n let scrollProgress: number;\n\n if (currentlyFixed) {\n scrollProgress = 1;\n } else {\n const scrollDelta = Math.abs(scrollPosition - directionChangeScrollYRef.current);\n\n if (isScrollingUp) {\n scrollProgress = Math.min(\n progressAtDirectionChangeRef.current + scrollDelta / scrollDistance,\n 1\n );\n } else {\n scrollProgress = Math.max(\n progressAtDirectionChangeRef.current - scrollDelta / scrollDistance,\n 0\n );\n }\n }\n\n return { pinned: scrollProgress > 0, scrollProgress };\n}\n\nexport namespace useHeadroom {\n export type Input = UseHeadroomInput;\n export type ReturnValue = UseHeadroomReturnValue;\n}\n"],"mappings":";;;;;;AAOA,MAAa,WAAW,SAAiB,YAAoB,WAAW;AAKxE,MAAa,sBACX,SACA,SACA,sBACA,eACA,OACA,cACG;CACH,MAAM,oBAAoB,QAAQ,SAAS,OAAO;CAClD,IAAI,qBAAqB,CAAC,qBAAqB,SAAS;EACtD,qBAAqB,UAAU;EAC/B,QAAQ;CACV,OAAO,IAAI,CAAC,qBAAqB,iBAAiB,CAAC,qBAAqB,SAAS;EAC/E,qBAAqB,UAAU;EAC/B,QAAQ;CACV,OAAO,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,qBAAqB,SAAS;EAC/E,qBAAqB,UAAU;EAC/B,YAAY;CACd;AACF;AA2BA,SAAgB,YAAY,EAC1B,UAAU,GACV,iBAAiB,KACjB,OACA,OACA,cACoB,CAAC,GAA2B;CAChD,MAAM,uBAAuB,OAAO,KAAK;CAEzC,MAAM,gBADkB,mBACY,MAAM;CAC1C,MAAM,CAAC,EAAE,GAAG,oBAAoB,gBAAgB;CAEhD,MAAM,aAAa,qBAAqB,QAAQ,CAAC;CACjD,MAAM,iBAAiB,qBAAqB,YAAY,CAAC;CACzD,MAAM,aAAa,qBAAqB,QAAQ,CAAC;CAEjD,0BAA0B;EACxB,mBACE,gBACA,SACA,sBACA,eACA,YACA,cACF;CACF,GAAG;EAAC;EAAgB;EAAS;CAAa,CAAC;CAE3C,MAAM,cAAc,OAAO,KAAK;CAEhC,0BAA0B;EACxB,MAAM,uBAAuB,QAAQ,gBAAgB,OAAO;EAC5D,IAAI,wBAAwB,CAAC,YAAY,SACvC,WAAW;EAEb,YAAY,UAAU;CACxB,GAAG,CAAC,gBAAgB,OAAO,CAAC;CAG5B,MAAM,iBAAiB,QAAQ,gBAAgB,OAAO;CACtD,MAAM,iBAAiB,OAAO,cAAc;CAC5C,MAAM,4BAA4B,OAAO,cAAc;CACvD,MAAM,+BAA+B,OAAO,iBAAiB,IAAI,CAAC;CAClE,MAAM,uBAAuB,OAAO,aAAa;CAMjD,IAAI,eAAe,YAAY,gBAAgB;EAC7C,eAAe,UAAU;EAEzB,IAAI,CAAC,gBAAgB;GACnB,0BAA0B,UAAU;GACpC,6BAA6B,UAAU;EACzC,OAAO;GACL,0BAA0B,UAAU;GACpC,6BAA6B,UAAU;EACzC;EAEA,qBAAqB,UAAU;CACjC;CAIA,IAAI,CAAC,kBAAkB,qBAAqB,YAAY,eAAe;EACrE,MAAM,kBAAkB,KAAK,IAAI,iBAAiB,0BAA0B,OAAO;EACnF,MAAM,qBAAqB,qBAAqB,UAC5C,KAAK,IAAI,6BAA6B,UAAU,kBAAkB,gBAAgB,CAAC,IACnF,KAAK,IAAI,6BAA6B,UAAU,kBAAkB,gBAAgB,CAAC;EAEvF,qBAAqB,UAAU;EAC/B,0BAA0B,UAAU;EACpC,6BAA6B,UAAU;CACzC;CAEA,IAAI;CAEJ,IAAI,gBACF,iBAAiB;MACZ;EACL,MAAM,cAAc,KAAK,IAAI,iBAAiB,0BAA0B,OAAO;EAE/E,IAAI,eACF,iBAAiB,KAAK,IACpB,6BAA6B,UAAU,cAAc,gBACrD,CACF;OAEA,iBAAiB,KAAK,IACpB,6BAA6B,UAAU,cAAc,gBACrD,CACF;CAEJ;CAEA,OAAO;EAAE,QAAQ,iBAAiB;EAAG;CAAe;AACtD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-hotkey.mjs","names":[],"sources":["../../src/use-hotkeys/parse-hotkey.ts"],"sourcesContent":["export interface KeyboardModifiers {\n alt: boolean;\n ctrl: boolean;\n meta: boolean;\n mod: boolean;\n shift: boolean;\n}\n\nexport interface Hotkey extends KeyboardModifiers {\n key?: string;\n}\n\ntype CheckHotkeyMatch = (event: KeyboardEvent) => boolean;\n\nconst keyNameMap: Record<string, string> = {\n ' ': 'space',\n ArrowLeft: 'arrowleft',\n ArrowRight: 'arrowright',\n ArrowUp: 'arrowup',\n ArrowDown: 'arrowdown',\n Escape: 'escape',\n Esc: 'escape',\n esc: 'escape',\n Enter: 'enter',\n Tab: 'tab',\n Backspace: 'backspace',\n Delete: 'delete',\n Insert: 'insert',\n Home: 'home',\n End: 'end',\n PageUp: 'pageup',\n PageDown: 'pagedown',\n '+': 'plus',\n '-': 'minus',\n '*': 'asterisk',\n '/': 'slash',\n};\n\nfunction normalizeKey(key: string): string {\n const lowerKey = key.replace('Key', '').toLowerCase();\n return keyNameMap[key] || lowerKey;\n}\n\nexport function parseHotkey(hotkey: string): Hotkey {\n const keys = hotkey\n .toLowerCase()\n .split('+')\n .map((part) => part.trim());\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n shift: keys.includes('shift'),\n };\n\n const reservedKeys = ['alt', 'ctrl', 'meta', 'shift', 'mod'];\n\n const freeKey = keys.find((key) => !reservedKeys.includes(key));\n\n return {\n ...modifiers,\n key: freeKey === '[plus]' ? '+' : freeKey,\n };\n}\n\nfunction isExactHotkey(hotkey: Hotkey, event: KeyboardEvent, usePhysicalKeys?: boolean): boolean {\n const { alt, ctrl, meta, mod, shift, key } = hotkey;\n const { altKey, ctrlKey, metaKey, shiftKey, key: pressedKey, code: pressedCode } = event;\n\n if (alt !== altKey) {\n return false;\n }\n\n if (mod) {\n if (!ctrlKey && !metaKey) {\n return false;\n }\n } else {\n if (ctrl !== ctrlKey) {\n return false;\n }\n if (meta !== metaKey) {\n return false;\n }\n }\n if (shift !== shiftKey) {\n return false;\n }\n\n if (\n key &&\n (usePhysicalKeys\n ? normalizeKey(pressedCode) === normalizeKey(key)\n : normalizeKey(pressedKey ?? pressedCode) === normalizeKey(key))\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function getHotkeyMatcher(hotkey: string, usePhysicalKeys?: boolean): CheckHotkeyMatch {\n return (event) => isExactHotkey(parseHotkey(hotkey), event, usePhysicalKeys);\n}\n\nexport interface HotkeyItemOptions {\n preventDefault?: boolean;\n usePhysicalKeys?: boolean;\n}\n\ntype HotkeyItem = [string, (event: any) => void, HotkeyItemOptions?];\n\nexport function getHotkeyHandler(hotkeys: HotkeyItem[]) {\n return (event: React.KeyboardEvent<HTMLElement> | KeyboardEvent) => {\n const _event = 'nativeEvent' in event ? event.nativeEvent : event;\n hotkeys.forEach(\n ([hotkey, handler, options = { preventDefault: true, usePhysicalKeys: false }]) => {\n if (getHotkeyMatcher(hotkey, options.usePhysicalKeys)(_event)) {\n if (options.preventDefault) {\n event.preventDefault();\n }\n\n handler(_event);\n }\n }\n );\n };\n}\n"],"mappings":";;AAcA,MAAM,aAAqC;CACzC,KAAK;CACL,WAAW;CACX,YAAY;CACZ,SAAS;CACT,WAAW;CACX,QAAQ;CACR,KAAK;CACL,KAAK;CACL,OAAO;CACP,KAAK;CACL,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,KAAK;CACL,QAAQ;CACR,UAAU;CACV,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;
|
|
1
|
+
{"version":3,"file":"parse-hotkey.mjs","names":[],"sources":["../../src/use-hotkeys/parse-hotkey.ts"],"sourcesContent":["export interface KeyboardModifiers {\n alt: boolean;\n ctrl: boolean;\n meta: boolean;\n mod: boolean;\n shift: boolean;\n}\n\nexport interface Hotkey extends KeyboardModifiers {\n key?: string;\n}\n\ntype CheckHotkeyMatch = (event: KeyboardEvent) => boolean;\n\nconst keyNameMap: Record<string, string> = {\n ' ': 'space',\n ArrowLeft: 'arrowleft',\n ArrowRight: 'arrowright',\n ArrowUp: 'arrowup',\n ArrowDown: 'arrowdown',\n Escape: 'escape',\n Esc: 'escape',\n esc: 'escape',\n Enter: 'enter',\n Tab: 'tab',\n Backspace: 'backspace',\n Delete: 'delete',\n Insert: 'insert',\n Home: 'home',\n End: 'end',\n PageUp: 'pageup',\n PageDown: 'pagedown',\n '+': 'plus',\n '-': 'minus',\n '*': 'asterisk',\n '/': 'slash',\n};\n\nfunction normalizeKey(key: string): string {\n const lowerKey = key.replace('Key', '').toLowerCase();\n return keyNameMap[key] || lowerKey;\n}\n\nexport function parseHotkey(hotkey: string): Hotkey {\n const keys = hotkey\n .toLowerCase()\n .split('+')\n .map((part) => part.trim());\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n shift: keys.includes('shift'),\n };\n\n const reservedKeys = ['alt', 'ctrl', 'meta', 'shift', 'mod'];\n\n const freeKey = keys.find((key) => !reservedKeys.includes(key));\n\n return {\n ...modifiers,\n key: freeKey === '[plus]' ? '+' : freeKey,\n };\n}\n\nfunction isExactHotkey(hotkey: Hotkey, event: KeyboardEvent, usePhysicalKeys?: boolean): boolean {\n const { alt, ctrl, meta, mod, shift, key } = hotkey;\n const { altKey, ctrlKey, metaKey, shiftKey, key: pressedKey, code: pressedCode } = event;\n\n if (alt !== altKey) {\n return false;\n }\n\n if (mod) {\n if (!ctrlKey && !metaKey) {\n return false;\n }\n } else {\n if (ctrl !== ctrlKey) {\n return false;\n }\n if (meta !== metaKey) {\n return false;\n }\n }\n if (shift !== shiftKey) {\n return false;\n }\n\n if (\n key &&\n (usePhysicalKeys\n ? normalizeKey(pressedCode) === normalizeKey(key)\n : normalizeKey(pressedKey ?? pressedCode) === normalizeKey(key))\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function getHotkeyMatcher(hotkey: string, usePhysicalKeys?: boolean): CheckHotkeyMatch {\n return (event) => isExactHotkey(parseHotkey(hotkey), event, usePhysicalKeys);\n}\n\nexport interface HotkeyItemOptions {\n preventDefault?: boolean;\n usePhysicalKeys?: boolean;\n}\n\ntype HotkeyItem = [string, (event: any) => void, HotkeyItemOptions?];\n\nexport function getHotkeyHandler(hotkeys: HotkeyItem[]) {\n return (event: React.KeyboardEvent<HTMLElement> | KeyboardEvent) => {\n const _event = 'nativeEvent' in event ? event.nativeEvent : event;\n hotkeys.forEach(\n ([hotkey, handler, options = { preventDefault: true, usePhysicalKeys: false }]) => {\n if (getHotkeyMatcher(hotkey, options.usePhysicalKeys)(_event)) {\n if (options.preventDefault) {\n event.preventDefault();\n }\n\n handler(_event);\n }\n }\n );\n };\n}\n"],"mappings":";;AAcA,MAAM,aAAqC;CACzC,KAAK;CACL,WAAW;CACX,YAAY;CACZ,SAAS;CACT,WAAW;CACX,QAAQ;CACR,KAAK;CACL,KAAK;CACL,OAAO;CACP,KAAK;CACL,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,KAAK;CACL,QAAQ;CACR,UAAU;CACV,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;AACP;AAEA,SAAS,aAAa,KAAqB;CACzC,MAAM,WAAW,IAAI,QAAQ,OAAO,EAAE,EAAE,YAAY;CACpD,OAAO,WAAW,QAAQ;AAC5B;AAEA,SAAgB,YAAY,QAAwB;CAClD,MAAM,OAAO,OACV,YAAY,EACZ,MAAM,GAAG,EACT,KAAK,SAAS,KAAK,KAAK,CAAC;CAE5B,MAAM,YAA+B;EACnC,KAAK,KAAK,SAAS,KAAK;EACxB,MAAM,KAAK,SAAS,MAAM;EAC1B,MAAM,KAAK,SAAS,MAAM;EAC1B,KAAK,KAAK,SAAS,KAAK;EACxB,OAAO,KAAK,SAAS,OAAO;CAC9B;CAEA,MAAM,eAAe;EAAC;EAAO;EAAQ;EAAQ;EAAS;CAAK;CAE3D,MAAM,UAAU,KAAK,MAAM,QAAQ,CAAC,aAAa,SAAS,GAAG,CAAC;CAE9D,OAAO;EACL,GAAG;EACH,KAAK,YAAY,WAAW,MAAM;CACpC;AACF;AAEA,SAAS,cAAc,QAAgB,OAAsB,iBAAoC;CAC/F,MAAM,EAAE,KAAK,MAAM,MAAM,KAAK,OAAO,QAAQ;CAC7C,MAAM,EAAE,QAAQ,SAAS,SAAS,UAAU,KAAK,YAAY,MAAM,gBAAgB;CAEnF,IAAI,QAAQ,QACV,OAAO;CAGT,IAAI;MACE,CAAC,WAAW,CAAC,SACf,OAAO;CAAA,OAEJ;EACL,IAAI,SAAS,SACX,OAAO;EAET,IAAI,SAAS,SACX,OAAO;CAEX;CACA,IAAI,UAAU,UACZ,OAAO;CAGT,IACE,QACC,kBACG,aAAa,WAAW,MAAM,aAAa,GAAG,IAC9C,aAAa,cAAc,WAAW,MAAM,aAAa,GAAG,IAEhE,OAAO;CAGT,OAAO;AACT;AAEA,SAAgB,iBAAiB,QAAgB,iBAA6C;CAC5F,QAAQ,UAAU,cAAc,YAAY,MAAM,GAAG,OAAO,eAAe;AAC7E;AASA,SAAgB,iBAAiB,SAAuB;CACtD,QAAQ,UAA4D;EAClE,MAAM,SAAS,iBAAiB,QAAQ,MAAM,cAAc;EAC5D,QAAQ,SACL,CAAC,QAAQ,SAAS,UAAU;GAAE,gBAAgB;GAAM,iBAAiB;EAAM,OAAO;GACjF,IAAI,iBAAiB,QAAQ,QAAQ,eAAe,EAAE,MAAM,GAAG;IAC7D,IAAI,QAAQ,gBACV,MAAM,eAAe;IAGvB,QAAQ,MAAM;GAChB;EACF,CACF;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-hotkeys.mjs","names":[],"sources":["../../src/use-hotkeys/use-hotkeys.ts"],"sourcesContent":["import { useEffect, useEffectEvent } from 'react';\nimport { getHotkeyHandler, getHotkeyMatcher, HotkeyItemOptions } from './parse-hotkey';\n\nexport type { HotkeyItemOptions };\nexport { getHotkeyHandler };\n\nexport type HotkeyItem = [string, (event: KeyboardEvent) => void, HotkeyItemOptions?];\n\nfunction shouldFireEvent(\n event: KeyboardEvent,\n tagsToIgnore: string[],\n triggerOnContentEditable = false\n) {\n if (event.target instanceof HTMLElement) {\n if (triggerOnContentEditable) {\n return !tagsToIgnore.includes(event.target.tagName);\n }\n\n return !event.target.isContentEditable && !tagsToIgnore.includes(event.target.tagName);\n }\n\n return true;\n}\n\nexport function useHotkeys(\n hotkeys: HotkeyItem[],\n tagsToIgnore: string[] = ['INPUT', 'TEXTAREA', 'SELECT'],\n triggerOnContentEditable = false\n) {\n const handleKeydown = useEffectEvent((event: KeyboardEvent) => {\n hotkeys.forEach(\n ([hotkey, handler, options = { preventDefault: true, usePhysicalKeys: false }]) => {\n if (\n getHotkeyMatcher(hotkey, options.usePhysicalKeys)(event) &&\n shouldFireEvent(event, tagsToIgnore, triggerOnContentEditable)\n ) {\n if (options.preventDefault) {\n event.preventDefault();\n }\n\n handler(event);\n }\n }\n );\n });\n\n useEffect(() => {\n document.documentElement.addEventListener('keydown', handleKeydown);\n return () => document.documentElement.removeEventListener('keydown', handleKeydown);\n }, []);\n}\n\nexport namespace useHotkeys {\n export type Hotkey = HotkeyItem;\n}\n"],"mappings":";;;;AAQA,SAAS,gBACP,OACA,cACA,2BAA2B,OAC3B;
|
|
1
|
+
{"version":3,"file":"use-hotkeys.mjs","names":[],"sources":["../../src/use-hotkeys/use-hotkeys.ts"],"sourcesContent":["import { useEffect, useEffectEvent } from 'react';\nimport { getHotkeyHandler, getHotkeyMatcher, HotkeyItemOptions } from './parse-hotkey';\n\nexport type { HotkeyItemOptions };\nexport { getHotkeyHandler };\n\nexport type HotkeyItem = [string, (event: KeyboardEvent) => void, HotkeyItemOptions?];\n\nfunction shouldFireEvent(\n event: KeyboardEvent,\n tagsToIgnore: string[],\n triggerOnContentEditable = false\n) {\n if (event.target instanceof HTMLElement) {\n if (triggerOnContentEditable) {\n return !tagsToIgnore.includes(event.target.tagName);\n }\n\n return !event.target.isContentEditable && !tagsToIgnore.includes(event.target.tagName);\n }\n\n return true;\n}\n\nexport function useHotkeys(\n hotkeys: HotkeyItem[],\n tagsToIgnore: string[] = ['INPUT', 'TEXTAREA', 'SELECT'],\n triggerOnContentEditable = false\n) {\n const handleKeydown = useEffectEvent((event: KeyboardEvent) => {\n hotkeys.forEach(\n ([hotkey, handler, options = { preventDefault: true, usePhysicalKeys: false }]) => {\n if (\n getHotkeyMatcher(hotkey, options.usePhysicalKeys)(event) &&\n shouldFireEvent(event, tagsToIgnore, triggerOnContentEditable)\n ) {\n if (options.preventDefault) {\n event.preventDefault();\n }\n\n handler(event);\n }\n }\n );\n });\n\n useEffect(() => {\n document.documentElement.addEventListener('keydown', handleKeydown);\n return () => document.documentElement.removeEventListener('keydown', handleKeydown);\n }, []);\n}\n\nexport namespace useHotkeys {\n export type Hotkey = HotkeyItem;\n}\n"],"mappings":";;;;AAQA,SAAS,gBACP,OACA,cACA,2BAA2B,OAC3B;CACA,IAAI,MAAM,kBAAkB,aAAa;EACvC,IAAI,0BACF,OAAO,CAAC,aAAa,SAAS,MAAM,OAAO,OAAO;EAGpD,OAAO,CAAC,MAAM,OAAO,qBAAqB,CAAC,aAAa,SAAS,MAAM,OAAO,OAAO;CACvF;CAEA,OAAO;AACT;AAEA,SAAgB,WACd,SACA,eAAyB;CAAC;CAAS;CAAY;AAAQ,GACvD,2BAA2B,OAC3B;CACA,MAAM,gBAAgB,gBAAgB,UAAyB;EAC7D,QAAQ,SACL,CAAC,QAAQ,SAAS,UAAU;GAAE,gBAAgB;GAAM,iBAAiB;EAAM,OAAO;GACjF,IACE,iBAAiB,QAAQ,QAAQ,eAAe,EAAE,KAAK,KACvD,gBAAgB,OAAO,cAAc,wBAAwB,GAC7D;IACA,IAAI,QAAQ,gBACV,MAAM,eAAe;IAGvB,QAAQ,KAAK;GACf;EACF,CACF;CACF,CAAC;CAED,gBAAgB;EACd,SAAS,gBAAgB,iBAAiB,WAAW,aAAa;EAClE,aAAa,SAAS,gBAAgB,oBAAoB,WAAW,aAAa;CACpF,GAAG,CAAC,CAAC;AACP"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-hover.mjs","names":[],"sources":["../../src/use-hover/use-hover.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface UseHoverReturnValue<T extends HTMLElement = any> {\n hovered: boolean;\n ref: React.RefCallback<T | null>;\n}\n\nexport function useHover<T extends HTMLElement = any>(): UseHoverReturnValue<T> {\n const [hovered, setHovered] = useState(false);\n const previousNode = useRef<HTMLElement>(null);\n\n const handleMouseEnter = useCallback(() => {\n setHovered(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setHovered(false);\n }, []);\n\n const ref: React.RefCallback<T | null> = useCallback(\n (node) => {\n if (previousNode.current) {\n previousNode.current.removeEventListener('mouseenter', handleMouseEnter);\n previousNode.current.removeEventListener('mouseleave', handleMouseLeave);\n }\n\n if (node) {\n node.addEventListener('mouseenter', handleMouseEnter);\n node.addEventListener('mouseleave', handleMouseLeave);\n }\n\n previousNode.current = node;\n\n return () => {\n previousNode.current = null;\n setHovered(false);\n };\n },\n [handleMouseEnter, handleMouseLeave]\n );\n\n return { ref, hovered };\n}\n\nexport namespace useHover {\n export type ReturnValue<T extends HTMLElement> = UseHoverReturnValue<T>;\n}\n"],"mappings":";;;AAOA,SAAgB,WAAgE;CAC9E,MAAM,CAAC,SAAS,cAAc,SAAS,
|
|
1
|
+
{"version":3,"file":"use-hover.mjs","names":[],"sources":["../../src/use-hover/use-hover.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface UseHoverReturnValue<T extends HTMLElement = any> {\n hovered: boolean;\n ref: React.RefCallback<T | null>;\n}\n\nexport function useHover<T extends HTMLElement = any>(): UseHoverReturnValue<T> {\n const [hovered, setHovered] = useState(false);\n const previousNode = useRef<HTMLElement>(null);\n\n const handleMouseEnter = useCallback(() => {\n setHovered(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setHovered(false);\n }, []);\n\n const ref: React.RefCallback<T | null> = useCallback(\n (node) => {\n if (previousNode.current) {\n previousNode.current.removeEventListener('mouseenter', handleMouseEnter);\n previousNode.current.removeEventListener('mouseleave', handleMouseLeave);\n }\n\n if (node) {\n node.addEventListener('mouseenter', handleMouseEnter);\n node.addEventListener('mouseleave', handleMouseLeave);\n }\n\n previousNode.current = node;\n\n return () => {\n previousNode.current = null;\n setHovered(false);\n };\n },\n [handleMouseEnter, handleMouseLeave]\n );\n\n return { ref, hovered };\n}\n\nexport namespace useHover {\n export type ReturnValue<T extends HTMLElement> = UseHoverReturnValue<T>;\n}\n"],"mappings":";;;AAOA,SAAgB,WAAgE;CAC9E,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,eAAe,OAAoB,IAAI;CAE7C,MAAM,mBAAmB,kBAAkB;EACzC,WAAW,IAAI;CACjB,GAAG,CAAC,CAAC;CAEL,MAAM,mBAAmB,kBAAkB;EACzC,WAAW,KAAK;CAClB,GAAG,CAAC,CAAC;CAwBL,OAAO;EAAE,KAtBgC,aACtC,SAAS;GACR,IAAI,aAAa,SAAS;IACxB,aAAa,QAAQ,oBAAoB,cAAc,gBAAgB;IACvE,aAAa,QAAQ,oBAAoB,cAAc,gBAAgB;GACzE;GAEA,IAAI,MAAM;IACR,KAAK,iBAAiB,cAAc,gBAAgB;IACpD,KAAK,iBAAiB,cAAc,gBAAgB;GACtD;GAEA,aAAa,UAAU;GAEvB,aAAa;IACX,aAAa,UAAU;IACvB,WAAW,KAAK;GAClB;EACF,GACA,CAAC,kBAAkB,gBAAgB,CAG1B;EAAG;CAAQ;AACxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-id.mjs","names":["useId","useReactId"],"sources":["../../src/use-id/use-id.ts"],"sourcesContent":["import { useId as useReactId, useState } from 'react';\nimport { useIsomorphicEffect } from '../use-isomorphic-effect/use-isomorphic-effect';\nimport { randomId } from '../utils';\n\nexport function useId(staticId?: string) {\n const reactId = useReactId();\n const [uuid, setUuid] = useState(`mantine-${reactId.replace(/:/g, '')}`);\n\n useIsomorphicEffect(() => {\n setUuid(randomId());\n }, []);\n\n if (typeof staticId === 'string') {\n return staticId;\n }\n\n return uuid;\n}\n"],"mappings":";;;;;AAIA,SAAgBA,QAAM,UAAmB;CAEvC,MAAM,CAAC,MAAM,WAAW,SAAS,WADjBC,
|
|
1
|
+
{"version":3,"file":"use-id.mjs","names":["useId","useReactId"],"sources":["../../src/use-id/use-id.ts"],"sourcesContent":["import { useId as useReactId, useState } from 'react';\nimport { useIsomorphicEffect } from '../use-isomorphic-effect/use-isomorphic-effect';\nimport { randomId } from '../utils';\n\nexport function useId(staticId?: string) {\n const reactId = useReactId();\n const [uuid, setUuid] = useState(`mantine-${reactId.replace(/:/g, '')}`);\n\n useIsomorphicEffect(() => {\n setUuid(randomId());\n }, []);\n\n if (typeof staticId === 'string') {\n return staticId;\n }\n\n return uuid;\n}\n"],"mappings":";;;;;AAIA,SAAgBA,QAAM,UAAmB;CAEvC,MAAM,CAAC,MAAM,WAAW,SAAS,WADjBC,MACkC,EAAE,QAAQ,MAAM,EAAE,GAAG;CAEvE,0BAA0B;EACxB,QAAQ,SAAS,CAAC;CACpB,GAAG,CAAC,CAAC;CAEL,IAAI,OAAO,aAAa,UACtB,OAAO;CAGT,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-idle.mjs","names":[],"sources":["../../src/use-idle/use-idle.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nexport interface UseIdleOptions {\n events?: (keyof DocumentEventMap)[];\n initialState?: boolean;\n}\n\nconst DEFAULT_OPTIONS: Required<UseIdleOptions> = {\n events: ['keydown', 'mousemove', 'touchmove', 'click', 'scroll', 'wheel'],\n initialState: true,\n};\n\nexport function useIdle(timeout: number, options?: UseIdleOptions) {\n const { events, initialState } = { ...DEFAULT_OPTIONS, ...options };\n const [idle, setIdle] = useState(initialState);\n const timer = useRef(-1);\n\n useEffect(() => {\n const handleEvents = () => {\n setIdle(false);\n\n if (timer.current) {\n window.clearTimeout(timer.current);\n }\n\n timer.current = window.setTimeout(() => {\n setIdle(true);\n }, timeout);\n };\n\n events.forEach((event) => document.addEventListener(event, handleEvents));\n\n // Start the timer immediately instead of waiting for the first event to happen\n timer.current = window.setTimeout(() => {\n setIdle(true);\n }, timeout);\n\n return () => {\n events.forEach((event) => document.removeEventListener(event, handleEvents));\n window.clearTimeout(timer.current);\n timer.current = -1;\n };\n }, [timeout]);\n\n return idle;\n}\n\nexport namespace useIdle {\n export type Options = UseIdleOptions;\n}\n"],"mappings":";;;AAOA,MAAM,kBAA4C;CAChD,QAAQ;EAAC;EAAW;EAAa;EAAa;EAAS;EAAU;
|
|
1
|
+
{"version":3,"file":"use-idle.mjs","names":[],"sources":["../../src/use-idle/use-idle.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nexport interface UseIdleOptions {\n events?: (keyof DocumentEventMap)[];\n initialState?: boolean;\n}\n\nconst DEFAULT_OPTIONS: Required<UseIdleOptions> = {\n events: ['keydown', 'mousemove', 'touchmove', 'click', 'scroll', 'wheel'],\n initialState: true,\n};\n\nexport function useIdle(timeout: number, options?: UseIdleOptions) {\n const { events, initialState } = { ...DEFAULT_OPTIONS, ...options };\n const [idle, setIdle] = useState(initialState);\n const timer = useRef(-1);\n\n useEffect(() => {\n const handleEvents = () => {\n setIdle(false);\n\n if (timer.current) {\n window.clearTimeout(timer.current);\n }\n\n timer.current = window.setTimeout(() => {\n setIdle(true);\n }, timeout);\n };\n\n events.forEach((event) => document.addEventListener(event, handleEvents));\n\n // Start the timer immediately instead of waiting for the first event to happen\n timer.current = window.setTimeout(() => {\n setIdle(true);\n }, timeout);\n\n return () => {\n events.forEach((event) => document.removeEventListener(event, handleEvents));\n window.clearTimeout(timer.current);\n timer.current = -1;\n };\n }, [timeout]);\n\n return idle;\n}\n\nexport namespace useIdle {\n export type Options = UseIdleOptions;\n}\n"],"mappings":";;;AAOA,MAAM,kBAA4C;CAChD,QAAQ;EAAC;EAAW;EAAa;EAAa;EAAS;EAAU;CAAO;CACxE,cAAc;AAChB;AAEA,SAAgB,QAAQ,SAAiB,SAA0B;CACjE,MAAM,EAAE,QAAQ,iBAAiB;EAAE,GAAG;EAAiB,GAAG;CAAQ;CAClE,MAAM,CAAC,MAAM,WAAW,SAAS,YAAY;CAC7C,MAAM,QAAQ,OAAO,EAAE;CAEvB,gBAAgB;EACd,MAAM,qBAAqB;GACzB,QAAQ,KAAK;GAEb,IAAI,MAAM,SACR,OAAO,aAAa,MAAM,OAAO;GAGnC,MAAM,UAAU,OAAO,iBAAiB;IACtC,QAAQ,IAAI;GACd,GAAG,OAAO;EACZ;EAEA,OAAO,SAAS,UAAU,SAAS,iBAAiB,OAAO,YAAY,CAAC;EAGxE,MAAM,UAAU,OAAO,iBAAiB;GACtC,QAAQ,IAAI;EACd,GAAG,OAAO;EAEV,aAAa;GACX,OAAO,SAAS,UAAU,SAAS,oBAAoB,OAAO,YAAY,CAAC;GAC3E,OAAO,aAAa,MAAM,OAAO;GACjC,MAAM,UAAU;EAClB;CACF,GAAG,CAAC,OAAO,CAAC;CAEZ,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-in-viewport.mjs","names":[],"sources":["../../src/use-in-viewport/use-in-viewport.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface UseInViewportReturnValue<T extends HTMLElement = any> {\n inViewport: boolean;\n ref: React.RefCallback<T | null>;\n}\n\nexport function useInViewport<T extends HTMLElement = any>(): UseInViewportReturnValue<T> {\n const observer = useRef<IntersectionObserver | null>(null);\n const [inViewport, setInViewport] = useState(false);\n\n const ref: React.RefCallback<T | null> = useCallback((node) => {\n if (typeof IntersectionObserver !== 'undefined') {\n observer.current?.disconnect();\n\n if (node) {\n observer.current = new IntersectionObserver((entries) => {\n const lastEntry = entries[entries.length - 1];\n setInViewport(lastEntry.isIntersecting);\n });\n observer.current.observe(node);\n } else {\n observer.current = null;\n setInViewport(false);\n }\n }\n }, []);\n\n return { ref, inViewport };\n}\n\nexport namespace useInViewport {\n export type ReturnValue<T extends HTMLElement> = UseInViewportReturnValue<T>;\n}\n"],"mappings":";;;AAOA,SAAgB,gBAA0E;CACxF,MAAM,WAAW,OAAoC,
|
|
1
|
+
{"version":3,"file":"use-in-viewport.mjs","names":[],"sources":["../../src/use-in-viewport/use-in-viewport.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface UseInViewportReturnValue<T extends HTMLElement = any> {\n inViewport: boolean;\n ref: React.RefCallback<T | null>;\n}\n\nexport function useInViewport<T extends HTMLElement = any>(): UseInViewportReturnValue<T> {\n const observer = useRef<IntersectionObserver | null>(null);\n const [inViewport, setInViewport] = useState(false);\n\n const ref: React.RefCallback<T | null> = useCallback((node) => {\n if (typeof IntersectionObserver !== 'undefined') {\n observer.current?.disconnect();\n\n if (node) {\n observer.current = new IntersectionObserver((entries) => {\n const lastEntry = entries[entries.length - 1];\n setInViewport(lastEntry.isIntersecting);\n });\n observer.current.observe(node);\n } else {\n observer.current = null;\n setInViewport(false);\n }\n }\n }, []);\n\n return { ref, inViewport };\n}\n\nexport namespace useInViewport {\n export type ReturnValue<T extends HTMLElement> = UseInViewportReturnValue<T>;\n}\n"],"mappings":";;;AAOA,SAAgB,gBAA0E;CACxF,MAAM,WAAW,OAAoC,IAAI;CACzD,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAmBlD,OAAO;EAAE,KAjBgC,aAAa,SAAS;GAC7D,IAAI,OAAO,yBAAyB,aAAa;IAC/C,SAAS,SAAS,WAAW;IAE7B,IAAI,MAAM;KACR,SAAS,UAAU,IAAI,sBAAsB,YAAY;MACvD,MAAM,YAAY,QAAQ,QAAQ,SAAS;MAC3C,cAAc,UAAU,cAAc;KACxC,CAAC;KACD,SAAS,QAAQ,QAAQ,IAAI;IAC/B,OAAO;KACL,SAAS,UAAU;KACnB,cAAc,KAAK;IACrB;GACF;EACF,GAAG,CAAC,CAEO;EAAG;CAAW;AAC3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-input-state.mjs","names":[],"sources":["../../src/use-input-state/use-input-state.ts"],"sourcesContent":["import { useState } from 'react';\n\nexport function getInputOnChange<T>(\n setValue: (value: null | undefined | T | ((current: T) => T)) => void\n) {\n return (val: null | undefined | T | React.ChangeEvent<any> | ((current: T) => T)) => {\n if (!val) {\n setValue(val as T);\n } else if (typeof val === 'function') {\n setValue(val);\n } else if (typeof val === 'object' && 'nativeEvent' in val) {\n const { currentTarget } = val;\n\n if (currentTarget.type === 'checkbox') {\n setValue((currentTarget as any).checked as any);\n } else {\n setValue(currentTarget.value as any);\n }\n } else {\n setValue(val);\n }\n };\n}\n\nexport type UseInputStateReturnValue<T> = [\n T,\n (value: null | undefined | T | React.ChangeEvent<any>) => void,\n];\n\nexport function useInputState<T>(initialState: T): UseInputStateReturnValue<T> {\n const [value, setValue] = useState<T>(initialState);\n return [value, getInputOnChange<T>(setValue as any)];\n}\n\nexport namespace useInputState {\n export type ReturnValue<T> = UseInputStateReturnValue<T>;\n}\n"],"mappings":";;;AAEA,SAAgB,iBACd,UACA;
|
|
1
|
+
{"version":3,"file":"use-input-state.mjs","names":[],"sources":["../../src/use-input-state/use-input-state.ts"],"sourcesContent":["import { useState } from 'react';\n\nexport function getInputOnChange<T>(\n setValue: (value: null | undefined | T | ((current: T) => T)) => void\n) {\n return (val: null | undefined | T | React.ChangeEvent<any> | ((current: T) => T)) => {\n if (!val) {\n setValue(val as T);\n } else if (typeof val === 'function') {\n setValue(val);\n } else if (typeof val === 'object' && 'nativeEvent' in val) {\n const { currentTarget } = val;\n\n if (currentTarget.type === 'checkbox') {\n setValue((currentTarget as any).checked as any);\n } else {\n setValue(currentTarget.value as any);\n }\n } else {\n setValue(val);\n }\n };\n}\n\nexport type UseInputStateReturnValue<T> = [\n T,\n (value: null | undefined | T | React.ChangeEvent<any>) => void,\n];\n\nexport function useInputState<T>(initialState: T): UseInputStateReturnValue<T> {\n const [value, setValue] = useState<T>(initialState);\n return [value, getInputOnChange<T>(setValue as any)];\n}\n\nexport namespace useInputState {\n export type ReturnValue<T> = UseInputStateReturnValue<T>;\n}\n"],"mappings":";;;AAEA,SAAgB,iBACd,UACA;CACA,QAAQ,QAA6E;EACnF,IAAI,CAAC,KACH,SAAS,GAAQ;OACZ,IAAI,OAAO,QAAQ,YACxB,SAAS,GAAG;OACP,IAAI,OAAO,QAAQ,YAAY,iBAAiB,KAAK;GAC1D,MAAM,EAAE,kBAAkB;GAE1B,IAAI,cAAc,SAAS,YACzB,SAAU,cAAsB,OAAc;QAE9C,SAAS,cAAc,KAAY;EAEvC,OACE,SAAS,GAAG;CAEhB;AACF;AAOA,SAAgB,cAAiB,cAA8C;CAC7E,MAAM,CAAC,OAAO,YAAY,SAAY,YAAY;CAClD,OAAO,CAAC,OAAO,iBAAoB,QAAe,CAAC;AACrD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-intersection.mjs","names":[],"sources":["../../src/use-intersection/use-intersection.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface UseIntersectionReturnValue<T> {\n ref: React.RefCallback<T | null>;\n entry: IntersectionObserverEntry | null;\n}\n\nexport function useIntersection<T extends HTMLElement = any>(\n options?: IntersectionObserverInit\n): UseIntersectionReturnValue<T> {\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n\n const observer = useRef<IntersectionObserver | null>(null);\n\n const ref: React.RefCallback<T | null> = useCallback(\n (element) => {\n if (observer.current) {\n observer.current.disconnect();\n observer.current = null;\n }\n\n if (element === null) {\n setEntry(null);\n return;\n }\n\n observer.current = new IntersectionObserver(([_entry]) => {\n setEntry(_entry);\n }, options);\n\n observer.current.observe(element);\n },\n [options?.rootMargin, options?.root, options?.threshold]\n );\n\n return { ref, entry };\n}\n\nexport namespace useIntersection {\n export type ReturnValue<T> = UseIntersectionReturnValue<T>;\n}\n"],"mappings":";;;AAOA,SAAgB,gBACd,SAC+B;CAC/B,MAAM,CAAC,OAAO,YAAY,SAA2C,
|
|
1
|
+
{"version":3,"file":"use-intersection.mjs","names":[],"sources":["../../src/use-intersection/use-intersection.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface UseIntersectionReturnValue<T> {\n ref: React.RefCallback<T | null>;\n entry: IntersectionObserverEntry | null;\n}\n\nexport function useIntersection<T extends HTMLElement = any>(\n options?: IntersectionObserverInit\n): UseIntersectionReturnValue<T> {\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n\n const observer = useRef<IntersectionObserver | null>(null);\n\n const ref: React.RefCallback<T | null> = useCallback(\n (element) => {\n if (observer.current) {\n observer.current.disconnect();\n observer.current = null;\n }\n\n if (element === null) {\n setEntry(null);\n return;\n }\n\n observer.current = new IntersectionObserver(([_entry]) => {\n setEntry(_entry);\n }, options);\n\n observer.current.observe(element);\n },\n [options?.rootMargin, options?.root, options?.threshold]\n );\n\n return { ref, entry };\n}\n\nexport namespace useIntersection {\n export type ReturnValue<T> = UseIntersectionReturnValue<T>;\n}\n"],"mappings":";;;AAOA,SAAgB,gBACd,SAC+B;CAC/B,MAAM,CAAC,OAAO,YAAY,SAA2C,IAAI;CAEzE,MAAM,WAAW,OAAoC,IAAI;CAuBzD,OAAO;EAAE,KArBgC,aACtC,YAAY;GACX,IAAI,SAAS,SAAS;IACpB,SAAS,QAAQ,WAAW;IAC5B,SAAS,UAAU;GACrB;GAEA,IAAI,YAAY,MAAM;IACpB,SAAS,IAAI;IACb;GACF;GAEA,SAAS,UAAU,IAAI,sBAAsB,CAAC,YAAY;IACxD,SAAS,MAAM;GACjB,GAAG,OAAO;GAEV,SAAS,QAAQ,QAAQ,OAAO;EAClC,GACA;GAAC,SAAS;GAAY,SAAS;GAAM,SAAS;EAAS,CAG9C;EAAG;CAAM;AACtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-interval.mjs","names":[],"sources":["../../src/use-interval/use-interval.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface UseIntervalOptions {\n /** If set, the interval will start automatically when the component is mounted, `false` by default */\n autoInvoke?: boolean;\n}\n\nexport interface UseIntervalReturnValue {\n /** Starts the interval */\n start: () => void;\n\n /** Stops the interval */\n stop: () => void;\n\n /** Toggles the interval */\n toggle: () => void;\n\n /** Indicates if the interval is active */\n active: boolean;\n}\n\nexport function useInterval(\n fn: () => void,\n interval: number,\n { autoInvoke = false }: UseIntervalOptions = {}\n): UseIntervalReturnValue {\n const [active, setActive] = useState(false);\n const intervalRef = useRef<number | null>(null);\n const fnRef = useRef<() => void>(null);\n const intervalValueRef = useRef(interval);\n intervalValueRef.current = interval;\n\n const start = useCallback(() => {\n setActive((old) => {\n if (!old && !intervalRef.current) {\n intervalRef.current = window.setInterval(fnRef.current!, intervalValueRef.current);\n }\n return true;\n });\n }, []);\n\n const stop = useCallback(() => {\n setActive(false);\n if (intervalRef.current) {\n window.clearInterval(intervalRef.current);\n }\n intervalRef.current = null;\n }, []);\n\n const toggle = useCallback(() => {\n setActive((current) => {\n if (current) {\n if (intervalRef.current) {\n window.clearInterval(intervalRef.current);\n }\n intervalRef.current = null;\n return false;\n }\n if (!intervalRef.current) {\n intervalRef.current = window.setInterval(fnRef.current!, intervalValueRef.current);\n }\n return true;\n });\n }, []);\n\n useEffect(() => {\n fnRef.current = fn;\n active && start();\n return stop;\n }, [fn, active, interval]);\n\n useEffect(() => {\n if (autoInvoke) {\n start();\n }\n }, []);\n\n return { start, stop, toggle, active };\n}\n\nexport namespace useInterval {\n export type Options = UseIntervalOptions;\n export type ReturnValue = UseIntervalReturnValue;\n}\n"],"mappings":";;;AAqBA,SAAgB,YACd,IACA,UACA,EAAE,aAAa,UAA8B,
|
|
1
|
+
{"version":3,"file":"use-interval.mjs","names":[],"sources":["../../src/use-interval/use-interval.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface UseIntervalOptions {\n /** If set, the interval will start automatically when the component is mounted, `false` by default */\n autoInvoke?: boolean;\n}\n\nexport interface UseIntervalReturnValue {\n /** Starts the interval */\n start: () => void;\n\n /** Stops the interval */\n stop: () => void;\n\n /** Toggles the interval */\n toggle: () => void;\n\n /** Indicates if the interval is active */\n active: boolean;\n}\n\nexport function useInterval(\n fn: () => void,\n interval: number,\n { autoInvoke = false }: UseIntervalOptions = {}\n): UseIntervalReturnValue {\n const [active, setActive] = useState(false);\n const intervalRef = useRef<number | null>(null);\n const fnRef = useRef<() => void>(null);\n const intervalValueRef = useRef(interval);\n intervalValueRef.current = interval;\n\n const start = useCallback(() => {\n setActive((old) => {\n if (!old && !intervalRef.current) {\n intervalRef.current = window.setInterval(fnRef.current!, intervalValueRef.current);\n }\n return true;\n });\n }, []);\n\n const stop = useCallback(() => {\n setActive(false);\n if (intervalRef.current) {\n window.clearInterval(intervalRef.current);\n }\n intervalRef.current = null;\n }, []);\n\n const toggle = useCallback(() => {\n setActive((current) => {\n if (current) {\n if (intervalRef.current) {\n window.clearInterval(intervalRef.current);\n }\n intervalRef.current = null;\n return false;\n }\n if (!intervalRef.current) {\n intervalRef.current = window.setInterval(fnRef.current!, intervalValueRef.current);\n }\n return true;\n });\n }, []);\n\n useEffect(() => {\n fnRef.current = fn;\n active && start();\n return stop;\n }, [fn, active, interval]);\n\n useEffect(() => {\n if (autoInvoke) {\n start();\n }\n }, []);\n\n return { start, stop, toggle, active };\n}\n\nexport namespace useInterval {\n export type Options = UseIntervalOptions;\n export type ReturnValue = UseIntervalReturnValue;\n}\n"],"mappings":";;;AAqBA,SAAgB,YACd,IACA,UACA,EAAE,aAAa,UAA8B,CAAC,GACtB;CACxB,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAC1C,MAAM,cAAc,OAAsB,IAAI;CAC9C,MAAM,QAAQ,OAAmB,IAAI;CACrC,MAAM,mBAAmB,OAAO,QAAQ;CACxC,iBAAiB,UAAU;CAE3B,MAAM,QAAQ,kBAAkB;EAC9B,WAAW,QAAQ;GACjB,IAAI,CAAC,OAAO,CAAC,YAAY,SACvB,YAAY,UAAU,OAAO,YAAY,MAAM,SAAU,iBAAiB,OAAO;GAEnF,OAAO;EACT,CAAC;CACH,GAAG,CAAC,CAAC;CAEL,MAAM,OAAO,kBAAkB;EAC7B,UAAU,KAAK;EACf,IAAI,YAAY,SACd,OAAO,cAAc,YAAY,OAAO;EAE1C,YAAY,UAAU;CACxB,GAAG,CAAC,CAAC;CAEL,MAAM,SAAS,kBAAkB;EAC/B,WAAW,YAAY;GACrB,IAAI,SAAS;IACX,IAAI,YAAY,SACd,OAAO,cAAc,YAAY,OAAO;IAE1C,YAAY,UAAU;IACtB,OAAO;GACT;GACA,IAAI,CAAC,YAAY,SACf,YAAY,UAAU,OAAO,YAAY,MAAM,SAAU,iBAAiB,OAAO;GAEnF,OAAO;EACT,CAAC;CACH,GAAG,CAAC,CAAC;CAEL,gBAAgB;EACd,MAAM,UAAU;EAChB,UAAU,MAAM;EAChB,OAAO;CACT,GAAG;EAAC;EAAI;EAAQ;CAAQ,CAAC;CAEzB,gBAAgB;EACd,IAAI,YACF,MAAM;CAEV,GAAG,CAAC,CAAC;CAEL,OAAO;EAAE;EAAO;EAAM;EAAQ;CAAO;AACvC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-is-first-render.mjs","names":[],"sources":["../../src/use-is-first-render/use-is-first-render.ts"],"sourcesContent":["import { useRef } from 'react';\n\nexport function useIsFirstRender() {\n const renderRef = useRef(true);\n\n if (renderRef.current === true) {\n renderRef.current = false;\n return true;\n }\n\n return renderRef.current;\n}\n"],"mappings":";;;AAEA,SAAgB,mBAAmB;CACjC,MAAM,YAAY,OAAO,
|
|
1
|
+
{"version":3,"file":"use-is-first-render.mjs","names":[],"sources":["../../src/use-is-first-render/use-is-first-render.ts"],"sourcesContent":["import { useRef } from 'react';\n\nexport function useIsFirstRender() {\n const renderRef = useRef(true);\n\n if (renderRef.current === true) {\n renderRef.current = false;\n return true;\n }\n\n return renderRef.current;\n}\n"],"mappings":";;;AAEA,SAAgB,mBAAmB;CACjC,MAAM,YAAY,OAAO,IAAI;CAE7B,IAAI,UAAU,YAAY,MAAM;EAC9B,UAAU,UAAU;EACpB,OAAO;CACT;CAEA,OAAO,UAAU;AACnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-list-state.mjs","names":[],"sources":["../../src/use-list-state/use-list-state.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\n\nexport interface UseListStateHandlers<T> {\n setState: React.Dispatch<React.SetStateAction<T[]>>;\n append: (...items: T[]) => void;\n prepend: (...items: T[]) => void;\n insert: (index: number, ...items: T[]) => void;\n pop: () => void;\n shift: () => void;\n apply: (fn: (item: T, index?: number) => T) => void;\n applyWhere: (\n condition: (item: T, index: number) => boolean,\n fn: (item: T, index?: number) => T\n ) => void;\n remove: (...indices: number[]) => void;\n reorder: ({ from, to }: { from: number; to: number }) => void;\n swap: ({ from, to }: { from: number; to: number }) => void;\n setItem: (index: number, item: T) => void;\n setItemProp: <K extends keyof T, U extends T[K]>(index: number, prop: K, value: U) => void;\n filter: (fn: (item: T, i: number) => boolean) => void;\n}\n\nexport type UseListStateReturnValue<T> = [T[], UseListStateHandlers<T>];\n\nexport function useListState<T>(initialValue: T[] | (() => T[]) = []): UseListStateReturnValue<T> {\n const [state, setState] = useState(initialValue);\n\n const append = useCallback((...items: T[]) => setState((current) => [...current, ...items]), []);\n\n const prepend = useCallback((...items: T[]) => setState((current) => [...items, ...current]), []);\n\n const insert = useCallback(\n (index: number, ...items: T[]) =>\n setState((current) => [...current.slice(0, index), ...items, ...current.slice(index)]),\n []\n );\n\n const apply = useCallback(\n (fn: (item: T, index?: number) => T) =>\n setState((current) => current.map((item, index) => fn(item, index))),\n []\n );\n\n const remove = useCallback(\n (...indices: number[]) =>\n setState((current) => current.filter((_, index) => !indices.includes(index))),\n []\n );\n\n const pop = useCallback(\n () =>\n setState((current) => {\n const cloned = [...current];\n cloned.pop();\n return cloned;\n }),\n []\n );\n\n const shift = useCallback(\n () =>\n setState((current) => {\n const cloned = [...current];\n cloned.shift();\n return cloned;\n }),\n []\n );\n\n const reorder = useCallback(\n ({ from, to }: { from: number; to: number }) =>\n setState((current) => {\n const cloned = [...current];\n const item = current[from];\n\n cloned.splice(from, 1);\n cloned.splice(to, 0, item);\n\n return cloned;\n }),\n []\n );\n\n const swap = useCallback(\n ({ from, to }: { from: number; to: number }) =>\n setState((current) => {\n const cloned = [...current];\n const fromItem = cloned[from];\n const toItem = cloned[to];\n\n cloned.splice(to, 1, fromItem);\n cloned.splice(from, 1, toItem);\n\n return cloned;\n }),\n []\n );\n\n const setItem = useCallback(\n (index: number, item: T) =>\n setState((current) => {\n const cloned = [...current];\n cloned[index] = item;\n return cloned;\n }),\n []\n );\n\n const setItemProp = useCallback(\n <K extends keyof T, U extends T[K]>(index: number, prop: K, value: U) =>\n setState((current) => {\n const cloned = [...current];\n cloned[index] = { ...cloned[index], [prop]: value };\n return cloned;\n }),\n []\n );\n\n const applyWhere = useCallback(\n (condition: (item: T, index: number) => boolean, fn: (item: T, index?: number) => T) =>\n setState((current) =>\n current.map((item, index) => (condition(item, index) ? fn(item, index) : item))\n ),\n []\n );\n\n const filter = useCallback((fn: (item: T, i: number) => boolean) => {\n setState((current) => current.filter(fn));\n }, []);\n\n const handlers = useMemo(\n () => ({\n setState,\n append,\n prepend,\n insert,\n pop,\n shift,\n apply,\n applyWhere,\n remove,\n reorder,\n swap,\n setItem,\n setItemProp,\n filter,\n }),\n []\n );\n\n return [state, handlers];\n}\n\nexport namespace useListState {\n export type ReturnValue<T> = UseListStateReturnValue<T>;\n export type Handlers<T> = UseListStateHandlers<T>;\n}\n"],"mappings":";;;AAwBA,SAAgB,aAAgB,eAAkC,
|
|
1
|
+
{"version":3,"file":"use-list-state.mjs","names":[],"sources":["../../src/use-list-state/use-list-state.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\n\nexport interface UseListStateHandlers<T> {\n setState: React.Dispatch<React.SetStateAction<T[]>>;\n append: (...items: T[]) => void;\n prepend: (...items: T[]) => void;\n insert: (index: number, ...items: T[]) => void;\n pop: () => void;\n shift: () => void;\n apply: (fn: (item: T, index?: number) => T) => void;\n applyWhere: (\n condition: (item: T, index: number) => boolean,\n fn: (item: T, index?: number) => T\n ) => void;\n remove: (...indices: number[]) => void;\n reorder: ({ from, to }: { from: number; to: number }) => void;\n swap: ({ from, to }: { from: number; to: number }) => void;\n setItem: (index: number, item: T) => void;\n setItemProp: <K extends keyof T, U extends T[K]>(index: number, prop: K, value: U) => void;\n filter: (fn: (item: T, i: number) => boolean) => void;\n}\n\nexport type UseListStateReturnValue<T> = [T[], UseListStateHandlers<T>];\n\nexport function useListState<T>(initialValue: T[] | (() => T[]) = []): UseListStateReturnValue<T> {\n const [state, setState] = useState(initialValue);\n\n const append = useCallback((...items: T[]) => setState((current) => [...current, ...items]), []);\n\n const prepend = useCallback((...items: T[]) => setState((current) => [...items, ...current]), []);\n\n const insert = useCallback(\n (index: number, ...items: T[]) =>\n setState((current) => [...current.slice(0, index), ...items, ...current.slice(index)]),\n []\n );\n\n const apply = useCallback(\n (fn: (item: T, index?: number) => T) =>\n setState((current) => current.map((item, index) => fn(item, index))),\n []\n );\n\n const remove = useCallback(\n (...indices: number[]) =>\n setState((current) => current.filter((_, index) => !indices.includes(index))),\n []\n );\n\n const pop = useCallback(\n () =>\n setState((current) => {\n const cloned = [...current];\n cloned.pop();\n return cloned;\n }),\n []\n );\n\n const shift = useCallback(\n () =>\n setState((current) => {\n const cloned = [...current];\n cloned.shift();\n return cloned;\n }),\n []\n );\n\n const reorder = useCallback(\n ({ from, to }: { from: number; to: number }) =>\n setState((current) => {\n const cloned = [...current];\n const item = current[from];\n\n cloned.splice(from, 1);\n cloned.splice(to, 0, item);\n\n return cloned;\n }),\n []\n );\n\n const swap = useCallback(\n ({ from, to }: { from: number; to: number }) =>\n setState((current) => {\n const cloned = [...current];\n const fromItem = cloned[from];\n const toItem = cloned[to];\n\n cloned.splice(to, 1, fromItem);\n cloned.splice(from, 1, toItem);\n\n return cloned;\n }),\n []\n );\n\n const setItem = useCallback(\n (index: number, item: T) =>\n setState((current) => {\n const cloned = [...current];\n cloned[index] = item;\n return cloned;\n }),\n []\n );\n\n const setItemProp = useCallback(\n <K extends keyof T, U extends T[K]>(index: number, prop: K, value: U) =>\n setState((current) => {\n const cloned = [...current];\n cloned[index] = { ...cloned[index], [prop]: value };\n return cloned;\n }),\n []\n );\n\n const applyWhere = useCallback(\n (condition: (item: T, index: number) => boolean, fn: (item: T, index?: number) => T) =>\n setState((current) =>\n current.map((item, index) => (condition(item, index) ? fn(item, index) : item))\n ),\n []\n );\n\n const filter = useCallback((fn: (item: T, i: number) => boolean) => {\n setState((current) => current.filter(fn));\n }, []);\n\n const handlers = useMemo(\n () => ({\n setState,\n append,\n prepend,\n insert,\n pop,\n shift,\n apply,\n applyWhere,\n remove,\n reorder,\n swap,\n setItem,\n setItemProp,\n filter,\n }),\n []\n );\n\n return [state, handlers];\n}\n\nexport namespace useListState {\n export type ReturnValue<T> = UseListStateReturnValue<T>;\n export type Handlers<T> = UseListStateHandlers<T>;\n}\n"],"mappings":";;;AAwBA,SAAgB,aAAgB,eAAkC,CAAC,GAA+B;CAChG,MAAM,CAAC,OAAO,YAAY,SAAS,YAAY;CAE/C,MAAM,SAAS,aAAa,GAAG,UAAe,UAAU,YAAY,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;CAE/F,MAAM,UAAU,aAAa,GAAG,UAAe,UAAU,YAAY,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAEhG,MAAM,SAAS,aACZ,OAAe,GAAG,UACjB,UAAU,YAAY;EAAC,GAAG,QAAQ,MAAM,GAAG,KAAK;EAAG,GAAG;EAAO,GAAG,QAAQ,MAAM,KAAK;CAAC,CAAC,GACvF,CAAC,CACH;CAEA,MAAM,QAAQ,aACX,OACC,UAAU,YAAY,QAAQ,KAAK,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,CAAC,GACrE,CAAC,CACH;CAEA,MAAM,SAAS,aACZ,GAAG,YACF,UAAU,YAAY,QAAQ,QAAQ,GAAG,UAAU,CAAC,QAAQ,SAAS,KAAK,CAAC,CAAC,GAC9E,CAAC,CACH;CAEA,MAAM,MAAM,kBAER,UAAU,YAAY;EACpB,MAAM,SAAS,CAAC,GAAG,OAAO;EAC1B,OAAO,IAAI;EACX,OAAO;CACT,CAAC,GACH,CAAC,CACH;CAEA,MAAM,QAAQ,kBAEV,UAAU,YAAY;EACpB,MAAM,SAAS,CAAC,GAAG,OAAO;EAC1B,OAAO,MAAM;EACb,OAAO;CACT,CAAC,GACH,CAAC,CACH;CAEA,MAAM,UAAU,aACb,EAAE,MAAM,SACP,UAAU,YAAY;EACpB,MAAM,SAAS,CAAC,GAAG,OAAO;EAC1B,MAAM,OAAO,QAAQ;EAErB,OAAO,OAAO,MAAM,CAAC;EACrB,OAAO,OAAO,IAAI,GAAG,IAAI;EAEzB,OAAO;CACT,CAAC,GACH,CAAC,CACH;CAEA,MAAM,OAAO,aACV,EAAE,MAAM,SACP,UAAU,YAAY;EACpB,MAAM,SAAS,CAAC,GAAG,OAAO;EAC1B,MAAM,WAAW,OAAO;EACxB,MAAM,SAAS,OAAO;EAEtB,OAAO,OAAO,IAAI,GAAG,QAAQ;EAC7B,OAAO,OAAO,MAAM,GAAG,MAAM;EAE7B,OAAO;CACT,CAAC,GACH,CAAC,CACH;CAEA,MAAM,UAAU,aACb,OAAe,SACd,UAAU,YAAY;EACpB,MAAM,SAAS,CAAC,GAAG,OAAO;EAC1B,OAAO,SAAS;EAChB,OAAO;CACT,CAAC,GACH,CAAC,CACH;CAEA,MAAM,cAAc,aACkB,OAAe,MAAS,UAC1D,UAAU,YAAY;EACpB,MAAM,SAAS,CAAC,GAAG,OAAO;EAC1B,OAAO,SAAS;GAAE,GAAG,OAAO;IAAS,OAAO;EAAM;EAClD,OAAO;CACT,CAAC,GACH,CAAC,CACH;CAEA,MAAM,aAAa,aAChB,WAAgD,OAC/C,UAAU,YACR,QAAQ,KAAK,MAAM,UAAW,UAAU,MAAM,KAAK,IAAI,GAAG,MAAM,KAAK,IAAI,IAAK,CAChF,GACF,CAAC,CACH;CAEA,MAAM,SAAS,aAAa,OAAwC;EAClE,UAAU,YAAY,QAAQ,OAAO,EAAE,CAAC;CAC1C,GAAG,CAAC,CAAC;CAsBL,OAAO,CAAC,OApBS,eACR;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,IACA,CAAC,CAGmB,CAAC;AACzB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-storage.mjs","names":[],"sources":["../../src/use-local-storage/create-storage.ts"],"sourcesContent":["/* oxlint-disable no-console */\nimport { useCallback, useEffect, useState } from 'react';\nimport { useWindowEvent } from '../use-window-event/use-window-event';\n\nexport type StorageType = 'localStorage' | 'sessionStorage';\n\nexport interface UseStorageOptions<T> {\n /** Storage key */\n key: string;\n\n /** Default value that will be set if value is not found in storage */\n defaultValue?: T;\n\n /** If set to true, value will be updated in useEffect after mount. Default value is true. */\n getInitialValueInEffect?: boolean;\n\n /** Determines whether the value must be synced between browser tabs, `true` by default */\n sync?: boolean;\n\n /** Function to serialize value into string to be save in storage */\n serialize?: (value: T) => string;\n\n /** Function to deserialize string value from storage to value */\n deserialize?: (value: string | undefined) => T;\n}\n\nfunction serializeJSON<T>(value: T, hookName: string = 'use-local-storage') {\n try {\n return JSON.stringify(value);\n } catch (error) {\n throw new Error(`@mantine/hooks ${hookName}: Failed to serialize the value`);\n }\n}\n\nfunction deserializeJSON(value: string | undefined) {\n try {\n return value && JSON.parse(value);\n } catch {\n return value;\n }\n}\n\nfunction createStorageHandler(type: StorageType) {\n const getItem = (key: string) => {\n try {\n return window[type].getItem(key);\n } catch (error) {\n console.warn('use-local-storage: Failed to get value from storage, localStorage is blocked');\n return null;\n }\n };\n\n const setItem = (key: string, value: string) => {\n try {\n window[type].setItem(key, value);\n } catch (error) {\n console.warn('use-local-storage: Failed to set value to storage, localStorage is blocked');\n }\n };\n\n const removeItem = (key: string) => {\n try {\n window[type].removeItem(key);\n } catch (error) {\n console.warn(\n 'use-local-storage: Failed to remove value from storage, localStorage is blocked'\n );\n }\n };\n\n return { getItem, setItem, removeItem };\n}\n\nexport type UseStorageReturnValue<T> = [\n T, // current value\n (val: T | ((prevState: T) => T)) => void, // callback to set value in storage\n () => void, // callback to remove value from storage\n];\n\nexport function createStorage<T>(type: StorageType, hookName: string) {\n const eventName = type === 'localStorage' ? 'mantine-local-storage' : 'mantine-session-storage';\n const { getItem, setItem, removeItem } = createStorageHandler(type);\n\n return function useStorage({\n key,\n defaultValue,\n getInitialValueInEffect = true,\n sync = true,\n deserialize = deserializeJSON,\n serialize = (value: T) => serializeJSON(value, hookName),\n }: UseStorageOptions<T>): UseStorageReturnValue<T> {\n const readStorageValue = useCallback(\n (skipStorage?: boolean): T => {\n let storageBlockedOrSkipped;\n\n try {\n storageBlockedOrSkipped =\n typeof window === 'undefined' ||\n !(type in window) ||\n window[type] === null ||\n !!skipStorage;\n } catch (_e) {\n storageBlockedOrSkipped = true;\n }\n\n if (storageBlockedOrSkipped) {\n return defaultValue as T;\n }\n\n const storageValue = getItem(key);\n return storageValue !== null ? deserialize(storageValue) : (defaultValue as T);\n },\n [key, defaultValue]\n );\n\n const [value, setValue] = useState<T>(readStorageValue(getInitialValueInEffect));\n\n const setStorageValue = useCallback(\n (val: T | ((prevState: T) => T)) => {\n if (val instanceof Function) {\n setValue((current) => {\n const result = val(current);\n setItem(key, serialize(result));\n // Defer dispatching this event to avoid the handler being called during render.\n queueMicrotask(() => {\n window.dispatchEvent(new CustomEvent(eventName, { detail: { key, value: result } }));\n });\n return result;\n });\n } else {\n setItem(key, serialize(val));\n window.dispatchEvent(new CustomEvent(eventName, { detail: { key, value: val } }));\n setValue(val);\n }\n },\n [key]\n );\n\n const removeStorageValue = useCallback(() => {\n removeItem(key);\n setValue(defaultValue as T);\n window.dispatchEvent(new CustomEvent(eventName, { detail: { key, value: defaultValue } }));\n }, [key, defaultValue]);\n\n useWindowEvent('storage', (event) => {\n if (sync) {\n if (event.storageArea === window[type] && event.key === key) {\n setValue(deserialize(event.newValue ?? undefined));\n }\n }\n });\n\n useWindowEvent(eventName, (event) => {\n if (sync) {\n if (event.detail.key === key) {\n setValue(event.detail.value);\n }\n }\n });\n\n useEffect(() => {\n if (defaultValue !== undefined && value === undefined) {\n setStorageValue(defaultValue);\n }\n }, [defaultValue, value, setStorageValue]);\n\n useEffect(() => {\n const val = readStorageValue();\n val !== undefined && setStorageValue(val);\n }, [key]);\n\n return [value === undefined ? (defaultValue as T) : value, setStorageValue, removeStorageValue];\n };\n}\n\nexport function readValue(type: StorageType) {\n const { getItem } = createStorageHandler(type);\n\n return function read<T>({\n key,\n defaultValue,\n deserialize = deserializeJSON,\n }: UseStorageOptions<T>) {\n let storageBlockedOrSkipped;\n\n try {\n storageBlockedOrSkipped =\n typeof window === 'undefined' || !(type in window) || window[type] === null;\n } catch (_e) {\n storageBlockedOrSkipped = true;\n }\n\n if (storageBlockedOrSkipped) {\n return defaultValue as T;\n }\n\n const storageValue = getItem(key);\n return storageValue !== null ? deserialize(storageValue) : (defaultValue as T);\n };\n}\n"],"mappings":";;;;AA0BA,SAAS,cAAiB,OAAU,WAAmB,qBAAqB;
|
|
1
|
+
{"version":3,"file":"create-storage.mjs","names":[],"sources":["../../src/use-local-storage/create-storage.ts"],"sourcesContent":["/* oxlint-disable no-console */\nimport { useCallback, useEffect, useState } from 'react';\nimport { useWindowEvent } from '../use-window-event/use-window-event';\n\nexport type StorageType = 'localStorage' | 'sessionStorage';\n\nexport interface UseStorageOptions<T> {\n /** Storage key */\n key: string;\n\n /** Default value that will be set if value is not found in storage */\n defaultValue?: T;\n\n /** If set to true, value will be updated in useEffect after mount. Default value is true. */\n getInitialValueInEffect?: boolean;\n\n /** Determines whether the value must be synced between browser tabs, `true` by default */\n sync?: boolean;\n\n /** Function to serialize value into string to be save in storage */\n serialize?: (value: T) => string;\n\n /** Function to deserialize string value from storage to value */\n deserialize?: (value: string | undefined) => T;\n}\n\nfunction serializeJSON<T>(value: T, hookName: string = 'use-local-storage') {\n try {\n return JSON.stringify(value);\n } catch (error) {\n throw new Error(`@mantine/hooks ${hookName}: Failed to serialize the value`);\n }\n}\n\nfunction deserializeJSON(value: string | undefined) {\n try {\n return value && JSON.parse(value);\n } catch {\n return value;\n }\n}\n\nfunction createStorageHandler(type: StorageType) {\n const getItem = (key: string) => {\n try {\n return window[type].getItem(key);\n } catch (error) {\n console.warn('use-local-storage: Failed to get value from storage, localStorage is blocked');\n return null;\n }\n };\n\n const setItem = (key: string, value: string) => {\n try {\n window[type].setItem(key, value);\n } catch (error) {\n console.warn('use-local-storage: Failed to set value to storage, localStorage is blocked');\n }\n };\n\n const removeItem = (key: string) => {\n try {\n window[type].removeItem(key);\n } catch (error) {\n console.warn(\n 'use-local-storage: Failed to remove value from storage, localStorage is blocked'\n );\n }\n };\n\n return { getItem, setItem, removeItem };\n}\n\nexport type UseStorageReturnValue<T> = [\n T, // current value\n (val: T | ((prevState: T) => T)) => void, // callback to set value in storage\n () => void, // callback to remove value from storage\n];\n\nexport function createStorage<T>(type: StorageType, hookName: string) {\n const eventName = type === 'localStorage' ? 'mantine-local-storage' : 'mantine-session-storage';\n const { getItem, setItem, removeItem } = createStorageHandler(type);\n\n return function useStorage({\n key,\n defaultValue,\n getInitialValueInEffect = true,\n sync = true,\n deserialize = deserializeJSON,\n serialize = (value: T) => serializeJSON(value, hookName),\n }: UseStorageOptions<T>): UseStorageReturnValue<T> {\n const readStorageValue = useCallback(\n (skipStorage?: boolean): T => {\n let storageBlockedOrSkipped;\n\n try {\n storageBlockedOrSkipped =\n typeof window === 'undefined' ||\n !(type in window) ||\n window[type] === null ||\n !!skipStorage;\n } catch (_e) {\n storageBlockedOrSkipped = true;\n }\n\n if (storageBlockedOrSkipped) {\n return defaultValue as T;\n }\n\n const storageValue = getItem(key);\n return storageValue !== null ? deserialize(storageValue) : (defaultValue as T);\n },\n [key, defaultValue]\n );\n\n const [value, setValue] = useState<T>(readStorageValue(getInitialValueInEffect));\n\n const setStorageValue = useCallback(\n (val: T | ((prevState: T) => T)) => {\n if (val instanceof Function) {\n setValue((current) => {\n const result = val(current);\n setItem(key, serialize(result));\n // Defer dispatching this event to avoid the handler being called during render.\n queueMicrotask(() => {\n window.dispatchEvent(new CustomEvent(eventName, { detail: { key, value: result } }));\n });\n return result;\n });\n } else {\n setItem(key, serialize(val));\n window.dispatchEvent(new CustomEvent(eventName, { detail: { key, value: val } }));\n setValue(val);\n }\n },\n [key]\n );\n\n const removeStorageValue = useCallback(() => {\n removeItem(key);\n setValue(defaultValue as T);\n window.dispatchEvent(new CustomEvent(eventName, { detail: { key, value: defaultValue } }));\n }, [key, defaultValue]);\n\n useWindowEvent('storage', (event) => {\n if (sync) {\n if (event.storageArea === window[type] && event.key === key) {\n setValue(deserialize(event.newValue ?? undefined));\n }\n }\n });\n\n useWindowEvent(eventName, (event) => {\n if (sync) {\n if (event.detail.key === key) {\n setValue(event.detail.value);\n }\n }\n });\n\n useEffect(() => {\n if (defaultValue !== undefined && value === undefined) {\n setStorageValue(defaultValue);\n }\n }, [defaultValue, value, setStorageValue]);\n\n useEffect(() => {\n const val = readStorageValue();\n val !== undefined && setStorageValue(val);\n }, [key]);\n\n return [value === undefined ? (defaultValue as T) : value, setStorageValue, removeStorageValue];\n };\n}\n\nexport function readValue(type: StorageType) {\n const { getItem } = createStorageHandler(type);\n\n return function read<T>({\n key,\n defaultValue,\n deserialize = deserializeJSON,\n }: UseStorageOptions<T>) {\n let storageBlockedOrSkipped;\n\n try {\n storageBlockedOrSkipped =\n typeof window === 'undefined' || !(type in window) || window[type] === null;\n } catch (_e) {\n storageBlockedOrSkipped = true;\n }\n\n if (storageBlockedOrSkipped) {\n return defaultValue as T;\n }\n\n const storageValue = getItem(key);\n return storageValue !== null ? deserialize(storageValue) : (defaultValue as T);\n };\n}\n"],"mappings":";;;;AA0BA,SAAS,cAAiB,OAAU,WAAmB,qBAAqB;CAC1E,IAAI;EACF,OAAO,KAAK,UAAU,KAAK;CAC7B,SAAS,OAAO;EACd,MAAM,IAAI,MAAM,kBAAkB,SAAS,gCAAgC;CAC7E;AACF;AAEA,SAAS,gBAAgB,OAA2B;CAClD,IAAI;EACF,OAAO,SAAS,KAAK,MAAM,KAAK;CAClC,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,qBAAqB,MAAmB;CAC/C,MAAM,WAAW,QAAgB;EAC/B,IAAI;GACF,OAAO,OAAO,MAAM,QAAQ,GAAG;EACjC,SAAS,OAAO;GACd,QAAQ,KAAK,8EAA8E;GAC3F,OAAO;EACT;CACF;CAEA,MAAM,WAAW,KAAa,UAAkB;EAC9C,IAAI;GACF,OAAO,MAAM,QAAQ,KAAK,KAAK;EACjC,SAAS,OAAO;GACd,QAAQ,KAAK,4EAA4E;EAC3F;CACF;CAEA,MAAM,cAAc,QAAgB;EAClC,IAAI;GACF,OAAO,MAAM,WAAW,GAAG;EAC7B,SAAS,OAAO;GACd,QAAQ,KACN,iFACF;EACF;CACF;CAEA,OAAO;EAAE;EAAS;EAAS;CAAW;AACxC;AAQA,SAAgB,cAAiB,MAAmB,UAAkB;CACpE,MAAM,YAAY,SAAS,iBAAiB,0BAA0B;CACtE,MAAM,EAAE,SAAS,SAAS,eAAe,qBAAqB,IAAI;CAElE,OAAO,SAAS,WAAW,EACzB,KACA,cACA,0BAA0B,MAC1B,OAAO,MACP,cAAc,iBACd,aAAa,UAAa,cAAc,OAAO,QAAQ,KACN;EACjD,MAAM,mBAAmB,aACtB,gBAA6B;GAC5B,IAAI;GAEJ,IAAI;IACF,0BACE,OAAO,WAAW,eAClB,EAAE,QAAQ,WACV,OAAO,UAAU,QACjB,CAAC,CAAC;GACN,SAAS,IAAI;IACX,0BAA0B;GAC5B;GAEA,IAAI,yBACF,OAAO;GAGT,MAAM,eAAe,QAAQ,GAAG;GAChC,OAAO,iBAAiB,OAAO,YAAY,YAAY,IAAK;EAC9D,GACA,CAAC,KAAK,YAAY,CACpB;EAEA,MAAM,CAAC,OAAO,YAAY,SAAY,iBAAiB,uBAAuB,CAAC;EAE/E,MAAM,kBAAkB,aACrB,QAAmC;GAClC,IAAI,eAAe,UACjB,UAAU,YAAY;IACpB,MAAM,SAAS,IAAI,OAAO;IAC1B,QAAQ,KAAK,UAAU,MAAM,CAAC;IAE9B,qBAAqB;KACnB,OAAO,cAAc,IAAI,YAAY,WAAW,EAAE,QAAQ;MAAE;MAAK,OAAO;KAAO,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO;GACT,CAAC;QACI;IACL,QAAQ,KAAK,UAAU,GAAG,CAAC;IAC3B,OAAO,cAAc,IAAI,YAAY,WAAW,EAAE,QAAQ;KAAE;KAAK,OAAO;IAAI,EAAE,CAAC,CAAC;IAChF,SAAS,GAAG;GACd;EACF,GACA,CAAC,GAAG,CACN;EAEA,MAAM,qBAAqB,kBAAkB;GAC3C,WAAW,GAAG;GACd,SAAS,YAAiB;GAC1B,OAAO,cAAc,IAAI,YAAY,WAAW,EAAE,QAAQ;IAAE;IAAK,OAAO;GAAa,EAAE,CAAC,CAAC;EAC3F,GAAG,CAAC,KAAK,YAAY,CAAC;EAEtB,eAAe,YAAY,UAAU;GACnC,IAAI;QACE,MAAM,gBAAgB,OAAO,SAAS,MAAM,QAAQ,KACtD,SAAS,YAAY,MAAM,YAAY,KAAA,CAAS,CAAC;GAAA;EAGvD,CAAC;EAED,eAAe,YAAY,UAAU;GACnC,IAAI;QACE,MAAM,OAAO,QAAQ,KACvB,SAAS,MAAM,OAAO,KAAK;GAAA;EAGjC,CAAC;EAED,gBAAgB;GACd,IAAI,iBAAiB,KAAA,KAAa,UAAU,KAAA,GAC1C,gBAAgB,YAAY;EAEhC,GAAG;GAAC;GAAc;GAAO;EAAe,CAAC;EAEzC,gBAAgB;GACd,MAAM,MAAM,iBAAiB;GAC7B,QAAQ,KAAA,KAAa,gBAAgB,GAAG;EAC1C,GAAG,CAAC,GAAG,CAAC;EAER,OAAO;GAAC,UAAU,KAAA,IAAa,eAAqB;GAAO;GAAiB;EAAkB;CAChG;AACF;AAEA,SAAgB,UAAU,MAAmB;CAC3C,MAAM,EAAE,YAAY,qBAAqB,IAAI;CAE7C,OAAO,SAAS,KAAQ,EACtB,KACA,cACA,cAAc,mBACS;EACvB,IAAI;EAEJ,IAAI;GACF,0BACE,OAAO,WAAW,eAAe,EAAE,QAAQ,WAAW,OAAO,UAAU;EAC3E,SAAS,IAAI;GACX,0BAA0B;EAC5B;EAEA,IAAI,yBACF,OAAO;EAGT,MAAM,eAAe,QAAQ,GAAG;EAChC,OAAO,iBAAiB,OAAO,YAAY,YAAY,IAAK;CAC9D;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-local-storage.mjs","names":[],"sources":["../../src/use-local-storage/use-local-storage.ts"],"sourcesContent":["import {\n createStorage,\n readValue,\n UseStorageOptions,\n UseStorageReturnValue,\n} from './create-storage';\n\nexport function useLocalStorage<T = string>(\n props: UseStorageOptions<T> & { defaultValue: T }\n): UseStorageReturnValue<T>;\nexport function useLocalStorage<T = string>(\n props: UseStorageOptions<T>\n): UseStorageReturnValue<T | undefined>;\nexport function useLocalStorage<T = string>(props: UseStorageOptions<T>) {\n return createStorage<T>('localStorage', 'use-local-storage')(props);\n}\n\ninterface ReadStorageValue {\n <T>(options: UseStorageOptions<T> & { defaultValue: T }): T;\n <T>(options: UseStorageOptions<T>): T | undefined;\n}\n\nexport const readLocalStorageValue: ReadStorageValue = readValue('localStorage');\n"],"mappings":";;;AAaA,SAAgB,gBAA4B,OAA6B;
|
|
1
|
+
{"version":3,"file":"use-local-storage.mjs","names":[],"sources":["../../src/use-local-storage/use-local-storage.ts"],"sourcesContent":["import {\n createStorage,\n readValue,\n UseStorageOptions,\n UseStorageReturnValue,\n} from './create-storage';\n\nexport function useLocalStorage<T = string>(\n props: UseStorageOptions<T> & { defaultValue: T }\n): UseStorageReturnValue<T>;\nexport function useLocalStorage<T = string>(\n props: UseStorageOptions<T>\n): UseStorageReturnValue<T | undefined>;\nexport function useLocalStorage<T = string>(props: UseStorageOptions<T>) {\n return createStorage<T>('localStorage', 'use-local-storage')(props);\n}\n\ninterface ReadStorageValue {\n <T>(options: UseStorageOptions<T> & { defaultValue: T }): T;\n <T>(options: UseStorageOptions<T>): T | undefined;\n}\n\nexport const readLocalStorageValue: ReadStorageValue = readValue('localStorage');\n"],"mappings":";;;AAaA,SAAgB,gBAA4B,OAA6B;CACvE,OAAO,cAAiB,gBAAgB,mBAAmB,EAAE,KAAK;AACpE;AAOA,MAAa,wBAA0C,UAAU,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-logger.mjs","names":[],"sources":["../../src/use-logger/use-logger.ts"],"sourcesContent":["/* oxlint-disable no-console */\nimport { useEffect } from 'react';\nimport { useDidUpdate } from '../use-did-update/use-did-update';\n\nexport function useLogger(componentName: string, props: any[]) {\n useEffect(() => {\n console.log(`${componentName} mounted`, ...props);\n return () => console.log(`${componentName} unmounted`);\n }, []);\n\n useDidUpdate(() => {\n console.log(`${componentName} updated`, ...props);\n }, props);\n\n return null;\n}\n"],"mappings":";;;;AAIA,SAAgB,UAAU,eAAuB,OAAc;
|
|
1
|
+
{"version":3,"file":"use-logger.mjs","names":[],"sources":["../../src/use-logger/use-logger.ts"],"sourcesContent":["/* oxlint-disable no-console */\nimport { useEffect } from 'react';\nimport { useDidUpdate } from '../use-did-update/use-did-update';\n\nexport function useLogger(componentName: string, props: any[]) {\n useEffect(() => {\n console.log(`${componentName} mounted`, ...props);\n return () => console.log(`${componentName} unmounted`);\n }, []);\n\n useDidUpdate(() => {\n console.log(`${componentName} updated`, ...props);\n }, props);\n\n return null;\n}\n"],"mappings":";;;;AAIA,SAAgB,UAAU,eAAuB,OAAc;CAC7D,gBAAgB;EACd,QAAQ,IAAI,GAAG,cAAc,WAAW,GAAG,KAAK;EAChD,aAAa,QAAQ,IAAI,GAAG,cAAc,WAAW;CACvD,GAAG,CAAC,CAAC;CAEL,mBAAmB;EACjB,QAAQ,IAAI,GAAG,cAAc,WAAW,GAAG,KAAK;CAClD,GAAG,KAAK;CAER,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-long-press.mjs","names":[],"sources":["../../src/use-long-press/use-long-press.ts"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from 'react';\n\nexport interface UseLongPressOptions {\n /** Time in milliseconds to trigger the long press, default is 400ms */\n threshold?: number;\n\n /** Callback triggered when the long press starts */\n onStart?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n /** Callback triggered when the long press finishes */\n onFinish?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n /** Callback triggered when the long press is canceled */\n onCancel?: (event: React.MouseEvent | React.TouchEvent) => void;\n}\n\nexport interface UseLongPressReturnValue {\n onMouseDown: (event: React.MouseEvent) => void;\n onMouseUp: (event: React.MouseEvent) => void;\n onMouseLeave: (event: React.MouseEvent) => void;\n onTouchStart: (event: React.TouchEvent) => void;\n onTouchEnd: (event: React.TouchEvent) => void;\n onTouchCancel: (event: React.TouchEvent) => void;\n}\n\nexport function useLongPress(\n onLongPress: (event: React.MouseEvent | React.TouchEvent) => void,\n options: UseLongPressOptions = {}\n): UseLongPressReturnValue {\n const { threshold = 400, onStart, onFinish, onCancel } = options;\n const isLongPressActive = useRef(false);\n const isPressed = useRef(false);\n const timeout = useRef<number>(-1);\n\n useEffect(() => () => window.clearTimeout(timeout.current), []);\n\n return useMemo(() => {\n if (typeof onLongPress !== 'function') {\n return {} as UseLongPressReturnValue;\n }\n\n const start = (event: React.MouseEvent | React.TouchEvent) => {\n if (!isMouseEvent(event) && !isTouchEvent(event)) {\n return;\n }\n\n if (onStart) {\n onStart(event);\n }\n\n isPressed.current = true;\n timeout.current = window.setTimeout(() => {\n onLongPress(event);\n isLongPressActive.current = true;\n }, threshold);\n };\n\n const cancel = (event: React.MouseEvent | React.TouchEvent) => {\n if (!isMouseEvent(event) && !isTouchEvent(event)) {\n return;\n }\n\n if (isLongPressActive.current) {\n if (onFinish) {\n onFinish(event);\n }\n } else if (isPressed.current) {\n if (onCancel) {\n onCancel(event);\n }\n }\n\n isLongPressActive.current = false;\n isPressed.current = false;\n\n if (timeout.current !== -1) {\n window.clearTimeout(timeout.current);\n timeout.current = -1;\n }\n };\n\n return {\n onMouseDown: start,\n onMouseUp: cancel,\n onMouseLeave: cancel,\n onTouchStart: start,\n onTouchEnd: cancel,\n onTouchCancel: cancel,\n };\n }, [onLongPress, threshold, onCancel, onFinish, onStart]);\n}\n\nfunction isTouchEvent(event: React.MouseEvent | React.TouchEvent): event is React.TouchEvent {\n return window.TouchEvent\n ? event.nativeEvent instanceof TouchEvent\n : 'touches' in event.nativeEvent;\n}\n\nfunction isMouseEvent(event: React.MouseEvent | React.TouchEvent): event is React.MouseEvent {\n return event.nativeEvent instanceof MouseEvent;\n}\n\nexport namespace useLongPress {\n export type Options = UseLongPressOptions;\n export type ReturnValue = UseLongPressReturnValue;\n}\n"],"mappings":";;;AAyBA,SAAgB,aACd,aACA,UAA+B,
|
|
1
|
+
{"version":3,"file":"use-long-press.mjs","names":[],"sources":["../../src/use-long-press/use-long-press.ts"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from 'react';\n\nexport interface UseLongPressOptions {\n /** Time in milliseconds to trigger the long press, default is 400ms */\n threshold?: number;\n\n /** Callback triggered when the long press starts */\n onStart?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n /** Callback triggered when the long press finishes */\n onFinish?: (event: React.MouseEvent | React.TouchEvent) => void;\n\n /** Callback triggered when the long press is canceled */\n onCancel?: (event: React.MouseEvent | React.TouchEvent) => void;\n}\n\nexport interface UseLongPressReturnValue {\n onMouseDown: (event: React.MouseEvent) => void;\n onMouseUp: (event: React.MouseEvent) => void;\n onMouseLeave: (event: React.MouseEvent) => void;\n onTouchStart: (event: React.TouchEvent) => void;\n onTouchEnd: (event: React.TouchEvent) => void;\n onTouchCancel: (event: React.TouchEvent) => void;\n}\n\nexport function useLongPress(\n onLongPress: (event: React.MouseEvent | React.TouchEvent) => void,\n options: UseLongPressOptions = {}\n): UseLongPressReturnValue {\n const { threshold = 400, onStart, onFinish, onCancel } = options;\n const isLongPressActive = useRef(false);\n const isPressed = useRef(false);\n const timeout = useRef<number>(-1);\n\n useEffect(() => () => window.clearTimeout(timeout.current), []);\n\n return useMemo(() => {\n if (typeof onLongPress !== 'function') {\n return {} as UseLongPressReturnValue;\n }\n\n const start = (event: React.MouseEvent | React.TouchEvent) => {\n if (!isMouseEvent(event) && !isTouchEvent(event)) {\n return;\n }\n\n if (onStart) {\n onStart(event);\n }\n\n isPressed.current = true;\n timeout.current = window.setTimeout(() => {\n onLongPress(event);\n isLongPressActive.current = true;\n }, threshold);\n };\n\n const cancel = (event: React.MouseEvent | React.TouchEvent) => {\n if (!isMouseEvent(event) && !isTouchEvent(event)) {\n return;\n }\n\n if (isLongPressActive.current) {\n if (onFinish) {\n onFinish(event);\n }\n } else if (isPressed.current) {\n if (onCancel) {\n onCancel(event);\n }\n }\n\n isLongPressActive.current = false;\n isPressed.current = false;\n\n if (timeout.current !== -1) {\n window.clearTimeout(timeout.current);\n timeout.current = -1;\n }\n };\n\n return {\n onMouseDown: start,\n onMouseUp: cancel,\n onMouseLeave: cancel,\n onTouchStart: start,\n onTouchEnd: cancel,\n onTouchCancel: cancel,\n };\n }, [onLongPress, threshold, onCancel, onFinish, onStart]);\n}\n\nfunction isTouchEvent(event: React.MouseEvent | React.TouchEvent): event is React.TouchEvent {\n return window.TouchEvent\n ? event.nativeEvent instanceof TouchEvent\n : 'touches' in event.nativeEvent;\n}\n\nfunction isMouseEvent(event: React.MouseEvent | React.TouchEvent): event is React.MouseEvent {\n return event.nativeEvent instanceof MouseEvent;\n}\n\nexport namespace useLongPress {\n export type Options = UseLongPressOptions;\n export type ReturnValue = UseLongPressReturnValue;\n}\n"],"mappings":";;;AAyBA,SAAgB,aACd,aACA,UAA+B,CAAC,GACP;CACzB,MAAM,EAAE,YAAY,KAAK,SAAS,UAAU,aAAa;CACzD,MAAM,oBAAoB,OAAO,KAAK;CACtC,MAAM,YAAY,OAAO,KAAK;CAC9B,MAAM,UAAU,OAAe,EAAE;CAEjC,sBAAsB,OAAO,aAAa,QAAQ,OAAO,GAAG,CAAC,CAAC;CAE9D,OAAO,cAAc;EACnB,IAAI,OAAO,gBAAgB,YACzB,OAAO,CAAC;EAGV,MAAM,SAAS,UAA+C;GAC5D,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,aAAa,KAAK,GAC7C;GAGF,IAAI,SACF,QAAQ,KAAK;GAGf,UAAU,UAAU;GACpB,QAAQ,UAAU,OAAO,iBAAiB;IACxC,YAAY,KAAK;IACjB,kBAAkB,UAAU;GAC9B,GAAG,SAAS;EACd;EAEA,MAAM,UAAU,UAA+C;GAC7D,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,aAAa,KAAK,GAC7C;GAGF,IAAI,kBAAkB;QAChB,UACF,SAAS,KAAK;GAAA,OAEX,IAAI,UAAU;QACf,UACF,SAAS,KAAK;GAAA;GAIlB,kBAAkB,UAAU;GAC5B,UAAU,UAAU;GAEpB,IAAI,QAAQ,YAAY,IAAI;IAC1B,OAAO,aAAa,QAAQ,OAAO;IACnC,QAAQ,UAAU;GACpB;EACF;EAEA,OAAO;GACL,aAAa;GACb,WAAW;GACX,cAAc;GACd,cAAc;GACd,YAAY;GACZ,eAAe;EACjB;CACF,GAAG;EAAC;EAAa;EAAW;EAAU;EAAU;CAAO,CAAC;AAC1D;AAEA,SAAS,aAAa,OAAuE;CAC3F,OAAO,OAAO,aACV,MAAM,uBAAuB,aAC7B,aAAa,MAAM;AACzB;AAEA,SAAS,aAAa,OAAuE;CAC3F,OAAO,MAAM,uBAAuB;AACtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-map.mjs","names":[],"sources":["../../src/use-map/use-map.ts"],"sourcesContent":["import { useRef } from 'react';\nimport { useForceUpdate } from '../use-force-update/use-force-update';\n\nexport function useMap<T, V>(initialState?: [T, V][]): Map<T, V> {\n const mapRef = useRef(new Map<T, V>(initialState));\n const forceUpdate = useForceUpdate();\n\n mapRef.current.set = (...args) => {\n Map.prototype.set.apply(mapRef.current, args);\n forceUpdate();\n return mapRef.current;\n };\n\n mapRef.current.clear = (...args) => {\n Map.prototype.clear.apply(mapRef.current, args);\n forceUpdate();\n };\n\n mapRef.current.delete = (...args) => {\n const res = Map.prototype.delete.apply(mapRef.current, args);\n forceUpdate();\n\n return res;\n };\n\n return mapRef.current;\n}\n"],"mappings":";;;;AAGA,SAAgB,OAAa,cAAoC;CAC/D,MAAM,SAAS,OAAO,IAAI,IAAU,
|
|
1
|
+
{"version":3,"file":"use-map.mjs","names":[],"sources":["../../src/use-map/use-map.ts"],"sourcesContent":["import { useRef } from 'react';\nimport { useForceUpdate } from '../use-force-update/use-force-update';\n\nexport function useMap<T, V>(initialState?: [T, V][]): Map<T, V> {\n const mapRef = useRef(new Map<T, V>(initialState));\n const forceUpdate = useForceUpdate();\n\n mapRef.current.set = (...args) => {\n Map.prototype.set.apply(mapRef.current, args);\n forceUpdate();\n return mapRef.current;\n };\n\n mapRef.current.clear = (...args) => {\n Map.prototype.clear.apply(mapRef.current, args);\n forceUpdate();\n };\n\n mapRef.current.delete = (...args) => {\n const res = Map.prototype.delete.apply(mapRef.current, args);\n forceUpdate();\n\n return res;\n };\n\n return mapRef.current;\n}\n"],"mappings":";;;;AAGA,SAAgB,OAAa,cAAoC;CAC/D,MAAM,SAAS,OAAO,IAAI,IAAU,YAAY,CAAC;CACjD,MAAM,cAAc,eAAe;CAEnC,OAAO,QAAQ,OAAO,GAAG,SAAS;EAChC,IAAI,UAAU,IAAI,MAAM,OAAO,SAAS,IAAI;EAC5C,YAAY;EACZ,OAAO,OAAO;CAChB;CAEA,OAAO,QAAQ,SAAS,GAAG,SAAS;EAClC,IAAI,UAAU,MAAM,MAAM,OAAO,SAAS,IAAI;EAC9C,YAAY;CACd;CAEA,OAAO,QAAQ,UAAU,GAAG,SAAS;EACnC,MAAM,MAAM,IAAI,UAAU,OAAO,MAAM,OAAO,SAAS,IAAI;EAC3D,YAAY;EAEZ,OAAO;CACT;CAEA,OAAO,OAAO;AAChB"}
|