{"version":3,"file":"hamo.modern.mjs","sources":["../src/hooks/use-click-outside-event.js","../src/hooks/use-is-client.js","../src/hooks/use-debug.js","../src/hooks/use-document-ready-state.js","../src/hooks/use-frame/index.js","../src/hooks/use-intersection-observer.js","../src/hooks/use-interval.js","../src/hooks/use-is-touch-device.js","../src/hooks/use-media-query.js","../src/hooks/use-rect/utils.js","../src/hooks/use-rect/emitter.js","../src/hooks/use-rect/index.js","../src/hooks/use-resize-observer/index.js","../src/hooks/use-slots.js","../src/hooks/use-window-size/index.js"],"sourcesContent":["/**\r\n * useOutsideClickEvent - custom hook that listens for clicks outside of a component\r\n * @param {Object} ref - React ref for the element to listen for clicks outside of\r\n * @param {Function} callback - callback function to call when a click outside of the element is detected\r\n */\r\n\r\nimport { useCallback, useEffect } from 'react'\r\n\r\nexport function useOutsideClickEvent(ref, callback) {\r\n  const handleClickOutside = useCallback(\r\n    (event) => {\r\n      if (ref.current && !ref.current.contains(event.target)) {\r\n        callback()\r\n      }\r\n    },\r\n    [ref, callback]\r\n  )\r\n\r\n  useEffect(() => {\r\n    if (ref.current) {\r\n      document.addEventListener('mousedown', handleClickOutside)\r\n      return () => {\r\n        document.removeEventListener('mousedown', handleClickOutside)\r\n      }\r\n    }\r\n  }, [handleClickOutside, ref])\r\n}\r\n","// This component is used to check if the window object is present.\r\nimport { useEffect, useState } from 'react'\r\n\r\nexport function useIsClient() {\r\n  const [isClient, setClient] = useState(false)\r\n\r\n  useEffect(() => {\r\n    setClient(true)\r\n  }, [])\r\n\r\n  return isClient\r\n}\r\n","import { useMemo } from 'react'\r\nimport { useIsClient } from './use-is-client'\r\n\r\nexport function useDebug() {\r\n  const isClient = useIsClient()\r\n\r\n  const debug = useMemo(() => {\r\n    if (!isClient) return undefined\r\n\r\n    const location = window.location\r\n    const search = location.search\r\n    const href = location.href\r\n    const searchParams = new URLSearchParams(search)\r\n\r\n    const isDebug =\r\n      href.includes('#debug') || // localhost:3000/#debug\r\n      href.includes('/_debug') || // localhost:3000/_debug\r\n      searchParams.has('debug') || // localhost:3000/?debug\r\n      // eslint-disable-next-line no-undef\r\n      process.env.NODE_ENV === 'development' // localhost:3000\r\n\r\n    const isProduction =\r\n      href.includes('#production') || // localhost:3000/#production\r\n      searchParams.has('production') // localhost:3000/?production\r\n\r\n    return isDebug && !isProduction\r\n  }, [isClient])\r\n\r\n  return debug\r\n}\r\n","// useDocumentReadyState.js\r\n// This code is a custom hook that returns the current document.readyState\r\n// The useLayoutEffect hook is used to set the state of the document\r\n// The useEffect hook is used to set the state of the document to 'complete' when the document is ready\r\n\r\nimport { useEffect, useState } from 'react'\r\n\r\n/**\r\n * @name useDocumentReadyState\r\n * @description A React hook that listen to document.readyState.\r\n * @returns {string} document.readyState\r\n */\r\n\r\nexport function useDocumentReadyState() {\r\n  const [readyState, setReadyState] = useState()\r\n\r\n  useEffect(() => {\r\n    function onStateChange() {\r\n      setReadyState(document.readyState)\r\n    }\r\n\r\n    document.addEventListener('readystatechange', onStateChange, false)\r\n    onStateChange()\r\n\r\n    return () => document.removeEventListener('readystatechange', onStateChange, false)\r\n  }, [])\r\n\r\n  return readyState\r\n}\r\n","/**\r\n * Creates a requestAnimationFrame loop and manages the lifecycle of the callback.\r\n * @param {Function} callback - A function that is called every frame.\r\n * @param {Number} priority - A number that determines the order in which the callback is called.\r\n */\r\n\r\nimport Tempus from '@studio-freight/tempus'\r\nimport { useEffect } from 'react'\r\n\r\nexport function useFrame(callback, priority = 0) {\r\n  useEffect(() => {\r\n    if (callback) {\r\n      Tempus.add(callback, priority)\r\n\r\n      return () => Tempus.remove(callback)\r\n    }\r\n  }, [callback, priority])\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react'\r\n\r\n/**\r\n * @name useIntersectionObserver\r\n * @description A React hook that oberves element visibility using IntersectionObserver.\r\n * @param {HTMLElement} root\r\n * @param {string} rootMargin\r\n * @param {number} threshold\r\n * @param {boolean} once\r\n * @param {boolean} lazy\r\n * @param {function} callback\r\n * @param {array} deps\r\n * @returns {array} [setElement, entry]\r\n */\r\n\r\nexport function useIntersectionObserver(\r\n  { root = null, rootMargin = '0px', threshold = 0, once = false, lazy = false, callback = () => {} } = {},\r\n  deps = []\r\n) {\r\n  const entryRef = useRef({})\r\n  const [entry, setEntry] = useState({})\r\n  const [element, setElement] = useState()\r\n\r\n  useEffect(() => {\r\n    if (!element) return\r\n\r\n    const intersection = new IntersectionObserver(\r\n      ([entry]) => {\r\n        if (lazy) {\r\n          entryRef.current = entry\r\n        } else {\r\n          setEntry(entry)\r\n        }\r\n\r\n        callback(entry)\r\n\r\n        if (once && entry.isIntersecting) intersection.disconnect()\r\n      },\r\n      {\r\n        root,\r\n        rootMargin,\r\n        threshold,\r\n      }\r\n    )\r\n    intersection.observe(element)\r\n\r\n    return () => {\r\n      intersection.disconnect()\r\n    }\r\n  }, [element, root, rootMargin, threshold, lazy, once, ...deps])\r\n\r\n  const get = useCallback(() => entryRef.current, [])\r\n\r\n  return [setElement, lazy ? get : entry]\r\n}\r\n","/**\r\n * This function allows you to set an interval in a functional component\r\n * @param {function} callback - The callback function\r\n * @param {number} delay - The delay between each interval\r\n */\r\n\r\nimport { useEffect } from 'react'\r\n\r\nexport function useInterval(callback, delay = 1000, deps = []) {\r\n  useEffect(() => {\r\n    const interval = setInterval(callback, delay)\r\n    return () => clearInterval(interval)\r\n  }, [delay, ...deps])\r\n}\r\n","/*\r\n  This hook checks if the device has a touch screen. It checks for the touchstart event,\r\n  as well as the maxTouchPoints property on the navigator object. It also checks the\r\n  msMaxTouchPoints property, which is specific to Microsoft browsers.\r\n*/\r\n\r\nimport { useEffect, useState } from 'react'\r\n\r\n/**\r\n * @name useIsTouchDevice\r\n * @description A React hook that detects if the device supports touch.\r\n * @returns {boolean} Whether the device supports touch or not.\r\n */\r\n\r\nexport function useIsTouchDevice() {\r\n  const [isTouchDevice, setIsTouchDevice] = useState()\r\n\r\n  useEffect(() => {\r\n    function onResize() {\r\n      setIsTouchDevice('ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0)\r\n    }\r\n\r\n    window.addEventListener('resize', onResize, false)\r\n    onResize()\r\n\r\n    return () => {\r\n      window.removeEventListener('resize', onResize, false)\r\n    }\r\n  }, [])\r\n\r\n  return isTouchDevice\r\n}\r\n","import { useEffect, useState } from 'react'\r\n\r\n/**\r\n * @name useMediaQuery\r\n * @description A React hook that detects whether a media query is true or false.\r\n * @param {string} queryString The media query to test against.\r\n * @returns {boolean} Whether the media query is true or false.\r\n */\r\n\r\nexport function useMediaQuery(queryString) {\r\n  const [isMatch, setIsMatch] = useState()\r\n\r\n  useEffect(() => {\r\n    const mediaQuery = window.matchMedia(queryString)\r\n\r\n    function onChange() {\r\n      setIsMatch(mediaQuery.matches)\r\n    }\r\n\r\n    mediaQuery.addEventListener('change', onChange, false)\r\n    onChange()\r\n\r\n    return () => mediaQuery.removeEventListener('change', onChange, false)\r\n  }, [queryString])\r\n\r\n  return isMatch\r\n}\r\n","export function removeParentSticky(element) {\r\n  const position = getComputedStyle(element).position\r\n\r\n  const isSticky = position === 'sticky'\r\n\r\n  if (isSticky) {\r\n    element.style.setProperty('position', 'static')\r\n    element.dataset.sticky = 'true'\r\n  }\r\n\r\n  if (element.offsetParent) {\r\n    removeParentSticky(element.offsetParent)\r\n  }\r\n}\r\n\r\nexport function addParentSticky(element) {\r\n  if (element?.dataset?.sticky === 'true') {\r\n    element.style.removeProperty('position')\r\n    element.dataset.sticky = 'true'\r\n    delete element.dataset.sticky\r\n  }\r\n\r\n  if (element.parentNode) {\r\n    addParentSticky(element.parentNode)\r\n  }\r\n}\r\n\r\nexport function offsetTop(element, accumulator = 0) {\r\n  const top = accumulator + element.offsetTop\r\n  if (element.offsetParent) {\r\n    return offsetTop(element.offsetParent, top)\r\n  }\r\n  return top\r\n}\r\n\r\nexport function offsetLeft(element, accumulator = 0) {\r\n  const left = accumulator + element.offsetLeft\r\n  if (element.offsetParent) {\r\n    return offsetLeft(element.offsetParent, left)\r\n  }\r\n  return left\r\n}\r\n\r\nexport function scrollTop(element, accumulator = 0) {\r\n  const top = accumulator + element.scrollTop\r\n  if (element.offsetParent) {\r\n    return scrollTop(element.offsetParent, top)\r\n  }\r\n  return top + window.scrollY\r\n}\r\n\r\nexport function scrollLeft(element, accumulator = 0) {\r\n  const left = accumulator + element.scrollLeft\r\n  if (element.offsetParent) {\r\n    return scrollLeft(element.offsetParent, left)\r\n  }\r\n  return left + window.scrollX\r\n}\r\n","import { createNanoEvents } from 'nanoevents'\r\n\r\nexport const emitter = createNanoEvents()\r\n","import { useEffect, useCallback, useRef, useState } from 'react'\r\nimport { addParentSticky, offsetLeft, offsetTop, removeParentSticky, scrollLeft, scrollTop } from './utils'\r\nimport debounce from 'just-debounce-it'\r\nimport { emitter } from './emitter'\r\n\r\nexport function useRect({\r\n  ignoreTransform = false,\r\n  ignoreSticky = true,\r\n  debounce: debounceDelay = 500,\r\n  lazy = false,\r\n  callback,\r\n} = {}) {\r\n  const [element, setElement] = useState()\r\n  const rectRef = useRef({})\r\n  const [rect, setRectState] = useState({})\r\n\r\n  const setRect = useCallback(\r\n    ({ top, left, width, height, element }) => {\r\n      top = top ?? rectRef.current.top\r\n      left = left ?? rectRef.current.left\r\n      width = width ?? rectRef.current.width\r\n      height = height ?? rectRef.current.height\r\n      element = element ?? rectRef.current.element\r\n\r\n      if (\r\n        top === rectRef.current.top &&\r\n        left === rectRef.current.left &&\r\n        width === rectRef.current.width &&\r\n        height === rectRef.current.height &&\r\n        element === rectRef.current.element\r\n      )\r\n        return\r\n\r\n      rectRef.current.top = top\r\n      rectRef.current.y = top\r\n      rectRef.current.width = width\r\n      rectRef.current.height = height\r\n      rectRef.current.left = left\r\n      rectRef.current.x = left\r\n      rectRef.current.bottom = top + height\r\n      rectRef.current.right = left + width\r\n      rectRef.current.element = element\r\n\r\n      callback?.(rectRef.current)\r\n\r\n      if (!lazy) {\r\n        setRectState({ ...rectRef.current })\r\n      }\r\n    },\r\n    [lazy],\r\n  )\r\n\r\n  useEffect(() => {\r\n    if (!element) return\r\n\r\n    const rect = element.getBoundingClientRect()\r\n    const width = rect.width\r\n    const height = rect.height\r\n    setRect({ width, height })\r\n\r\n    const onResize = debounce(([entry]) => {\r\n      const width = entry.borderBoxSize[0].inlineSize\r\n      const height = entry.borderBoxSize[0].blockSize\r\n\r\n      setRect({ width, height })\r\n    }, debounceDelay)\r\n\r\n    const resizeObserver = new ResizeObserver(onResize)\r\n    resizeObserver.observe(element)\r\n\r\n    return () => {\r\n      resizeObserver.disconnect()\r\n      onResize.cancel()\r\n    }\r\n  }, [element, debounceDelay, setRect])\r\n\r\n  const [wrapperElement, setWrapperElementRef] = useState()\r\n\r\n  const onWrapperResize = useCallback(() => {\r\n    if (!element) return\r\n\r\n    let top, left\r\n\r\n    if (ignoreSticky) removeParentSticky(element)\r\n    if (ignoreTransform) {\r\n      top = offsetTop(element)\r\n      left = offsetLeft(element)\r\n    } else {\r\n      const rect = element.getBoundingClientRect()\r\n      top = rect.top + scrollTop(element)\r\n      left = rect.left + scrollLeft(element)\r\n    }\r\n    if (ignoreSticky) addParentSticky(element)\r\n\r\n    setRect({ top, left, element })\r\n  }, [ignoreTransform, ignoreSticky, element, setRect])\r\n\r\n  // resize if body height changes\r\n  useEffect(() => {\r\n    onWrapperResize()\r\n    const debouncedOnWrapperResize = debounce(onWrapperResize, debounceDelay)\r\n\r\n    const resizeObserver = new ResizeObserver(debouncedOnWrapperResize)\r\n    resizeObserver.observe(wrapperElement ?? document.body)\r\n\r\n    return () => {\r\n      resizeObserver.disconnect()\r\n      debouncedOnWrapperResize.cancel()\r\n    }\r\n  }, [wrapperElement, debounceDelay, onWrapperResize])\r\n\r\n  useEffect(() => {\r\n    function onResize() {\r\n      if (!element) return\r\n      const elementRect = element.getBoundingClientRect()\r\n\r\n      const width = elementRect.width\r\n      const height = elementRect.height\r\n\r\n      setRect({ width, height })\r\n\r\n      onWrapperResize()\r\n    }\r\n\r\n    const unbind = emitter.on('resize', onResize)\r\n\r\n    return unbind\r\n  }, [element, onWrapperResize, setRect])\r\n\r\n  const getRect = useCallback(() => rectRef.current, [])\r\n\r\n  return [setElement, lazy ? getRect : rect, setWrapperElementRef]\r\n}\r\n\r\nuseRect.resize = () => {\r\n  emitter.emit('resize')\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react'\r\nimport debounce from 'just-debounce-it'\r\n\r\n/**\r\n * useResizeObserver - observe elements dimensions using ResizeObserver\r\n * @param {Boolean} lazy - should return a state or not\r\n * @param {Number} debounce - minimum delay between two ResizeObserver computations\r\n * @param {String} box - ResizeObserver parameter\r\n * @param {Function} callback - called on value change\r\n */\r\n\r\nexport function useResizeObserver({\r\n  lazy = false,\r\n  debounce: debounceDelay = 500,\r\n  box = 'border-box',\r\n  callback = () => {},\r\n} = {}) {\r\n  const entryRef = useRef({})\r\n  const [entry, setEntry] = useState({})\r\n  const [element, setElement] = useState()\r\n\r\n  useEffect(() => {\r\n    if (!element) return\r\n\r\n    const onResize = debounce(\r\n      ([entry]) => {\r\n        entryRef.current = entry\r\n\r\n        callback(entry)\r\n\r\n        if (!lazy) {\r\n          setEntry(entry)\r\n        }\r\n      },\r\n      debounceDelay,\r\n      true,\r\n    )\r\n\r\n    const resizeObserver = new ResizeObserver(onResize)\r\n    resizeObserver.observe(element, { box })\r\n\r\n    return () => {\r\n      resizeObserver.disconnect()\r\n      onResize.cancel()\r\n    }\r\n  }, [element, lazy, debounceDelay, box])\r\n\r\n  const get = useCallback(() => entryRef.current, [])\r\n\r\n  return [setElement, lazy ? get : entry]\r\n}\r\n","// This code is used to extract the contents of a component's children and return them as an array.\r\n// The code accepts two arguments, the names of the components that it should extract, and the children to extract from.\r\n// The code returns an array of the children of the components passed in the types argument.\r\n// based on:\r\n// https://medium.com/swlh/bring-vue-named-slots-to-react-87684188f18e\r\n\r\nimport { useMemo } from 'react'\r\n\r\nexport function useSlots(types = [], children = []) {\r\n  const _children = useMemo(() => children && [children].flat(), [children])\r\n  const _types = useMemo(() => types && [types].flat(), [types])\r\n  const slots = useMemo(() => {\r\n    if (!_children || !_types) {\r\n      return\r\n    }\r\n\r\n    const slots = _types.map((type) => _children.find((el) => el.type === type)?.props.children)\r\n\r\n    return types[0] ? slots : slots[0]\r\n  }, [_children, _types])\r\n\r\n  return slots\r\n}\r\n","import { useEffect, useState } from 'react'\r\nimport debounce from 'just-debounce-it'\r\n\r\n/**\r\n * @name useWindowSize\r\n * @description A React hook that listens to window size.\r\n * @returns {object} { width, height }\r\n */\r\n\r\nexport function useWindowSize(debounceDelay = 500) {\r\n  const [width, setWidth] = useState()\r\n  const [height, setHeight] = useState()\r\n\r\n  useEffect(() => {\r\n    const onWindowRezise = debounce(() => {\r\n      setWidth(Math.min(window.innerWidth, document.documentElement.clientWidth))\r\n      setHeight(Math.min(window.innerHeight, document.documentElement.clientHeight))\r\n    }, debounceDelay)\r\n\r\n    window.addEventListener('resize', onWindowRezise, false)\r\n\r\n    onWindowRezise()\r\n\r\n    return () => window.removeEventListener('resize', onWindowRezise, false)\r\n  }, [debounceDelay])\r\n\r\n  return { width, height }\r\n}\r\n"],"names":["useOutsideClickEvent","ref","callback","handleClickOutside","useCallback","event","current","contains","target","useEffect","document","addEventListener","removeEventListener","useIsClient","isClient","setClient","useState","useDebug","useMemo","location","window","href","searchParams","URLSearchParams","search","isDebug","includes","has","process","env","NODE_ENV","isProduction","useDocumentReadyState","readyState","setReadyState","onStateChange","useFrame","priority","Tempus","add","remove","useIntersectionObserver","root","rootMargin","threshold","once","lazy","deps","entryRef","useRef","entry","setEntry","element","setElement","intersection","IntersectionObserver","isIntersecting","disconnect","observe","get","useInterval","delay","interval","setInterval","clearInterval","useIsTouchDevice","isTouchDevice","setIsTouchDevice","onResize","navigator","maxTouchPoints","msMaxTouchPoints","useMediaQuery","queryString","isMatch","setIsMatch","mediaQuery","matchMedia","onChange","matches","removeParentSticky","getComputedStyle","position","style","setProperty","dataset","sticky","offsetParent","addParentSticky","_element$dataset","removeProperty","parentNode","offsetTop","accumulator","top","offsetLeft","left","scrollTop","scrollY","scrollLeft","scrollX","emitter","createNanoEvents","useRect","ignoreTransform","ignoreSticky","debounce","debounceDelay","rectRef","rect","setRectState","setRect","width","height","_top","_left","_width","_height","_element","y","x","bottom","right","_extends","getBoundingClientRect","borderBoxSize","inlineSize","blockSize","resizeObserver","ResizeObserver","cancel","wrapperElement","setWrapperElementRef","onWrapperResize","debouncedOnWrapperResize","body","on","elementRect","getRect","useResizeObserver","box","useSlots","types","children","_children","flat","_types","slots","map","type","_children$find","find","el","props","useWindowSize","setWidth","setHeight","onWindowRezise","Math","min","innerWidth","documentElement","clientWidth","innerHeight","clientHeight","resize","emit"],"mappings":"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"}