@siberiacancode/reactuse 0.3.10 → 0.3.12

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.
Files changed (70) hide show
  1. package/dist/cjs/hooks/useActiveElement/useActiveElement.cjs +1 -1
  2. package/dist/cjs/hooks/useActiveElement/useActiveElement.cjs.map +1 -1
  3. package/dist/cjs/hooks/useAutoScroll/useAutoScroll.cjs +1 -1
  4. package/dist/cjs/hooks/useAutoScroll/useAutoScroll.cjs.map +1 -1
  5. package/dist/cjs/hooks/useClickOutside/useClickOutside.cjs +1 -1
  6. package/dist/cjs/hooks/useClickOutside/useClickOutside.cjs.map +1 -1
  7. package/dist/cjs/hooks/useDoubleClick/useDoubleClick.cjs +1 -1
  8. package/dist/cjs/hooks/useDoubleClick/useDoubleClick.cjs.map +1 -1
  9. package/dist/cjs/hooks/useFocusTrap/useFocusTrap.cjs.map +1 -1
  10. package/dist/cjs/hooks/useHash/useHash.cjs +1 -1
  11. package/dist/cjs/hooks/useHash/useHash.cjs.map +1 -1
  12. package/dist/cjs/hooks/useHover/useHover.cjs +1 -1
  13. package/dist/cjs/hooks/useHover/useHover.cjs.map +1 -1
  14. package/dist/cjs/hooks/useInfiniteScroll/useInfiniteScroll.cjs +1 -1
  15. package/dist/cjs/hooks/useInfiniteScroll/useInfiniteScroll.cjs.map +1 -1
  16. package/dist/cjs/hooks/useKeyPress/useKeyPress.cjs +1 -1
  17. package/dist/cjs/hooks/useKeyPress/useKeyPress.cjs.map +1 -1
  18. package/dist/cjs/hooks/useKeysPressed/useKeysPressed.cjs +1 -1
  19. package/dist/cjs/hooks/useKeysPressed/useKeysPressed.cjs.map +1 -1
  20. package/dist/cjs/hooks/useLongPress/useLongPress.cjs +1 -1
  21. package/dist/cjs/hooks/useLongPress/useLongPress.cjs.map +1 -1
  22. package/dist/cjs/hooks/useMediaControls/useMediaControls.cjs.map +1 -1
  23. package/dist/cjs/hooks/usePostMessage/usePostMessage.cjs +1 -1
  24. package/dist/cjs/hooks/usePostMessage/usePostMessage.cjs.map +1 -1
  25. package/dist/cjs/hooks/useSticky/useSticky.cjs +1 -1
  26. package/dist/cjs/hooks/useSticky/useSticky.cjs.map +1 -1
  27. package/dist/cjs/hooks/useWindowScroll/useWindowScroll.cjs +1 -1
  28. package/dist/cjs/hooks/useWindowScroll/useWindowScroll.cjs.map +1 -1
  29. package/dist/esm/hooks/useActiveElement/useActiveElement.mjs +1 -1
  30. package/dist/esm/hooks/useActiveElement/useActiveElement.mjs.map +1 -1
  31. package/dist/esm/hooks/useAutoScroll/useAutoScroll.mjs +11 -11
  32. package/dist/esm/hooks/useAutoScroll/useAutoScroll.mjs.map +1 -1
  33. package/dist/esm/hooks/useClickOutside/useClickOutside.mjs +9 -9
  34. package/dist/esm/hooks/useClickOutside/useClickOutside.mjs.map +1 -1
  35. package/dist/esm/hooks/useDoubleClick/useDoubleClick.mjs +3 -1
  36. package/dist/esm/hooks/useDoubleClick/useDoubleClick.mjs.map +1 -1
  37. package/dist/esm/hooks/useFocusTrap/useFocusTrap.mjs.map +1 -1
  38. package/dist/esm/hooks/useHash/useHash.mjs +6 -3
  39. package/dist/esm/hooks/useHash/useHash.mjs.map +1 -1
  40. package/dist/esm/hooks/useHover/useHover.mjs +4 -4
  41. package/dist/esm/hooks/useHover/useHover.mjs.map +1 -1
  42. package/dist/esm/hooks/useInfiniteScroll/useInfiniteScroll.mjs +1 -1
  43. package/dist/esm/hooks/useInfiniteScroll/useInfiniteScroll.mjs.map +1 -1
  44. package/dist/esm/hooks/useKeyPress/useKeyPress.mjs +1 -1
  45. package/dist/esm/hooks/useKeyPress/useKeyPress.mjs.map +1 -1
  46. package/dist/esm/hooks/useKeysPressed/useKeysPressed.mjs +1 -1
  47. package/dist/esm/hooks/useKeysPressed/useKeysPressed.mjs.map +1 -1
  48. package/dist/esm/hooks/useLongPress/useLongPress.mjs +1 -4
  49. package/dist/esm/hooks/useLongPress/useLongPress.mjs.map +1 -1
  50. package/dist/esm/hooks/useMediaControls/useMediaControls.mjs.map +1 -1
  51. package/dist/esm/hooks/usePostMessage/usePostMessage.mjs +18 -14
  52. package/dist/esm/hooks/usePostMessage/usePostMessage.mjs.map +1 -1
  53. package/dist/esm/hooks/useSticky/useSticky.mjs +1 -1
  54. package/dist/esm/hooks/useSticky/useSticky.mjs.map +1 -1
  55. package/dist/esm/hooks/useWindowScroll/useWindowScroll.mjs +1 -4
  56. package/dist/esm/hooks/useWindowScroll/useWindowScroll.mjs.map +1 -1
  57. package/dist/types/hooks/useActiveElement/useActiveElement.d.ts +4 -3
  58. package/dist/types/hooks/useAutoScroll/useAutoScroll.d.ts +5 -3
  59. package/dist/types/hooks/useClickOutside/useClickOutside.d.ts +5 -3
  60. package/dist/types/hooks/useDoubleClick/useDoubleClick.d.ts +7 -5
  61. package/dist/types/hooks/useFocusTrap/useFocusTrap.d.ts +2 -2
  62. package/dist/types/hooks/useHash/useHash.d.ts +10 -5
  63. package/dist/types/hooks/useHover/useHover.d.ts +8 -6
  64. package/dist/types/hooks/useInfiniteScroll/useInfiniteScroll.d.ts +12 -6
  65. package/dist/types/hooks/useKeyPress/useKeyPress.d.ts +10 -4
  66. package/dist/types/hooks/useKeysPressed/useKeysPressed.d.ts +10 -10
  67. package/dist/types/hooks/useLongPress/useLongPress.d.ts +9 -3
  68. package/dist/types/hooks/usePostMessage/usePostMessage.d.ts +5 -2
  69. package/dist/types/hooks/useSticky/useSticky.d.ts +5 -5
  70. package/package.json +89 -89
@@ -1 +1 @@
1
- {"version":3,"file":"useMediaControls.mjs","sources":["../../../../src/hooks/useMediaControls/useMediaControls.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\nexport const timeRangeToArray = (timeRanges: TimeRanges) => {\n let ranges: [number, number][] = [];\n\n for (let i = 0; i < timeRanges.length; ++i)\n ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n\n return ranges;\n};\n\n/** The media source configuration type */\nexport interface UseMediaSource {\n /** The media attribute of the media */\n media?: string;\n /** The source URL of the media */\n src: string;\n /** The MIME type of the media */\n type?: string;\n}\n\n/** The media controls return type */\nexport interface UseMediaControlsReturn {\n /** Whether the media is currently buffering */\n buffered: [number, number][];\n /** The current playback position in seconds */\n currentTime: number;\n /** The total duration of the media in seconds */\n duration: number;\n /** Whether the media has ended */\n ended: boolean;\n /** Whether the media is currently muted */\n muted: boolean;\n /** The current playback rate (1.0 is normal speed) */\n playbackRate: number;\n /** Whether the media is currently playing */\n playing: boolean;\n /** Whether the media is currently seeking */\n seeking: boolean;\n /** Whether the media is currently stalled */\n stalled: boolean;\n /** The current volume level (0.0 to 1.0) */\n volume: number;\n /** Whether the media is currently waiting */\n waiting: boolean;\n\n /** Set the playback rate */\n changePlaybackRate: (rate: number) => void;\n /** Set the volume level (0.0 to 1.0) */\n changeVolume: (volume: number) => void;\n /** Set the muted state */\n mute: () => void;\n /** Pause the media */\n pause: () => void;\n /** Start playing the media */\n play: () => Promise<void>;\n /** Seek to a specific time in seconds */\n seek: (time: number) => void;\n /** Toggle between play and pause */\n toggle: () => Promise<void>;\n /** Set the unmuted state */\n unmute: () => void;\n}\n\nexport interface UseMediaControls {\n (target: HookTarget, src: string): UseMediaControlsReturn;\n\n (target: HookTarget, options: UseMediaSource): UseMediaControlsReturn;\n\n <Target extends HTMLMediaElement>(\n src: string\n ): UseMediaControlsReturn & {\n ref: StateRef<Target>;\n };\n\n <Target extends HTMLMediaElement>(\n options: UseMediaSource\n ): UseMediaControlsReturn & { ref: StateRef<Target> };\n}\n\n/**\n * @name useMediaControls\n * @description Hook that provides controls for HTML media elements (audio/video)\n * @category Browser\n * @usage low\n *\n * @overload\n * @param {HookTarget} target The target media element\n * @param {string} src The source URL of the media\n * @returns {UseMediaControlsReturn} An object containing media controls and state\n *\n * @example\n * const { playing, play, pause } = useMediaControls(videoRef, 'video.mp4');\n *\n * @overload\n * @param {HookTarget} target The target media element\n * @param {UseMediaSource} options The media source configuration\n * @returns {UseMediaControlsReturn} An object containing media controls and state\n *\n * @example\n * const { playing, play, pause } = useMediaControls(audioRef, { src: 'audio.mp3', type: 'audio/mp3' });\n *\n * @overload\n * @template Target The target media element type\n * @param {string} src The source URL of the media\n * @returns {UseMediaControlsReturn & { ref: StateRef<Target> }} An object containing media controls, state and ref\n *\n * @example\n * const { ref, playing, play, pause } = useMediaControls<HTMLVideoElement>('video.mp4');\n *\n * @overload\n * @template Target The target media element type\n * @param {UseMediaSource} options The media source configuration\n * @returns {UseMediaControlsReturn & { ref: StateRef<Target> }} An object containing media controls, state and ref\n *\n * @example\n * const { ref, playing, play, pause } = useMediaControls<HTMLVideoElement>({ src: 'video.mp4', type: 'video/mp4' });\n */\nexport const useMediaControls = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const options = (\n target\n ? typeof params[1] === 'object'\n ? params[1]\n : { src: params[1] }\n : typeof params[0] === 'object'\n ? params[0]\n : { src: params[0] }\n ) as UseMediaSource;\n\n const internalRef = useRefState<HTMLMediaElement>();\n const elementRef = useRef<HTMLMediaElement | null>(null);\n\n const [playing, setPlaying] = useState(false);\n const [duration, setDuration] = useState(0);\n const [currentTime, setCurrentTime] = useState(0);\n const [seeking, setSeeking] = useState(false);\n const [waiting, setWaiting] = useState(false);\n const [buffered, setBuffered] = useState<[number, number][]>([]);\n const [stalled, setStalled] = useState(false);\n const [ended, setEnded] = useState(false);\n const [playbackRate, setPlaybackRateState] = useState(1);\n\n const [muted, setMutedState] = useState(false);\n const [volume, setVolumeState] = useState(1);\n\n useEffect(() => {\n const element = (\n target ? isTarget.getElement(target) : internalRef.current\n ) as HTMLMediaElement;\n\n if (!element) return;\n\n elementRef.current = element;\n element.src = options.src;\n\n if (options.type) element.setAttribute('type', options.type);\n if (options.media) element.setAttribute('media', options.media);\n\n setDuration(element.duration);\n setCurrentTime(element.currentTime);\n setPlaying(false);\n setEnded(element.ended);\n setMutedState(element.muted);\n setVolumeState(element.volume);\n setPlaybackRateState(element.playbackRate);\n\n const onPlaying = () => {\n setPlaying(true);\n setStalled(false);\n };\n const onPause = () => setPlaying(false);\n const onWaiting = () => setWaiting(true);\n const onStalled = () => setStalled(true);\n const onSeeking = () => setSeeking(true);\n const onSeeked = () => setSeeking(false);\n const onEnded = () => {\n setPlaying(false);\n setEnded(true);\n };\n const onDurationChange = () => setDuration(element.duration);\n const onTimeUpdate = () => setCurrentTime(element.currentTime);\n const onVolumechange = () => {\n setMutedState(element.muted);\n setVolumeState(element.volume);\n };\n const onRatechange = () => setPlaybackRateState(element.playbackRate);\n const onProgress = () => setBuffered(timeRangeToArray(element.buffered));\n\n element.addEventListener('playing', onPlaying);\n element.addEventListener('pause', onPause);\n element.addEventListener('waiting', onWaiting);\n element.addEventListener('progress', onProgress);\n element.addEventListener('stalled', onStalled);\n element.addEventListener('seeking', onSeeking);\n element.addEventListener('seeked', onSeeked);\n element.addEventListener('ended', onEnded);\n element.addEventListener('loadedmetadata', onDurationChange);\n element.addEventListener('timeupdate', onTimeUpdate);\n element.addEventListener('volumechange', onVolumechange);\n element.addEventListener('ratechange', onRatechange);\n\n return () => {\n element.removeEventListener('playing', onPlaying);\n element.removeEventListener('pause', onPause);\n element.removeEventListener('waiting', onWaiting);\n element.removeEventListener('progress', onProgress);\n element.removeEventListener('stalled', onStalled);\n element.removeEventListener('seeking', onSeeking);\n element.removeEventListener('seeked', onSeeked);\n element.removeEventListener('ended', onEnded);\n element.removeEventListener('loadedmetadata', onDurationChange);\n element.removeEventListener('timeupdate', onTimeUpdate);\n element.removeEventListener('volumechange', onVolumechange);\n element.removeEventListener('ratechange', onRatechange);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state]);\n\n const play = async () => {\n const element = elementRef.current;\n if (!element) return;\n\n await element.play();\n };\n\n const pause = () => {\n if (!elementRef.current) return;\n elementRef.current.pause();\n };\n\n const toggle = async (value = !playing) => {\n if (value) return play();\n return pause();\n };\n\n const seek = (time: number) => {\n if (!elementRef.current) return;\n elementRef.current.currentTime = Math.min(Math.max(time, 0), duration);\n };\n\n const changeVolume = (value: number) => {\n if (!elementRef.current) return;\n elementRef.current.volume = Math.min(Math.max(value, 0), 1);\n };\n\n const mute = () => {\n if (!elementRef.current) return;\n elementRef.current.muted = true;\n };\n\n const unmute = () => {\n if (!elementRef.current) return;\n elementRef.current.muted = false;\n };\n\n const changePlaybackRate = (value: number) => {\n if (!elementRef.current) return;\n elementRef.current.playbackRate = value;\n };\n\n return {\n playing,\n duration,\n currentTime,\n seeking,\n waiting,\n buffered,\n stalled,\n ended,\n playbackRate,\n muted,\n volume,\n\n play,\n pause,\n toggle,\n seek,\n changeVolume,\n mute,\n unmute,\n changePlaybackRate,\n\n ...(!target && { ref: internalRef })\n };\n}) as UseMediaControls;\n"],"names":["timeRangeToArray","timeRanges","ranges","i","useMediaControls","params","target","isTarget","options","internalRef","useRefState","elementRef","useRef","playing","setPlaying","useState","duration","setDuration","currentTime","setCurrentTime","seeking","setSeeking","waiting","setWaiting","buffered","setBuffered","stalled","setStalled","ended","setEnded","playbackRate","setPlaybackRateState","muted","setMutedState","volume","setVolumeState","useEffect","element","onPlaying","onPause","onWaiting","onStalled","onSeeking","onSeeked","onEnded","onDurationChange","onTimeUpdate","onVolumechange","onRatechange","onProgress","play","pause","value","time"],"mappings":"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"}
1
+ {"version":3,"file":"useMediaControls.mjs","sources":["../../../../src/hooks/useMediaControls/useMediaControls.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\nexport const timeRangeToArray = (timeRanges: TimeRanges) => {\n let ranges: [number, number][] = [];\n\n for (let i = 0; i < timeRanges.length; ++i)\n ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n\n return ranges;\n};\n\n/** The media source configuration type */\nexport interface UseMediaSource {\n /** The media attribute of the media */\n media?: string;\n /** The source URL of the media */\n src: string;\n /** The MIME type of the media */\n type?: string;\n}\n\n/** The media controls return type */\nexport interface UseMediaControlsReturn {\n /** Whether the media is currently buffering */\n buffered: [number, number][];\n /** The current playback position in seconds */\n currentTime: number;\n /** The total duration of the media in seconds */\n duration: number;\n /** Whether the media has ended */\n ended: boolean;\n /** Whether the media is currently muted */\n muted: boolean;\n /** The current playback rate (1.0 is normal speed) */\n playbackRate: number;\n /** Whether the media is currently playing */\n playing: boolean;\n /** Whether the media is currently seeking */\n seeking: boolean;\n /** Whether the media is currently stalled */\n stalled: boolean;\n /** The current volume level (0.0 to 1.0) */\n volume: number;\n /** Whether the media is currently waiting */\n waiting: boolean;\n /** Set the playback rate */\n changePlaybackRate: (rate: number) => void;\n /** Set the volume level (0.0 to 1.0) */\n changeVolume: (volume: number) => void;\n /** Set the muted state */\n mute: () => void;\n /** Pause the media */\n pause: () => void;\n /** Start playing the media */\n play: () => Promise<void>;\n /** Seek to a specific time in seconds */\n seek: (time: number) => void;\n /** Toggle between play and pause */\n toggle: () => Promise<void>;\n /** Set the unmuted state */\n unmute: () => void;\n}\n\nexport interface UseMediaControls {\n (target: HookTarget, src: string): UseMediaControlsReturn;\n\n (target: HookTarget, options: UseMediaSource): UseMediaControlsReturn;\n\n <Target extends HTMLMediaElement>(\n src: string\n ): UseMediaControlsReturn & {\n ref: StateRef<Target>;\n };\n\n <Target extends HTMLMediaElement>(\n options: UseMediaSource\n ): UseMediaControlsReturn & { ref: StateRef<Target> };\n}\n\n/**\n * @name useMediaControls\n * @description Hook that provides controls for HTML media elements (audio/video)\n * @category Browser\n * @usage low\n *\n * @overload\n * @param {HookTarget} target The target media element\n * @param {string} src The source URL of the media\n * @returns {UseMediaControlsReturn} An object containing media controls and state\n *\n * @example\n * const { playing, play, pause } = useMediaControls(videoRef, 'video.mp4');\n *\n * @overload\n * @param {HookTarget} target The target media element\n * @param {UseMediaSource} options The media source configuration\n * @returns {UseMediaControlsReturn} An object containing media controls and state\n *\n * @example\n * const { playing, play, pause } = useMediaControls(audioRef, { src: 'audio.mp3', type: 'audio/mp3' });\n *\n * @overload\n * @template Target The target media element type\n * @param {string} src The source URL of the media\n * @returns {UseMediaControlsReturn & { ref: StateRef<Target> }} An object containing media controls, state and ref\n *\n * @example\n * const { ref, playing, play, pause } = useMediaControls<HTMLVideoElement>('video.mp4');\n *\n * @overload\n * @template Target The target media element type\n * @param {UseMediaSource} options The media source configuration\n * @returns {UseMediaControlsReturn & { ref: StateRef<Target> }} An object containing media controls, state and ref\n *\n * @example\n * const { ref, playing, play, pause } = useMediaControls<HTMLVideoElement>({ src: 'video.mp4', type: 'video/mp4' });\n */\nexport const useMediaControls = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const options = (\n target\n ? typeof params[1] === 'object'\n ? params[1]\n : { src: params[1] }\n : typeof params[0] === 'object'\n ? params[0]\n : { src: params[0] }\n ) as UseMediaSource;\n\n const internalRef = useRefState<HTMLMediaElement>();\n const elementRef = useRef<HTMLMediaElement | null>(null);\n\n const [playing, setPlaying] = useState(false);\n const [duration, setDuration] = useState(0);\n const [currentTime, setCurrentTime] = useState(0);\n const [seeking, setSeeking] = useState(false);\n const [waiting, setWaiting] = useState(false);\n const [buffered, setBuffered] = useState<[number, number][]>([]);\n const [stalled, setStalled] = useState(false);\n const [ended, setEnded] = useState(false);\n const [playbackRate, setPlaybackRateState] = useState(1);\n\n const [muted, setMutedState] = useState(false);\n const [volume, setVolumeState] = useState(1);\n\n useEffect(() => {\n const element = (\n target ? isTarget.getElement(target) : internalRef.current\n ) as HTMLMediaElement;\n\n if (!element) return;\n\n elementRef.current = element;\n element.src = options.src;\n\n if (options.type) element.setAttribute('type', options.type);\n if (options.media) element.setAttribute('media', options.media);\n\n setDuration(element.duration);\n setCurrentTime(element.currentTime);\n setPlaying(false);\n setEnded(element.ended);\n setMutedState(element.muted);\n setVolumeState(element.volume);\n setPlaybackRateState(element.playbackRate);\n\n const onPlaying = () => {\n setPlaying(true);\n setStalled(false);\n };\n const onPause = () => setPlaying(false);\n const onWaiting = () => setWaiting(true);\n const onStalled = () => setStalled(true);\n const onSeeking = () => setSeeking(true);\n const onSeeked = () => setSeeking(false);\n const onEnded = () => {\n setPlaying(false);\n setEnded(true);\n };\n const onDurationChange = () => setDuration(element.duration);\n const onTimeUpdate = () => setCurrentTime(element.currentTime);\n const onVolumechange = () => {\n setMutedState(element.muted);\n setVolumeState(element.volume);\n };\n const onRatechange = () => setPlaybackRateState(element.playbackRate);\n const onProgress = () => setBuffered(timeRangeToArray(element.buffered));\n\n element.addEventListener('playing', onPlaying);\n element.addEventListener('pause', onPause);\n element.addEventListener('waiting', onWaiting);\n element.addEventListener('progress', onProgress);\n element.addEventListener('stalled', onStalled);\n element.addEventListener('seeking', onSeeking);\n element.addEventListener('seeked', onSeeked);\n element.addEventListener('ended', onEnded);\n element.addEventListener('loadedmetadata', onDurationChange);\n element.addEventListener('timeupdate', onTimeUpdate);\n element.addEventListener('volumechange', onVolumechange);\n element.addEventListener('ratechange', onRatechange);\n\n return () => {\n element.removeEventListener('playing', onPlaying);\n element.removeEventListener('pause', onPause);\n element.removeEventListener('waiting', onWaiting);\n element.removeEventListener('progress', onProgress);\n element.removeEventListener('stalled', onStalled);\n element.removeEventListener('seeking', onSeeking);\n element.removeEventListener('seeked', onSeeked);\n element.removeEventListener('ended', onEnded);\n element.removeEventListener('loadedmetadata', onDurationChange);\n element.removeEventListener('timeupdate', onTimeUpdate);\n element.removeEventListener('volumechange', onVolumechange);\n element.removeEventListener('ratechange', onRatechange);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state]);\n\n const play = async () => {\n const element = elementRef.current;\n if (!element) return;\n\n await element.play();\n };\n\n const pause = () => {\n if (!elementRef.current) return;\n elementRef.current.pause();\n };\n\n const toggle = async (value = !playing) => {\n if (value) return play();\n return pause();\n };\n\n const seek = (time: number) => {\n if (!elementRef.current) return;\n elementRef.current.currentTime = Math.min(Math.max(time, 0), duration);\n };\n\n const changeVolume = (value: number) => {\n if (!elementRef.current) return;\n elementRef.current.volume = Math.min(Math.max(value, 0), 1);\n };\n\n const mute = () => {\n if (!elementRef.current) return;\n elementRef.current.muted = true;\n };\n\n const unmute = () => {\n if (!elementRef.current) return;\n elementRef.current.muted = false;\n };\n\n const changePlaybackRate = (value: number) => {\n if (!elementRef.current) return;\n elementRef.current.playbackRate = value;\n };\n\n return {\n playing,\n duration,\n currentTime,\n seeking,\n waiting,\n buffered,\n stalled,\n ended,\n playbackRate,\n muted,\n volume,\n\n play,\n pause,\n toggle,\n seek,\n changeVolume,\n mute,\n unmute,\n changePlaybackRate,\n\n ...(!target && { ref: internalRef })\n };\n}) as UseMediaControls;\n"],"names":["timeRangeToArray","timeRanges","ranges","i","useMediaControls","params","target","isTarget","options","internalRef","useRefState","elementRef","useRef","playing","setPlaying","useState","duration","setDuration","currentTime","setCurrentTime","seeking","setSeeking","waiting","setWaiting","buffered","setBuffered","stalled","setStalled","ended","setEnded","playbackRate","setPlaybackRateState","muted","setMutedState","volume","setVolumeState","useEffect","element","onPlaying","onPause","onWaiting","onStalled","onSeeking","onSeeked","onEnded","onDurationChange","onTimeUpdate","onVolumechange","onRatechange","onProgress","play","pause","value","time"],"mappings":"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"}
@@ -1,20 +1,24 @@
1
- import { useRef as n, useEffect as o } from "react";
2
- const d = (e, t) => {
3
- const a = n(t);
4
- return a.current = t, o(() => {
5
- const r = (s) => {
6
- Array.isArray(e) && (!e.includes(s.origin) || !e.includes("*")) || s.origin !== e && e !== "*" || a.current(s.data, s);
1
+ import { useRef as i, useEffect as u } from "react";
2
+ const f = (s, t) => {
3
+ const o = i(t);
4
+ o.current = t;
5
+ const r = i(s);
6
+ return r.current = s, u(() => {
7
+ const n = (e) => {
8
+ if (Array.isArray(r.current)) {
9
+ if (!r.current.includes(e.origin)) return;
10
+ } else if (r.current !== "*" && e.origin !== r.current)
11
+ return;
12
+ o.current(e.data, e);
7
13
  };
8
- return window.addEventListener("message", r), () => window.removeEventListener("message", r);
9
- }, []), (r) => {
10
- if (Array.isArray(e)) {
11
- e.forEach((s) => window.postMessage(r, s));
12
- return;
13
- }
14
- window.postMessage(r, e);
14
+ return window.addEventListener("message", n), () => window.removeEventListener("message", n);
15
+ }, []), (n) => {
16
+ if (Array.isArray(r.current))
17
+ return r.current.forEach((e) => window.postMessage(n, e));
18
+ window.postMessage(n, r.current);
15
19
  };
16
20
  };
17
21
  export {
18
- d as usePostMessage
22
+ f as usePostMessage
19
23
  };
20
24
  //# sourceMappingURL=usePostMessage.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePostMessage.mjs","sources":["../../../../src/hooks/usePostMessage/usePostMessage.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nexport type UsePostMessageReturn<Message> = (message: Message) => void;\n\n/**\n * @name usePostMessage\n * @description - Hook that allows you to receive messages from other origins\n * @category Browser\n * @usage low\n *\n * @overload\n * @template Message The message data type\n * @param {string | string[]} origin The origin of the message\n * @param {(message: Message) => Message} callback callback to get received message\n * @returns {(message: Message) => void} An object containing the current message\n *\n * @example\n * const postMessage = usePostMessage();\n */\nexport const usePostMessage = <Message>(\n origin: string | '*' | string[],\n callback: (message: Message, event: MessageEvent<Message>) => void\n): UsePostMessageReturn<Message> => {\n const internalCallbackRef = useRef(callback);\n internalCallbackRef.current = callback;\n\n useEffect(() => {\n const onMessage = (event: MessageEvent<Message>) => {\n if (\n (Array.isArray(origin) && (!origin.includes(event.origin) || !origin.includes('*'))) ||\n (event.origin !== origin && origin !== '*')\n )\n return;\n\n internalCallbackRef.current(event.data as Message, event);\n };\n\n window.addEventListener('message', onMessage);\n return () => window.removeEventListener('message', onMessage);\n }, []);\n\n const postMessage = (message: Message) => {\n if (Array.isArray(origin)) {\n origin.forEach((origin) => window.postMessage(message, origin));\n return;\n }\n\n window.postMessage(message, origin);\n };\n\n return postMessage;\n};\n"],"names":["usePostMessage","origin","callback","internalCallbackRef","useRef","useEffect","onMessage","event","message"],"mappings":";AAmBO,MAAMA,IAAiB,CAC5BC,GACAC,MACkC;AAClC,QAAMC,IAAsBC,EAAOF,CAAQ;AAC3C,SAAAC,EAAoB,UAAUD,GAE9BG,EAAU,MAAM;AACd,UAAMC,IAAY,CAACC,MAAiC;AAClD,MACG,MAAM,QAAQN,CAAM,MAAM,CAACA,EAAO,SAASM,EAAM,MAAM,KAAK,CAACN,EAAO,SAAS,GAAG,MAChFM,EAAM,WAAWN,KAAUA,MAAW,OAIzCE,EAAoB,QAAQI,EAAM,MAAiBA,CAAK;AAAA,IAAA;AAG1D,kBAAO,iBAAiB,WAAWD,CAAS,GACrC,MAAM,OAAO,oBAAoB,WAAWA,CAAS;AAAA,EAAA,GAC3D,EAAE,GAEe,CAACE,MAAqB;AACxC,QAAI,MAAM,QAAQP,CAAM,GAAG;AACzB,MAAAA,EAAO,QAAQ,CAACA,MAAW,OAAO,YAAYO,GAASP,CAAM,CAAC;AAC9D;AAAA,IAAA;AAGF,WAAO,YAAYO,GAASP,CAAM;AAAA,EAAA;AAItC;"}
1
+ {"version":3,"file":"usePostMessage.mjs","sources":["../../../../src/hooks/usePostMessage/usePostMessage.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\n/** The origin of the message */\nexport type UsePostMessageOrigin = string | '*' | string[];\n\n/** The return type of the usePostMessage hook */\nexport type UsePostMessageReturn<Message> = (message: Message) => void;\n\n/**\n * @name usePostMessage\n * @description - Hook that allows you to receive messages from other origins\n * @category Browser\n * @usage low\n *\n * @overload\n * @template Message The message data type\n * @param {UsePostMessageOrigin} origin The origin of the message\n * @param {(message: Message) => Message} callback callback to get received message\n * @returns {(message: Message) => void} An object containing the current message\n *\n * @example\n * const postMessage = usePostMessage();\n */\nexport const usePostMessage = <Message>(\n origin: UsePostMessageOrigin,\n callback: (message: Message, event: MessageEvent<Message>) => void\n): UsePostMessageReturn<Message> => {\n const internalCallbackRef = useRef(callback);\n internalCallbackRef.current = callback;\n const internalOriginRef = useRef(origin);\n internalOriginRef.current = origin;\n\n useEffect(() => {\n const onMessage = (event: MessageEvent<Message>) => {\n if (Array.isArray(internalOriginRef.current)) {\n if (!internalOriginRef.current.includes(event.origin)) return;\n } else if (internalOriginRef.current !== '*' && event.origin !== internalOriginRef.current)\n return;\n\n internalCallbackRef.current(event.data as Message, event);\n };\n\n window.addEventListener('message', onMessage);\n return () => window.removeEventListener('message', onMessage);\n }, []);\n\n const postMessage = (message: Message) => {\n if (Array.isArray(internalOriginRef.current))\n return internalOriginRef.current.forEach((origin) => window.postMessage(message, origin));\n\n window.postMessage(message, internalOriginRef.current);\n };\n\n return postMessage;\n};\n"],"names":["usePostMessage","origin","callback","internalCallbackRef","useRef","internalOriginRef","useEffect","onMessage","event","message"],"mappings":";AAuBO,MAAMA,IAAiB,CAC5BC,GACAC,MACkC;AAClC,QAAMC,IAAsBC,EAAOF,CAAQ;AAC3C,EAAAC,EAAoB,UAAUD;AAC9B,QAAMG,IAAoBD,EAAOH,CAAM;AACvC,SAAAI,EAAkB,UAAUJ,GAE5BK,EAAU,MAAM;AACd,UAAMC,IAAY,CAACC,MAAiC;AAClD,UAAI,MAAM,QAAQH,EAAkB,OAAO;AACzC,YAAI,CAACA,EAAkB,QAAQ,SAASG,EAAM,MAAM,EAAG;AAAA,iBAC9CH,EAAkB,YAAY,OAAOG,EAAM,WAAWH,EAAkB;AACjF;AAEF,MAAAF,EAAoB,QAAQK,EAAM,MAAiBA,CAAK;AAAA,IAAA;AAG1D,kBAAO,iBAAiB,WAAWD,CAAS,GACrC,MAAM,OAAO,oBAAoB,WAAWA,CAAS;AAAA,EAAA,GAC3D,EAAE,GAEe,CAACE,MAAqB;AACxC,QAAI,MAAM,QAAQJ,EAAkB,OAAO;AACzC,aAAOA,EAAkB,QAAQ,QAAQ,CAACJ,MAAW,OAAO,YAAYQ,GAASR,CAAM,CAAC;AAE1F,WAAO,YAAYQ,GAASJ,EAAkB,OAAO;AAAA,EAAA;AAIzD;"}
@@ -20,7 +20,7 @@ const R = ((...o) => {
20
20
  return e.addEventListener("scroll", n), window.addEventListener("resize", n), window.addEventListener("orientationchange", n), n(), () => {
21
21
  e.removeEventListener("scroll", n), window.removeEventListener("resize", n), window.removeEventListener("orientationchange", n);
22
22
  };
23
- }, [t && s.getRawElement(t), i.state, c, r?.root]), t ? u : {
23
+ }, [t && s.getRawElement(t), i.state, c, r?.root]), t ? { stuck: u } : {
24
24
  stuck: u,
25
25
  ref: i
26
26
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useSticky.mjs","sources":["../../../../src/hooks/useSticky/useSticky.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use sticky return type */\nexport interface UseStickyReturn {\n stuck: boolean;\n}\n\n/** The use sticky axis type */\nexport type UseStickyAxis = 'horizontal' | 'vertical';\n\n/** The use sticky options type */\nexport interface UseStickyOptions {\n axis?: UseStickyAxis;\n root?: HookTarget;\n}\n\nexport interface UseSticky {\n (target: HookTarget, options?: UseStickyOptions): boolean;\n\n <Target extends Element>(\n options?: UseStickyOptions,\n target?: never\n ): {\n ref: StateRef<Target>;\n } & UseStickyReturn;\n}\n\n/**\n * @name UseSticky\n * @description - Hook that allows you to detect that your sticky component is stuck\n * @category Elements\n * @usage low\n *\n * @overload\n * @param {HookTarget} target The target sticky element\n * @param {UseStickyAxis} [options.axis='vertical'] The axis of motion of the sticky component\n * @param {UseStickyRoot} [options.root=document] The element that contains your sticky component\n * @returns {UseStickyReturn} The state of the sticky\n *\n * @example\n * const stuck = useSticky(ref);\n *\n * @overload\n * @param {UseStickyAxis} [options.axis='vertical'] The axis of motion of the sticky component\n * @param {UseStickyRoot} [options.root=document] The element that contains your sticky component\n * @returns {{ stickyRef: StateRef<Target> } & UseStickyReturn} The state of the sticky\n *\n * @example\n * const { stuck, ref } = useSticky();\n */\nexport const useSticky = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const options = (target ? params[1] : params[0]) as UseStickyOptions;\n const axis = options?.axis ?? 'vertical';\n\n const internalRef = useRefState<Element>();\n const [stuck, setStuck] = useState(false);\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = (target ? isTarget.getElement(target) : internalRef.current) as Element;\n\n if (!element) return;\n\n const root = (options?.root ? isTarget.getElement(options.root) : document) as Element;\n const elementOffsetTop =\n element.getBoundingClientRect().top + root.scrollTop - root.getBoundingClientRect().top;\n const elementOffsetLeft =\n element.getBoundingClientRect().left + root.scrollLeft - root.getBoundingClientRect().left;\n\n const onSticky = () => {\n if (axis === 'vertical') {\n const scrollTop = root.scrollTop;\n setStuck(scrollTop >= elementOffsetTop);\n }\n\n if (axis === 'horizontal') {\n const scrollLeft = root.scrollLeft;\n setStuck(scrollLeft >= elementOffsetLeft);\n }\n };\n\n root.addEventListener('scroll', onSticky);\n window.addEventListener('resize', onSticky);\n window.addEventListener('orientationchange', onSticky);\n\n onSticky();\n\n return () => {\n root.removeEventListener('scroll', onSticky);\n window.removeEventListener('resize', onSticky);\n window.removeEventListener('orientationchange', onSticky);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state, axis, options?.root]);\n\n if (target) return stuck;\n return {\n stuck,\n ref: internalRef\n };\n}) as UseSticky;\n"],"names":["useSticky","params","target","isTarget","options","axis","internalRef","useRefState","stuck","setStuck","useState","useEffect","element","root","elementOffsetTop","elementOffsetLeft","onSticky","scrollTop","scrollLeft"],"mappings":";;;AA0DO,MAAMA,KAAa,IAAIC,MAAkB;AAC9C,QAAMC,IAAUC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAC5CG,IAAWF,IAASD,EAAO,CAAC,IAAIA,EAAO,CAAC,GACxCI,IAAOD,GAAS,QAAQ,YAExBE,IAAcC,EAAA,GACd,CAACC,GAAOC,CAAQ,IAAIC,EAAS,EAAK;AAwCxC,SAtCAC,EAAU,MAAM;AACd,QAAI,CAACT,KAAU,CAACI,EAAY,MAAO;AAEnC,UAAMM,IAAWV,IAASC,EAAS,WAAWD,CAAM,IAAII,EAAY;AAEpE,QAAI,CAACM,EAAS;AAEd,UAAMC,IAAQT,GAAS,OAAOD,EAAS,WAAWC,EAAQ,IAAI,IAAI,UAC5DU,IACJF,EAAQ,wBAAwB,MAAMC,EAAK,YAAYA,EAAK,sBAAA,EAAwB,KAChFE,IACJH,EAAQ,wBAAwB,OAAOC,EAAK,aAAaA,EAAK,sBAAA,EAAwB,MAElFG,IAAW,MAAM;AACrB,UAAIX,MAAS,YAAY;AACvB,cAAMY,IAAYJ,EAAK;AACvB,QAAAJ,EAASQ,KAAaH,CAAgB;AAAA,MAAA;AAGxC,UAAIT,MAAS,cAAc;AACzB,cAAMa,IAAaL,EAAK;AACxB,QAAAJ,EAASS,KAAcH,CAAiB;AAAA,MAAA;AAAA,IAC1C;AAGF,WAAAF,EAAK,iBAAiB,UAAUG,CAAQ,GACxC,OAAO,iBAAiB,UAAUA,CAAQ,GAC1C,OAAO,iBAAiB,qBAAqBA,CAAQ,GAErDA,EAAA,GAEO,MAAM;AACX,MAAAH,EAAK,oBAAoB,UAAUG,CAAQ,GAC3C,OAAO,oBAAoB,UAAUA,CAAQ,GAC7C,OAAO,oBAAoB,qBAAqBA,CAAQ;AAAA,IAAA;AAAA,EAC1D,GACC,CAACd,KAAUC,EAAS,cAAcD,CAAM,GAAGI,EAAY,OAAOD,GAAMD,GAAS,IAAI,CAAC,GAEjFF,IAAeM,IACZ;AAAA,IACL,OAAAA;AAAA,IACA,KAAKF;AAAA,EAAA;AAET;"}
1
+ {"version":3,"file":"useSticky.mjs","sources":["../../../../src/hooks/useSticky/useSticky.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { HookTarget } from '@/utils/helpers';\n\nimport { isTarget } from '@/utils/helpers';\n\nimport type { StateRef } from '../useRefState/useRefState';\n\nimport { useRefState } from '../useRefState/useRefState';\n\n/** The use sticky return type */\nexport interface UseStickyReturn {\n stuck: boolean;\n}\n\n/** The use sticky axis type */\nexport type UseStickyAxis = 'horizontal' | 'vertical';\n\n/** The use sticky options type */\nexport interface UseStickyOptions {\n axis?: UseStickyAxis;\n root?: HookTarget;\n}\n\nexport interface UseSticky {\n (target: HookTarget, options?: UseStickyOptions): UseStickyReturn;\n\n <Target extends Element>(\n options?: UseStickyOptions,\n target?: never\n ): UseStickyReturn & {\n ref: StateRef<Target>;\n };\n}\n\n/**\n * @name UseSticky\n * @description - Hook that allows you to detect that your sticky component is stuck\n * @category Elements\n * @usage low\n *\n * @overload\n * @param {HookTarget} target The target sticky element\n * @param {UseStickyAxis} [options.axis='vertical'] The axis of motion of the sticky component\n * @param {UseStickyRoot} [options.root=document] The element that contains your sticky component\n * @returns {UseStickyReturn} The state of the sticky\n *\n * @example\n * const { stuck } = useSticky(ref);\n *\n * @overload\n * @param {UseStickyAxis} [options.axis='vertical'] The axis of motion of the sticky component\n * @param {UseStickyRoot} [options.root=document] The element that contains your sticky component\n * @returns {{ ref: StateRef<Target> } & UseStickyReturn} The state of the sticky\n *\n * @example\n * const { stuck, ref } = useSticky();\n */\nexport const useSticky = ((...params: any[]) => {\n const target = (isTarget(params[0]) ? params[0] : undefined) as HookTarget | undefined;\n const options = (target ? params[1] : params[0]) as UseStickyOptions;\n const axis = options?.axis ?? 'vertical';\n\n const internalRef = useRefState<Element>();\n const [stuck, setStuck] = useState(false);\n\n useEffect(() => {\n if (!target && !internalRef.state) return;\n\n const element = (target ? isTarget.getElement(target) : internalRef.current) as Element;\n\n if (!element) return;\n\n const root = (options?.root ? isTarget.getElement(options.root) : document) as Element;\n const elementOffsetTop =\n element.getBoundingClientRect().top + root.scrollTop - root.getBoundingClientRect().top;\n const elementOffsetLeft =\n element.getBoundingClientRect().left + root.scrollLeft - root.getBoundingClientRect().left;\n\n const onSticky = () => {\n if (axis === 'vertical') {\n const scrollTop = root.scrollTop;\n setStuck(scrollTop >= elementOffsetTop);\n }\n\n if (axis === 'horizontal') {\n const scrollLeft = root.scrollLeft;\n setStuck(scrollLeft >= elementOffsetLeft);\n }\n };\n\n root.addEventListener('scroll', onSticky);\n window.addEventListener('resize', onSticky);\n window.addEventListener('orientationchange', onSticky);\n\n onSticky();\n\n return () => {\n root.removeEventListener('scroll', onSticky);\n window.removeEventListener('resize', onSticky);\n window.removeEventListener('orientationchange', onSticky);\n };\n }, [target && isTarget.getRawElement(target), internalRef.state, axis, options?.root]);\n\n if (target) return { stuck };\n return {\n stuck,\n ref: internalRef\n };\n}) as UseSticky;\n"],"names":["useSticky","params","target","isTarget","options","axis","internalRef","useRefState","stuck","setStuck","useState","useEffect","element","root","elementOffsetTop","elementOffsetLeft","onSticky","scrollTop","scrollLeft"],"mappings":";;;AA0DO,MAAMA,KAAa,IAAIC,MAAkB;AAC9C,QAAMC,IAAUC,EAASF,EAAO,CAAC,CAAC,IAAIA,EAAO,CAAC,IAAI,QAC5CG,IAAWF,IAASD,EAAO,CAAC,IAAIA,EAAO,CAAC,GACxCI,IAAOD,GAAS,QAAQ,YAExBE,IAAcC,EAAA,GACd,CAACC,GAAOC,CAAQ,IAAIC,EAAS,EAAK;AAwCxC,SAtCAC,EAAU,MAAM;AACd,QAAI,CAACT,KAAU,CAACI,EAAY,MAAO;AAEnC,UAAMM,IAAWV,IAASC,EAAS,WAAWD,CAAM,IAAII,EAAY;AAEpE,QAAI,CAACM,EAAS;AAEd,UAAMC,IAAQT,GAAS,OAAOD,EAAS,WAAWC,EAAQ,IAAI,IAAI,UAC5DU,IACJF,EAAQ,wBAAwB,MAAMC,EAAK,YAAYA,EAAK,sBAAA,EAAwB,KAChFE,IACJH,EAAQ,wBAAwB,OAAOC,EAAK,aAAaA,EAAK,sBAAA,EAAwB,MAElFG,IAAW,MAAM;AACrB,UAAIX,MAAS,YAAY;AACvB,cAAMY,IAAYJ,EAAK;AACvB,QAAAJ,EAASQ,KAAaH,CAAgB;AAAA,MAAA;AAGxC,UAAIT,MAAS,cAAc;AACzB,cAAMa,IAAaL,EAAK;AACxB,QAAAJ,EAASS,KAAcH,CAAiB;AAAA,MAAA;AAAA,IAC1C;AAGF,WAAAF,EAAK,iBAAiB,UAAUG,CAAQ,GACxC,OAAO,iBAAiB,UAAUA,CAAQ,GAC1C,OAAO,iBAAiB,qBAAqBA,CAAQ,GAErDA,EAAA,GAEO,MAAM;AACX,MAAAH,EAAK,oBAAoB,UAAUG,CAAQ,GAC3C,OAAO,oBAAoB,UAAUA,CAAQ,GAC7C,OAAO,oBAAoB,qBAAqBA,CAAQ;AAAA,IAAA;AAAA,EAC1D,GACC,CAACd,KAAUC,EAAS,cAAcD,CAAM,GAAGI,EAAY,OAAOD,GAAMD,GAAS,IAAI,CAAC,GAEjFF,IAAe,EAAE,OAAAM,EAAA,IACd;AAAA,IACL,OAAAA;AAAA,IACA,KAAKF;AAAA,EAAA;AAET;"}
@@ -7,10 +7,7 @@ const i = ({
7
7
  const r = { behavior: e };
8
8
  typeof o == "number" && (r.left = o), typeof n == "number" && (r.top = n), window.scrollTo(r);
9
9
  }, w = () => {
10
- const [o, n] = t({
11
- x: typeof window < "u" ? window.scrollX : Number.POSITIVE_INFINITY,
12
- y: typeof window < "u" ? window.scrollY : Number.POSITIVE_INFINITY
13
- });
10
+ const [o, n] = t(() => typeof window > "u" ? { x: Number.POSITIVE_INFINITY, y: Number.POSITIVE_INFINITY } : { x: window.scrollX, y: window.scrollY });
14
11
  return s(() => {
15
12
  const e = () => n({ x: window.scrollX, y: window.scrollY });
16
13
  return window.addEventListener("scroll", e), window.addEventListener("resize", e), () => {
@@ -1 +1 @@
1
- {"version":3,"file":"useWindowScroll.mjs","sources":["../../../../src/hooks/useWindowScroll/useWindowScroll.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport interface ScrollPosition {\n x: number;\n y: number;\n}\n\nexport const scrollTo = ({\n x,\n y,\n behavior = 'smooth'\n}: Partial<ScrollPosition & ScrollOptions>) => {\n const scrollOptions: ScrollToOptions = { behavior };\n if (typeof x === 'number') scrollOptions.left = x;\n if (typeof y === 'number') scrollOptions.top = y;\n window.scrollTo(scrollOptions);\n};\n\n/**\n * @name useWindowScroll\n * @description - Hook that manages the window scroll position\n * @category Sensors\n * @usage low\n *\n * @returns {UseWindowScrollReturn} An object containing the current window scroll position\n *\n * @example\n * const { value, scrollTo } = useWindowScroll();\n */\nexport const useWindowScroll = () => {\n const [value, setValue] = useState<ScrollPosition>({\n x: typeof window !== 'undefined' ? window.scrollX : Number.POSITIVE_INFINITY,\n y: typeof window !== 'undefined' ? window.scrollY : Number.POSITIVE_INFINITY\n });\n\n useEffect(() => {\n const onChange = () => setValue({ x: window.scrollX, y: window.scrollY });\n window.addEventListener('scroll', onChange);\n window.addEventListener('resize', onChange);\n return () => {\n window.removeEventListener('scroll', onChange);\n window.removeEventListener('resize', onChange);\n };\n }, []);\n\n return { value, scrollTo };\n};\n"],"names":["scrollTo","x","y","behavior","scrollOptions","useWindowScroll","value","setValue","useState","useEffect","onChange"],"mappings":";AAOO,MAAMA,IAAW,CAAC;AAAA,EACvB,GAAAC;AAAA,EACA,GAAAC;AAAA,EACA,UAAAC,IAAW;AACb,MAA+C;AAC7C,QAAMC,IAAiC,EAAE,UAAAD,EAAA;AACzC,EAAI,OAAOF,KAAM,aAAUG,EAAc,OAAOH,IAC5C,OAAOC,KAAM,aAAUE,EAAc,MAAMF,IAC/C,OAAO,SAASE,CAAa;AAC/B,GAaaC,IAAkB,MAAM;AACnC,QAAM,CAACC,GAAOC,CAAQ,IAAIC,EAAyB;AAAA,IACjD,GAAG,OAAO,SAAW,MAAc,OAAO,UAAU,OAAO;AAAA,IAC3D,GAAG,OAAO,SAAW,MAAc,OAAO,UAAU,OAAO;AAAA,EAAA,CAC5D;AAED,SAAAC,EAAU,MAAM;AACd,UAAMC,IAAW,MAAMH,EAAS,EAAE,GAAG,OAAO,SAAS,GAAG,OAAO,SAAS;AACxE,kBAAO,iBAAiB,UAAUG,CAAQ,GAC1C,OAAO,iBAAiB,UAAUA,CAAQ,GACnC,MAAM;AACX,aAAO,oBAAoB,UAAUA,CAAQ,GAC7C,OAAO,oBAAoB,UAAUA,CAAQ;AAAA,IAAA;AAAA,EAC/C,GACC,EAAE,GAEE,EAAE,OAAAJ,GAAO,UAAAN,EAAA;AAClB;"}
1
+ {"version":3,"file":"useWindowScroll.mjs","sources":["../../../../src/hooks/useWindowScroll/useWindowScroll.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport interface ScrollPosition {\n x: number;\n y: number;\n}\n\nexport const scrollTo = ({\n x,\n y,\n behavior = 'smooth'\n}: Partial<ScrollPosition & ScrollOptions>) => {\n const scrollOptions: ScrollToOptions = { behavior };\n if (typeof x === 'number') scrollOptions.left = x;\n if (typeof y === 'number') scrollOptions.top = y;\n window.scrollTo(scrollOptions);\n};\n\n/**\n * @name useWindowScroll\n * @description - Hook that manages the window scroll position\n * @category Sensors\n * @usage low\n *\n * @returns {UseWindowScrollReturn} An object containing the current window scroll position\n *\n * @example\n * const { value, scrollTo } = useWindowScroll();\n */\nexport const useWindowScroll = () => {\n const [value, setValue] = useState<ScrollPosition>(() => {\n if (typeof window === 'undefined')\n return { x: Number.POSITIVE_INFINITY, y: Number.POSITIVE_INFINITY };\n return { x: window.scrollX, y: window.scrollY };\n });\n\n useEffect(() => {\n const onChange = () => setValue({ x: window.scrollX, y: window.scrollY });\n window.addEventListener('scroll', onChange);\n window.addEventListener('resize', onChange);\n return () => {\n window.removeEventListener('scroll', onChange);\n window.removeEventListener('resize', onChange);\n };\n }, []);\n\n return { value, scrollTo };\n};\n"],"names":["scrollTo","x","y","behavior","scrollOptions","useWindowScroll","value","setValue","useState","useEffect","onChange"],"mappings":";AAOO,MAAMA,IAAW,CAAC;AAAA,EACvB,GAAAC;AAAA,EACA,GAAAC;AAAA,EACA,UAAAC,IAAW;AACb,MAA+C;AAC7C,QAAMC,IAAiC,EAAE,UAAAD,EAAA;AACzC,EAAI,OAAOF,KAAM,aAAUG,EAAc,OAAOH,IAC5C,OAAOC,KAAM,aAAUE,EAAc,MAAMF,IAC/C,OAAO,SAASE,CAAa;AAC/B,GAaaC,IAAkB,MAAM;AACnC,QAAM,CAACC,GAAOC,CAAQ,IAAIC,EAAyB,MAC7C,OAAO,SAAW,MACb,EAAE,GAAG,OAAO,mBAAmB,GAAG,OAAO,kBAAA,IAC3C,EAAE,GAAG,OAAO,SAAS,GAAG,OAAO,QAAA,CACvC;AAED,SAAAC,EAAU,MAAM;AACd,UAAMC,IAAW,MAAMH,EAAS,EAAE,GAAG,OAAO,SAAS,GAAG,OAAO,SAAS;AACxE,kBAAO,iBAAiB,UAAUG,CAAQ,GAC1C,OAAO,iBAAiB,UAAUA,CAAQ,GACnC,MAAM;AACX,aAAO,oBAAoB,UAAUA,CAAQ,GAC7C,OAAO,oBAAoB,UAAUA,CAAQ;AAAA,IAAA;AAAA,EAC/C,GACC,EAAE,GAEE,EAAE,OAAAJ,GAAO,UAAAN,EAAA;AAClB;"}
@@ -1,13 +1,14 @@
1
1
  import { HookTarget } from '../../utils/helpers';
2
2
  import { StateRef } from '../useRefState/useRefState';
3
3
  /** The use active element return type */
4
- export type UseActiveElementReturn<ActiveElement extends HTMLElement = HTMLElement> = ActiveElement | null;
4
+ export interface UseActiveElementReturn<ActiveElement extends HTMLElement = HTMLElement> {
5
+ value: ActiveElement | null;
6
+ }
5
7
  export interface UseActiveElement {
6
8
  (): UseActiveElementReturn;
7
9
  <Target extends Element, ActiveElement extends HTMLElement = HTMLElement>(target?: never): {
8
10
  ref: StateRef<Target>;
9
- value: UseActiveElementReturn<ActiveElement>;
10
- };
11
+ } & UseActiveElementReturn<ActiveElement>;
11
12
  <ActiveElement extends HTMLElement = HTMLElement>(target: HookTarget): UseActiveElementReturn<ActiveElement>;
12
13
  }
13
14
  /**
@@ -9,7 +9,9 @@ export interface UseAutoScrollOptions {
9
9
  }
10
10
  export interface UseAutoScroll {
11
11
  (target: HookTarget, options?: UseAutoScrollOptions): void;
12
- <Target extends HTMLElement>(options?: UseAutoScrollOptions): StateRef<Target>;
12
+ <Target extends HTMLElement>(options?: UseAutoScrollOptions): {
13
+ ref: StateRef<Target>;
14
+ };
13
15
  }
14
16
  /**
15
17
  * @name useAutoScroll
@@ -28,9 +30,9 @@ export interface UseAutoScroll {
28
30
  * @overload
29
31
  * @template Target
30
32
  * @param {boolean} [options.enabled] Whether auto-scrolling is enabled
31
- * @returns {StateRef<Target>} A React ref to attach to the list element
33
+ * @returns {{ ref: StateRef<Target> }} A React ref to attach to the list element
32
34
  *
33
35
  * @example
34
- * const ref = useAutoScroll();
36
+ * const { ref } = useAutoScroll();
35
37
  */
36
38
  export declare const useAutoScroll: UseAutoScroll;
@@ -2,7 +2,9 @@ import { HookTarget } from '../../utils/helpers';
2
2
  import { StateRef } from '../useRefState/useRefState';
3
3
  export interface UseClickOutside {
4
4
  (target: HookTarget, callback: (event: Event) => void): void;
5
- <Target extends Element>(callback: (event: Event) => void, target?: never): StateRef<Target>;
5
+ <Target extends Element>(callback: (event: Event) => void, target?: never): {
6
+ ref: StateRef<Target>;
7
+ };
6
8
  }
7
9
  /**
8
10
  * @name useClickOutside
@@ -21,10 +23,10 @@ export interface UseClickOutside {
21
23
  * @overload
22
24
  * @template Target The target element(s)
23
25
  * @param {(event: Event) => void} callback The callback to execute when a click outside the target is detected
24
- * @returns {StateRef<Target>} A ref to attach to the target element
26
+ * @returns {{ ref: StateRef<Target> }} A ref to attach to the target element
25
27
  *
26
28
  * @example
27
- * const ref = useClickOutside<HTMLDivElement>(() => console.log('click outside'));
29
+ * const { ref } = useClickOutside<HTMLDivElement>(() => console.log('click outside'));
28
30
  *
29
31
  * @see {@link https://siberiacancode.github.io/reactuse/functions/hooks/useClickOutside.html}
30
32
  */
@@ -9,8 +9,10 @@ export interface UseDoubleClickOptions {
9
9
  onSingleClick?: (event: DoubleClickEvents) => void;
10
10
  }
11
11
  export interface UseDoubleClick {
12
- (target: HookTarget, callback: (event: DoubleClickEvents) => void, options?: UseDoubleClickOptions): boolean;
13
- <Target extends Element>(callback: (event: DoubleClickEvents) => void, options?: UseDoubleClickOptions, target?: never): StateRef<Target>;
12
+ (target: HookTarget, callback: (event: DoubleClickEvents) => void, options?: UseDoubleClickOptions): void;
13
+ <Target extends Element>(callback: (event: DoubleClickEvents) => void, options?: UseDoubleClickOptions, target?: never): {
14
+ ref: StateRef<Target>;
15
+ };
14
16
  }
15
17
  export declare const DEFAULT_THRESHOLD_TIME = 300;
16
18
  /**
@@ -23,7 +25,7 @@ export declare const DEFAULT_THRESHOLD_TIME = 300;
23
25
  * @param {HookTarget} target The target element to be double clicked
24
26
  * @param {(event: DoubleClickEvents) => void} callback The callback function to be invoked on double click
25
27
  * @param {UseDoubleClickOptions} [options] The options for the double click
26
- * @returns {boolean} The double clicking state
28
+ * @returns {void} The double clicking state
27
29
  *
28
30
  * @example
29
31
  * useDoubleClick(ref, () => console.log('double clicked'));
@@ -32,10 +34,10 @@ export declare const DEFAULT_THRESHOLD_TIME = 300;
32
34
  * @template Target The target element
33
35
  * @param {(event: DoubleClickEvents) => void} callback The callback function to be invoked on double click
34
36
  * @param {UseDoubleClickOptions} [options] The options for the double click
35
- * @returns {boolean} The double clicking state
37
+ * @returns {{ ref: StateRef<Target> }} The double clicking state
36
38
  *
37
39
  * @example
38
- * const ref = useDoubleClick(() => console.log('double clicked'));
40
+ * const { ref } = useDoubleClick(() => console.log('double clicked'));
39
41
  *
40
42
  * @see {@link https://siberiacancode.github.io/reactuse/functions/hooks/useDoubleClick.html}
41
43
  */
@@ -27,7 +27,7 @@ export interface UseFocusTrap {
27
27
  * @overload
28
28
  * @param {HookTarget} target The target element for focus trap
29
29
  * @param {boolean} [active=true] Whether focus trap is active
30
- * @returns {UseFocusTrapReturn} Object with control methods and state
30
+ * @returns {UseFocusTrapReturn} Object with the focus trap state and methods
31
31
  *
32
32
  * @example
33
33
  * const { active, disable, toggle, enable } = useFocusTrap(ref, true);
@@ -35,7 +35,7 @@ export interface UseFocusTrap {
35
35
  * @overload
36
36
  * @template Target The target element type
37
37
  * @param {boolean} [active=true] Whether focus trap is active
38
- * @returns {UseFocusTrapReturn & { ref: StateRef<Target> }} Object with ref and controls
38
+ * @returns {UseFocusTrapReturn & { ref: StateRef<Target> }} Object with the focus trap state and methods
39
39
  *
40
40
  * @example
41
41
  * const { ref, active, disable, toggle, enable } = useFocusTrap(true);
@@ -9,7 +9,12 @@ export interface UseHashOptions {
9
9
  onChange?: (hash: string) => void;
10
10
  }
11
11
  /** The use hash return type */
12
- type UseHashReturn = [string, (value: string) => void];
12
+ interface UseHashReturn {
13
+ /** The hash value */
14
+ value: string;
15
+ /** The function to set the hash value */
16
+ set: (value: string) => void;
17
+ }
13
18
  export interface UseHash {
14
19
  (initialValue?: string, options?: UseHashOptions): UseHashReturn;
15
20
  (options?: UseHashOptions): UseHashReturn;
@@ -31,7 +36,7 @@ export interface UseHash {
31
36
  * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value
32
37
  *
33
38
  * @example
34
- * const [hash, setHash] = useHash("initial");
39
+ * const { value, set } = useHash("initial");
35
40
  *
36
41
  * @overload
37
42
  * @param {string} [initialValue] The initial hash value if no hash exists
@@ -39,7 +44,7 @@ export interface UseHash {
39
44
  * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value
40
45
  *
41
46
  * @example
42
- * const [hash, setHash] = useHash("initial", (newHash) => console.log('callback'));
47
+ * const { value, set } = useHash("initial", (newHash) => console.log('callback'));
43
48
  *
44
49
  * @overload
45
50
  * @param {UseHashOptions} [options] Configuration options
@@ -49,14 +54,14 @@ export interface UseHash {
49
54
  * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value
50
55
  *
51
56
  * @example
52
- * const [hash, setHash] = useHash();
57
+ * const { value, set } = useHash();
53
58
  *
54
59
  * @overload
55
60
  * @param {(hash: string) => void} [callback] Callback function called when hash changes
56
61
  * @returns {UseHashReturn} An array containing the hash value and a function to set the hash value
57
62
  *
58
63
  * @example
59
- * const [hash, setHash] = useHash((newHash) => console.log('callback'));
64
+ * const { value, set } = useHash((newHash) => console.log('callback'));
60
65
  */
61
66
  export declare const useHash: UseHash;
62
67
  export {};
@@ -9,18 +9,20 @@ export interface UseHoverOptions {
9
9
  /** The on leave callback */
10
10
  onLeave?: (event: Event) => void;
11
11
  }
12
+ /** The use hover return type */
12
13
  export interface UseHoverReturn {
14
+ /** The value of the hover */
13
15
  value: boolean;
14
16
  }
15
17
  export interface UseHover {
16
- (target: HookTarget, callback?: (event: Event) => void): boolean;
17
- (target: HookTarget, options?: UseHoverOptions): boolean;
18
- <Target extends Element>(callback?: (event: Event) => void, target?: never): {
18
+ (target: HookTarget, callback?: (event: Event) => void): UseHoverReturn;
19
+ (target: HookTarget, options?: UseHoverOptions): UseHoverReturn;
20
+ <Target extends Element>(callback?: (event: Event) => void, target?: never): UseHoverReturn & {
19
21
  ref: StateRef<Target>;
20
- } & UseHoverReturn;
21
- <Target extends Element>(options?: UseHoverOptions, target?: never): {
22
+ };
23
+ <Target extends Element>(options?: UseHoverOptions, target?: never): UseHoverReturn & {
22
24
  ref: StateRef<Target>;
23
- } & UseHoverReturn;
25
+ };
24
26
  }
25
27
  /**
26
28
  * @name useHover
@@ -7,11 +7,17 @@ export interface UseInfiniteScrollOptions {
7
7
  /** The distance in pixels to trigger the callback */
8
8
  distance?: number;
9
9
  }
10
+ /** The use infinite scroll return type */
11
+ export interface UseInfiniteScrollReturn {
12
+ /** The loading state of the infinite scroll */
13
+ loading: boolean;
14
+ /** The ref to attach to the element */
15
+ ref: StateRef<Element>;
16
+ }
10
17
  export interface UseInfiniteScroll {
11
- (target: HookTarget, callback: (event: Event) => void, options?: UseInfiniteScrollOptions): boolean;
12
- <Target extends Element>(callback: (event: Event) => void, options?: UseInfiniteScrollOptions, target?: never): {
18
+ (target: HookTarget, callback: (event: Event) => void, options?: UseInfiniteScrollOptions): UseInfiniteScrollReturn;
19
+ <Target extends Element>(callback: (event: Event) => void, options?: UseInfiniteScrollOptions, target?: never): UseInfiniteScrollReturn & {
13
20
  ref: StateRef<Target>;
14
- loading: boolean;
15
21
  };
16
22
  }
17
23
  /**
@@ -25,7 +31,7 @@ export interface UseInfiniteScroll {
25
31
  * @param {(event: Event) => void} callback The callback to execute when a click outside the target is detected
26
32
  * @param {number} [options.distance=10] The distance in pixels to trigger the callback
27
33
  * @param {string} [options.direction='bottom'] The direction to trigger the callback
28
- * @returns {{ ref: StateRef<Target>, loading: boolean }} An object containing the ref and loading
34
+ * @returns {UseInfiniteScrollReturn & { ref: StateRef<Target> }} An object containing the ref and loading
29
35
  *
30
36
  * @example
31
37
  * const { ref, loading } = useInfiniteScroll(() => console.log('infinite scroll'));
@@ -35,9 +41,9 @@ export interface UseInfiniteScroll {
35
41
  * @param {(event: Event) => void} callback The callback to execute when a click outside the target is detected
36
42
  * @param {number} [options.distance=10] The distance in pixels to trigger the callback
37
43
  * @param {string} [options.direction='bottom'] The direction to trigger the callback
38
- * @returns {boolean} A loading indicator of the infinite scroll
44
+ * @returns {UseInfiniteScrollReturn} An object containing the ref and loading
39
45
  *
40
46
  * @example
41
- * const loading = useInfiniteScroll(ref, () => console.log('infinite scroll'));
47
+ * const { loading } = useInfiniteScroll(ref, () => console.log('infinite scroll'));
42
48
  */
43
49
  export declare const useInfiniteScroll: UseInfiniteScroll;
@@ -4,10 +4,16 @@ import { StateRef } from '../useRefState/useRefState';
4
4
  export type UseKeyPressKey = string | string[];
5
5
  /** The callback function to be invoked when key is pressed */
6
6
  export type UseKeyPressCallback = (pressed: boolean, event: KeyboardEvent) => void;
7
+ /** The use key press return type */
8
+ export interface UseKeyPressReturn {
9
+ /** The pressed state of the key */
10
+ pressed: boolean;
11
+ /** The ref to attach to the element */
12
+ ref: StateRef<Element>;
13
+ }
7
14
  export interface UseKeyPress {
8
- (target: HookTarget | Window, key: UseKeyPressKey, callback?: UseKeyPressCallback): boolean;
9
- <Target extends Element>(key: UseKeyPressKey, callback?: UseKeyPressCallback, target?: never): {
10
- pressed: boolean;
15
+ (target: HookTarget | Window, key: UseKeyPressKey, callback?: UseKeyPressCallback): UseKeyPressReturn;
16
+ <Target extends Element>(key: UseKeyPressKey, callback?: UseKeyPressCallback, target?: never): UseKeyPressReturn & {
11
17
  ref: StateRef<Target>;
12
18
  };
13
19
  }
@@ -21,7 +27,7 @@ export interface UseKeyPress {
21
27
  * @param {HookTarget} [target=window] The target to attach the event listeners to
22
28
  * @param {UseKeyPressKey} key The key or keys to listen for
23
29
  * @param {(pressed: boolean, event: KeyboardEvent) => void} [callback] Callback function invoked when key is pressed
24
- * @returns {boolean} The pressed state of the key
30
+ * @returns {UseKeyPressReturn} An object containing the pressed state and ref
25
31
  *
26
32
  * @example
27
33
  * const isKeyPressed = useKeyPress(ref, 'a');
@@ -5,16 +5,16 @@ export interface UseKeysPressedOptions {
5
5
  /** Enable or disable the event listeners */
6
6
  enabled?: boolean;
7
7
  }
8
- export interface UseKeysPressed {
9
- (target: HookTarget | Window, options?: UseKeysPressedOptions): Array<{
8
+ export interface UseKeysPressedReturn {
9
+ /** The array of currently pressed keys */
10
+ value: Array<{
10
11
  key: string;
11
12
  code: string;
12
13
  }>;
13
- <Target extends Element>(options?: UseKeysPressedOptions): {
14
- value: Array<{
15
- key: string;
16
- code: string;
17
- }>;
14
+ }
15
+ export interface UseKeysPressed {
16
+ (target: HookTarget | Window, options?: UseKeysPressedOptions): UseKeysPressedReturn;
17
+ <Target extends Element>(options?: UseKeysPressedOptions): UseKeysPressedReturn & {
18
18
  ref: StateRef<Target>;
19
19
  };
20
20
  }
@@ -27,15 +27,15 @@ export interface UseKeysPressed {
27
27
  * @overload
28
28
  * @param {HookTarget | Window} target DOM element or ref to attach keyboard listeners to
29
29
  * @param {UseKeysPressedOptions} [options.enabled=true] Enable or disable the event listeners
30
- * @returns {Array<{ key: string; code: string }>} Array of currently pressed keys with their key and code values
30
+ * @returns {UseKeysPressedReturn} Object containing the array of currently pressed keys
31
31
  *
32
32
  * @example
33
- * const pressedKeys = useKeysPressed(ref);
33
+ * const { value } = useKeysPressed(ref);
34
34
  *
35
35
  * @overload
36
36
  * @template Target - Type of the target DOM element
37
37
  * @param {UseKeysPressedOptions} [options] - Optional configuration options
38
- * @returns {{ keys: Array<{ key: string; code: string }>; ref: StateRef<Target> }} Object containing pressed keys array and ref to attach to a DOM element
38
+ * @returns {UseKeysPressedReturn & { ref: StateRef<Target> }} Object containing the array of currently pressed keys and ref to attach to the element
39
39
  *
40
40
  * @example
41
41
  * const { value, ref } = useKeysPressed();
@@ -7,12 +7,18 @@ export interface UseLongPressOptions {
7
7
  onFinish?: (event: LongPressEvents) => void;
8
8
  onStart?: (event: LongPressEvents) => void;
9
9
  }
10
+ /** The use long press return type */
11
+ export interface UseLongPressReturn {
12
+ /** The long pressing state */
13
+ pressed: boolean;
14
+ /** The ref to attach to the element */
15
+ ref: StateRef<Element>;
16
+ }
10
17
  export interface UseLongPress {
11
- (target: HookTarget, callback: (event: LongPressEvents) => void, options?: UseLongPressOptions): boolean;
18
+ (target: HookTarget, callback: (event: LongPressEvents) => void, options?: UseLongPressOptions): UseLongPressReturn;
12
19
  <Target extends Element>(callback: (event: LongPressEvents) => void, options?: UseLongPressOptions, target?: never): {
13
20
  ref: StateRef<Target>;
14
- pressed: boolean;
15
- };
21
+ } & UseLongPressReturn;
16
22
  }
17
23
  /**
18
24
  * @name useLongPress
@@ -1,3 +1,6 @@
1
+ /** The origin of the message */
2
+ export type UsePostMessageOrigin = string | '*' | string[];
3
+ /** The return type of the usePostMessage hook */
1
4
  export type UsePostMessageReturn<Message> = (message: Message) => void;
2
5
  /**
3
6
  * @name usePostMessage
@@ -7,11 +10,11 @@ export type UsePostMessageReturn<Message> = (message: Message) => void;
7
10
  *
8
11
  * @overload
9
12
  * @template Message The message data type
10
- * @param {string | string[]} origin The origin of the message
13
+ * @param {UsePostMessageOrigin} origin The origin of the message
11
14
  * @param {(message: Message) => Message} callback callback to get received message
12
15
  * @returns {(message: Message) => void} An object containing the current message
13
16
  *
14
17
  * @example
15
18
  * const postMessage = usePostMessage();
16
19
  */
17
- export declare const usePostMessage: <Message>(origin: string | "*" | string[], callback: (message: Message, event: MessageEvent<Message>) => void) => UsePostMessageReturn<Message>;
20
+ export declare const usePostMessage: <Message>(origin: UsePostMessageOrigin, callback: (message: Message, event: MessageEvent<Message>) => void) => UsePostMessageReturn<Message>;
@@ -12,10 +12,10 @@ export interface UseStickyOptions {
12
12
  root?: HookTarget;
13
13
  }
14
14
  export interface UseSticky {
15
- (target: HookTarget, options?: UseStickyOptions): boolean;
16
- <Target extends Element>(options?: UseStickyOptions, target?: never): {
15
+ (target: HookTarget, options?: UseStickyOptions): UseStickyReturn;
16
+ <Target extends Element>(options?: UseStickyOptions, target?: never): UseStickyReturn & {
17
17
  ref: StateRef<Target>;
18
- } & UseStickyReturn;
18
+ };
19
19
  }
20
20
  /**
21
21
  * @name UseSticky
@@ -30,12 +30,12 @@ export interface UseSticky {
30
30
  * @returns {UseStickyReturn} The state of the sticky
31
31
  *
32
32
  * @example
33
- * const stuck = useSticky(ref);
33
+ * const { stuck } = useSticky(ref);
34
34
  *
35
35
  * @overload
36
36
  * @param {UseStickyAxis} [options.axis='vertical'] The axis of motion of the sticky component
37
37
  * @param {UseStickyRoot} [options.root=document] The element that contains your sticky component
38
- * @returns {{ stickyRef: StateRef<Target> } & UseStickyReturn} The state of the sticky
38
+ * @returns {{ ref: StateRef<Target> } & UseStickyReturn} The state of the sticky
39
39
  *
40
40
  * @example
41
41
  * const { stuck, ref } = useSticky();