{"version":3,"file":"utilities.cjs.production.min.js","sources":["../src/execution-context/canUseDOM.ts","../src/type-guards/isWindow.ts","../src/type-guards/isNode.ts","../src/execution-context/getWindow.ts","../src/type-guards/isDocument.ts","../src/type-guards/isHTMLElement.ts","../src/type-guards/isSVGElement.ts","../src/hooks/useIsomorphicLayoutEffect.ts","../src/hooks/useEvent.ts","../src/hooks/useUniqueId.ts","../src/adjustment.ts","../src/event/hasViewportRelativeCoordinates.ts","../src/event/isTouchEvent.ts","../src/css.ts","../src/focus/findFirstFocusableNode.ts","../src/coordinates/getEventCoordinates.ts","../src/execution-context/getOwnerDocument.ts","../src/event/isKeyboardEvent.ts","../src/hooks/useCombinedRefs.ts","../src/hooks/useInterval.ts","../src/hooks/useLatestValue.ts","../src/hooks/useLazyMemo.ts","../src/hooks/useNodeRef.ts","../src/hooks/usePrevious.ts"],"sourcesContent":["// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js\nexport const canUseDOM =\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n typeof window.document.createElement !== 'undefined';\n","export function isWindow(element: Object): element is typeof window {\n const elementString = Object.prototype.toString.call(element);\n return (\n elementString === '[object Window]' ||\n // In Electron context the Window object serializes to [object global]\n elementString === '[object global]'\n );\n}\n","export function isNode(node: Object): node is Node {\n return 'nodeType' in node;\n}\n","import {isWindow} from '../type-guards/isWindow';\nimport {isNode} from '../type-guards/isNode';\n\nexport function getWindow(target: Event['target']): typeof window {\n if (!target) {\n return window;\n }\n\n if (isWindow(target)) {\n return target;\n }\n\n if (!isNode(target)) {\n return window;\n }\n\n return target.ownerDocument?.defaultView ?? window;\n}\n","import {getWindow} from '../execution-context/getWindow';\n\nexport function isDocument(node: Node): node is Document {\n const {Document} = getWindow(node);\n\n return node instanceof Document;\n}\n","import {getWindow} from '../execution-context/getWindow';\n\nimport {isWindow} from './isWindow';\n\nexport function isHTMLElement(node: Node | Window): node is HTMLElement {\n if (isWindow(node)) {\n return false;\n }\n\n return node instanceof getWindow(node).HTMLElement;\n}\n","import {getWindow} from '../execution-context/getWindow';\n\nexport function isSVGElement(node: Node): node is SVGElement {\n return node instanceof getWindow(node).SVGElement;\n}\n","import {useEffect, useLayoutEffect} from 'react';\n\nimport {canUseDOM} from '../execution-context';\n\n/**\n * A hook that resolves to useEffect on the server and useLayoutEffect on the client\n * @param callback {function} Callback function that is invoked when the dependencies of the hook change\n */\nexport const useIsomorphicLayoutEffect = canUseDOM\n ? useLayoutEffect\n : useEffect;\n","import {useCallback, useRef} from 'react';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect';\n\nexport function useEvent(handler: T | undefined) {\n const handlerRef = useRef(handler);\n\n useIsomorphicLayoutEffect(() => {\n handlerRef.current = handler;\n });\n\n return useCallback(function (...args: any) {\n return handlerRef.current?.(...args);\n }, []);\n}\n","import {useMemo} from 'react';\n\nlet ids: Record = {};\n\nexport function useUniqueId(prefix: string, value?: string) {\n return useMemo(() => {\n if (value) {\n return value;\n }\n\n const id = ids[prefix] == null ? 0 : ids[prefix] + 1;\n ids[prefix] = id;\n\n return `${prefix}-${id}`;\n }, [prefix, value]);\n}\n","function createAdjustmentFn(modifier: number) {\n return , U extends string>(\n object: T,\n ...adjustments: Partial[]\n ): T => {\n return adjustments.reduce(\n (accumulator, adjustment) => {\n const entries = Object.entries(adjustment) as [U, number][];\n\n for (const [key, valueAdjustment] of entries) {\n const value = accumulator[key];\n\n if (value != null) {\n accumulator[key] = (value + modifier * valueAdjustment) as T[U];\n }\n }\n\n return accumulator;\n },\n {\n ...object,\n }\n );\n };\n}\n\nexport const add = createAdjustmentFn(1);\nexport const subtract = createAdjustmentFn(-1);\n","export function hasViewportRelativeCoordinates(\n event: Event\n): event is Event & Pick {\n return 'clientX' in event && 'clientY' in event;\n}\n","import {getWindow} from '../execution-context';\n\nexport function isTouchEvent(\n event: Event | undefined | null\n): event is TouchEvent {\n if (!event) {\n return false;\n }\n\n const {TouchEvent} = getWindow(event.target);\n\n return TouchEvent && event instanceof TouchEvent;\n}\n","export type Transform = {\n x: number;\n y: number;\n scaleX: number;\n scaleY: number;\n};\n\nexport interface Transition {\n property: string;\n easing: string;\n duration: number;\n}\n\nexport const CSS = Object.freeze({\n Translate: {\n toString(transform: Transform | null) {\n if (!transform) {\n return;\n }\n\n const {x, y} = transform;\n\n return `translate3d(${x ? Math.round(x) : 0}px, ${\n y ? Math.round(y) : 0\n }px, 0)`;\n },\n },\n Scale: {\n toString(transform: Transform | null) {\n if (!transform) {\n return;\n }\n\n const {scaleX, scaleY} = transform;\n\n return `scaleX(${scaleX}) scaleY(${scaleY})`;\n },\n },\n Transform: {\n toString(transform: Transform | null) {\n if (!transform) {\n return;\n }\n\n return [\n CSS.Translate.toString(transform),\n CSS.Scale.toString(transform),\n ].join(' ');\n },\n },\n Transition: {\n toString({property, duration, easing}: Transition) {\n return `${property} ${duration}ms ${easing}`;\n },\n },\n});\n","const SELECTOR =\n 'a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]';\n\nexport function findFirstFocusableNode(\n element: HTMLElement\n): HTMLElement | null {\n if (element.matches(SELECTOR)) {\n return element;\n }\n\n return element.querySelector(SELECTOR);\n}\n","import type {Coordinates} from './types';\nimport {isTouchEvent, hasViewportRelativeCoordinates} from '../event';\n\n/**\n * Returns the normalized x and y coordinates for mouse and touch events.\n */\nexport function getEventCoordinates(event: Event): Coordinates | null {\n if (isTouchEvent(event)) {\n if (event.touches && event.touches.length) {\n const {clientX: x, clientY: y} = event.touches[0];\n\n return {\n x,\n y,\n };\n } else if (event.changedTouches && event.changedTouches.length) {\n const {clientX: x, clientY: y} = event.changedTouches[0];\n\n return {\n x,\n y,\n };\n }\n }\n\n if (hasViewportRelativeCoordinates(event)) {\n return {\n x: event.clientX,\n y: event.clientY,\n };\n }\n\n return null;\n}\n","import {\n isWindow,\n isHTMLElement,\n isDocument,\n isNode,\n isSVGElement,\n} from '../type-guards';\n\nexport function getOwnerDocument(target: Event['target']): Document {\n if (!target) {\n return document;\n }\n\n if (isWindow(target)) {\n return target.document;\n }\n\n if (!isNode(target)) {\n return document;\n }\n\n if (isDocument(target)) {\n return target;\n }\n\n if (isHTMLElement(target) || isSVGElement(target)) {\n return target.ownerDocument;\n }\n\n return document;\n}\n","import {getWindow} from '../execution-context';\n\nexport function isKeyboardEvent(\n event: Event | undefined | null\n): event is KeyboardEvent {\n if (!event) {\n return false;\n }\n\n const {KeyboardEvent} = getWindow(event.target);\n\n return KeyboardEvent && event instanceof KeyboardEvent;\n}\n","import {useMemo} from 'react';\n\nexport function useCombinedRefs(\n ...refs: ((node: T) => void)[]\n): (node: T) => void {\n return useMemo(\n () => (node: T) => {\n refs.forEach((ref) => ref(node));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs\n );\n}\n","import {useCallback, useRef} from 'react';\n\nexport function useInterval() {\n const intervalRef = useRef(null);\n\n const set = useCallback((listener: Function, duration: number) => {\n intervalRef.current = setInterval(listener, duration);\n }, []);\n\n const clear = useCallback(() => {\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n }, []);\n\n return [set, clear] as const;\n}\n","import {useRef} from 'react';\nimport type {DependencyList} from 'react';\n\nimport {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect';\n\nexport function useLatestValue(\n value: T,\n dependencies: DependencyList = [value]\n) {\n const valueRef = useRef(value);\n\n useIsomorphicLayoutEffect(() => {\n if (valueRef.current !== value) {\n valueRef.current = value;\n }\n }, dependencies);\n\n return valueRef;\n}\n","import {useMemo, useRef} from 'react';\n\nexport function useLazyMemo(\n callback: (prevValue: T | undefined) => T,\n dependencies: any[]\n) {\n const valueRef = useRef();\n\n return useMemo(\n () => {\n const newValue = callback(valueRef.current);\n valueRef.current = newValue;\n\n return newValue;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [...dependencies]\n );\n}\n","import {useRef, useCallback} from 'react';\n\nimport {useEvent} from './useEvent';\n\nexport function useNodeRef(\n onChange?: (\n newElement: HTMLElement | null,\n previousElement: HTMLElement | null\n ) => void\n) {\n const onChangeHandler = useEvent(onChange);\n const node = useRef(null);\n const setNodeRef = useCallback(\n (element: HTMLElement | null) => {\n if (element !== node.current) {\n onChangeHandler?.(element, node.current);\n }\n\n node.current = element;\n },\n //eslint-disable-next-line\n []\n );\n\n return [node, setNodeRef] as const;\n}\n","import {useRef, useEffect} from 'react';\n\nexport function usePrevious(value: T) {\n const ref = useRef();\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref.current;\n}\n"],"names":["canUseDOM","window","document","createElement","isWindow","element","elementString","Object","prototype","toString","call","isNode","node","getWindow","target","ownerDocument","_target$ownerDocument2","defaultView","isDocument","Document","isHTMLElement","HTMLElement","isSVGElement","SVGElement","useIsomorphicLayoutEffect","useLayoutEffect","useEffect","useEvent","handler","handlerRef","useRef","current","useCallback","args","ids","createAdjustmentFn","modifier","object","adjustments","reduce","accumulator","adjustment","entries","key","valueAdjustment","value","add","subtract","hasViewportRelativeCoordinates","event","isTouchEvent","TouchEvent","CSS","freeze","Translate","transform","x","y","Math","round","Scale","scaleX","scaleY","Transform","join","Transition","property","duration","easing","SELECTOR","matches","querySelector","touches","length","clientX","clientY","changedTouches","KeyboardEvent","refs","useMemo","forEach","ref","intervalRef","listener","setInterval","clearInterval","dependencies","valueRef","callback","newValue","onChange","onChangeHandler","setNodeRef","prefix","id"],"mappings":"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"}